From a9866f84ad7232b0d6113d473162b5dca44caabd Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 20 Mar 2020 16:03:48 +0100 Subject: [PATCH 001/377] Implemented FOF types 100-105 --- src/p_setup.c | 47 ++++++++++++++++++++++++++++++ src/p_spec.c | 81 +++++++++++++++++++++++++-------------------------- 2 files changed, 86 insertions(+), 42 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 56bfb2444..635c220f5 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2803,6 +2803,44 @@ static void P_ConvertBinaryMap(void) { switch (lines[i].special) { + case 100: //FOF: solid, opaque, shadowcasting + case 101: //FOF: solid, opaque, non-shadowcasting + case 102: //FOF: solid, translucent + case 103: //FOF: solid, sides only + case 104: //FOF: solid, no sides + case 105: //FOF: solid, invisible + lines[i].args[0] = lines[i].tag; + + //Visibility + if (lines[i].special == 105) + lines[i].args[1] = 3; + else if (lines[i].special == 104) + lines[i].args[1] = 2; + else if (lines[i].special == 103) + lines[i].args[1] = 1; + + //Translucency + if (lines[i].special == 102) + { + lines[i].args[2] = (lines[i].flags & ML_NOCLIMB) ? 2 : 1; + if (sides[lines[i].sidenum[0]].toptexture > 0) + lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; + else + lines[i].alpha = FRACUNIT/2; + } + + //Tangibility + if (lines[i].flags & ML_EFFECT1) + lines[i].args[3] |= 8; + if (lines[i].flags & ML_EFFECT2) + lines[i].args[3] |= 4; + + //Shadow? + if (lines[i].special != 100 && (lines[i].special != 104 || !(lines[i].flags & ML_NOCLIMB))) + lines[i].args[4] = 1; + + lines[i].special = 100; + break; case 443: //Call Lua function if (lines[i].text) { @@ -2942,6 +2980,15 @@ static void P_ConvertBinaryMap(void) lines[i].alpha = ((909 - lines[i].special) << FRACBITS)/10; break; default: + // \todo Remove once all FOF types are converted + if (lines[i].special >= 100 && lines[i].special < 300) + { + lines[i].args[0] = lines[i].tag; + if (sides[lines[i].sidenum[0]].toptexture > 0) + lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; + else + lines[i].alpha = FRACUNIT/2; + } break; } } diff --git a/src/p_spec.c b/src/p_spec.c index 1b41ae015..5522ea84c 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5760,7 +5760,7 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f { fixed_t tempceiling = sec2->ceilingheight; //flip the sector around and print an error instead of crashing 12.1.08 -Inuyasha - CONS_Alert(CONS_ERROR, M_GetText("A FOF tagged %d has a top height below its bottom.\n"), master->tag); + CONS_Alert(CONS_ERROR, M_GetText("A FOF tagged %d has a top height below its bottom.\n"), master->args[0]); sec2->ceilingheight = sec2->floorheight; sec2->floorheight = tempceiling; } @@ -5820,6 +5820,7 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f sec->hasslope = true; #endif + // \todo Remove once all FOFs are adapted if ((flags & FF_SOLID) && (master->flags & ML_EFFECT1)) // Block player only flags &= ~FF_BLOCKOTHERS; @@ -5881,17 +5882,7 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f else th = th->next; } - - if (flags & FF_TRANSLUCENT) - { - if (sides[master->sidenum[0]].toptexture > 0) - fflr->alpha = sides[master->sidenum[0]].toptexture; // for future reference, "#0" is 1, and "#255" is 256. Be warned - else - fflr->alpha = 0x80; - } - else - fflr->alpha = 0xff; - + fflr->alpha = (flags & FF_TRANSLUCENT) ? (master->alpha * 0xff) >> FRACBITS : 0xff; fflr->spawnalpha = fflr->alpha; // save for netgames if (flags & FF_QUICKSAND) @@ -6772,44 +6763,50 @@ void P_SpawnSpecials(boolean fromnetsave) P_AddPlaneDisplaceThinker(pd_both, P_AproxDistance(lines[i].dx, lines[i].dy)>>8, sides[lines[i].sidenum[0]].sector-sectors, s, !!(lines[i].flags & ML_NOCLIMB)); break; - case 100: // FOF (solid, opaque, shadows) - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); - break; + case 100: // FOF (solid) + ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; - case 101: // FOF (solid, opaque, no shadows) - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_NOSHADE|FF_CUTLEVEL, secthinkers); - break; + //Visibility settings + if (lines[i].args[1] & 1) + ffloorflags &= ~FF_RENDERPLANES; + if (lines[i].args[1] & 2) + ffloorflags &= ~FF_RENDERSIDES; - case 102: // TL block: FOF (solid, translucent) - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_NOSHADE|FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; - - // Draw the 'insides' of the block too - if (lines[i].flags & ML_NOCLIMB) + //Translucency settings are irrelevant for invisible FOFs + if (lines[i].args[1] != 3) { - ffloorflags |= FF_CUTLEVEL|FF_BOTHPLANES|FF_ALLSIDES; - ffloorflags &= ~(FF_EXTRA|FF_CUTEXTRA); + if (lines[i].args[2] == 0) //Opaque + { + if (lines[i].args[3] & 7) + { + //At least partially intangible: You can see it from the inside + ffloorflags |= FF_ALLSIDES; + //Unless the planes are invisible, render both sides. + if (!(lines[i].args[1] & 1)) + ffloorflags |= FF_BOTHPLANES; + } + else + ffloorflags |= FF_CUTLEVEL; + } + if (lines[i].args[2] == 1) //Translucent, don't render insides + ffloorflags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; + if (lines[i].args[2] == 2) //Translucent, render insides + ffloorflags |= FF_TRANSLUCENT|FF_CUTEXTRA|FF_BOTHPLANES|FF_ALLSIDES; } - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - break; - - case 103: // Solid FOF with no floor/ceiling (quite possibly useless) - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERSIDES|FF_NOSHADE|FF_CUTLEVEL, secthinkers); - break; - - case 104: // 3D Floor type that doesn't draw sides - // If line has no-climb set, give it shadows, otherwise don't - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERPLANES|FF_CUTLEVEL; - if (!(lines[i].flags & ML_NOCLIMB)) + if (lines[i].args[3] & 1) + ffloorflags |= FF_REVERSEPLATFORM; + if (lines[i].args[3] & 2) + ffloorflags |= FF_PLATFORM; + if (lines[i].args[3] & 4) + ffloorflags &= ~FF_BLOCKPLAYER; + if (lines[i].args[3] & 8) + ffloorflags &= ~FF_BLOCKOTHERS; + if (lines[i].args[4]) ffloorflags |= FF_NOSHADE; - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); break; - case 105: // FOF (solid, invisible) - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_NOSHADE, secthinkers); - break; - case 120: // Opaque water ffloorflags = FF_EXISTS|FF_RENDERALL|FF_SWIMMABLE|FF_BOTHPLANES|FF_ALLSIDES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; if (lines[i].flags & ML_NOCLIMB) @@ -7495,7 +7492,7 @@ static void P_AddFakeFloorsByLine(size_t line, ffloortype_e ffloorflags, thinker INT32 s; size_t sec = sides[*lines[line].sidenum].sector-sectors; - for (s = -1; (s = P_FindSectorFromLineTag(lines+line, s)) >= 0 ;) + for (s = -1; (s = P_FindSectorFromTag(lines[line].args[0], s)) >= 0 ;) P_AddFakeFloor(§ors[s], §ors[sec], lines+line, ffloorflags, secthinkers); } From 1e306dc7b407def50ee2df6697d6487a08b00c58 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 20 Mar 2020 16:08:48 +0100 Subject: [PATCH 002/377] Implement linedef type 100-146 --- src/p_setup.c | 39 ++++++++++++++++++++++++ src/p_spec.c | 84 --------------------------------------------------- 2 files changed, 39 insertions(+), 84 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 635c220f5..e23b52357 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2839,6 +2839,45 @@ static void P_ConvertBinaryMap(void) if (lines[i].special != 100 && (lines[i].special != 104 || !(lines[i].flags & ML_NOCLIMB))) lines[i].args[4] = 1; + lines[i].special = 100; + break; + case 140: //FOF: intangible from bottom, opaque + case 141: //FOF: intangible from bottom, translucent + case 142: //FOF: intangible from bottom, translucent, no sides + case 143: //FOF: intangible from top, opaque + case 144: //FOF: intangible from top, translucent + case 145: //FOF: intangible from top, translucent, no sides + case 146: //FOF: only tangible from sides + lines[i].args[0] = lines[i].tag; + + //Visibility + if (lines[i].special == 142 || lines[i].special == 145) + lines[i].args[1] = 2; + else if (lines[i].special == 146) + lines[i].args[1] = 1; + + //Translucency + if (lines[i].special == 141 || lines[i].special == 142 || lines[i].special == 144 || lines[i].special == 145) + { + lines[i].args[2] = (lines[i].flags & ML_EFFECT2) ? 2 : 1; + if (sides[lines[i].sidenum[0]].toptexture > 0) + lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; + else + lines[i].alpha = FRACUNIT/2; + } + + //Tangibility + if (lines[i].special <= 142) + lines[i].args[3] |= 2; + else if (lines[i].special <= 145) + lines[i].args[3] |= 1; + else + lines[i].args[3] |= 3; + + //Shadow? + if (lines[i].special != 146 && (lines[i].flags & ML_NOCLIMB)) + lines[i].args[4] = 1; + lines[i].special = 100; break; case 443: //Call Lua function diff --git a/src/p_spec.c b/src/p_spec.c index 5522ea84c..121e1c11d 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6873,90 +6873,6 @@ void P_SpawnSpecials(boolean fromnetsave) P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); break; - case 140: // 'Platform' - You can jump up through it - // If line has no-climb set, don't give it shadows, otherwise do - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_PLATFORM|FF_BOTHPLANES|FF_ALLSIDES; - if (lines[i].flags & ML_NOCLIMB) - ffloorflags |= FF_NOSHADE; - - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - break; - - case 141: // Translucent "platform" - // If line has no-climb set, don't give it shadows, otherwise do - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_PLATFORM|FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; - if (lines[i].flags & ML_NOCLIMB) - ffloorflags |= FF_NOSHADE; - - // Draw the 'insides' of the block too - if (lines[i].flags & ML_EFFECT2) - { - ffloorflags |= FF_CUTLEVEL|FF_BOTHPLANES|FF_ALLSIDES; - ffloorflags &= ~(FF_EXTRA|FF_CUTEXTRA); - } - - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - break; - - case 142: // Translucent "platform" with no sides - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERPLANES|FF_TRANSLUCENT|FF_PLATFORM|FF_EXTRA|FF_CUTEXTRA; - if (lines[i].flags & ML_NOCLIMB) // shade it unless no-climb - ffloorflags |= FF_NOSHADE; - - // Draw the 'insides' of the block too - if (lines[i].flags & ML_EFFECT2) - { - ffloorflags |= FF_CUTLEVEL|FF_BOTHPLANES|FF_ALLSIDES; - ffloorflags &= ~(FF_EXTRA|FF_CUTEXTRA); - } - - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - break; - - case 143: // 'Reverse platform' - You fall through it - // If line has no-climb set, don't give it shadows, otherwise do - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_REVERSEPLATFORM|FF_BOTHPLANES|FF_ALLSIDES; - if (lines[i].flags & ML_NOCLIMB) - ffloorflags |= FF_NOSHADE; - - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - break; - - case 144: // Translucent "reverse platform" - // If line has no-climb set, don't give it shadows, otherwise do - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_REVERSEPLATFORM|FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; - if (lines[i].flags & ML_NOCLIMB) - ffloorflags |= FF_NOSHADE; - - // Draw the 'insides' of the block too - if (lines[i].flags & ML_EFFECT2) - { - ffloorflags |= FF_CUTLEVEL|FF_BOTHPLANES|FF_ALLSIDES; - ffloorflags &= ~(FF_EXTRA|FF_CUTEXTRA); - } - - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - break; - - case 145: // Translucent "reverse platform" with no sides - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERPLANES|FF_TRANSLUCENT|FF_REVERSEPLATFORM|FF_EXTRA|FF_CUTEXTRA; - if (lines[i].flags & ML_NOCLIMB) // shade it unless no-climb - ffloorflags |= FF_NOSHADE; - - // Draw the 'insides' of the block too - if (lines[i].flags & ML_EFFECT2) - { - ffloorflags |= FF_CUTLEVEL|FF_BOTHPLANES|FF_ALLSIDES; - ffloorflags &= ~(FF_EXTRA|FF_CUTEXTRA); - } - - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - break; - - case 146: // Intangible floor/ceiling with solid sides (fences/hoops maybe?) - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERSIDES|FF_ALLSIDES|FF_INTANGIBLEFLATS, secthinkers); - break; - case 150: // Air bobbing platform case 151: // Adjustable air bobbing platform P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); From 6e8760524c9a0c7f12f001823a012656bca3bf37 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 20 Mar 2020 16:15:39 +0100 Subject: [PATCH 003/377] Implement water FOF types --- src/p_setup.c | 37 +++++++++++++++++++++++++++ src/p_spec.c | 69 ++++++++------------------------------------------- 2 files changed, 47 insertions(+), 59 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index e23b52357..6f4d1c317 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2841,6 +2841,43 @@ static void P_ConvertBinaryMap(void) lines[i].special = 100; break; + case 120: //FOF: water, opaque + case 121: //FOF: water, translucent + case 122: //FOF: water, opaque, no sides + case 123: //FOF: water, translucent, no sides + case 124: //FOF: goo water, translucent + case 125: //FOF: goo water, translucent, no sides + lines[i].args[0] = lines[i].tag; + + //Opaque? + if (lines[i].special == 120 || lines[i].special == 122) + lines[i].args[1] |= 1; + else + { + if (sides[lines[i].sidenum[0]].toptexture > 0) + lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; + else + lines[i].alpha = FRACUNIT/2; + } + + //No sides? + if (lines[i].special == 122 || lines[i].special == 123 || lines[i].special == 125) + lines[i].args[1] |= 2; + + //Flags + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[1] |= 4; + if (lines[i].flags & ML_EFFECT4) + lines[i].args[1] |= 8; + if (!(lines[i].flags & ML_EFFECT5)) + lines[i].args[1] |= 16; + + //Goo? + if (lines[i].special >= 124) + lines[i].args[1] |= 32; + + lines[i].special = 120; + break; case 140: //FOF: intangible from bottom, opaque case 141: //FOF: intangible from bottom, translucent case 142: //FOF: intangible from bottom, translucent, no sides diff --git a/src/p_spec.c b/src/p_spec.c index 121e1c11d..a558499be 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6807,69 +6807,20 @@ void P_SpawnSpecials(boolean fromnetsave) P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); break; - case 120: // Opaque water - ffloorflags = FF_EXISTS|FF_RENDERALL|FF_SWIMMABLE|FF_BOTHPLANES|FF_ALLSIDES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; - if (lines[i].flags & ML_NOCLIMB) - ffloorflags |= FF_DOUBLESHADOW; - if (lines[i].flags & ML_EFFECT4) - ffloorflags |= FF_COLORMAPONLY; - if (lines[i].flags & ML_EFFECT5) - ffloorflags |= FF_RIPPLE; - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - break; - - case 121: // TL water - ffloorflags = FF_EXISTS|FF_RENDERALL|FF_TRANSLUCENT|FF_SWIMMABLE|FF_BOTHPLANES|FF_ALLSIDES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; - if (lines[i].flags & ML_NOCLIMB) - ffloorflags |= FF_DOUBLESHADOW; - if (lines[i].flags & ML_EFFECT4) - ffloorflags |= FF_COLORMAPONLY; - if (lines[i].flags & ML_EFFECT5) - ffloorflags |= FF_RIPPLE; - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - break; - - case 122: // Opaque water, no sides + case 120: // FOF (water) ffloorflags = FF_EXISTS|FF_RENDERPLANES|FF_SWIMMABLE|FF_BOTHPLANES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; - if (lines[i].flags & ML_NOCLIMB) + if (!(lines[i].args[1] & 1)) + ffloorflags |= FF_TRANSLUCENT; + if (!(lines[i].args[1] & 2)) + ffloorflags |= FF_RENDERSIDES|FF_ALLSIDES; + if (lines[i].args[1] & 4) ffloorflags |= FF_DOUBLESHADOW; - if (lines[i].flags & ML_EFFECT4) + if (lines[i].args[1] & 8) ffloorflags |= FF_COLORMAPONLY; - if (lines[i].flags & ML_EFFECT5) - ffloorflags |= FF_RIPPLE; - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - break; - - case 123: // TL water, no sides - ffloorflags = FF_EXISTS|FF_RENDERPLANES|FF_TRANSLUCENT|FF_SWIMMABLE|FF_BOTHPLANES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; - if (lines[i].flags & ML_NOCLIMB) - ffloorflags |= FF_DOUBLESHADOW; - if (lines[i].flags & ML_EFFECT4) - ffloorflags |= FF_COLORMAPONLY; - if (lines[i].flags & ML_EFFECT5) - ffloorflags |= FF_RIPPLE; - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - break; - - case 124: // goo water - ffloorflags = FF_EXISTS|FF_RENDERALL|FF_TRANSLUCENT|FF_SWIMMABLE|FF_GOOWATER|FF_BOTHPLANES|FF_ALLSIDES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; - if (lines[i].flags & ML_NOCLIMB) - ffloorflags |= FF_DOUBLESHADOW; - if (lines[i].flags & ML_EFFECT4) - ffloorflags |= FF_COLORMAPONLY; - if (lines[i].flags & ML_EFFECT5) - ffloorflags |= FF_RIPPLE; - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - break; - - case 125: // goo water, no sides - ffloorflags = FF_EXISTS|FF_RENDERPLANES|FF_TRANSLUCENT|FF_SWIMMABLE|FF_GOOWATER|FF_BOTHPLANES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; - if (lines[i].flags & ML_NOCLIMB) - ffloorflags |= FF_DOUBLESHADOW; - if (lines[i].flags & ML_EFFECT4) - ffloorflags |= FF_COLORMAPONLY; - if (lines[i].flags & ML_EFFECT5) + if (!(lines[i].args[1] & 16)) ffloorflags |= FF_RIPPLE; + if (lines[i].args[1] & 32) + ffloorflags |= FF_GOOWATER; P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); break; From 61d903cb5be19e8eaed8a9962148c993ed1136ae Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 14 Apr 2020 01:34:11 +0200 Subject: [PATCH 004/377] Revise setup of solid FOFs --- src/p_setup.c | 45 ++++++++++++++++++++++++----------------- src/p_spec.c | 55 ++++++++++++++++++++++++++------------------------- 2 files changed, 55 insertions(+), 45 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 8ecfceeae..6eeeac5cd 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2813,25 +2813,27 @@ static void P_ConvertBinaryMap(void) else if (lines[i].special == 103) lines[i].args[1] = 1; + //Tangibility + if (lines[i].flags & ML_EFFECT1) + lines[i].args[2] |= 8; + if (lines[i].flags & ML_EFFECT2) + lines[i].args[2] |= 4; + //Translucency if (lines[i].special == 102) { - lines[i].args[2] = (lines[i].flags & ML_NOCLIMB) ? 2 : 1; + lines[i].args[3] |= 1; + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[1] |= 4; if (sides[lines[i].sidenum[0]].toptexture > 0) lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; else lines[i].alpha = FRACUNIT/2; } - //Tangibility - if (lines[i].flags & ML_EFFECT1) - lines[i].args[3] |= 8; - if (lines[i].flags & ML_EFFECT2) - lines[i].args[3] |= 4; - //Shadow? if (lines[i].special != 100 && (lines[i].special != 104 || !(lines[i].flags & ML_NOCLIMB))) - lines[i].args[4] = 1; + lines[i].args[3] |= 1; lines[i].special = 100; break; @@ -2887,27 +2889,34 @@ static void P_ConvertBinaryMap(void) else if (lines[i].special == 146) lines[i].args[1] = 1; + //Tangibility + if (lines[i].special <= 142) + lines[i].args[2] |= 2; + else if (lines[i].special <= 145) + lines[i].args[2] |= 1; + else + lines[i].args[2] |= 3; + + if (lines[i].flags & ML_EFFECT1) + lines[i].args[2] |= 8; + if (lines[i].flags & ML_EFFECT2) + lines[i].args[2] |= 4; + //Translucency if (lines[i].special == 141 || lines[i].special == 142 || lines[i].special == 144 || lines[i].special == 145) { - lines[i].args[2] = (lines[i].flags & ML_EFFECT2) ? 2 : 1; + lines[i].args[3] |= 1; + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[1] |= 4; if (sides[lines[i].sidenum[0]].toptexture > 0) lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; else lines[i].alpha = FRACUNIT/2; } - //Tangibility - if (lines[i].special <= 142) - lines[i].args[3] |= 2; - else if (lines[i].special <= 145) - lines[i].args[3] |= 1; - else - lines[i].args[3] |= 3; - //Shadow? if (lines[i].special != 146 && (lines[i].flags & ML_NOCLIMB)) - lines[i].args[4] = 1; + lines[i].args[3] |= 2; lines[i].special = 100; break; diff --git a/src/p_spec.c b/src/p_spec.c index 95addfbb8..ac45b6d07 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6757,43 +6757,44 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; //Visibility settings - if (lines[i].args[1] & 1) + if (lines[i].args[1] & 1) //Don't render planes ffloorflags &= ~FF_RENDERPLANES; - if (lines[i].args[1] & 2) + if (lines[i].args[1] & 2) //Don't render sides ffloorflags &= ~FF_RENDERSIDES; - - //Translucency settings are irrelevant for invisible FOFs - if (lines[i].args[1] != 3) + if (lines[i].args[1] & 4) //Render insides { - if (lines[i].args[2] == 0) //Opaque - { - if (lines[i].args[3] & 7) - { - //At least partially intangible: You can see it from the inside - ffloorflags |= FF_ALLSIDES; - //Unless the planes are invisible, render both sides. - if (!(lines[i].args[1] & 1)) - ffloorflags |= FF_BOTHPLANES; - } - else - ffloorflags |= FF_CUTLEVEL; - } - if (lines[i].args[2] == 1) //Translucent, don't render insides - ffloorflags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; - if (lines[i].args[2] == 2) //Translucent, render insides - ffloorflags |= FF_TRANSLUCENT|FF_CUTEXTRA|FF_BOTHPLANES|FF_ALLSIDES; + if (ffloorflags & FF_RENDERPLANES) + ffloorflags |= FF_BOTHPLANES; + if (ffloorflags & FF_RENDERSIDES) + ffloorflags |= FF_ALLSIDES; } - if (lines[i].args[3] & 1) + //Tangibility settings + if (lines[i].args[2] & 1) //Intangible from top ffloorflags |= FF_REVERSEPLATFORM; - if (lines[i].args[3] & 2) + if (lines[i].args[2] & 2) //Intangible from bottom ffloorflags |= FF_PLATFORM; - if (lines[i].args[3] & 4) + if (lines[i].args[2] & 4) //Don't block player ffloorflags &= ~FF_BLOCKPLAYER; - if (lines[i].args[3] & 8) + if (lines[i].args[2] & 8) //Don't block others ffloorflags &= ~FF_BLOCKOTHERS; - if (lines[i].args[4]) + + //Appearance settings + if ((lines[i].args[3] & 1) && (ffloorflags & FF_RENDERALL)) //Translucent + ffloorflags |= FF_TRANSLUCENT; + if (lines[i].args[3] & 2) //Don't cast shadow ffloorflags |= FF_NOSHADE; + + //Cutting options + if (ffloorflags & FF_RENDERALL) + { + //If translucent or player can enter it, cut inner walls + if ((ffloorflags & FF_TRANSLUCENT) || (lines[i].args[2] & 7)) + ffloorflags |= FF_CUTEXTRA|FF_EXTRA; + else + ffloorflags |= FF_CUTLEVEL; + } + P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); break; From 7f889532eac4d4eb63b3ef0491ed74213f92a776 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 14 Apr 2020 09:00:26 +0200 Subject: [PATCH 005/377] Adapt solid FOF setup in UDB config --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 24 ++++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 707396078..64bc00450 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1537,30 +1537,24 @@ udmf { 1 = "Don't render planes"; 2 = "Don't render sides"; + 4 = "Render insides"; } } arg2 - { - title = "Translucency"; - type = 11; - enum - { - 0 = "Opaque"; - 1 = "Translucent, no insides"; - 2 = "Translucent, render insides"; - } - } - arg3 { title = "Tangibility"; type = 12; enum = "tangibility"; } - arg4 + arg3 { - title = "Cast shadow?"; - type = 11; - enum = "yesno"; + title = "Appearance"; + type = 12; + enum + { + 1 = "Translucent"; + 2 = "No shadow"; + } } } From 60e589e92a2f5cc59321342d727375008edd2129 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 14 Apr 2020 09:03:00 +0200 Subject: [PATCH 006/377] Implement FOF types 200-201 --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 17 +++++++++++++++++ src/p_setup.c | 7 +++++++ src/p_spec.c | 11 +++++------ 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 64bc00450..e7d7b4337 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1584,6 +1584,23 @@ udmf } } + 200 + { + title = "Light Block"; + prefix = "(200); + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Expand to bottom?"; + type = 11; + enum = "noyes"; + } + } + linedefexecmisc { title = "Linedef Executor (misc.)"; diff --git a/src/p_setup.c b/src/p_setup.c index 6eeeac5cd..4379425df 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2920,6 +2920,13 @@ static void P_ConvertBinaryMap(void) lines[i].special = 100; break; + case 200: //FOF: Light block + case 201: //FOF: Half light block + lines[i].args[0] = lines[i].tag; + if (lines[i].special == 201) + lines[i].args[1] = 1; + lines[i].special = 200; + break; case 443: //Call Lua function if (lines[i].text) { diff --git a/src/p_spec.c b/src/p_spec.c index ac45b6d07..d10d72a0f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6943,12 +6943,11 @@ void P_SpawnSpecials(boolean fromnetsave) P_AddRaiseThinker(lines[i].frontsector, &lines[i]); break; - case 200: // Double light effect - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_CUTSPRITES|FF_DOUBLESHADOW, secthinkers); - break; - - case 201: // Light effect - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_CUTSPRITES, secthinkers); + case 200: // Light block + ffloorflags = FF_EXISTS|FF_CUTSPRITES; + if (!lines[i].args[1]) + ffloorflags |= FF_DOUBLESHADOW; + P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); break; case 202: // Fog From fdb46e5d14f78df255c02df953790b963b8c61fd Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 14 Apr 2020 09:06:02 +0200 Subject: [PATCH 007/377] Implement FOF types 202 and 223 --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 22 ++++++++++++++++++++ src/p_setup.c | 4 ++++ 2 files changed, 26 insertions(+) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index e7d7b4337..1bd5055e2 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1601,6 +1601,28 @@ udmf } } + 202 + { + title = "Fog Block"; + prefix = "(202); + arg0 + { + title = "Target sector tag"; + type = 13; + } + } + + 223 + { + title = "Intangible, Invisible"; + prefix = "(223); + arg0 + { + title = "Target sector tag"; + type = 13; + } + } + linedefexecmisc { title = "Linedef Executor (misc.)"; diff --git a/src/p_setup.c b/src/p_setup.c index 4379425df..cf5dbcbc7 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2927,6 +2927,10 @@ static void P_ConvertBinaryMap(void) lines[i].args[1] = 1; lines[i].special = 200; break; + case 202: //FOF: Fog block + case 223: //FOF: Intangible, invisible + lines[i].args[0] = lines[i].tag; + break; case 443: //Call Lua function if (lines[i].text) { From 916f831edbeba5f1ec9cd26714342cf2ffd471b4 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 14 Apr 2020 09:14:10 +0200 Subject: [PATCH 008/377] Implement linedef type 250 --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 21 ++++++++++++++++++++ src/p_setup.c | 7 +++++++ src/p_spec.c | 4 ++-- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 1bd5055e2..528690dc4 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1623,6 +1623,27 @@ udmf } } + 250 + { + title = "Mario Block"; + prefix = "(250); + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Block type"; + type = 12; + enum + { + 1 = "Brick"; + 2 = "Invisible"; + } + } + } + linedefexecmisc { title = "Linedef Executor (misc.)"; diff --git a/src/p_setup.c b/src/p_setup.c index cf5dbcbc7..92eaff4b5 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2931,6 +2931,13 @@ static void P_ConvertBinaryMap(void) case 223: //FOF: Intangible, invisible lines[i].args[0] = lines[i].tag; break; + case 250: //FOF: Mario block + lines[i].args[0] = lines[i].tag; + if (lines[i].flags & ML_NOCLIMB) //Brick block + lines[i].args[1] |= 1; + if (lines[i].flags & ML_EFFECT1) //Invisible + lines[i].args[1] |= 2; + break; case 443: //Call Lua function if (lines[i].text) { diff --git a/src/p_spec.c b/src/p_spec.c index d10d72a0f..94e6aa936 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6987,9 +6987,9 @@ void P_SpawnSpecials(boolean fromnetsave) case 250: // Mario Block ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_MARIO; - if (lines[i].flags & ML_NOCLIMB) + if (lines[i].args[1] & 1) //Brick block ffloorflags |= FF_SHATTERBOTTOM; - if (lines[i].flags & ML_EFFECT1) + if (lines[i].args[1] & 2) // Invisible ffloorflags &= ~(FF_SOLID|FF_RENDERALL|FF_CUTLEVEL); P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); From 32a1131c68060a6abb33c04132984f26831211a6 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 14 Apr 2020 09:43:49 +0200 Subject: [PATCH 009/377] Implement FOF type 251 --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 24 ++++++++++++++++++++ src/p_floor.c | 17 ++++---------- src/p_setup.c | 20 ++++++++++++++++ src/p_spec.c | 2 +- 4 files changed, 50 insertions(+), 13 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 528690dc4..c63947f65 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1644,6 +1644,30 @@ udmf } } + 251 + { + title = "Thwomp Block"; + prefix = "(251); + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Falling speed"; + } + arg2 + { + title = "Rising speed"; + } + stringarg0 + { + title = "Crushing sound"; + type = 2; + } + } + linedefexecmisc { title = "Linedef Executor (misc.)"; diff --git a/src/p_floor.c b/src/p_floor.c index b8b40df3c..d9b404155 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -11,6 +11,7 @@ /// \file p_floor.c /// \brief Floor animation, elevators +#include "dehacked.h" #include "doomdef.h" #include "doomstat.h" #include "m_random.h" @@ -1885,10 +1886,7 @@ void T_ThwompSector(levelspecthink_t *thwomp) sides[thwomp->sourceline->sidenum[0]].midtexture = sides[thwomp->sourceline->sidenum[0]].bottomtexture; /// \note this should only have to be done once, but is already done repeatedly, above - if (thwomp->sourceline->flags & ML_EFFECT5) - thwomp->speed = thwomp->sourceline->dx/8; - else - thwomp->speed = 2*FRACUNIT; + thwomp->speed = thwomp->sourceline->args[2] << (FRACBITS - 3); res = T_MovePlane ( @@ -1924,10 +1922,7 @@ void T_ThwompSector(levelspecthink_t *thwomp) // Set the texture from the upper one (angry) sides[thwomp->sourceline->sidenum[0]].midtexture = sides[thwomp->sourceline->sidenum[0]].toptexture; - if (thwomp->sourceline->flags & ML_EFFECT5) - thwomp->speed = thwomp->sourceline->dy/8; - else - thwomp->speed = 10*FRACUNIT; + thwomp->speed = thwomp->sourceline->args[1] << (FRACBITS - 3); res = T_MovePlane ( @@ -1961,10 +1956,8 @@ void T_ThwompSector(levelspecthink_t *thwomp) if (!rover || (rover->flags & FF_EXISTS)) { - if (thwomp->sourceline->flags & ML_EFFECT4) - S_StartSound(mp, sides[thwomp->sourceline->sidenum[0]].textureoffset>>FRACBITS); - else - S_StartSound(mp, sfx_thwomp); + sfxenum_t sound = (thwomp->sourceline->stringargs[0]) ? get_number(thwomp->sourceline->stringargs[0]) : sfx_thwomp; + S_StartSound(mp, sound); } thwomp->direction = 1; // start heading back up diff --git a/src/p_setup.c b/src/p_setup.c index 92eaff4b5..82671abb0 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2938,6 +2938,26 @@ static void P_ConvertBinaryMap(void) if (lines[i].flags & ML_EFFECT1) //Invisible lines[i].args[1] |= 2; break; + case 251: //FOF: Thwomp block + lines[i].args[0] = lines[i].tag; + if (lines[i].flags & ML_EFFECT5) //Custom speeds + { + lines[i].args[1] = lines[i].dy >> FRACBITS; + lines[i].args[2] = lines[i].dx >> FRACBITS; + } + else + { + lines[i].args[1] = 80; + lines[i].args[2] = 16; + } + if (lines[i].flags & ML_EFFECT4) + { + char buffer[6]; + sprintf(buffer, "%d", sides[lines[i].sidenum[0]].textureoffset >> FRACBITS); + lines[i].stringargs[0] = Z_Malloc(strlen(buffer) + 1, PU_LEVEL, NULL); + M_Memcpy(lines[i].stringargs[0], buffer, strlen(buffer) + 1); + } + break; case 443: //Call Lua function if (lines[i].text) { diff --git a/src/p_spec.c b/src/p_spec.c index 94e6aa936..774c7162a 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6997,7 +6997,7 @@ void P_SpawnSpecials(boolean fromnetsave) case 251: // A THWOMP! sec = sides[*lines[i].sidenum].sector - sectors; - for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;) + for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0], s)) >= 0 ;) { P_AddThwompThinker(§ors[sec], §ors[s], &lines[i]); P_AddFakeFloor(§ors[s], §ors[sec], lines + i, From 9fc2b5b1b9b324cf03c77a96cb612ab8f8b6e634 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 14 Apr 2020 09:51:48 +0200 Subject: [PATCH 010/377] Implement FOF type 258 --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 157 ++++++++++--------- src/p_setup.c | 5 + src/p_spec.c | 4 +- 3 files changed, 94 insertions(+), 72 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index c63947f65..0847826d4 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1582,89 +1582,106 @@ udmf } } } - } - 200 - { - title = "Light Block"; - prefix = "(200); - arg0 + 200 { - title = "Target sector tag"; - type = 13; - } - arg1 - { - title = "Expand to bottom?"; - type = 11; - enum = "noyes"; - } - } - - 202 - { - title = "Fog Block"; - prefix = "(202); - arg0 - { - title = "Target sector tag"; - type = 13; - } - } - - 223 - { - title = "Intangible, Invisible"; - prefix = "(223); - arg0 - { - title = "Target sector tag"; - type = 13; - } - } - - 250 - { - title = "Mario Block"; - prefix = "(250); - arg0 - { - title = "Target sector tag"; - type = 13; - } - arg1 - { - title = "Block type"; - type = 12; - enum + title = "Light Block"; + prefix = "(200); + arg0 { - 1 = "Brick"; - 2 = "Invisible"; + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Expand to bottom?"; + type = 11; + enum = "noyes"; } } - } - 251 - { - title = "Thwomp Block"; - prefix = "(251); - arg0 + 202 { - title = "Target sector tag"; - type = 13; + title = "Fog Block"; + prefix = "(202); + arg0 + { + title = "Target sector tag"; + type = 13; + } } - arg1 + + 223 { - title = "Falling speed"; + title = "Intangible, Invisible"; + prefix = "(223); + arg0 + { + title = "Target sector tag"; + type = 13; + } } - arg2 + + 250 { - title = "Rising speed"; + title = "Mario Block"; + prefix = "(250); + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Block type"; + type = 12; + enum + { + 1 = "Brick"; + 2 = "Invisible"; + } + } } - stringarg0 + + 251 { - title = "Crushing sound"; - type = 2; + title = "Thwomp Block"; + prefix = "(251); + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Falling speed"; + } + arg2 + { + title = "Rising speed"; + } + stringarg0 + { + title = "Crushing sound"; + type = 2; + } + } + + 258 + { + title = "Laser"; + prefix = "(258)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Damage bosses?"; + type = 11; + enum = "yesno"; + } } } diff --git a/src/p_setup.c b/src/p_setup.c index 82671abb0..7c8a8c147 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2958,6 +2958,11 @@ static void P_ConvertBinaryMap(void) M_Memcpy(lines[i].stringargs[0], buffer, strlen(buffer) + 1); } break; + case 258: //FOF: Laser + lines[i].args[0] = lines[i].tag; + if (lines[i].flags & ML_EFFECT1) + lines[i].args[1] = 1; + break; case 443: //Call Lua function if (lines[i].text) { diff --git a/src/p_spec.c b/src/p_spec.c index 774c7162a..5288d2773 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6293,7 +6293,7 @@ void T_LaserFlash(laserthink_t *flash) { thing = node->m_thing; - if ((fflr->master->flags & ML_EFFECT1) + if ((fflr->master->args[1]) && thing->flags & MF_BOSS) continue; // Don't hurt bosses @@ -7045,7 +7045,7 @@ void P_SpawnSpecials(boolean fromnetsave) sec = sides[*lines[i].sidenum].sector - sectors; // No longer totally disrupts netgames - for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;) + for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0], s)) >= 0 ;) EV_AddLaserThinker(§ors[s], §ors[sec], lines + i, secthinkers); break; From f8c51ccde341582e831f19dbd5ece3e68c87a4aa Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 14 Apr 2020 10:13:38 +0200 Subject: [PATCH 011/377] Implement FOF types 220-222 --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 32 ++++++++++++++++++ src/p_setup.c | 25 ++++++++++++++ src/p_spec.c | 35 +++++++++++--------- 3 files changed, 76 insertions(+), 16 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 0847826d4..1ee245d08 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1611,6 +1611,38 @@ udmf } } + 220 + { + title = "Intangible"; + prefix = "(220)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Visibility"; + type = 12; + enum + { + 1 = "Don't render planes"; + 2 = "Don't render sides"; + 4 = "Don't render insides"; + } + } + arg2 + { + title = "Appearance"; + type = 12; + enum + { + 1 = "Translucent"; + 2 = "No shadow"; + } + } + } + 223 { title = "Intangible, Invisible"; diff --git a/src/p_setup.c b/src/p_setup.c index 7c8a8c147..55eacc6e4 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2931,6 +2931,31 @@ static void P_ConvertBinaryMap(void) case 223: //FOF: Intangible, invisible lines[i].args[0] = lines[i].tag; break; + case 220: //FOF: Intangible, opaque + case 221: //FOF: Intangible, translucent + case 222: //FOF: Intangible, sides only + lines[i].args[0] = lines[i].tag; + + //Visibility + if (lines[i].special == 222) + lines[i].args[1] |= 1; //Don't render planes + if (lines[i].special != 220) + lines[i].args[1] |= 4; //Don't render insides + + //Appearance + if (lines[i].special == 221) + { + lines[i].args[2] |= 1; //Translucent + if (sides[lines[i].sidenum[0]].toptexture > 0) + lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; + else + lines[i].alpha = FRACUNIT/2; + } + if (lines[i].special != 220 && !(lines[i].flags & ML_NOCLIMB)) + lines[i].args[2] |= 2; //Don't cast shadow + + lines[i].special = 220; + break; case 250: //FOF: Mario block lines[i].args[0] = lines[i].tag; if (lines[i].flags & ML_NOCLIMB) //Brick block diff --git a/src/p_spec.c b/src/p_spec.c index 5288d2773..2bcd2a9e5 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6959,28 +6959,31 @@ void P_SpawnSpecials(boolean fromnetsave) P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); break; - case 220: // Like opaque water, but not swimmable. (Good for snow effect on FOFs) - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_RENDERALL|FF_BOTHPLANES|FF_ALLSIDES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES, secthinkers); - break; + case 220: //Intangible + ffloorflags = FF_EXISTS|FF_RENDERALL|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; - case 221: // FOF (intangible, translucent) - // If line has no-climb set, give it shadows, otherwise don't - ffloorflags = FF_EXISTS|FF_RENDERALL|FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA|FF_CUTSPRITES; - if (!(lines[i].flags & ML_NOCLIMB)) + //Visibility settings + if (lines[i].args[1] & 1) //Don't render planes + ffloorflags &= ~FF_RENDERPLANES; + if (lines[i].args[1] & 2) //Don't render sides + ffloorflags &= ~FF_RENDERSIDES; + if (!(lines[i].args[1] & 4)) //Render insides + { + if (ffloorflags & FF_RENDERPLANES) + ffloorflags |= FF_BOTHPLANES; + if (ffloorflags & FF_RENDERSIDES) + ffloorflags |= FF_ALLSIDES; + } + + //Appearance settings + if ((lines[i].args[2] & 1) && (ffloorflags & FF_RENDERALL)) //Translucent + ffloorflags |= FF_TRANSLUCENT; + if (lines[i].args[2] & 2) //Don't cast shadow ffloorflags |= FF_NOSHADE; P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); break; - case 222: // FOF with no floor/ceiling (good for GFZGRASS effect on FOFs) - // If line has no-climb set, give it shadows, otherwise don't - ffloorflags = FF_EXISTS|FF_RENDERSIDES|FF_ALLSIDES; - if (!(lines[i].flags & ML_NOCLIMB)) - ffloorflags |= FF_NOSHADE|FF_CUTSPRITES; - - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - break; - case 223: // FOF (intangible, invisible) - for combining specials in a sector P_AddFakeFloorsByLine(i, FF_EXISTS|FF_NOSHADE, secthinkers); break; From 15defaebeb1bae71c71eafe88f071d8d1631e033 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 14 Apr 2020 10:14:56 +0200 Subject: [PATCH 012/377] Render insides on FOF type 222 --- src/p_setup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_setup.c b/src/p_setup.c index 55eacc6e4..dfaa23c75 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2939,7 +2939,7 @@ static void P_ConvertBinaryMap(void) //Visibility if (lines[i].special == 222) lines[i].args[1] |= 1; //Don't render planes - if (lines[i].special != 220) + if (lines[i].special == 221) lines[i].args[1] |= 4; //Don't render insides //Appearance From e3b86d0c7492665986dc6198d5f2ec36f000d3bc Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 14 Apr 2020 11:45:37 +0200 Subject: [PATCH 013/377] Implement FOF types 252-256 --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 45 ++++++++++++++++++ src/p_mobj.c | 4 +- src/p_setup.c | 39 ++++++++++++++++ src/p_spec.c | 49 +++++++++++--------- src/p_user.c | 4 +- 5 files changed, 114 insertions(+), 27 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 1ee245d08..c592b09d9 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1699,6 +1699,51 @@ udmf } } + 252 + { + title = "Bustable Block"; + prefix = "(252)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Bustable type"; + type = 11; + enum + { + 0 = "Touch"; + 1 = "Spin"; + 2 = "Regular"; + 3 = "Strong"; + } + } + arg2 + { + title = "Translucent?" + type = 11; + enum = "noyes"; + } + arg3 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Bustable by pushables"; + 2 = "Trigger linedef executor"; + 4 = "Only bustable from below"; + } + } + arg4 + { + title = "Linedef executor tag"; + type = 15; + } + } + 258 { title = "Laser"; diff --git a/src/p_mobj.c b/src/p_mobj.c index b27d27a76..617c3bdd1 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1688,8 +1688,8 @@ static void P_PushableCheckBustables(mobj_t *mo) if (!(rover->flags & FF_BUSTUP)) continue; - // Needs ML_EFFECT4 flag for pushables to break it - if (!(rover->master->flags & ML_EFFECT4)) continue; + // Bustable by pushables? + if (!(rover->master->args[3] & 1)) continue; if (!rover->master->frontsector->crumblestate) { diff --git a/src/p_setup.c b/src/p_setup.c index dfaa23c75..57e12d34c 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2983,6 +2983,45 @@ static void P_ConvertBinaryMap(void) M_Memcpy(lines[i].stringargs[0], buffer, strlen(buffer) + 1); } break; + case 252: //FOF: Shatter block + case 253: //FOF: Shatter block, translucent + case 254: //FOF: Bustable block + case 255: //FOF: Spin-bustable block + case 256: //FOF: Spin-bustable block, translucent + lines[i].args[0] = lines[i].tag; + + //Bustable type + if (lines[i].special <= 253) + lines[i].args[1] = 0; + else if (lines[i].special >= 255) + lines[i].args[1] = 1; + else if (lines[i].flags & ML_NOCLIMB) + lines[i].args[1] = 3; + else + lines[i].args[1] = 2; + + //Translucency + if (lines[i].special == 253 || lines[i].special == 256) + { + lines[i].args[2] = 1; + if (sides[lines[i].sidenum[0]].toptexture > 0) + lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; + else + lines[i].alpha = FRACUNIT/2; + } + + if (lines[i].flags & ML_EFFECT4) + lines[i].args[3] |= 1; //Bustable by pushables + if (lines[i].flags & ML_EFFECT5) + { + lines[i].args[3] |= 2; //Trigger linedef executor + lines[i].args[4] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + } + if (lines[i].special == 252 && lines[i].flags & ML_NOCLIMB) + lines[i].args[4] |= 4; //Bust only from below + + lines[i].special = 254; + break; case 258: //FOF: Laser lines[i].args[0] = lines[i].tag; if (lines[i].flags & ML_EFFECT1) diff --git a/src/p_spec.c b/src/p_spec.c index 2bcd2a9e5..e41e30d05 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7008,34 +7008,37 @@ void P_SpawnSpecials(boolean fromnetsave) } break; - case 252: // Shatter block (breaks when touched) - ffloorflags = FF_EXISTS|FF_BLOCKOTHERS|FF_RENDERALL|FF_BUSTUP|FF_SHATTER; - if (lines[i].flags & ML_NOCLIMB) - ffloorflags |= FF_BLOCKPLAYER|FF_SHATTERBOTTOM; - - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - break; - - case 253: // Translucent shatter block (see 76) - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_BLOCKOTHERS|FF_RENDERALL|FF_BUSTUP|FF_SHATTER|FF_TRANSLUCENT, secthinkers); - break; - case 254: // Bustable block - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_BUSTUP; - if (lines[i].flags & ML_NOCLIMB) - ffloorflags |= FF_STRONGBUST; + ffloorflags = FF_EXISTS|FF_BLOCKOTHERS|FF_RENDERALL|FF_BUSTUP; + + //Bustable type + switch (lines[i].args[1]) + { + case 0: + ffloorflags |= FF_SHATTER; + break; + case 1: + ffloorflags |= FF_SPINBUST; + break; + case 3: + ffloorflags |= FF_STRONGBUST; + break; + default: + break; + } + + if (lines[i].args[2]) + ffloorflags |= FF_TRANSLUCENT; + + if (lines[i].args[2] & 4) + ffloorflags |= FF_SHATTERBOTTOM; + + if (!(ffloorflags & FF_SHATTER) || ffloorflags & FF_SHATTERBOTTOM) + ffloorflags |= FF_BLOCKPLAYER; P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); break; - case 255: // Spin bust block (breaks when jumped or spun downwards onto) - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_BUSTUP|FF_SPINBUST, secthinkers); - break; - - case 256: // Translucent spin bust block (see 78) - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_BUSTUP|FF_SPINBUST|FF_TRANSLUCENT, secthinkers); - break; - case 257: // Quicksand ffloorflags = FF_EXISTS|FF_QUICKSAND|FF_RENDERALL|FF_ALLSIDES|FF_CUTSPRITES; if (lines[i].flags & ML_EFFECT5) diff --git a/src/p_user.c b/src/p_user.c index c12bc0c59..aa732bc63 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2659,8 +2659,8 @@ static void P_CheckBustableBlocks(player_t *player) EV_CrumbleChain(NULL, rover); // node->m_sector // Run a linedef executor?? - if (rover->master->flags & ML_EFFECT5) - P_LinedefExecute((INT16)(P_AproxDistance(rover->master->dx, rover->master->dy)>>FRACBITS), player->mo, node->m_sector); + if (rover->master->args[3] & 2) + P_LinedefExecute((INT16)(rover->master->args[4]), player->mo, node->m_sector); goto bustupdone; } From 5389344a32142ff570d1d6de0a1042ef98987a22 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 14 Apr 2020 11:56:11 +0200 Subject: [PATCH 014/377] Implement FOF type 257 --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 25 ++++++++++++++++++++ src/p_setup.c | 7 ++++++ src/p_spec.c | 2 +- src/p_user.c | 4 ++-- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index c592b09d9..dcff6927b 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1744,6 +1744,31 @@ udmf } } + 257 + { + title = "Quicksand"; + prefix = "(257)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Ripple effect?"; + type = 11; + enum = "yesno"; + } + arg2 + { + title = "Sinking speed"; + } + arg3 + { + title = "Friction"; + } + } + 258 { title = "Laser"; diff --git a/src/p_setup.c b/src/p_setup.c index 57e12d34c..1af4803d6 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3022,6 +3022,13 @@ static void P_ConvertBinaryMap(void) lines[i].special = 254; break; + case 257: //FOF: Quicksand + lines[i].args[0] = lines[i].tag; + if (!(lines[i].flags & ML_EFFECT5)) + lines[i].args[1] = 1; //No ripple effect + lines[i].args[2] = lines[i].dx >> FRACBITS; //Sinking speed + lines[i].args[3] = lines[i].dy >> FRACBITS; //Friction + break; case 258: //FOF: Laser lines[i].args[0] = lines[i].tag; if (lines[i].flags & ML_EFFECT1) diff --git a/src/p_spec.c b/src/p_spec.c index e41e30d05..1a1cb8990 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7041,7 +7041,7 @@ void P_SpawnSpecials(boolean fromnetsave) case 257: // Quicksand ffloorflags = FF_EXISTS|FF_QUICKSAND|FF_RENDERALL|FF_ALLSIDES|FF_CUTSPRITES; - if (lines[i].flags & ML_EFFECT5) + if (!(lines[i].args[1])) ffloorflags |= FF_RIPPLE; P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); diff --git a/src/p_user.c b/src/p_user.c index aa732bc63..c1ceadad3 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2844,7 +2844,7 @@ static void P_CheckQuicksand(player_t *player) if (topheight >= player->mo->z && bottomheight < player->mo->z + player->mo->height) { - sinkspeed = abs(rover->master->v1->x - rover->master->v2->x)>>1; + sinkspeed = abs(rover->master->args[2]) << (FRACBITS - 1); sinkspeed = FixedDiv(sinkspeed,TICRATE*FRACUNIT); @@ -2873,7 +2873,7 @@ static void P_CheckQuicksand(player_t *player) P_PlayerHitFloor(player, false); } - friction = abs(rover->master->v1->y - rover->master->v2->y)>>6; + friction = abs(rover->master->args[3]) << (FRACBITS - 6); player->mo->momx = FixedMul(player->mo->momx, friction); player->mo->momy = FixedMul(player->mo->momy, friction); From f81559721916a4d6044ffe51ec3dea0c2b19872b Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 15 Apr 2020 09:44:33 +0200 Subject: [PATCH 015/377] Implement FOF types 170-180 --- src/p_floor.c | 12 ++--- src/p_setup.c | 28 ++++++++++++ src/p_spec.c | 124 +++++++++++++++++++------------------------------- 3 files changed, 80 insertions(+), 84 deletions(-) diff --git a/src/p_floor.c b/src/p_floor.c index d9b404155..a88555f9b 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -972,7 +972,7 @@ void T_StartCrumble(elevator_t *elevator) } else if (++elevator->distance == 0) // Reposition back to original spot { - for (i = -1; (i = P_FindSectorFromTag(elevator->sourceline->tag, i)) >= 0 ;) + for (i = -1; (i = P_FindSectorFromTag(elevator->sourceline->args[0], i)) >= 0 ;) { sector = §ors[i]; @@ -1003,7 +1003,7 @@ void T_StartCrumble(elevator_t *elevator) // Flash to indicate that the platform is about to return. if (elevator->distance > -224 && (leveltime % ((abs(elevator->distance)/8) + 1) == 0)) { - for (i = -1; (i = P_FindSectorFromTag(elevator->sourceline->tag, i)) >= 0 ;) + for (i = -1; (i = P_FindSectorFromTag(elevator->sourceline->args[0], i)) >= 0 ;) { sector = §ors[i]; @@ -1099,7 +1099,7 @@ void T_StartCrumble(elevator_t *elevator) P_RemoveThinker(&elevator->thinker); } - for (i = -1; (i = P_FindSectorFromTag(elevator->sourceline->tag, i)) >= 0 ;) + for (i = -1; (i = P_FindSectorFromTag(elevator->sourceline->args[0], i)) >= 0 ;) { sector = §ors[i]; sector->moved = true; @@ -2423,7 +2423,7 @@ void T_RaiseSector(levelspecthink_t *raise) if (raise->sector->crumblestate >= 3 || raise->sector->ceilingdata) return; - for (i = -1; (i = P_FindSectorFromTag(raise->sourceline->tag, i)) >= 0 ;) + for (i = -1; (i = P_FindSectorFromTag(raise->sourceline->args[0], i)) >= 0 ;) { sector = §ors[i]; @@ -2616,7 +2616,7 @@ void T_RaiseSector(levelspecthink_t *raise) raise->sector->ceilspeed = 42; raise->sector->floorspeed = raise->vars[3]*raise->vars[8]; - for (i = -1; (i = P_FindSectorFromTag(raise->sourceline->tag, i)) >= 0 ;) + for (i = -1; (i = P_FindSectorFromTag(raise->sourceline->args[0], i)) >= 0 ;) P_RecalcPrecipInSector(§ors[i]); } @@ -3335,7 +3335,7 @@ INT32 EV_StartCrumble(sector_t *sec, ffloor_t *rover, boolean floating, elevator->sector->crumblestate = 2; - for (i = -1; (i = P_FindSectorFromTag(elevator->sourceline->tag, i)) >= 0 ;) + for (i = -1; (i = P_FindSectorFromTag(elevator->sourceline->args[0], i)) >= 0 ;) { foundsec = §ors[i]; diff --git a/src/p_setup.c b/src/p_setup.c index 1af4803d6..6b7f59327 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2920,6 +2920,34 @@ static void P_ConvertBinaryMap(void) lines[i].special = 100; break; + case 170: //FOF: Crumbling, respawn + case 171: //FOF: Crumbling, no respawn + case 172: //FOF: Crumbling, respawn, intangible from bottom + case 173: //FOF: Crumbling, no respawn, intangible from bottom + case 174: //FOF: Crumbling, respawn, intangible from bottom, translucent + case 175: //FOF: Crumbling, no respawn, intangible from bottom, translucent + case 176: //FOF: Crumbling, respawn, floating, bobbing + case 177: //FOF: Crumbling, no respawn, floating, bobbing + case 178: //FOF: Crumbling, respawn, floating + case 179: //FOF: Crumbling, no respawn, floating + case 180: //FOF: Crumbling, respawn, air bobbing + lines[i].args[0] = lines[i].tag; + if (lines[i].special >= 172 && lines[i].special <= 175) + { + lines[i].args[1] |= 2; //Intangible from below + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[2] |= 2; //Don't cast shadow + } + if (lines[i].special >= 174 && lines[i].special <= 175) + lines[i].args[2] |= 1; //Translucent + if (lines[i].special % 2 == 1) + lines[i].args[2] |= 4; //Don't respawn + if (lines[i].special == 176 || lines[i].special == 177 || lines[i].special == 180) + lines[i].args[2] |= 8; //Air bobbing + if (lines[i].special >= 176 && lines[i].special <= 179) + lines[i].args[2] |= 16; //Float on water + lines[i].special = 170; + break; case 200: //FOF: Light block case 201: //FOF: Half light block lines[i].args[0] = lines[i].tag; diff --git a/src/p_spec.c b/src/p_spec.c index 1a1cb8990..57e9c22aa 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6093,7 +6093,7 @@ static void P_AddRaiseThinker(sector_t *sec, line_t *sourceline) raise->sourceline = sourceline; } -static void P_AddAirbob(sector_t *sec, line_t *sourceline, boolean noadjust, boolean dynamic) +static void P_AddAirbob(sector_t *sec, line_t *sourceline, fixed_t dist, boolean raise, boolean dynamic, boolean spindash) { levelspecthink_t *airbob; @@ -6106,26 +6106,18 @@ static void P_AddAirbob(sector_t *sec, line_t *sourceline, boolean noadjust, boo airbob->sector = sec; // Require a spindash to activate - if (sourceline->flags & ML_NOCLIMB) - airbob->vars[1] = 1; - else - airbob->vars[1] = 0; + airbob->vars[1] = spindash ? 1 : 0; airbob->vars[2] = FRACUNIT; - if (noadjust) - airbob->vars[7] = airbob->sector->ceilingheight-16*FRACUNIT; - else - airbob->vars[7] = airbob->sector->ceilingheight - P_AproxDistance(sourceline->dx, sourceline->dy); + airbob->vars[7] = airbob->sector->ceilingheight - dist; + airbob->vars[6] = airbob->vars[7] - (sec->ceilingheight - sec->floorheight); airbob->vars[3] = airbob->vars[2]; - if (sourceline->flags & ML_BLOCKMONSTERS) - airbob->vars[0] = 1; - else - airbob->vars[0] = 0; + airbob->vars[0] = raise ? 0 : 1; airbob->vars[5] = sec->ceilingheight; airbob->vars[4] = airbob->vars[5] @@ -6817,18 +6809,19 @@ void P_SpawnSpecials(boolean fromnetsave) case 150: // Air bobbing platform case 151: // Adjustable air bobbing platform + { + fixed_t dist = (lines[i].special == 151) ? P_AproxDistance(lines[i].dx, lines[i].dy) : 16*FRACUNIT; P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); - lines[i].flags |= ML_BLOCKMONSTERS; - P_AddAirbob(lines[i].frontsector, lines + i, (lines[i].special != 151), false); + P_AddAirbob(lines[i].frontsector, lines + i, dist, false, false, !!(lines[i].flags & ML_NOCLIMB)); break; + } case 152: // Adjustable air bobbing platform in reverse P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); - P_AddAirbob(lines[i].frontsector, lines + i, true, false); + P_AddAirbob(lines[i].frontsector, lines + i, P_AproxDistance(lines[i].dx, lines[i].dy), true, false, !!(lines[i].flags & ML_NOCLIMB)); break; case 153: // Dynamic Sinking Platform P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); - lines[i].flags |= ML_BLOCKMONSTERS; - P_AddAirbob(lines[i].frontsector, lines + i, false, true); + P_AddAirbob(lines[i].frontsector, lines + i, P_AproxDistance(lines[i].dx, lines[i].dy), false, true, !!(lines[i].flags & ML_NOCLIMB)); break; case 160: // Float/bob platform @@ -6836,71 +6829,46 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 170: // Crumbling platform - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_CRUMBLE, secthinkers); - break; + ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CRUMBLE; - case 171: // Crumbling platform that will not return - P_AddFakeFloorsByLine(i, - FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_CRUMBLE|FF_NORETURN, secthinkers); - break; + //Tangibility settings + if (lines[i].args[1] & 1) //Intangible from top + ffloorflags |= FF_REVERSEPLATFORM; + if (lines[i].args[1] & 2) //Intangible from bottom + ffloorflags |= FF_PLATFORM; + if (lines[i].args[1] & 4) //Don't block player + ffloorflags &= ~FF_BLOCKPLAYER; + if (lines[i].args[1] & 8) //Don't block others + ffloorflags &= ~FF_BLOCKOTHERS; - case 172: // "Platform" that crumbles and returns - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_PLATFORM|FF_CRUMBLE|FF_BOTHPLANES|FF_ALLSIDES; - if (lines[i].flags & ML_NOCLIMB) // shade it unless no-climb + //Flags + if (lines[i].args[2] & 1) //Translucent + ffloorflags |= FF_TRANSLUCENT; + if (lines[i].args[2] & 2) //Don't cast shadow ffloorflags |= FF_NOSHADE; + if (lines[i].args[2] & 4) //Don't respawn + ffloorflags |= FF_NORETURN; + if (lines[i].args[2] & 16) //Float on water + ffloorflags |= FF_FLOATBOB; + + //If translucent or player can enter it, cut inner walls + if ((ffloorflags & FF_TRANSLUCENT) || (lines[i].args[1] & 7)) + ffloorflags |= FF_CUTEXTRA|FF_EXTRA; + else + ffloorflags |= FF_CUTLEVEL; + + //If player can enter it, render insides + if (lines[i].args[1] & 7) + { + if (ffloorflags & FF_RENDERPLANES) + ffloorflags |= FF_BOTHPLANES; + if (ffloorflags & FF_RENDERSIDES) + ffloorflags |= FF_ALLSIDES; + } P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - break; - - case 173: // "Platform" that crumbles and doesn't return - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_PLATFORM|FF_CRUMBLE|FF_NORETURN|FF_BOTHPLANES|FF_ALLSIDES; - if (lines[i].flags & ML_NOCLIMB) // shade it unless no-climb - ffloorflags |= FF_NOSHADE; - - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - break; - - case 174: // Translucent "platform" that crumbles and returns - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_PLATFORM|FF_CRUMBLE|FF_TRANSLUCENT|FF_BOTHPLANES|FF_ALLSIDES; - if (lines[i].flags & ML_NOCLIMB) // shade it unless no-climb - ffloorflags |= FF_NOSHADE; - - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - break; - - case 175: // Translucent "platform" that crumbles and doesn't return - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_PLATFORM|FF_CRUMBLE|FF_NORETURN|FF_TRANSLUCENT|FF_BOTHPLANES|FF_ALLSIDES; - if (lines[i].flags & ML_NOCLIMB) // shade it unless no-climb - ffloorflags |= FF_NOSHADE; - - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - break; - - case 176: // Air bobbing platform that will crumble and bob on the water when it falls and hits - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_FLOATBOB|FF_CRUMBLE, secthinkers); - lines[i].flags |= ML_BLOCKMONSTERS; - P_AddAirbob(lines[i].frontsector, lines + i, true, false); - break; - - case 177: // Air bobbing platform that will crumble and bob on - // the water when it falls and hits, then never return - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_FLOATBOB|FF_CRUMBLE|FF_NORETURN, secthinkers); - lines[i].flags |= ML_BLOCKMONSTERS; - P_AddAirbob(lines[i].frontsector, lines + i, true, false); - break; - - case 178: // Crumbling platform that will float when it hits water - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CRUMBLE|FF_FLOATBOB, secthinkers); - break; - - case 179: // Crumbling platform that will float when it hits water, but not return - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_CRUMBLE|FF_FLOATBOB|FF_NORETURN, secthinkers); - break; - - case 180: // Air bobbing platform that will crumble - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_CRUMBLE, secthinkers); - lines[i].flags |= ML_BLOCKMONSTERS; - P_AddAirbob(lines[i].frontsector, lines + i, true, false); + if (lines[i].args[2] & 8) //Air bobbing + P_AddAirbob(lines[i].frontsector, lines + i, 16*FRACUNIT, false, false, false); break; case 190: // Rising Platform FOF (solid, opaque, shadows) From 2e9dc59ca75d38ddd74cd3fb31a7bf7ac4c67ec9 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 15 Apr 2020 09:49:00 +0200 Subject: [PATCH 016/377] Forgot some stuff regarding FOF type 170 --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 30 ++++++++++++++++++++ src/p_setup.c | 6 ++++ 2 files changed, 36 insertions(+) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index dcff6927b..32584505d 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1583,6 +1583,36 @@ udmf } } + 170 + { + title = "Crumbling"; + prefix = "(170)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Tangibility"; + type = 12; + enum = "tangibility"; + } + arg2 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Translucent"; + 2 = "No shadow"; + 4 = "No respawn"; + 8 = "Air bobbing"; + 16 = "Float on water"; + } + } + } + 200 { title = "Light Block"; diff --git a/src/p_setup.c b/src/p_setup.c index 6b7f59327..8eb2a750c 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2939,7 +2939,13 @@ static void P_ConvertBinaryMap(void) lines[i].args[2] |= 2; //Don't cast shadow } if (lines[i].special >= 174 && lines[i].special <= 175) + { lines[i].args[2] |= 1; //Translucent + if (sides[lines[i].sidenum[0]].toptexture > 0) + lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; + else + lines[i].alpha = FRACUNIT/2; + } if (lines[i].special % 2 == 1) lines[i].args[2] |= 4; //Don't respawn if (lines[i].special == 176 || lines[i].special == 177 || lines[i].special == 180) From 1d3aa7129a2759f90594ea159c826b2de52842b4 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 18 Apr 2020 18:02:43 +0200 Subject: [PATCH 017/377] Add enums for textmap FOF values --- src/p_mobj.c | 2 +- src/p_setup.c | 92 +++++++++++++++++++++++++-------------------------- src/p_spec.c | 76 +++++++++++++++++++++--------------------- src/p_spec.h | 63 +++++++++++++++++++++++++++++++++++ src/p_user.c | 4 +-- 5 files changed, 150 insertions(+), 87 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 8f89ed0b0..39adbc5ab 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1689,7 +1689,7 @@ static void P_PushableCheckBustables(mobj_t *mo) if (!(rover->flags & FF_BUSTUP)) continue; // Bustable by pushables? - if (!(rover->master->args[3] & 1)) continue; + if (!(rover->master->args[3] & TMFB_PUSHABLES)) continue; if (!rover->master->frontsector->crumblestate) { diff --git a/src/p_setup.c b/src/p_setup.c index a09b2d659..e9df4eecd 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2810,24 +2810,24 @@ static void P_ConvertBinaryMap(void) //Visibility if (lines[i].special == 105) - lines[i].args[1] = 3; + lines[i].args[1] = TMFV_NOPLANES|TMFV_NOSIDES; else if (lines[i].special == 104) - lines[i].args[1] = 2; + lines[i].args[1] = TMFV_NOSIDES; else if (lines[i].special == 103) - lines[i].args[1] = 1; + lines[i].args[1] = TMFV_NOPLANES; //Tangibility if (lines[i].flags & ML_EFFECT1) - lines[i].args[2] |= 8; + lines[i].args[2] |= TMFT_DONTBLOCKOTHERS; if (lines[i].flags & ML_EFFECT2) - lines[i].args[2] |= 4; + lines[i].args[2] |= TMFT_DONTBLOCKPLAYER; //Translucency if (lines[i].special == 102) { - lines[i].args[3] |= 1; + lines[i].args[3] |= TMFA_TRANSLUCENT; if (lines[i].flags & ML_NOCLIMB) - lines[i].args[1] |= 4; + lines[i].args[1] |= TMFV_TOGGLEINSIDES; if (sides[lines[i].sidenum[0]].toptexture > 0) lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; else @@ -2836,7 +2836,7 @@ static void P_ConvertBinaryMap(void) //Shadow? if (lines[i].special != 100 && (lines[i].special != 104 || !(lines[i].flags & ML_NOCLIMB))) - lines[i].args[3] |= 1; + lines[i].args[3] |= TMFA_NOSHADE; lines[i].special = 100; break; @@ -2850,7 +2850,7 @@ static void P_ConvertBinaryMap(void) //Opaque? if (lines[i].special == 120 || lines[i].special == 122) - lines[i].args[1] |= 1; + lines[i].args[1] |= TMFW_OPAQUE; else { if (sides[lines[i].sidenum[0]].toptexture > 0) @@ -2861,19 +2861,19 @@ static void P_ConvertBinaryMap(void) //No sides? if (lines[i].special == 122 || lines[i].special == 123 || lines[i].special == 125) - lines[i].args[1] |= 2; + lines[i].args[1] |= TMFW_NOSIDES; //Flags if (lines[i].flags & ML_NOCLIMB) - lines[i].args[1] |= 4; + lines[i].args[1] |= TMFW_DOUBLESHADOW; if (lines[i].flags & ML_EFFECT4) - lines[i].args[1] |= 8; + lines[i].args[1] |= TMFW_COLORMAPONLY; if (!(lines[i].flags & ML_EFFECT5)) - lines[i].args[1] |= 16; + lines[i].args[1] |= TMFW_NORIPPLE; //Goo? if (lines[i].special >= 124) - lines[i].args[1] |= 32; + lines[i].args[1] |= TMFW_GOOWATER; lines[i].special = 120; break; @@ -2888,29 +2888,29 @@ static void P_ConvertBinaryMap(void) //Visibility if (lines[i].special == 142 || lines[i].special == 145) - lines[i].args[1] = 2; + lines[i].args[1] = TMFV_NOSIDES; else if (lines[i].special == 146) - lines[i].args[1] = 1; + lines[i].args[1] = TMFV_NOPLANES; //Tangibility if (lines[i].special <= 142) - lines[i].args[2] |= 2; + lines[i].args[2] |= TMFT_INTANGIBLEBOTTOM; else if (lines[i].special <= 145) - lines[i].args[2] |= 1; + lines[i].args[2] |= TMFT_INTANGIBLETOP; else - lines[i].args[2] |= 3; + lines[i].args[2] |= TMFT_INTANGIBLEBOTTOM|TMFT_INTANGIBLETOP; if (lines[i].flags & ML_EFFECT1) - lines[i].args[2] |= 8; + lines[i].args[2] |= TMFT_DONTBLOCKOTHERS; if (lines[i].flags & ML_EFFECT2) - lines[i].args[2] |= 4; + lines[i].args[2] |= TMFT_DONTBLOCKPLAYER; //Translucency if (lines[i].special == 141 || lines[i].special == 142 || lines[i].special == 144 || lines[i].special == 145) { - lines[i].args[3] |= 1; + lines[i].args[3] |= TMFA_TRANSLUCENT; if (lines[i].flags & ML_NOCLIMB) - lines[i].args[1] |= 4; + lines[i].args[1] |= TMFV_TOGGLEINSIDES; if (sides[lines[i].sidenum[0]].toptexture > 0) lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; else @@ -2919,7 +2919,7 @@ static void P_ConvertBinaryMap(void) //Shadow? if (lines[i].special != 146 && (lines[i].flags & ML_NOCLIMB)) - lines[i].args[3] |= 2; + lines[i].args[3] |= TMFA_NOSHADE; lines[i].special = 100; break; @@ -2937,24 +2937,24 @@ static void P_ConvertBinaryMap(void) lines[i].args[0] = lines[i].tag; if (lines[i].special >= 172 && lines[i].special <= 175) { - lines[i].args[1] |= 2; //Intangible from below + lines[i].args[1] |= TMFT_INTANGIBLEBOTTOM; if (lines[i].flags & ML_NOCLIMB) - lines[i].args[2] |= 2; //Don't cast shadow + lines[i].args[2] |= TMFC_NOSHADE; } if (lines[i].special >= 174 && lines[i].special <= 175) { - lines[i].args[2] |= 1; //Translucent + lines[i].args[2] |= TMFC_TRANSLUCENT; if (sides[lines[i].sidenum[0]].toptexture > 0) lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; else lines[i].alpha = FRACUNIT/2; } if (lines[i].special % 2 == 1) - lines[i].args[2] |= 4; //Don't respawn + lines[i].args[2] |= TMFC_NORETURN; if (lines[i].special == 176 || lines[i].special == 177 || lines[i].special == 180) - lines[i].args[2] |= 8; //Air bobbing + lines[i].args[2] |= TMFC_AIRBOB; if (lines[i].special >= 176 && lines[i].special <= 179) - lines[i].args[2] |= 16; //Float on water + lines[i].args[2] |= TMFC_FLOATBOB; lines[i].special = 170; break; case 200: //FOF: Light block @@ -2975,30 +2975,30 @@ static void P_ConvertBinaryMap(void) //Visibility if (lines[i].special == 222) - lines[i].args[1] |= 1; //Don't render planes + lines[i].args[1] |= TMFV_NOPLANES; if (lines[i].special == 221) - lines[i].args[1] |= 4; //Don't render insides + lines[i].args[1] |= TMFV_TOGGLEINSIDES; //Appearance if (lines[i].special == 221) { - lines[i].args[2] |= 1; //Translucent + lines[i].args[2] |= TMFA_TRANSLUCENT; if (sides[lines[i].sidenum[0]].toptexture > 0) lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; else lines[i].alpha = FRACUNIT/2; } if (lines[i].special != 220 && !(lines[i].flags & ML_NOCLIMB)) - lines[i].args[2] |= 2; //Don't cast shadow + lines[i].args[2] |= TMFA_NOSHADE; lines[i].special = 220; break; case 250: //FOF: Mario block lines[i].args[0] = lines[i].tag; - if (lines[i].flags & ML_NOCLIMB) //Brick block - lines[i].args[1] |= 1; - if (lines[i].flags & ML_EFFECT1) //Invisible - lines[i].args[1] |= 2; + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[1] |= TMFM_BRICK; + if (lines[i].flags & ML_EFFECT1) + lines[i].args[1] |= TMFM_INVISIBLE; break; case 251: //FOF: Thwomp block lines[i].args[0] = lines[i].tag; @@ -3029,18 +3029,18 @@ static void P_ConvertBinaryMap(void) //Bustable type if (lines[i].special <= 253) - lines[i].args[1] = 0; + lines[i].args[1] = TMFB_TOUCH; else if (lines[i].special >= 255) - lines[i].args[1] = 1; + lines[i].args[1] = TMFB_SPIN; else if (lines[i].flags & ML_NOCLIMB) - lines[i].args[1] = 3; + lines[i].args[1] = TMFB_STRONG; else - lines[i].args[1] = 2; + lines[i].args[1] = TMFB_REGULAR; //Translucency if (lines[i].special == 253 || lines[i].special == 256) { - lines[i].args[2] = 1; + lines[i].args[2] = TMFC_TRANSLUCENT; if (sides[lines[i].sidenum[0]].toptexture > 0) lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; else @@ -3048,14 +3048,14 @@ static void P_ConvertBinaryMap(void) } if (lines[i].flags & ML_EFFECT4) - lines[i].args[3] |= 1; //Bustable by pushables + lines[i].args[3] |= TMFB_PUSHABLES; if (lines[i].flags & ML_EFFECT5) { - lines[i].args[3] |= 2; //Trigger linedef executor + lines[i].args[3] |= TMFB_EXECUTOR; lines[i].args[4] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; } if (lines[i].special == 252 && lines[i].flags & ML_NOCLIMB) - lines[i].args[4] |= 4; //Bust only from below + lines[i].args[4] |= TMFB_ONLYBOTTOM; lines[i].special = 254; break; diff --git a/src/p_spec.c b/src/p_spec.c index ff6275889..9f5eed74a 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6736,11 +6736,11 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; //Visibility settings - if (lines[i].args[1] & 1) //Don't render planes + if (lines[i].args[1] & TMFV_NOPLANES) ffloorflags &= ~FF_RENDERPLANES; - if (lines[i].args[1] & 2) //Don't render sides + if (lines[i].args[1] & TMFV_NOSIDES) ffloorflags &= ~FF_RENDERSIDES; - if (lines[i].args[1] & 4) //Render insides + if (lines[i].args[1] & TMFV_TOGGLEINSIDES) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_BOTHPLANES; @@ -6749,26 +6749,26 @@ void P_SpawnSpecials(boolean fromnetsave) } //Tangibility settings - if (lines[i].args[2] & 1) //Intangible from top + if (lines[i].args[2] & TMFT_INTANGIBLETOP) ffloorflags |= FF_REVERSEPLATFORM; - if (lines[i].args[2] & 2) //Intangible from bottom + if (lines[i].args[2] & TMFT_INTANGIBLEBOTTOM) ffloorflags |= FF_PLATFORM; - if (lines[i].args[2] & 4) //Don't block player + if (lines[i].args[2] & TMFT_DONTBLOCKPLAYER) ffloorflags &= ~FF_BLOCKPLAYER; - if (lines[i].args[2] & 8) //Don't block others + if (lines[i].args[2] & TMFT_DONTBLOCKOTHERS) ffloorflags &= ~FF_BLOCKOTHERS; //Appearance settings - if ((lines[i].args[3] & 1) && (ffloorflags & FF_RENDERALL)) //Translucent + if ((lines[i].args[3] & TMFA_TRANSLUCENT) && (ffloorflags & FF_RENDERALL)) //Translucent ffloorflags |= FF_TRANSLUCENT; - if (lines[i].args[3] & 2) //Don't cast shadow + if (lines[i].args[3] & TMFA_NOSHADE) ffloorflags |= FF_NOSHADE; //Cutting options if (ffloorflags & FF_RENDERALL) { //If translucent or player can enter it, cut inner walls - if ((ffloorflags & FF_TRANSLUCENT) || (lines[i].args[2] & 7)) + if ((ffloorflags & FF_TRANSLUCENT) || (lines[i].args[2] & TMFT_VISIBLEFROMINSIDE)) ffloorflags |= FF_CUTEXTRA|FF_EXTRA; else ffloorflags |= FF_CUTLEVEL; @@ -6779,17 +6779,17 @@ void P_SpawnSpecials(boolean fromnetsave) case 120: // FOF (water) ffloorflags = FF_EXISTS|FF_RENDERPLANES|FF_SWIMMABLE|FF_BOTHPLANES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; - if (!(lines[i].args[1] & 1)) + if (!(lines[i].args[1] & TMFW_OPAQUE)) ffloorflags |= FF_TRANSLUCENT; - if (!(lines[i].args[1] & 2)) + if (!(lines[i].args[1] & TMFW_NOSIDES)) ffloorflags |= FF_RENDERSIDES|FF_ALLSIDES; - if (lines[i].args[1] & 4) + if (lines[i].args[1] & TMFW_DOUBLESHADOW) ffloorflags |= FF_DOUBLESHADOW; - if (lines[i].args[1] & 8) + if (lines[i].args[1] & TMFW_COLORMAPONLY) ffloorflags |= FF_COLORMAPONLY; - if (!(lines[i].args[1] & 16)) + if (!(lines[i].args[1] & TMFW_NORIPPLE)) ffloorflags |= FF_RIPPLE; - if (lines[i].args[1] & 32) + if (lines[i].args[1] & TMFW_GOOWATER) ffloorflags |= FF_GOOWATER; P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); break; @@ -6819,33 +6819,33 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CRUMBLE; //Tangibility settings - if (lines[i].args[1] & 1) //Intangible from top + if (lines[i].args[1] & TMFT_INTANGIBLETOP) ffloorflags |= FF_REVERSEPLATFORM; - if (lines[i].args[1] & 2) //Intangible from bottom + if (lines[i].args[1] & TMFT_INTANGIBLEBOTTOM) ffloorflags |= FF_PLATFORM; - if (lines[i].args[1] & 4) //Don't block player + if (lines[i].args[1] & TMFT_DONTBLOCKPLAYER) ffloorflags &= ~FF_BLOCKPLAYER; - if (lines[i].args[1] & 8) //Don't block others + if (lines[i].args[1] & TMFT_DONTBLOCKOTHERS) ffloorflags &= ~FF_BLOCKOTHERS; //Flags - if (lines[i].args[2] & 1) //Translucent + if (lines[i].args[2] & TMFC_TRANSLUCENT) ffloorflags |= FF_TRANSLUCENT; - if (lines[i].args[2] & 2) //Don't cast shadow + if (lines[i].args[2] & TMFC_NOSHADE) ffloorflags |= FF_NOSHADE; - if (lines[i].args[2] & 4) //Don't respawn + if (lines[i].args[2] & TMFC_NORETURN) ffloorflags |= FF_NORETURN; - if (lines[i].args[2] & 16) //Float on water + if (lines[i].args[2] & TMFC_FLOATBOB) ffloorflags |= FF_FLOATBOB; //If translucent or player can enter it, cut inner walls - if ((ffloorflags & FF_TRANSLUCENT) || (lines[i].args[1] & 7)) + if ((ffloorflags & FF_TRANSLUCENT) || (lines[i].args[1] & TMFT_VISIBLEFROMINSIDE)) ffloorflags |= FF_CUTEXTRA|FF_EXTRA; else ffloorflags |= FF_CUTLEVEL; //If player can enter it, render insides - if (lines[i].args[1] & 7) + if (lines[i].args[1] & TMFT_VISIBLEFROMINSIDE) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_BOTHPLANES; @@ -6854,7 +6854,7 @@ void P_SpawnSpecials(boolean fromnetsave) } P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - if (lines[i].args[2] & 8) //Air bobbing + if (lines[i].args[2] & TMFC_AIRBOB) P_AddAirbob(lines[i].frontsector, lines + i, 16*FRACUNIT, false, false, false); break; @@ -6918,11 +6918,11 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags = FF_EXISTS|FF_RENDERALL|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; //Visibility settings - if (lines[i].args[1] & 1) //Don't render planes + if (lines[i].args[1] & TMFV_NOPLANES) ffloorflags &= ~FF_RENDERPLANES; - if (lines[i].args[1] & 2) //Don't render sides + if (lines[i].args[1] & TMFV_NOSIDES) ffloorflags &= ~FF_RENDERSIDES; - if (!(lines[i].args[1] & 4)) //Render insides + if (!(lines[i].args[1] & TMFV_TOGGLEINSIDES)) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_BOTHPLANES; @@ -6931,9 +6931,9 @@ void P_SpawnSpecials(boolean fromnetsave) } //Appearance settings - if ((lines[i].args[2] & 1) && (ffloorflags & FF_RENDERALL)) //Translucent + if ((lines[i].args[2] & TMFA_TRANSLUCENT) && (ffloorflags & FF_RENDERALL)) ffloorflags |= FF_TRANSLUCENT; - if (lines[i].args[2] & 2) //Don't cast shadow + if (lines[i].args[2] & TMFA_NOSHADE) ffloorflags |= FF_NOSHADE; P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); @@ -6945,9 +6945,9 @@ void P_SpawnSpecials(boolean fromnetsave) case 250: // Mario Block ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_MARIO; - if (lines[i].args[1] & 1) //Brick block + if (lines[i].args[1] & TMFM_BRICK) ffloorflags |= FF_SHATTERBOTTOM; - if (lines[i].args[1] & 2) // Invisible + if (lines[i].args[1] & TMFM_INVISIBLE) ffloorflags &= ~(FF_SOLID|FF_RENDERALL|FF_CUTLEVEL); P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); @@ -6969,13 +6969,13 @@ void P_SpawnSpecials(boolean fromnetsave) //Bustable type switch (lines[i].args[1]) { - case 0: + case TMFB_TOUCH: ffloorflags |= FF_SHATTER; break; - case 1: + case TMFB_SPIN: ffloorflags |= FF_SPINBUST; break; - case 3: + case TMFB_STRONG: ffloorflags |= FF_STRONGBUST; break; default: @@ -6985,7 +6985,7 @@ void P_SpawnSpecials(boolean fromnetsave) if (lines[i].args[2]) ffloorflags |= FF_TRANSLUCENT; - if (lines[i].args[2] & 4) + if (lines[i].args[3] & TMFB_ONLYBOTTOM) ffloorflags |= FF_SHATTERBOTTOM; if (!(ffloorflags & FF_SHATTER) || ffloorflags & FF_SHATTERBOTTOM) diff --git a/src/p_spec.h b/src/p_spec.h index d756f1942..6d13e9da7 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -21,6 +21,69 @@ extern mobj_t *skyboxmo[2]; // current skybox mobjs: 0 = viewpoint, 1 = centerpo extern mobj_t *skyboxviewpnts[16]; // array of MT_SKYBOX viewpoint mobjs extern mobj_t *skyboxcenterpnts[16]; // array of MT_SKYBOX centerpoint mobjs +//FOF flags +typedef enum +{ + TMFV_NOPLANES = 1, + TMFV_NOSIDES = 1<<1, + TMFV_TOGGLEINSIDES = 1<<2, +} textmapfofvisibility_t; + +typedef enum +{ + TMFT_INTANGIBLETOP = 1, + TMFT_INTANGIBLEBOTTOM = 1<<1, + TMFT_DONTBLOCKPLAYER = 1<<2, + TMFT_VISIBLEFROMINSIDE = (TMFT_INTANGIBLETOP|TMFT_INTANGIBLEBOTTOM|TMFT_DONTBLOCKPLAYER), + TMFT_DONTBLOCKOTHERS = 1<<3, +} textmapfoftangibility_t; + +typedef enum +{ + TMFA_TRANSLUCENT = 1, + TMFA_NOSHADE = 1<<1, +} textmapfofappearance_t; + +typedef enum +{ + TMFW_OPAQUE = 1, + TMFW_NOSIDES = 1<<1, + TMFW_DOUBLESHADOW = 1<<2, + TMFW_COLORMAPONLY = 1<<3, + TMFW_NORIPPLE = 1<<4, + TMFW_GOOWATER = 1<<5, +} textmapfofwater_t; + +typedef enum +{ + TMFC_TRANSLUCENT = 1, + TMFC_NOSHADE = 1<<1, + TMFC_NORETURN = 1<<2, + TMFC_AIRBOB = 1<<3, + TMFC_FLOATBOB = 1<<4, +} textmapfofcrumbling_t; + +typedef enum +{ + TMFM_BRICK = 1, + TMFM_INVISIBLE = 1<<1, +} textmapfofmario_t; + +typedef enum +{ + TMFB_TOUCH, + TMFB_SPIN, + TMFB_REGULAR, + TMFB_STRONG, +} textmapfofbusttype_t; + +typedef enum +{ + TMFB_PUSHABLES = 1, + TMFB_EXECUTOR = 1<<1, + TMFB_ONLYBOTTOM = 1<<2, +} textmapfofbustflags_t; + // GETSECSPECIAL (specialval, section) // // Pulls out the special # from a particular section. diff --git a/src/p_user.c b/src/p_user.c index c1dc2676d..8accce238 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2663,7 +2663,7 @@ static void P_CheckBustableBlocks(player_t *player) EV_CrumbleChain(NULL, rover); // node->m_sector // Run a linedef executor?? - if (rover->master->args[3] & 2) + if (rover->master->args[3] & TMFB_EXECUTOR) P_LinedefExecute((INT16)(rover->master->args[4]), player->mo, node->m_sector); goto bustupdone; @@ -12213,7 +12213,7 @@ void P_PlayerThink(player_t *player) player->powers[pw_nocontrol]--; else player->powers[pw_nocontrol] = 0; - + //pw_super acts as a timer now if (player->powers[pw_super] && (player->mo->state < &states[S_PLAY_SUPER_TRANS1] From 0ab01cd4b25c13587c47687d83d3c47dd9331ff7 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 25 Apr 2020 09:20:53 +0200 Subject: [PATCH 018/377] Port over thwomp thinker changes manually, to avoid merge conflicts --- src/p_floor.c | 249 ++++++++++++++++++++++++-------------------------- src/p_saveg.c | 46 +++++++++- src/p_spec.c | 36 ++++---- src/p_spec.h | 17 +++- 4 files changed, 197 insertions(+), 151 deletions(-) diff --git a/src/p_floor.c b/src/p_floor.c index b67f193fa..6f3b459ca 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -11,7 +11,6 @@ /// \file p_floor.c /// \brief Floor animation, elevators -#include "dehacked.h" #include "doomdef.h" #include "doomstat.h" #include "m_random.h" @@ -1266,156 +1265,74 @@ void T_MarioBlockChecker(levelspecthink_t *block) } } +static boolean P_IsPlayerValid(size_t playernum) +{ + if (!playeringame[playernum]) + return false; + + if (!players[playernum].mo) + return false; + + if (players[playernum].mo->health <= 0) + return false; + + if (players[playernum].spectator) + return false; + + return true; +} + // This is the Thwomp's 'brain'. It looks around for players nearby, and if // it finds any, **SMASH**!!! Muahahhaa.... -void T_ThwompSector(levelspecthink_t *thwomp) +void T_ThwompSector(thwomp_t *thwomp) { -#define speed vars[1] -#define direction vars[2] -#define distance vars[3] -#define floorwasheight vars[4] -#define ceilingwasheight vars[5] fixed_t thwompx, thwompy; sector_t *actionsector; ffloor_t *rover = NULL; INT32 secnum; + fixed_t speed; // If you just crashed down, wait a second before coming back up. - if (--thwomp->distance > 0) - { - sides[thwomp->sourceline->sidenum[0]].midtexture = sides[thwomp->sourceline->sidenum[0]].bottomtexture; + if (--thwomp->delay > 0) return; - } // Just find the first sector with the tag. // Doesn't work with multiple sectors that have different floor/ceiling heights. - secnum = P_FindSectorFromTag((INT16)thwomp->vars[0], -1); + secnum = P_FindSectorFromTag(thwomp->tag, -1); - if (secnum > 0) - { - actionsector = §ors[secnum]; - - // Look for thwomp FFloor - for (rover = actionsector->ffloors; rover; rover = rover->next) - { - if (rover->master == thwomp->sourceline) - break; - } - } - else + if (secnum <= 0) return; // Bad bad bad! + actionsector = §ors[secnum]; + + // Look for thwomp FOF + for (rover = actionsector->ffloors; rover; rover = rover->next) + { + if (rover->master == thwomp->sourceline) + break; + } + + if (!rover) + return; // Didn't find any FOFs, so bail out + thwompx = actionsector->soundorg.x; thwompy = actionsector->soundorg.y; - if (thwomp->direction > 0) // Moving back up.. + if (thwomp->direction == 0) // Not going anywhere, so look for players. { - result_e res = 0; - - // Set the texture from the lower one (normal) - sides[thwomp->sourceline->sidenum[0]].midtexture = sides[thwomp->sourceline->sidenum[0]].bottomtexture; - /// \note this should only have to be done once, but is already done repeatedly, above - - thwomp->speed = thwomp->sourceline->args[2] << (FRACBITS - 3); - - res = T_MovePlane - ( - thwomp->sector, // sector - thwomp->speed, // speed - thwomp->floorwasheight, // dest - 0, // crush - 0, // floor or ceiling (0 for floor) - thwomp->direction // direction - ); - - if (res == ok || res == pastdest) - T_MovePlane - ( - thwomp->sector, // sector - thwomp->speed, // speed - thwomp->ceilingwasheight, // dest - 0, // crush - 1, // floor or ceiling (1 for ceiling) - thwomp->direction // direction - ); - - if (res == pastdest) - thwomp->direction = 0; // stop moving - - thwomp->sector->ceilspeed = 42; - thwomp->sector->floorspeed = thwomp->speed*thwomp->direction; - } - else if (thwomp->direction < 0) // Crashing down! - { - result_e res = 0; - - // Set the texture from the upper one (angry) - sides[thwomp->sourceline->sidenum[0]].midtexture = sides[thwomp->sourceline->sidenum[0]].toptexture; - - thwomp->speed = thwomp->sourceline->args[1] << (FRACBITS - 3); - - res = T_MovePlane - ( - thwomp->sector, // sector - thwomp->speed, // speed - P_FloorzAtPos(thwompx, thwompy, thwomp->sector->floorheight, - thwomp->sector->ceilingheight - thwomp->sector->floorheight), // dest - 0, // crush - 0, // floor or ceiling (0 for floor) - thwomp->direction // direction - ); - - if (res == ok || res == pastdest) - T_MovePlane - ( - thwomp->sector, // sector - thwomp->speed, // speed - P_FloorzAtPos(thwompx, thwompy, thwomp->sector->floorheight, - thwomp->sector->ceilingheight - - (thwomp->sector->floorheight + thwomp->speed)) - + (thwomp->sector->ceilingheight - - (thwomp->sector->floorheight + thwomp->speed/2)), // dest - 0, // crush - 1, // floor or ceiling (1 for ceiling) - thwomp->direction // direction - ); - - if (res == pastdest) - { - mobj_t *mp = (void *)&actionsector->soundorg; - - if (!rover || (rover->flags & FF_EXISTS)) - { - sfxenum_t sound = (thwomp->sourceline->stringargs[0]) ? get_number(thwomp->sourceline->stringargs[0]) : sfx_thwomp; - S_StartSound(mp, sound); - } - - thwomp->direction = 1; // start heading back up - thwomp->distance = TICRATE; // but only after a small delay - } - - thwomp->sector->ceilspeed = 42; - thwomp->sector->floorspeed = thwomp->speed*thwomp->direction; - } - else // Not going anywhere, so look for players. - { - if (!rover || (rover->flags & FF_EXISTS)) + if (rover->flags & FF_EXISTS) { UINT8 i; // scan the players to find victims! for (i = 0; i < MAXPLAYERS; i++) { - if (!playeringame[i]) - continue; - if (players[i].spectator) - continue; - if (!players[i].mo) - continue; - if (!players[i].mo->health) + if (!P_IsPlayerValid(i)) continue; + if (players[i].mo->z > thwomp->sector->ceilingheight) continue; - if (P_AproxDistance(thwompx - players[i].mo->x, thwompy - players[i].mo->y) > 96 * FRACUNIT) + + if (P_AproxDistance(thwompx - players[i].mo->x, thwompy - players[i].mo->y) > 96*FRACUNIT) continue; thwomp->direction = -1; @@ -1426,13 +1343,89 @@ void T_ThwompSector(levelspecthink_t *thwomp) thwomp->sector->ceilspeed = 0; thwomp->sector->floorspeed = 0; } + else + { + result_e res = 0; + + if (thwomp->direction > 0) //Moving back up.. + { + // Set the texture from the lower one (normal) + sides[thwomp->sourceline->sidenum[0]].midtexture = sides[thwomp->sourceline->sidenum[0]].bottomtexture; + + speed = thwomp->retractspeed; + + res = T_MovePlane + ( + thwomp->sector, // sector + speed, // speed + thwomp->floorstartheight, // dest + false, // crush + 0, // ceiling? + thwomp->direction // direction + ); + + if (res == ok || res == pastdest) + T_MovePlane + ( + thwomp->sector, // sector + speed, // speed + thwomp->ceilingstartheight, // dest + false, // crush + 1, // ceiling? + thwomp->direction // direction + ); + + if (res == pastdest) + thwomp->direction = 0; // stop moving + } + else // Crashing down! + { + // Set the texture from the upper one (angry) + sides[thwomp->sourceline->sidenum[0]].midtexture = sides[thwomp->sourceline->sidenum[0]].toptexture; + + speed = thwomp->crushspeed; + + res = T_MovePlane + ( + thwomp->sector, // sector + speed, // speed + P_FloorzAtPos(thwompx, thwompy, thwomp->sector->floorheight, + thwomp->sector->ceilingheight - thwomp->sector->floorheight), // dest + false, // crush + 0, // ceiling? + thwomp->direction // direction + ); + + if (res == ok || res == pastdest) + T_MovePlane + ( + thwomp->sector, // sector + speed, // speed + P_FloorzAtPos(thwompx, thwompy, thwomp->sector->floorheight, + thwomp->sector->ceilingheight + - (thwomp->sector->floorheight + speed)) + + (thwomp->sector->ceilingheight + - (thwomp->sector->floorheight + speed/2)), // dest + false, // crush + 1, // ceiling? + thwomp->direction // direction + ); + + if (res == pastdest) + { + if (rover->flags & FF_EXISTS) + S_StartSound((void *)&actionsector->soundorg, thwomp->sound); + + thwomp->direction = 1; // start heading back up + thwomp->delay = TICRATE; // but only after a small delay + } + } + + thwomp->sector->ceilspeed = 42; + thwomp->sector->floorspeed = speed*thwomp->direction; + } P_RecalcPrecipInSector(actionsector); -#undef speed -#undef direction -#undef distance -#undef floorwasheight -#undef ceilingwasheight } // diff --git a/src/p_saveg.c b/src/p_saveg.c index 34392886d..23407b2b1 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1745,6 +1745,27 @@ static void SaveSpecialLevelThinker(const thinker_t *th, const UINT8 type) WRITEUINT32(save_p, SaveSector(ht->sector)); } +// +// SaveThwompThinker +// +// Saves a thwomp_t thinker +// +static void SaveThwompThinker(const thinker_t *th, const UINT8 type) +{ + const thwomp_t *ht = (const void *)th; + WRITEUINT8(save_p, type); + WRITEUINT32(save_p, SaveLine(ht->sourceline)); + WRITEUINT32(save_p, SaveSector(ht->sector)); + WRITEFIXED(save_p, ht->crushspeed); + WRITEFIXED(save_p, ht->retractspeed); + WRITEINT32(save_p, ht->direction); + WRITEFIXED(save_p, ht->floorstartheight); + WRITEFIXED(save_p, ht->ceilingstartheight); + WRITEINT32(save_p, ht->delay); + WRITEINT16(save_p, ht->tag); + WRITEUINT16(save_p, ht->sound); +} + // // SaveCeilingThinker // @@ -2308,7 +2329,7 @@ static void P_NetArchiveThinkers(void) } else if (th->function.acp1 == (actionf_p1)T_ThwompSector) { - SaveSpecialLevelThinker(th, tc_thwomp); + SaveThwompThinker(th, tc_thwomp); continue; } else if (th->function.acp1 == (actionf_p1)T_NoEnemiesSector) @@ -2856,6 +2877,27 @@ static thinker_t* LoadSpecialLevelThinker(actionf_p1 thinker, UINT8 floorOrCeili return &ht->thinker; } +// LoadThwompThinker +// +// Loads a thwomp_t from a save game +// +static thinker_t* LoadThwompThinker(actionf_p1 thinker) +{ + thwomp_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); + ht->thinker.function.acp1 = thinker; + ht->sourceline = LoadLine(READUINT32(save_p)); + ht->sector = LoadSector(READUINT32(save_p)); + ht->crushspeed = READFIXED(save_p); + ht->retractspeed = READFIXED(save_p); + ht->direction = READINT32(save_p); + ht->floorstartheight = READFIXED(save_p); + ht->ceilingstartheight = READFIXED(save_p); + ht->delay = READINT32(save_p); + ht->tag = READINT16(save_p); + ht->sound = READUINT16(save_p); + return &ht->thinker; +} + // // LoadCeilingThinker // @@ -3522,7 +3564,7 @@ static void P_NetUnArchiveThinkers(void) break; case tc_thwomp: - th = LoadSpecialLevelThinker((actionf_p1)T_ThwompSector, 3); + th = LoadThwompThinker((actionf_p1)T_ThwompSector); break; case tc_noenemies: diff --git a/src/p_spec.c b/src/p_spec.c index 9f5eed74a..7c968f376 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -15,6 +15,7 @@ /// utility functions, etc. /// Line Tag handling. Line and Sector triggers. +#include "dehacked.h" #include "doomdef.h" #include "g_game.h" #include "p_local.h" @@ -6133,12 +6134,7 @@ static void P_AddAirbob(sector_t *sec, line_t *sourceline, fixed_t dist, boolean */ static inline void P_AddThwompThinker(sector_t *sec, sector_t *actionsector, line_t *sourceline) { -#define speed vars[1] -#define direction vars[2] -#define distance vars[3] -#define floorwasheight vars[4] -#define ceilingwasheight vars[5] - levelspecthink_t *thwomp; + thwomp_t *thwomp; // You *probably* already have a thwomp in this sector. If you've combined it with something // else that uses the floordata/ceilingdata, you must be weird. @@ -6152,21 +6148,21 @@ static inline void P_AddThwompThinker(sector_t *sec, sector_t *actionsector, lin thwomp->thinker.function.acp1 = (actionf_p1)T_ThwompSector; // set up the fields according to the type of elevator action - thwomp->sector = sec; - thwomp->vars[0] = actionsector->tag; - thwomp->floorwasheight = thwomp->sector->floorheight; - thwomp->ceilingwasheight = thwomp->sector->ceilingheight; - thwomp->direction = 0; - thwomp->distance = 1; thwomp->sourceline = sourceline; - thwomp->sector->floordata = thwomp; - thwomp->sector->ceilingdata = thwomp; - return; -#undef speed -#undef direction -#undef distance -#undef floorwasheight -#undef ceilingwasheight + thwomp->sector = sec; + thwomp->crushspeed = thwomp->sourceline->args[1] << (FRACBITS - 3); + thwomp->retractspeed = thwomp->sourceline->args[2] << (FRACBITS - 3); + thwomp->direction = 0; + thwomp->floorstartheight = sec->floorheight; + thwomp->ceilingstartheight = sec->ceilingheight; + thwomp->delay = 1; + thwomp->tag = actionsector->tag; + thwomp->sound = (thwomp->sourceline->stringargs[0]) ? get_number(thwomp->sourceline->stringargs[0]) : sfx_thwomp; + + sec->floordata = thwomp; + sec->ceilingdata = thwomp; + // Start with 'resting' texture + sides[sourceline->sidenum[0]].midtexture = sides[sourceline->sidenum[0]].bottomtexture; } /** Adds a thinker which checks if any MF_ENEMY objects with health are in the defined area. diff --git a/src/p_spec.h b/src/p_spec.h index 6d13e9da7..083cd0ce6 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -383,6 +383,21 @@ typedef struct sector_t *sector; // Sector the thinker is from } levelspecthink_t; +typedef struct +{ + thinker_t thinker; + line_t *sourceline; + sector_t *sector; + fixed_t crushspeed; + fixed_t retractspeed; + INT32 direction; + fixed_t floorstartheight; + fixed_t ceilingstartheight; + INT32 delay; + INT16 tag; + UINT16 sound; +} thwomp_t; + #define ELEVATORSPEED (FRACUNIT*4) #define FLOORSPEED (FRACUNIT) @@ -418,7 +433,7 @@ void T_MarioBlock(levelspecthink_t *block); void T_SpikeSector(levelspecthink_t *spikes); void T_FloatSector(levelspecthink_t *floater); void T_MarioBlockChecker(levelspecthink_t *block); -void T_ThwompSector(levelspecthink_t *thwomp); +void T_ThwompSector(thwomp_t *thwomp); void T_NoEnemiesSector(levelspecthink_t *nobaddies); void T_EachTimeThinker(levelspecthink_t *eachtime); void T_CameraScanner(elevator_t *elevator); From 1aa90754db8a59b4dd9a552632f1b131e9fe5c73 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 26 Apr 2020 10:33:13 +0200 Subject: [PATCH 019/377] Port over raise thinker changes from next (preparation for merge) --- src/p_saveg.c | 41 +++++++++++++++++++++++++++++++++++++++-- src/p_spec.c | 46 ++++++++++++++++------------------------------ src/p_spec.h | 22 +++++++++++++++++++++- 3 files changed, 76 insertions(+), 33 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 23407b2b1..f9ab4d83c 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1766,6 +1766,24 @@ static void SaveThwompThinker(const thinker_t *th, const UINT8 type) WRITEUINT16(save_p, ht->sound); } +// SaveRaiseThinker +// +// Saves a raise_t thinker +// +static void SaveRaiseThinker(const thinker_t *th, const UINT8 type) +{ + const raise_t *ht = (const void *)th; + WRITEUINT8(save_p, type); + WRITEUINT32(save_p, SaveLine(ht->sourceline)); + WRITEUINT32(save_p, SaveSector(ht->sector)); + WRITEFIXED(save_p, ht->ceilingbottom); + WRITEFIXED(save_p, ht->ceilingtop); + WRITEFIXED(save_p, ht->basespeed); + WRITEFIXED(save_p, ht->extraspeed); + WRITEUINT8(save_p, ht->shaketimer); + WRITEUINT8(save_p, ht->flags); +} + // // SaveCeilingThinker // @@ -2344,7 +2362,7 @@ static void P_NetArchiveThinkers(void) } else if (th->function.acp1 == (actionf_p1)T_RaiseSector) { - SaveSpecialLevelThinker(th, tc_raisesector); + SaveRaiseThinker(th, tc_raisesector); continue; } else if (th->function.acp1 == (actionf_p1)T_CameraScanner) @@ -2898,6 +2916,25 @@ static thinker_t* LoadThwompThinker(actionf_p1 thinker) return &ht->thinker; } +// LoadRaiseThinker +// +// Loads a raise_t from a save game +// +static thinker_t* LoadRaiseThinker(actionf_p1 thinker) +{ + raise_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); + ht->thinker.function.acp1 = thinker; + ht->sourceline = LoadLine(READUINT32(save_p)); + ht->sector = LoadSector(READUINT32(save_p)); + ht->ceilingbottom = READFIXED(save_p); + ht->ceilingtop = READFIXED(save_p); + ht->basespeed = READFIXED(save_p); + ht->extraspeed = READFIXED(save_p); + ht->shaketimer = READUINT8(save_p); + ht->flags = READUINT8(save_p); + return &ht->thinker; +} + // // LoadCeilingThinker // @@ -3576,7 +3613,7 @@ static void P_NetUnArchiveThinkers(void) break; case tc_raisesector: - th = LoadSpecialLevelThinker((actionf_p1)T_RaiseSector, 0); + th = LoadRaiseThinker((actionf_p1)T_RaiseSector); break; /// \todo rewrite all the code that uses an elevator_t but isn't an elevator diff --git a/src/p_spec.c b/src/p_spec.c index 7c968f376..6ffb56776 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6050,42 +6050,28 @@ static void P_AddBlockThinker(sector_t *sec, line_t *sourceline) * \sa P_SpawnSpecials, T_RaiseSector * \author SSNTails */ -static void P_AddRaiseThinker(sector_t *sec, line_t *sourceline) +static void P_AddRaiseThinker(sector_t *sec, line_t *sourceline, boolean lower, boolean spindash) { - levelspecthink_t *raise; + raise_t *raise; raise = Z_Calloc(sizeof (*raise), PU_LEVSPEC, NULL); P_AddThinker(THINK_MAIN, &raise->thinker); raise->thinker.function.acp1 = (actionf_p1)T_RaiseSector; - if (sourceline->flags & ML_BLOCKMONSTERS) - raise->vars[0] = 1; - else - raise->vars[0] = 0; - // set up the fields + raise->sourceline = sourceline; raise->sector = sec; - // Require a spindash to activate - if (sourceline->flags & ML_NOCLIMB) - raise->vars[1] = 1; - else - raise->vars[1] = 0; + raise->ceilingtop = P_FindHighestCeilingSurrounding(sec); + raise->ceilingbottom = P_FindLowestCeilingSurrounding(sec); - raise->vars[2] = P_AproxDistance(sourceline->dx, sourceline->dy); - raise->vars[2] = FixedDiv(raise->vars[2], 4*FRACUNIT); - raise->vars[3] = raise->vars[2]; + raise->basespeed = FixedDiv(P_AproxDistance(sourceline->dx, sourceline->dy), 4*FRACUNIT); - raise->vars[5] = P_FindHighestCeilingSurrounding(sec); - raise->vars[4] = raise->vars[5] - - (sec->ceilingheight - sec->floorheight); - - raise->vars[7] = P_FindLowestCeilingSurrounding(sec); - raise->vars[6] = raise->vars[7] - - (sec->ceilingheight - sec->floorheight); - - raise->sourceline = sourceline; + if (lower) + raise->flags |= RF_REVERSE; + if (spindash) + raise->flags |= RF_SPINDASH; } static void P_AddAirbob(sector_t *sec, line_t *sourceline, fixed_t dist, boolean raise, boolean dynamic, boolean spindash) @@ -6856,22 +6842,22 @@ void P_SpawnSpecials(boolean fromnetsave) case 190: // Rising Platform FOF (solid, opaque, shadows) P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); - P_AddRaiseThinker(lines[i].frontsector, &lines[i]); + P_AddRaiseThinker(lines[i].frontsector, &lines[i], !!(lines[i].flags & ML_BLOCKMONSTERS), !!(lines[i].flags & ML_NOCLIMB)); break; case 191: // Rising Platform FOF (solid, opaque, no shadows) P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_NOSHADE|FF_CUTLEVEL, secthinkers); - P_AddRaiseThinker(lines[i].frontsector, &lines[i]); + P_AddRaiseThinker(lines[i].frontsector, &lines[i], !!(lines[i].flags & ML_BLOCKMONSTERS), !!(lines[i].flags & ML_NOCLIMB)); break; case 192: // Rising Platform TL block: FOF (solid, translucent) P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_NOSHADE|FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA, secthinkers); - P_AddRaiseThinker(lines[i].frontsector, &lines[i]); + P_AddRaiseThinker(lines[i].frontsector, &lines[i], !!(lines[i].flags & ML_BLOCKMONSTERS), !!(lines[i].flags & ML_NOCLIMB)); break; case 193: // Rising Platform FOF (solid, invisible) P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_NOSHADE, secthinkers); - P_AddRaiseThinker(lines[i].frontsector, &lines[i]); + P_AddRaiseThinker(lines[i].frontsector, &lines[i], !!(lines[i].flags & ML_BLOCKMONSTERS), !!(lines[i].flags & ML_NOCLIMB)); break; case 194: // Rising Platform 'Platform' - You can jump up through it @@ -6881,7 +6867,7 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags |= FF_NOSHADE; P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - P_AddRaiseThinker(lines[i].frontsector, &lines[i]); + P_AddRaiseThinker(lines[i].frontsector, &lines[i], !!(lines[i].flags & ML_BLOCKMONSTERS), !!(lines[i].flags & ML_NOCLIMB)); break; case 195: // Rising Platform Translucent "platform" @@ -6891,7 +6877,7 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags |= FF_NOSHADE; P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - P_AddRaiseThinker(lines[i].frontsector, &lines[i]); + P_AddRaiseThinker(lines[i].frontsector, &lines[i], !!(lines[i].flags & ML_BLOCKMONSTERS), !!(lines[i].flags & ML_NOCLIMB)); break; case 200: // Light block diff --git a/src/p_spec.h b/src/p_spec.h index 083cd0ce6..06d4ad266 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -398,6 +398,26 @@ typedef struct UINT16 sound; } thwomp_t; +typedef enum +{ + RF_REVERSE = 1, //Lower when stood on + RF_SPINDASH = 1<<1, //Require spindash to move + RF_DYNAMIC = 1<<2, //Dynamically sinking platform +} raiseflag_t; + +typedef struct +{ + thinker_t thinker; + line_t *sourceline; + sector_t *sector; + fixed_t ceilingbottom; + fixed_t ceilingtop; + fixed_t basespeed; + fixed_t extraspeed; //For dynamically sinking platform + UINT8 shaketimer; //For dynamically sinking platform + UINT8 flags; +} raise_t; + #define ELEVATORSPEED (FRACUNIT*4) #define FLOORSPEED (FRACUNIT) @@ -437,7 +457,7 @@ void T_ThwompSector(thwomp_t *thwomp); void T_NoEnemiesSector(levelspecthink_t *nobaddies); void T_EachTimeThinker(levelspecthink_t *eachtime); void T_CameraScanner(elevator_t *elevator); -void T_RaiseSector(levelspecthink_t *sraise); +void T_RaiseSector(raise_t *raise); typedef struct { From abcc47ac6109d29e50c4ee06c8df66eefc936b35 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 26 Apr 2020 10:35:08 +0200 Subject: [PATCH 020/377] Bring signature of P_AddAirbob in line with next --- src/p_spec.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 6ffb56776..24f6e572e 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6074,7 +6074,7 @@ static void P_AddRaiseThinker(sector_t *sec, line_t *sourceline, boolean lower, raise->flags |= RF_SPINDASH; } -static void P_AddAirbob(sector_t *sec, line_t *sourceline, fixed_t dist, boolean raise, boolean dynamic, boolean spindash) +static void P_AddAirbob(sector_t *sec, line_t *sourceline, fixed_t dist, boolean raise, boolean spindash, boolean dynamic) { levelspecthink_t *airbob; @@ -6781,16 +6781,16 @@ void P_SpawnSpecials(boolean fromnetsave) { fixed_t dist = (lines[i].special == 151) ? P_AproxDistance(lines[i].dx, lines[i].dy) : 16*FRACUNIT; P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); - P_AddAirbob(lines[i].frontsector, lines + i, dist, false, false, !!(lines[i].flags & ML_NOCLIMB)); + P_AddAirbob(lines[i].frontsector, lines + i, dist, false, !!(lines[i].flags & ML_NOCLIMB), false); break; } case 152: // Adjustable air bobbing platform in reverse P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); - P_AddAirbob(lines[i].frontsector, lines + i, P_AproxDistance(lines[i].dx, lines[i].dy), true, false, !!(lines[i].flags & ML_NOCLIMB)); + P_AddAirbob(lines[i].frontsector, lines + i, P_AproxDistance(lines[i].dx, lines[i].dy), true, !!(lines[i].flags & ML_NOCLIMB), false); break; case 153: // Dynamic Sinking Platform P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); - P_AddAirbob(lines[i].frontsector, lines + i, P_AproxDistance(lines[i].dx, lines[i].dy), false, true, !!(lines[i].flags & ML_NOCLIMB)); + P_AddAirbob(lines[i].frontsector, lines + i, P_AproxDistance(lines[i].dx, lines[i].dy), false, !!(lines[i].flags & ML_NOCLIMB), true); break; case 160: // Float/bob platform From b439fa2b990a91aed3b2126bf8e71f5843edfcb0 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 26 Apr 2020 10:37:31 +0200 Subject: [PATCH 021/377] Uh-oh! Forgot to stash a file --- src/p_floor.c | 172 ++++++++++++++++---------------------------------- 1 file changed, 55 insertions(+), 117 deletions(-) diff --git a/src/p_floor.c b/src/p_floor.c index 6f3b459ca..b831fb78b 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -1833,14 +1833,18 @@ void T_EachTimeThinker(levelspecthink_t *eachtime) // Rises up to its topmost position when a // player steps on it. Lowers otherwise. // -void T_RaiseSector(levelspecthink_t *raise) +void T_RaiseSector(raise_t *raise) { msecnode_t *node; mobj_t *thing; sector_t *sector; INT32 i; boolean playeronme = false, active = false; + boolean moveUp; fixed_t ceilingdestination, floordestination; + fixed_t speed, origspeed; + fixed_t distToNearestEndpoint; + INT32 direction; result_e res = 0; if (raise->sector->crumblestate >= 3 || raise->sector->ceilingdata) @@ -1863,7 +1867,7 @@ void T_RaiseSector(levelspecthink_t *raise) continue; // Option to require spindashing. - if (raise->vars[1] && !(thing->player->pflags & PF_STARTDASH)) + if (raise->flags & RF_SPINDASH && !(thing->player->pflags & PF_STARTDASH)) continue; if (!(thing->z == P_GetSpecialTopZ(thing, raise->sector, sector))) @@ -1874,43 +1878,43 @@ void T_RaiseSector(levelspecthink_t *raise) } } - if (raise->vars[9]) // Dynamically Sinking Platform^tm + if (raise->flags & RF_DYNAMIC) // Dynamically Sinking Platform^tm { #define shaketime 10 - if (raise->vars[11] > shaketime) // State: moving + if (raise->shaketimer > shaketime) // State: moving { if (playeronme) // If player is standing on the platform, accelerate { - raise->vars[10] += (FRACUNIT >> 5); + raise->extraspeed += (FRACUNIT >> 5); } else // otherwise, decelerate until inflection { - raise->vars[10] -= FRACUNIT >> 3; - if (raise->vars[10] <= 0) // inflection! + raise->extraspeed -= FRACUNIT >> 3; + if (raise->extraspeed <= 0) // inflection! { - raise->vars[10] = 0; - raise->vars[11] = 0; // allow the shake to occur again (fucks over players attempting to jump-cheese) + raise->extraspeed = 0; + raise->shaketimer = 0; // allow the shake to occur again (fucks over players attempting to jump-cheese) } } - active = raise->vars[10] > 0; + active = raise->extraspeed > 0; } else // State: shaking { - if (playeronme || raise->vars[11]) + if (playeronme || raise->shaketimer) { active = true; - if (++raise->vars[11] > shaketime) + if (++raise->shaketimer > shaketime) { if (playeronme) - raise->vars[10] = FRACUNIT >> 5; + raise->extraspeed = FRACUNIT >> 5; else - raise->vars[10] = FRACUNIT << 1; + raise->extraspeed = FRACUNIT << 1; } else { - raise->vars[10] = ((shaketime/2) - raise->vars[11]) << FRACBITS; - if (raise->vars[10] < -raise->vars[2]/2) - raise->vars[10] = -raise->vars[2]/2; + raise->extraspeed = ((shaketime/2) - raise->shaketimer) << FRACBITS; + if (raise->extraspeed < -raise->basespeed/2) + raise->extraspeed = -raise->basespeed/2; } } } @@ -1919,125 +1923,59 @@ void T_RaiseSector(levelspecthink_t *raise) else // Air bobbing platform (not a Dynamically Sinking Platform^tm) active = playeronme; - if (active) + moveUp = active ^ (raise->flags & RF_REVERSE); + ceilingdestination = moveUp ? raise->ceilingtop : raise->ceilingbottom; + floordestination = ceilingdestination - (raise->sector->ceilingheight - raise->sector->floorheight); + + if ((moveUp && raise->sector->ceilingheight >= ceilingdestination) + || (!moveUp && raise->sector->ceilingheight <= ceilingdestination)) { - raise->vars[3] = raise->vars[2]; - - if (raise->vars[0] == 1) - { - if (raise->sector->ceilingheight <= raise->vars[7]) - { - raise->sector->floorheight = raise->vars[7] - (raise->sector->ceilingheight - raise->sector->floorheight); - raise->sector->ceilingheight = raise->vars[7]; - raise->sector->ceilspeed = 0; - raise->sector->floorspeed = 0; - return; - } - - raise->vars[8] = -1; - ceilingdestination = raise->vars[7]; - floordestination = raise->vars[6]; - } - else // elevateUp - { - if (raise->sector->ceilingheight >= raise->vars[5]) - { - raise->sector->floorheight = raise->vars[5] - (raise->sector->ceilingheight - raise->sector->floorheight); - raise->sector->ceilingheight = raise->vars[5]; - raise->sector->ceilspeed = 0; - raise->sector->floorspeed = 0; - return; - } - - raise->vars[8] = 1; - ceilingdestination = raise->vars[5]; - floordestination = raise->vars[4]; - } + raise->sector->floorheight = floordestination; + raise->sector->ceilingheight = ceilingdestination; + raise->sector->ceilspeed = 0; + raise->sector->floorspeed = 0; + return; } - else - { - raise->vars[3] = raise->vars[2]/2; + direction = moveUp ? 1 : -1; - if (raise->vars[0] == 1) - { - if (raise->sector->ceilingheight >= raise->vars[5]) - { - raise->sector->floorheight = raise->vars[5] - (raise->sector->ceilingheight - raise->sector->floorheight); - raise->sector->ceilingheight = raise->vars[5]; - raise->sector->ceilspeed = 0; - raise->sector->floorspeed = 0; - return; - } - raise->vars[8] = 1; - ceilingdestination = raise->vars[5]; - floordestination = raise->vars[4]; - } - else // elevateUp - { - if (raise->sector->ceilingheight <= raise->vars[7]) - { - raise->sector->floorheight = raise->vars[7] - (raise->sector->ceilingheight - raise->sector->floorheight); - raise->sector->ceilingheight = raise->vars[7]; - raise->sector->ceilspeed = 0; - raise->sector->floorspeed = 0; - return; - } - raise->vars[8] = -1; - ceilingdestination = raise->vars[7]; - floordestination = raise->vars[6]; - } - } + origspeed = raise->basespeed; + if (!active) + origspeed /= 2; - if ((raise->sector->ceilingheight - raise->vars[7]) - < (raise->vars[5] - raise->sector->ceilingheight)) - { - fixed_t origspeed = raise->vars[3]; + // Speed up as you get closer to the middle, then slow down again + distToNearestEndpoint = min(raise->sector->ceilingheight - raise->ceilingbottom, raise->ceilingtop - raise->sector->ceilingheight); + speed = FixedMul(origspeed, FixedDiv(distToNearestEndpoint, (raise->ceilingtop - raise->ceilingbottom) >> 5)); - // Slow down as you get closer to the bottom - raise->vars[3] = FixedMul(raise->vars[3],FixedDiv(raise->sector->ceilingheight - raise->vars[7], (raise->vars[5] - raise->vars[7])>>5)); + if (speed <= origspeed/16) + speed = origspeed/16; + else if (speed > origspeed) + speed = origspeed; - if (raise->vars[3] <= origspeed/16) - raise->vars[3] = origspeed/16; - else if (raise->vars[3] > origspeed) - raise->vars[3] = origspeed; - } - else - { - fixed_t origspeed = raise->vars[3]; - // Slow down as you get closer to the top - raise->vars[3] = FixedMul(raise->vars[3],FixedDiv(raise->vars[5] - raise->sector->ceilingheight, (raise->vars[5] - raise->vars[7])>>5)); - - if (raise->vars[3] <= origspeed/16) - raise->vars[3] = origspeed/16; - else if (raise->vars[3] > origspeed) - raise->vars[3] = origspeed; - } - - raise->vars[3] += raise->vars[10]; + speed += raise->extraspeed; res = T_MovePlane ( - raise->sector, // sector - raise->vars[3], // speed + raise->sector, // sector + speed, // speed ceilingdestination, // dest - 0, // crush - 1, // floor or ceiling (1 for ceiling) - raise->vars[8] // direction + 0, // crush + 1, // floor or ceiling (1 for ceiling) + direction // direction ); if (res == ok || res == pastdest) T_MovePlane ( - raise->sector, // sector - raise->vars[3], // speed + raise->sector, // sector + speed, // speed floordestination, // dest - 0, // crush - 0, // floor or ceiling (0 for floor) - raise->vars[8] // direction + 0, // crush + 0, // floor or ceiling (0 for floor) + direction // direction ); raise->sector->ceilspeed = 42; - raise->sector->floorspeed = raise->vars[3]*raise->vars[8]; + raise->sector->floorspeed = speed*direction; for (i = -1; (i = P_FindSectorFromTag(raise->sourceline->args[0], i)) >= 0 ;) P_RecalcPrecipInSector(§ors[i]); From 607aeb3a525cad0e1fc1f5a957c6405aa105f09d Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 27 Apr 2020 10:29:29 +0200 Subject: [PATCH 022/377] Adapt setup of air bobbing FOFs --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 32 ++++++++++++++++++ src/p_setup.c | 14 ++++++++ src/p_spec.c | 34 ++++++++++++-------- src/p_spec.h | 7 ++++ 4 files changed, 73 insertions(+), 14 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 506dd1515..d7f904869 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1583,6 +1583,38 @@ udmf } } + 150 + { + title = "Air Bobbing"; + prefix = "(150)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Bobbing distance"; + } + arg2 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Raise"; + 2 = "Require spindash"; + 4 = "Dynamic"; + } + } + arg3 + { + title = "Tangibility"; + type = 12; + enum = "tangibility"; + } + } + 170 { title = "Crumbling"; diff --git a/src/p_setup.c b/src/p_setup.c index 10b3ae80b..d8c65f1b8 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2931,6 +2931,20 @@ static void P_ConvertBinaryMap(void) lines[i].special = 100; break; + case 150: //FOF: Air bobbing + case 151: //FOF: Air bobbing (adjustable) + case 152: //FOF: Reverse air bobbing (adjustable) + case 153: //FOF: Dynamically sinking platform + lines[i].args[0] = lines[i].tag; + lines[i].args[1] = (lines[i].special == 150) ? 16*FRACUNIT : P_AproxDistance(lines[i].dx, lines[i].dy); + if (lines[i].special == 152) + lines[i].args[2] |= TMFB_REVERSE; + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[2] |= TMFB_SPINDASH; + if (lines[i].special == 153) + lines[i].args[3] |= TMFB_DYNAMIC; + lines[i].special = 150; + break; case 170: //FOF: Crumbling, respawn case 171: //FOF: Crumbling, no respawn case 172: //FOF: Crumbling, respawn, intangible from bottom diff --git a/src/p_spec.c b/src/p_spec.c index b564d4557..352282316 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6735,20 +6735,26 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 150: // Air bobbing platform - case 151: // Adjustable air bobbing platform - { - fixed_t dist = (lines[i].special == 150) ? 16*FRACUNIT : P_AproxDistance(lines[i].dx, lines[i].dy); - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); - P_AddAirbob(lines[i].frontsector, lines + i, dist, false, !!(lines[i].flags & ML_NOCLIMB), false); - break; - } - case 152: // Adjustable air bobbing platform in reverse - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); - P_AddAirbob(lines[i].frontsector, lines + i, P_AproxDistance(lines[i].dx, lines[i].dy), true, !!(lines[i].flags & ML_NOCLIMB), false); - break; - case 153: // Dynamic Sinking Platform - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); - P_AddAirbob(lines[i].frontsector, lines + i, P_AproxDistance(lines[i].dx, lines[i].dy), false, !!(lines[i].flags & ML_NOCLIMB), true); + ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; + + //Tangibility settings + if (lines[i].args[3] & TMFT_INTANGIBLETOP) + ffloorflags |= FF_REVERSEPLATFORM; + if (lines[i].args[3] & TMFT_INTANGIBLEBOTTOM) + ffloorflags |= FF_PLATFORM; + if (lines[i].args[3] & TMFT_DONTBLOCKPLAYER) + ffloorflags &= ~FF_BLOCKPLAYER; + if (lines[i].args[3] & TMFT_DONTBLOCKOTHERS) + ffloorflags &= ~FF_BLOCKOTHERS; + + //If player can enter it, cut inner walls + if (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE) + ffloorflags |= FF_CUTEXTRA|FF_EXTRA; + else + ffloorflags |= FF_CUTLEVEL; + + P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); + P_AddAirbob(lines[i].frontsector, lines + i, lines[i].args[1], !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); break; case 160: // Float/bob platform diff --git a/src/p_spec.h b/src/p_spec.h index 34f3c4068..cd3e8f737 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -54,6 +54,13 @@ typedef enum TMFW_GOOWATER = 1<<5, } textmapfofwater_t; +typedef enum +{ + TMFB_REVERSE = 1, + TMFB_SPINDASH = 1<<1, + TMFB_DYNAMIC = 1<<2, +} textmapfofbobbing_t; + typedef enum { TMFC_TRANSLUCENT = 1, From f6b67d8253dc37fa9654ec31b191534c8746f177 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 27 Apr 2020 10:58:38 +0200 Subject: [PATCH 023/377] Some additions/fixes for air bobbing FOFs --- src/p_setup.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/p_setup.c b/src/p_setup.c index d8c65f1b8..844e50972 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2937,12 +2937,21 @@ static void P_ConvertBinaryMap(void) case 153: //FOF: Dynamically sinking platform lines[i].args[0] = lines[i].tag; lines[i].args[1] = (lines[i].special == 150) ? 16*FRACUNIT : P_AproxDistance(lines[i].dx, lines[i].dy); + + //Flags if (lines[i].special == 152) lines[i].args[2] |= TMFB_REVERSE; if (lines[i].flags & ML_NOCLIMB) lines[i].args[2] |= TMFB_SPINDASH; if (lines[i].special == 153) - lines[i].args[3] |= TMFB_DYNAMIC; + lines[i].args[2] |= TMFB_DYNAMIC; + + //Tangibility + if (lines[i].flags & ML_EFFECT1) + lines[i].args[3] |= TMFT_DONTBLOCKOTHERS; + if (lines[i].flags & ML_EFFECT2) + lines[i].args[3] |= TMFT_DONTBLOCKPLAYER; + lines[i].special = 150; break; case 170: //FOF: Crumbling, respawn From 7198cc46fd23947a914642ed619a4e4de38f6315 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 27 Apr 2020 11:05:27 +0200 Subject: [PATCH 024/377] Adapt setup of water bobbing FOF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 19 ++++++++++++- src/p_setup.c | 10 +++++++ src/p_spec.c | 29 +++++++++++++++++--- 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index d7f904869..96e711641 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -397,7 +397,7 @@ doom } 160 { - title = "Floating, Bobbing"; + title = "Water Bobbing"; prefix = "(160)"; } 190 @@ -1615,6 +1615,23 @@ udmf } } + 160 + { + title = "Water Bobbing"; + prefix = "(160)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Tangibility"; + type = 12; + enum = "tangibility"; + } + } + 170 { title = "Crumbling"; diff --git a/src/p_setup.c b/src/p_setup.c index 844e50972..30e572982 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2954,6 +2954,16 @@ static void P_ConvertBinaryMap(void) lines[i].special = 150; break; + case 160: //FOF: Water bobbing + lines[i].args[0] = lines[i].tag; + + //Tangibility + if (lines[i].flags & ML_EFFECT1) + lines[i].args[1] |= TMFT_DONTBLOCKOTHERS; + if (lines[i].flags & ML_EFFECT2) + lines[i].args[1] |= TMFT_DONTBLOCKPLAYER; + + break; case 170: //FOF: Crumbling, respawn case 171: //FOF: Crumbling, no respawn case 172: //FOF: Crumbling, respawn, intangible from bottom diff --git a/src/p_spec.c b/src/p_spec.c index 352282316..86bc46f69 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6734,7 +6734,7 @@ void P_SpawnSpecials(boolean fromnetsave) P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); break; - case 150: // Air bobbing platform + case 150: // FOF (Air bobbing) ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; //Tangibility settings @@ -6757,11 +6757,32 @@ void P_SpawnSpecials(boolean fromnetsave) P_AddAirbob(lines[i].frontsector, lines + i, lines[i].args[1], !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); break; - case 160: // Float/bob platform - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_FLOATBOB, secthinkers); + case 160: // FOF (Water bobbing) + ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_FLOATBOB; + + //Tangibility settings + if (lines[i].args[1] & TMFT_INTANGIBLETOP) + ffloorflags |= FF_REVERSEPLATFORM; + if (lines[i].args[1] & TMFT_INTANGIBLEBOTTOM) + ffloorflags |= FF_PLATFORM; + if (lines[i].args[1] & TMFT_DONTBLOCKPLAYER) + ffloorflags &= ~FF_BLOCKPLAYER; + if (lines[i].args[1] & TMFT_DONTBLOCKOTHERS) + ffloorflags &= ~FF_BLOCKOTHERS; + + //If player can enter it, render insides + if (lines[i].args[1] & TMFT_VISIBLEFROMINSIDE) + { + if (ffloorflags & FF_RENDERPLANES) + ffloorflags |= FF_BOTHPLANES; + if (ffloorflags & FF_RENDERSIDES) + ffloorflags |= FF_ALLSIDES; + } + + P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); break; - case 170: // Crumbling platform + case 170: // FOF (Crumbling) ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CRUMBLE; //Tangibility settings From d9f761b619209e142c85d2508843e9f4eedd94b6 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 27 Apr 2020 11:52:31 +0200 Subject: [PATCH 025/377] Adapt setup of rising FOFs --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 52 ++++++++++++++++ src/p_setup.c | 47 ++++++++++++++ src/p_spec.c | 64 +++++++++++++------- src/p_spec.h | 6 ++ 4 files changed, 148 insertions(+), 21 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 96e711641..1043c3bf2 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1661,6 +1661,58 @@ udmf } } } + + 190 + { + title = "Rising"; + prefix = "(190)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Visibility"; + type = 12; + enum + { + 1 = "Don't render planes"; + 2 = "Don't render sides"; + 4 = "Render insides"; + } + } + arg2 + { + title = "Tangibility"; + type = 12; + enum = "tangibility"; + } + arg3 + { + title = "Appearance"; + type = 12; + enum + { + 1 = "Translucent"; + 2 = "No shadow"; + } + } + arg4 + { + title = "Speed"; + } + arg5 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Lower"; + 2 = "Require spindash"; + } + } + } 200 { diff --git a/src/p_setup.c b/src/p_setup.c index 30e572982..06297fd52 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2998,6 +2998,53 @@ static void P_ConvertBinaryMap(void) lines[i].args[2] |= TMFC_FLOATBOB; lines[i].special = 170; break; + case 190: // FOF: Rising, solid, opaque, shadowcasting + case 191: // FOF: Rising, solid, opaque, non-shadowcasting + case 192: // FOF: Rising, solid, translucent + case 193: // FOF: Rising, solid, invisible + case 194: // FOF: Rising, intangible from bottom, opaque + case 195: // FOF: Rising, intangible from bottom, translucent + lines[i].args[0] = lines[i].tag; + + //Visibility + if (lines[i].special == 193) + lines[i].args[1] = TMFV_NOPLANES|TMFV_NOSIDES; + if (lines[i].special >= 194) + lines[i].args[1] = TMFV_TOGGLEINSIDES; + + //Tangibility + if (lines[i].flags & ML_EFFECT1) + lines[i].args[2] |= TMFT_DONTBLOCKOTHERS; + if (lines[i].flags & ML_EFFECT2) + lines[i].args[2] |= TMFT_DONTBLOCKPLAYER; + if (lines[i].special >= 194) + lines[i].args[2] |= TMFT_INTANGIBLEBOTTOM; + + //Translucency + if (lines[i].special == 192 || lines[i].special == 195) + { + lines[i].args[3] |= TMFA_TRANSLUCENT; + if (sides[lines[i].sidenum[0]].toptexture > 0) + lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; + else + lines[i].alpha = FRACUNIT/2; + } + + //Shadow? + if (lines[i].special != 190 && (lines[i].special <= 193 || lines[i].flags & ML_NOCLIMB)) + lines[i].args[3] |= TMFA_NOSHADE; + + //Speed + lines[i].args[4] = FixedDiv(P_AproxDistance(lines[i].dx, lines[i].dy), 4*FRACUNIT) >> FRACBITS; + + //Flags + if (lines[i].flags & ML_BLOCKMONSTERS) + lines[i].args[5] |= TMFR_REVERSE; + if (lines[i].flags & ML_BLOCKMONSTERS) + lines[i].args[5] |= TMFR_SPINDASH; + + lines[i].special = 190; + break; case 200: //FOF: Light block case 201: //FOF: Half light block lines[i].args[0] = lines[i].tag; diff --git a/src/p_spec.c b/src/p_spec.c index 5f07b9529..240015ad7 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6825,34 +6825,56 @@ void P_SpawnSpecials(boolean fromnetsave) P_AddAirbob(lines[i].frontsector, lines + i, 16*FRACUNIT, false, false, false); break; - case 190: // Rising Platform FOF (solid, opaque, shadows) - case 191: // Rising Platform FOF (solid, opaque, no shadows) - case 192: // Rising Platform TL block: FOF (solid, translucent) - case 193: // Rising Platform FOF (solid, invisible) - case 194: // Rising Platform 'Platform' - You can jump up through it - case 195: // Rising Platform Translucent "platform" + case 190: // FOF (Rising) { - fixed_t speed = FixedDiv(P_AproxDistance(lines[i].dx, lines[i].dy), 4*FRACUNIT); fixed_t ceilingtop = P_FindHighestCeilingSurrounding(lines[i].frontsector); fixed_t ceilingbottom = P_FindLowestCeilingSurrounding(lines[i].frontsector); - ffloorflags = FF_EXISTS|FF_SOLID; - if (lines[i].special != 193) - ffloorflags |= FF_RENDERALL; - if (lines[i].special <= 191) - ffloorflags |= FF_CUTLEVEL; - if (lines[i].special == 192 || lines[i].special == 195) - ffloorflags |= FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA; - if (lines[i].special >= 194) - ffloorflags |= FF_PLATFORM|FF_BOTHPLANES|FF_ALLSIDES; - if (lines[i].special != 190 && (lines[i].special <= 193 || lines[i].flags & ML_NOCLIMB)) - ffloorflags |= FF_NOSHADE; - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); + ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; - P_AddRaiseThinker(lines[i].frontsector, &lines[i], speed, ceilingtop, ceilingbottom, !!(lines[i].flags & ML_BLOCKMONSTERS), !!(lines[i].flags & ML_NOCLIMB)); + //Visibility settings + if (lines[i].args[1] & TMFV_NOPLANES) + ffloorflags &= ~FF_RENDERPLANES; + if (lines[i].args[1] & TMFV_NOSIDES) + ffloorflags &= ~FF_RENDERSIDES; + if (lines[i].args[1] & TMFV_TOGGLEINSIDES) + { + if (ffloorflags & FF_RENDERPLANES) + ffloorflags |= FF_BOTHPLANES; + if (ffloorflags & FF_RENDERSIDES) + ffloorflags |= FF_ALLSIDES; + } + + //Tangibility settings + if (lines[i].args[2] & TMFT_INTANGIBLETOP) + ffloorflags |= FF_REVERSEPLATFORM; + if (lines[i].args[2] & TMFT_INTANGIBLEBOTTOM) + ffloorflags |= FF_PLATFORM; + if (lines[i].args[2] & TMFT_DONTBLOCKPLAYER) + ffloorflags &= ~FF_BLOCKPLAYER; + if (lines[i].args[2] & TMFT_DONTBLOCKOTHERS) + ffloorflags &= ~FF_BLOCKOTHERS; + + //Appearance settings + if ((lines[i].args[3] & TMFA_TRANSLUCENT) && (ffloorflags & FF_RENDERALL)) //Translucent + ffloorflags |= FF_TRANSLUCENT; + if (lines[i].args[3] & TMFA_NOSHADE) + ffloorflags |= FF_NOSHADE; + + //Cutting options + if (ffloorflags & FF_RENDERALL) + { + //If translucent or player can enter it, cut inner walls + if ((ffloorflags & FF_TRANSLUCENT) || (lines[i].args[2] & TMFT_VISIBLEFROMINSIDE)) + ffloorflags |= FF_CUTEXTRA|FF_EXTRA; + else + ffloorflags |= FF_CUTLEVEL; + } + + P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); + P_AddRaiseThinker(lines[i].frontsector, &lines[i], lines[i].args[4] << FRACBITS, ceilingtop, ceilingbottom, !!(lines[i].args[5] & TMFR_REVERSE), !!(lines[i].args[5] & TMFR_SPINDASH)); break; } - case 200: // Light block ffloorflags = FF_EXISTS|FF_CUTSPRITES; if (!lines[i].args[1]) diff --git a/src/p_spec.h b/src/p_spec.h index cd3e8f737..83f7d9978 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -70,6 +70,12 @@ typedef enum TMFC_FLOATBOB = 1<<4, } textmapfofcrumbling_t; +typedef enum +{ + TMFR_REVERSE = 1, + TMFR_SPINDASH = 1<<1, +} textmapfofrising_t; + typedef enum { TMFM_BRICK = 1, From c702e697b610c37fd0a7a8da7468ef54b2c018aa Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 27 Apr 2020 11:55:05 +0200 Subject: [PATCH 026/377] Fix bobbing FOF speed --- src/p_setup.c | 2 +- src/p_spec.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 06297fd52..91bce3e2e 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2936,7 +2936,7 @@ static void P_ConvertBinaryMap(void) case 152: //FOF: Reverse air bobbing (adjustable) case 153: //FOF: Dynamically sinking platform lines[i].args[0] = lines[i].tag; - lines[i].args[1] = (lines[i].special == 150) ? 16*FRACUNIT : P_AproxDistance(lines[i].dx, lines[i].dy); + lines[i].args[1] = (lines[i].special == 150) ? 16 : (P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS); //Flags if (lines[i].special == 152) diff --git a/src/p_spec.c b/src/p_spec.c index 240015ad7..dcc6de697 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6754,7 +6754,7 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags |= FF_CUTLEVEL; P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); - P_AddAirbob(lines[i].frontsector, lines + i, lines[i].args[1], !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); + P_AddAirbob(lines[i].frontsector, lines + i, lines[i].args[1] << FRACBITS, !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); break; case 160: // FOF (Water bobbing) From 863ac48c9b16e7681aea7838eaa68955fb6775f4 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 27 Apr 2020 11:56:29 +0200 Subject: [PATCH 027/377] Fix rising FOF speed --- src/p_setup.c | 2 +- src/p_spec.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 91bce3e2e..0aa9d3eab 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3035,7 +3035,7 @@ static void P_ConvertBinaryMap(void) lines[i].args[3] |= TMFA_NOSHADE; //Speed - lines[i].args[4] = FixedDiv(P_AproxDistance(lines[i].dx, lines[i].dy), 4*FRACUNIT) >> FRACBITS; + lines[i].args[4] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; //Flags if (lines[i].flags & ML_BLOCKMONSTERS) diff --git a/src/p_spec.c b/src/p_spec.c index dcc6de697..63abf8bc7 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6038,7 +6038,7 @@ static void P_AddRaiseThinker(sector_t *sec, line_t *sourceline, fixed_t speed, raise->ceilingtop = ceilingtop; raise->ceilingbottom = ceilingbottom; - raise->basespeed = speed; + raise->basespeed = speed >> 2; if (lower) raise->flags |= RF_REVERSE; From 3a05d7b33351dcf030dbe9b02933b9458a183b62 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 1 May 2020 14:55:20 +0200 Subject: [PATCH 028/377] Fix ZB config typo --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 1043c3bf2..267e52845 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1717,7 +1717,7 @@ udmf 200 { title = "Light Block"; - prefix = "(200); + prefix = "(200)"; arg0 { title = "Target sector tag"; From f2011cc99b159adb1c97726164b671430fc4139b Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 1 May 2020 14:59:08 +0200 Subject: [PATCH 029/377] More config fixes --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 267e52845..53a82aa0a 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1734,7 +1734,7 @@ udmf 202 { title = "Fog Block"; - prefix = "(202); + prefix = "(202)"; arg0 { title = "Target sector tag"; @@ -1777,7 +1777,7 @@ udmf 223 { title = "Intangible, Invisible"; - prefix = "(223); + prefix = "(223)"; arg0 { title = "Target sector tag"; @@ -1788,7 +1788,7 @@ udmf 250 { title = "Mario Block"; - prefix = "(250); + prefix = "(250)"; arg0 { title = "Target sector tag"; @@ -1809,7 +1809,7 @@ udmf 251 { title = "Thwomp Block"; - prefix = "(251); + prefix = "(251)"; arg0 { title = "Target sector tag"; @@ -1853,7 +1853,7 @@ udmf } arg2 { - title = "Translucent?" + title = "Translucent?"; type = 11; enum = "noyes"; } From d7363ff87a7c3e70aa4a5a35bdca7b8435835165 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 1 May 2020 19:07:29 +0200 Subject: [PATCH 030/377] Implement linedef type that adds a raise thinker to an FOF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 25 ++++++++++++++++++++ src/p_spec.c | 21 ++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 53a82aa0a..a356a2df7 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1916,6 +1916,31 @@ udmf enum = "yesno"; } } + + 260 + { + title = "Add Raise Thinker"; + prefix = "(260)"; + arg0 + { + title = "Control linedef tag"; + type = 15; + } + arg1 + { + title = "Speed"; + } + arg2 + { + title = "Destination height"; + } + arg3 + { + title = "Require spindash?"; + type = 11; + enum = "noyes"; + } + } } linedefexecmisc diff --git a/src/p_spec.c b/src/p_spec.c index 72b8ebbb4..128f84a73 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6450,6 +6450,7 @@ void P_SpawnSpecials(boolean fromnetsave) switch (lines[i].special) { INT32 s; + INT32 l; size_t sec; ffloortype_e ffloorflags; @@ -6968,6 +6969,26 @@ void P_SpawnSpecials(boolean fromnetsave) I_Error("Custom FOF (tag %d) found without a linedef back side!", lines[i].tag); break; + case 260: // Add raise thinker to FOF + if (udmf) + { + fixed_t destheight = lines[i].args[2] << FRACBITS; + fixed_t startheight, topheight, bottomheight; + + for (l = -1; (l = P_FindLineFromTag(lines[i].args[0], l)) >= 0 ;) + { + if (lines[l].special < 100 || lines[l].special >= 300) + continue; + + startheight = lines[l].frontsector->ceilingheight; + topheight = max(startheight, destheight); + bottomheight = min(startheight, destheight); + + P_AddRaiseThinker(lines[l].frontsector, lines[l].args[0], lines[i].args[1] << FRACBITS, topheight, bottomheight, (destheight < startheight), !!(lines[i].args[3])); + } + } + break; + case 300: // Linedef executor (combines with sector special 974/975) and commands case 302: case 303: From cada0d2928838e0309e10d1dbf9a787e68f2f7e9 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 1 May 2020 19:29:19 +0200 Subject: [PATCH 031/377] Implement "add airbob thinker to FOF" linedef type --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 26 ++++++++++++++++++++ src/p_spec.c | 13 ++++++++++ 2 files changed, 39 insertions(+) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index a356a2df7..9b520a56e 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1941,6 +1941,32 @@ udmf enum = "noyes"; } } + + 261 + { + title = "Add Air Bobbing Thinker"; + prefix = "(261)"; + arg0 + { + title = "Control linedef tag"; + type = 15; + } + arg1 + { + title = "Bobbing distance"; + } + arg2 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Raise"; + 2 = "Require spindash"; + 4 = "Dynamic"; + } + } + } } linedefexecmisc diff --git a/src/p_spec.c b/src/p_spec.c index 128f84a73..3b86857d2 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6989,6 +6989,19 @@ void P_SpawnSpecials(boolean fromnetsave) } break; + case 261: // Add air bob thinker to FOF + if (udmf) + { + for (l = -1; (l = P_FindLineFromTag(lines[i].args[0], l)) >= 0 ;) + { + if (lines[l].special < 100 || lines[l].special >= 300) + continue; + + P_AddAirbob(lines[l].frontsector, lines[l].args[0], lines[i].args[1] << FRACBITS, !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); + } + } + break; + case 300: // Linedef executor (combines with sector special 974/975) and commands case 302: case 303: From 7000c203a23966b6f44defd3f3017f83ac239d91 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 1 May 2020 19:41:52 +0200 Subject: [PATCH 032/377] Implement "add thwomp thinker to FOF" linedef type --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 24 ++++++++++++++++++++ src/p_spec.c | 15 ++++++++++++ 2 files changed, 39 insertions(+) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 9b520a56e..e46f533f7 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1967,6 +1967,30 @@ udmf } } } + + 262 + { + title = "Thwomp Block"; + prefix = "(262)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Falling speed"; + } + arg2 + { + title = "Rising speed"; + } + stringarg0 + { + title = "Crushing sound"; + type = 2; + } + } } linedefexecmisc diff --git a/src/p_spec.c b/src/p_spec.c index 3b86857d2..0526d34ff 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7002,6 +7002,21 @@ void P_SpawnSpecials(boolean fromnetsave) } break; + case 262: // Add thwomp thinker to FOF + if (udmf) + { + UINT16 sound = (lines[i].stringargs[0]) ? get_number(lines[i].stringargs[0]) : sfx_thwomp; + + for (l = -1; (l = P_FindLineFromTag(lines[i].args[0], l)) >= 0 ;) + { + if (lines[l].special < 100 || lines[l].special >= 300) + continue; + + P_AddThwompThinker(lines[l].frontsector, lines[l].args[0], &lines[l], lines[i].args[1] << FRACBITS, lines[i].args[2] << FRACBITS, sound); + } + } + break; + case 300: // Linedef executor (combines with sector special 974/975) and commands case 302: case 303: From 3b0fc857c8a1881beb7499398b8c60ee95476c93 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 1 May 2020 19:43:44 +0200 Subject: [PATCH 033/377] UDB config fix --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index e46f533f7..8c093052f 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1970,12 +1970,12 @@ udmf 262 { - title = "Thwomp Block"; + title = "Add Thwomp Thinker"; prefix = "(262)"; arg0 { - title = "Target sector tag"; - type = 13; + title = "Control linedef tag"; + type = 15; } arg1 { From 312a2def3d8a2cc84f38dc298007feacd9888b1f Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 2 May 2020 10:30:21 +0200 Subject: [PATCH 034/377] Implement "add laser thinker to FOF" linedef type --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 17 +++++++++++++++++ src/p_spec.c | 13 +++++++++++++ 2 files changed, 30 insertions(+) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 8c093052f..87ef6db33 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1991,6 +1991,23 @@ udmf type = 2; } } + + 263 + { + title = "Add Laser Thinker"; + prefix = "(263)"; + arg0 + { + title = "Control linedef tag"; + type = 15; + } + arg1 + { + title = "Damage bosses?"; + type = 11; + enum = "yesno"; + } + } } linedefexecmisc diff --git a/src/p_spec.c b/src/p_spec.c index a207b0fad..e5e50d73e 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6999,6 +6999,19 @@ void P_SpawnSpecials(boolean fromnetsave) } break; + case 263: // Add laser thinker to FOF + if (udmf) + { + for (l = -1; (l = P_FindLineFromTag(lines[i].args[0], l)) >= 0 ;) + { + if (lines[l].special < 100 || lines[l].special >= 300) + continue; + + P_AddLaserThinker(lines[l].args[0], lines + l, !!(lines[i].args[1])); + } + } + break; + case 300: // Linedef executor (combines with sector special 974/975) and commands case 302: case 303: From 538c81676bb8b08d7c3e806d933c213bb562717c Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 2 May 2020 10:40:35 +0200 Subject: [PATCH 035/377] Recognize ML_EFFECT1 and ML_EFFECT2 on crumbling FOFs --- src/p_setup.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/p_setup.c b/src/p_setup.c index 0aa9d3eab..c2f6e8e10 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2996,6 +2996,12 @@ static void P_ConvertBinaryMap(void) lines[i].args[2] |= TMFC_AIRBOB; if (lines[i].special >= 176 && lines[i].special <= 179) lines[i].args[2] |= TMFC_FLOATBOB; + + if (lines[i].flags & ML_EFFECT1) + lines[i].args[1] |= TMFT_DONTBLOCKOTHERS; + if (lines[i].flags & ML_EFFECT2) + lines[i].args[1] |= TMFT_DONTBLOCKPLAYER; + lines[i].special = 170; break; case 190: // FOF: Rising, solid, opaque, shadowcasting From 21eccc15d8bfd129325e2688e46a8430ec1220da Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 2 May 2020 14:51:03 +0200 Subject: [PATCH 036/377] Bustable blocks: Forgot to adapt linedef executor triggering for pushables --- src/p_mobj.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 1e9346bf1..a13299c71 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1732,8 +1732,8 @@ static void P_PushableCheckBustables(mobj_t *mo) EV_CrumbleChain(NULL, rover); // node->m_sector // Run a linedef executor?? - if (rover->master->flags & ML_EFFECT5) - P_LinedefExecute((INT16)(P_AproxDistance(rover->master->dx, rover->master->dy)>>FRACBITS), mo, node->m_sector); + if (rover->master->args[3] & TMFB_EXECUTOR) + P_LinedefExecute((INT16)(rover->master->args[4]), mo, node->m_sector); goto bustupdone; } From be92ed7091c29b473143d26b8105c6a1f99b73e0 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 2 May 2020 20:24:17 +0200 Subject: [PATCH 037/377] UDB config fix --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 87ef6db33..cacff27e1 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1830,10 +1830,10 @@ udmf } } - 252 + 254 { title = "Bustable Block"; - prefix = "(252)"; + prefix = "(254)"; arg0 { title = "Target sector tag"; From 1f041496c7748f9d9430245af2843733e0631727 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 2 May 2020 21:19:55 +0200 Subject: [PATCH 038/377] Store bustable FOF data directly in ffloor_t instead of referring to master line --- src/dehacked.c | 18 ++++-- src/lua_maplib.c | 15 +++++ src/p_mobj.c | 57 ++++++++++--------- src/p_spec.c | 41 ++++++++++---- src/p_user.c | 144 ++++++++++++++++++++++++----------------------- src/r_defs.h | 26 +++++++-- 6 files changed, 182 insertions(+), 119 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index e9d029be0..3051b92d1 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -9688,20 +9688,26 @@ struct { {"FF_FLOATBOB",FF_FLOATBOB}, ///< Floats on water and bobs if you step on it. {"FF_NORETURN",FF_NORETURN}, ///< Used with ::FF_CRUMBLE. Will not return to its original position after falling. {"FF_CRUMBLE",FF_CRUMBLE}, ///< Falls 2 seconds after being stepped on, and randomly brings all touching crumbling 3dfloors down with it, providing their master sectors share the same tag (allows crumble platforms above or below, to also exist). - {"FF_SHATTERBOTTOM",FF_SHATTERBOTTOM}, ///< Used with ::FF_BUSTUP. Like FF_SHATTER, but only breaks from the bottom. Good for springing up through rubble. + {"FF_GOOWATER",FF_GOOWATER}, ///< Used with ::FF_SWIMMABLE. Makes thick bouncey goop. {"FF_MARIO",FF_MARIO}, ///< Acts like a question block when hit from underneath. Goodie spawned at top is determined by master sector. - {"FF_BUSTUP",FF_BUSTUP}, ///< You can spin through/punch this block and it will crumble! {"FF_QUICKSAND",FF_QUICKSAND}, ///< Quicksand! {"FF_PLATFORM",FF_PLATFORM}, ///< You can jump up through this to the top. {"FF_REVERSEPLATFORM",FF_REVERSEPLATFORM}, ///< A fall-through floor in normal gravity, a platform in reverse gravity. {"FF_INTANGIBLEFLATS",FF_INTANGIBLEFLATS}, ///< Both flats are intangible, but the sides are still solid. {"FF_INTANGABLEFLATS",FF_INTANGIBLEFLATS}, ///< Both flats are intangable, but the sides are still solid. - {"FF_SHATTER",FF_SHATTER}, ///< Used with ::FF_BUSTUP. Bustable on mere touch. - {"FF_SPINBUST",FF_SPINBUST}, ///< Used with ::FF_BUSTUP. Also bustable if you're in your spinning frames. - {"FF_STRONGBUST",FF_STRONGBUST}, ///< Used with ::FF_BUSTUP. Only bustable by "strong" characters (Knuckles) and abilities (bouncing, twinspin, melee). {"FF_RIPPLE",FF_RIPPLE}, ///< Ripple the flats {"FF_COLORMAPONLY",FF_COLORMAPONLY}, ///< Only copy the colormap, not the lightlevel - {"FF_GOOWATER",FF_GOOWATER}, ///< Used with ::FF_SWIMMABLE. Makes thick bouncey goop. + + // Bustable FOF type + {"BT_TOUCH",BT_TOUCH}, + {"BT_SPIN",BT_SPIN}, + {"BT_REGULAR",BT_REGULAR}, + {"BT_STRONG",BT_STRONG}, + + // Bustable FOF flags + {"BF_PUSHABLES",BF_PUSHABLES}, + {"BF_EXECUTOR",BF_EXECUTOR}, + {"BF_ONLYBOTTOM",BF_ONLYBOTTOM}, #ifdef HAVE_LUA_SEGS // Node flags diff --git a/src/lua_maplib.c b/src/lua_maplib.c index a3bdd9aa8..6ea82e2bf 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -187,6 +187,9 @@ enum ffloor_e { ffloor_next, ffloor_prev, ffloor_alpha, + ffloor_busttype, + ffloor_bustflags, + ffloor_busttag, }; static const char *const ffloor_opt[] = { @@ -205,6 +208,9 @@ static const char *const ffloor_opt[] = { "next", "prev", "alpha", + "busttype", + "bustflags", + "busttag", NULL}; #ifdef HAVE_LUA_SEGS @@ -1752,6 +1758,15 @@ static int ffloor_get(lua_State *L) case ffloor_alpha: lua_pushinteger(L, ffloor->alpha); return 1; + case ffloor_busttype: + lua_pushinteger(L, ffloor->busttype); + return 1; + case ffloor_bustflags: + lua_pushinteger(L, ffloor->bustflags); + return 1; + case ffloor_busttag: + lua_pushinteger(L, ffloor->busttag); + return 1; } return 0; } diff --git a/src/p_mobj.c b/src/p_mobj.c index 8acd1bec4..62aa7770a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1691,8 +1691,7 @@ static void P_PushableCheckBustables(mobj_t *mo) if (!(rover->flags & FF_BUSTUP)) continue; - // Bustable by pushables? - if (!(rover->master->args[3] & TMFB_PUSHABLES)) + if (!(rover->bustflags & BF_PUSHABLES)) continue; if (rover->master->frontsector->crumblestate != CRUMBLE_NONE) @@ -1702,7 +1701,7 @@ static void P_PushableCheckBustables(mobj_t *mo) bottomheight = P_GetFOFBottomZ(mo, node->m_sector, rover, mo->x, mo->y, NULL); // Height checks - if (rover->flags & FF_SHATTERBOTTOM) + if (rover->bustflags & BF_ONLYBOTTOM) { if (mo->z + mo->momz + mo->height < bottomheight) continue; @@ -1710,36 +1709,42 @@ static void P_PushableCheckBustables(mobj_t *mo) if (mo->z + mo->height > bottomheight) continue; } - else if (rover->flags & FF_SPINBUST) - { - if (mo->z + mo->momz > topheight) - continue; - - if (mo->z + mo->height < bottomheight) - continue; - } - else if (rover->flags & FF_SHATTER) - { - if (mo->z + mo->momz > topheight) - continue; - - if (mo->z + mo->momz + mo->height < bottomheight) - continue; - } else { - if (mo->z >= topheight) - continue; + switch (rover->busttype) + { + case BT_TOUCH: + if (mo->z + mo->momz > topheight) + continue; - if (mo->z + mo->height < bottomheight) - continue; + if (mo->z + mo->momz + mo->height < bottomheight) + continue; + + break; + case BT_SPIN: + if (mo->z + mo->momz > topheight) + continue; + + if (mo->z + mo->height < bottomheight) + continue; + + break; + default: + if (mo->z >= topheight) + continue; + + if (mo->z + mo->height < bottomheight) + continue; + + break; + } } EV_CrumbleChain(NULL, rover); // node->m_sector // Run a linedef executor?? - if (rover->master->args[3] & TMFB_EXECUTOR) - P_LinedefExecute((INT16)(rover->master->args[4]), mo, node->m_sector); + if (rover->bustflags & BF_EXECUTOR) + P_LinedefExecute(rover->busttag, mo, node->m_sector); goto bustupdone; } @@ -2831,7 +2836,7 @@ static void P_CheckMarioBlocks(mobj_t *mo) if (*rover->bottomheight != mo->ceilingz) continue; - if (rover->flags & FF_SHATTERBOTTOM) // Brick block! + if (rover->flags & FF_GOOWATER) // Brick block! EV_CrumbleChain(node->m_sector, rover); else // Question block! EV_MarioBlock(rover, node->m_sector, mo); diff --git a/src/p_spec.c b/src/p_spec.c index adfe8b314..e17da83a8 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5867,12 +5867,12 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f if (flags & FF_QUICKSAND) CheckForQuicksand = true; - if ((flags & FF_BUSTUP) || (flags & FF_SHATTER) || (flags & FF_SPINBUST)) + if (flags & FF_BUSTUP) CheckForBustableBlocks = true; if ((flags & FF_MARIO)) { - if (!(flags & FF_SHATTERBOTTOM)) // Don't change the textures of a brick block, just a question block + if (!(flags & FF_GOOWATER)) // Don't change the textures of a brick block, just a question block P_AddBlockThinker(sec2, master); CheckForMarioBlocks = true; } @@ -6875,7 +6875,7 @@ void P_SpawnSpecials(boolean fromnetsave) case 250: // Mario Block ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_MARIO; if (lines[i].args[1] & TMFM_BRICK) - ffloorflags |= FF_SHATTERBOTTOM; + ffloorflags |= FF_GOOWATER; if (lines[i].args[1] & TMFM_INVISIBLE) ffloorflags &= ~(FF_SOLID|FF_RENDERALL|FF_CUTLEVEL); @@ -6891,36 +6891,53 @@ void P_SpawnSpecials(boolean fromnetsave) } case 254: // Bustable block + { + UINT8 busttype = BT_REGULAR; + UINT8 bustflags = 0; + ffloorflags = FF_EXISTS|FF_BLOCKOTHERS|FF_RENDERALL|FF_BUSTUP; //Bustable type switch (lines[i].args[1]) { case TMFB_TOUCH: - ffloorflags |= FF_SHATTER; + busttype = BT_TOUCH; break; case TMFB_SPIN: - ffloorflags |= FF_SPINBUST; + busttype = BT_SPIN; + break; + case TMFB_REGULAR: + busttype = BT_REGULAR; break; case TMFB_STRONG: - ffloorflags |= FF_STRONGBUST; - break; - default: + busttype = BT_STRONG; break; } + //Translucent? if (lines[i].args[2]) ffloorflags |= FF_TRANSLUCENT; + //Flags + if (lines[i].args[3] & TMFB_PUSHABLES) + bustflags |= BF_PUSHABLES; + if (lines[i].args[3] & TMFB_EXECUTOR) + bustflags |= BF_EXECUTOR; if (lines[i].args[3] & TMFB_ONLYBOTTOM) - ffloorflags |= FF_SHATTERBOTTOM; + bustflags |= BF_ONLYBOTTOM; - if (!(ffloorflags & FF_SHATTER) || ffloorflags & FF_SHATTERBOTTOM) + if (busttype != BT_TOUCH || bustflags & BF_ONLYBOTTOM) ffloorflags |= FF_BLOCKPLAYER; - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); + for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0], s)) >= 0 ;) + { + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, ffloorflags, secthinkers); + fflr->busttype = busttype; + fflr->bustflags = bustflags; + fflr->busttag = lines[i].args[4]; + } break; - + } case 257: // Quicksand ffloorflags = FF_EXISTS|FF_QUICKSAND|FF_RENDERALL|FF_ALLSIDES|FF_CUTSPRITES; if (!(lines[i].args[1])) diff --git a/src/p_user.c b/src/p_user.c index 562448151..14e466fde 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2543,58 +2543,56 @@ static boolean P_PlayerCanBust(player_t *player, ffloor_t *rover) /*if (rover->master->frontsector->crumblestate != CRUMBLE_NONE) return false;*/ - // If it's an FF_SHATTER, you can break it just by touching it. - if (rover->flags & FF_SHATTER) - return true; - - // If it's an FF_SPINBUST, you can break it if you are in your spinning frames - // (either from jumping or spindashing). - if (rover->flags & FF_SPINBUST) + switch (rover->busttype) { + case BT_TOUCH: // Shatters on contact + return true; + case BT_SPIN: // Can be busted by spinning (either from jumping or spindashing) if ((player->pflags & PF_SPINNING) && !(player->pflags & PF_STARTDASH)) return true; if ((player->pflags & PF_JUMPED) && !(player->pflags & PF_NOJUMPDAMAGE)) return true; + + /* FALLTHRU */ + case BT_REGULAR: + // Spinning (and not jumping) + if ((player->pflags & PF_SPINNING) && !(player->pflags & PF_JUMPED)) + return true; + + // Super + if (player->powers[pw_super]) + return true; + + // Dashmode + if ((player->charflags & (SF_DASHMODE|SF_MACHINE)) == (SF_DASHMODE|SF_MACHINE) && player->dashmode >= DASHMODE_THRESHOLD) + return true; + + // NiGHTS drill + if (player->pflags & PF_DRILLING) + return true; + + // Recording for Metal Sonic + if (metalrecording) + return true; + + /* FALLTHRU */ + case BT_STRONG: // Requires a "strong ability" + if (player->charability == CA_GLIDEANDCLIMB) + return true; + + if (player->pflags & PF_BOUNCING) + return true; + + if (player->charability == CA_TWINSPIN && player->panim == PA_ABILITY) + return true; + + if (player->charability2 == CA2_MELEE && player->panim == PA_ABILITY2) + return true; + + break; } - // Strong abilities can break even FF_STRONGBUST. - if (player->charability == CA_GLIDEANDCLIMB) - return true; - - if (player->pflags & PF_BOUNCING) - return true; - - if (player->charability == CA_TWINSPIN && player->panim == PA_ABILITY) - return true; - - if (player->charability2 == CA2_MELEE && player->panim == PA_ABILITY2) - return true; - - // Everyone else is out of luck. - if (rover->flags & FF_STRONGBUST) - return false; - - // Spinning (and not jumping) - if ((player->pflags & PF_SPINNING) && !(player->pflags & PF_JUMPED)) - return true; - - // Super - if (player->powers[pw_super]) - return true; - - // Dashmode - if ((player->charflags & (SF_DASHMODE|SF_MACHINE)) == (SF_DASHMODE|SF_MACHINE) && player->dashmode >= DASHMODE_THRESHOLD) - return true; - - // NiGHTS drill - if (player->pflags & PF_DRILLING) - return true; - - // Recording for Metal Sonic - if (metalrecording) - return true; - return false; } @@ -2645,7 +2643,7 @@ static void P_CheckBustableBlocks(player_t *player) } // Height checks - if (rover->flags & FF_SHATTERBOTTOM) + if (rover->bustflags & BF_ONLYBOTTOM) { if (player->mo->z + player->mo->momz + player->mo->height < bottomheight) continue; @@ -2653,35 +2651,41 @@ static void P_CheckBustableBlocks(player_t *player) if (player->mo->z + player->mo->height > bottomheight) continue; } - else if (rover->flags & FF_SPINBUST) - { - if (player->mo->z + player->mo->momz > topheight) - continue; - - if (player->mo->z + player->mo->height < bottomheight) - continue; - } - else if (rover->flags & FF_SHATTER) - { - if (player->mo->z + player->mo->momz > topheight) - continue; - - if (player->mo->z + player->mo->momz + player->mo->height < bottomheight) - continue; - } else { - if (player->mo->z >= topheight) - continue; + switch (rover->busttype) + { + case BT_TOUCH: + if (player->mo->z + player->mo->momz > topheight) + continue; - if (player->mo->z + player->mo->height < bottomheight) - continue; + if (player->mo->z + player->mo->momz + player->mo->height < bottomheight) + continue; + + break; + case BT_SPIN: + if (player->mo->z + player->mo->momz > topheight) + continue; + + if (player->mo->z + player->mo->height < bottomheight) + continue; + + break; + default: + if (player->mo->z >= topheight) + continue; + + if (player->mo->z + player->mo->height < bottomheight) + continue; + + break; + } } // Impede the player's fall a bit - if (((rover->flags & FF_SPINBUST) || (rover->flags & FF_SHATTER)) && player->mo->z >= topheight) + if (((rover->busttype == BT_TOUCH) || (rover->busttype == BT_SPIN)) && player->mo->z >= topheight) player->mo->momz >>= 1; - else if (rover->flags & FF_SHATTER) + else if (rover->busttype == BT_TOUCH) { player->mo->momx >>= 1; player->mo->momy >>= 1; @@ -2693,8 +2697,8 @@ static void P_CheckBustableBlocks(player_t *player) EV_CrumbleChain(NULL, rover); // node->m_sector // Run a linedef executor?? - if (rover->master->args[3] & TMFB_EXECUTOR) - P_LinedefExecute((INT16)(rover->master->args[4]), player->mo, node->m_sector); + if (rover->bustflags & BF_EXECUTOR) + P_LinedefExecute(rover->busttag, player->mo, node->m_sector); goto bustupdone; } @@ -8669,7 +8673,7 @@ static void P_MovePlayer(player_t *player) #endif // Look for blocks to bust up - // Because of FF_SHATTER, we should look for blocks constantly, + // Because of BT_TOUCH, we should look for blocks constantly, // not just when spinning or playing as Knuckles if (CheckForBustableBlocks) P_CheckBustableBlocks(player); diff --git a/src/r_defs.h b/src/r_defs.h index 73c6d0513..38f80954a 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -137,21 +137,32 @@ typedef enum FF_FLOATBOB = 0x40000, ///< Floats on water and bobs if you step on it. FF_NORETURN = 0x80000, ///< Used with ::FF_CRUMBLE. Will not return to its original position after falling. FF_CRUMBLE = 0x100000, ///< Falls 2 seconds after being stepped on, and randomly brings all touching crumbling 3dfloors down with it, providing their master sectors share the same tag (allows crumble platforms above or below, to also exist). - FF_SHATTERBOTTOM = 0x200000, ///< Used with ::FF_BUSTUP. Like FF_SHATTER, but only breaks from the bottom. Good for springing up through rubble. + FF_GOOWATER = 0x200000, ///< Used with ::FF_SWIMMABLE. Makes thick bouncey goop. FF_MARIO = 0x400000, ///< Acts like a question block when hit from underneath. Goodie spawned at top is determined by master sector. FF_BUSTUP = 0x800000, ///< You can spin through/punch this block and it will crumble! FF_QUICKSAND = 0x1000000, ///< Quicksand! FF_PLATFORM = 0x2000000, ///< You can jump up through this to the top. FF_REVERSEPLATFORM = 0x4000000, ///< A fall-through floor in normal gravity, a platform in reverse gravity. FF_INTANGIBLEFLATS = 0x6000000, ///< Both flats are intangible, but the sides are still solid. - FF_SHATTER = 0x8000000, ///< Used with ::FF_BUSTUP. Bustable on mere touch. - FF_SPINBUST = 0x10000000, ///< Used with ::FF_BUSTUP. Also bustable if you're in your spinning frames. - FF_STRONGBUST = 0x20000000, ///< Used with ::FF_BUSTUP. Only bustable by "strong" characters (Knuckles) and abilities (bouncing, twinspin, melee). FF_RIPPLE = 0x40000000, ///< Ripple the flats FF_COLORMAPONLY = 0x80000000, ///< Only copy the colormap, not the lightlevel - FF_GOOWATER = FF_SHATTERBOTTOM, ///< Used with ::FF_SWIMMABLE. Makes thick bouncey goop. } ffloortype_e; +typedef enum +{ + BT_TOUCH, + BT_SPIN, + BT_REGULAR, + BT_STRONG, +} busttype_e; + +typedef enum +{ + BF_PUSHABLES = 1, + BF_EXECUTOR = 1<<1, + BF_ONLYBOTTOM = 1<<2, +} bustflags_e; + typedef struct ffloor_s { fixed_t *topheight; @@ -184,6 +195,11 @@ typedef struct ffloor_s INT32 alpha; tic_t norender; // for culling + // Only relevant for FF_BUSTUP + UINT8 busttype; + UINT8 bustflags; + INT16 busttag; + // these are saved for netgames, so do not let Lua touch these! ffloortype_e spawnflags; // flags the 3D floor spawned with INT32 spawnalpha; // alpha the 3D floor spawned with From 16936893058bab2a10c75e7026d87bdac9bd771d Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 2 May 2020 21:50:49 +0200 Subject: [PATCH 039/377] Implement "make FOF bustable" linedef type --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 39 ++++++++++++ src/p_spec.c | 67 ++++++++++++++++++++ 2 files changed, 106 insertions(+) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index cacff27e1..d1696df2e 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2008,6 +2008,45 @@ udmf enum = "yesno"; } } + + 264 + { + title = "Make FOF Bustable"; + prefix = "(264)"; + arg0 + { + title = "Control linedef tag"; + type = 15; + } + arg1 + { + title = "Bustable type"; + type = 11; + enum + { + 0 = "Touch"; + 1 = "Spin"; + 2 = "Regular"; + 3 = "Strong"; + } + } + arg2 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Bustable by pushables"; + 2 = "Trigger linedef executor"; + 4 = "Only bustable from below"; + } + } + arg3 + { + title = "Linedef executor tag"; + type = 15; + } + } } linedefexecmisc diff --git a/src/p_spec.c b/src/p_spec.c index e17da83a8..2d8b1e48a 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7267,6 +7267,73 @@ void P_SpawnSpecials(boolean fromnetsave) } } + // And another round, this time with all FOFs already created + for (i = 0; i < numlines; i++) + { + switch (lines[i].special) + { + INT32 s; + INT32 l; + + case 264: // Make FOF bustable + { + UINT8 busttype = BT_REGULAR; + UINT8 bustflags = 0; + + if (!udmf) + break; + + switch (lines[i].args[1]) + { + case TMFB_TOUCH: + busttype = BT_TOUCH; + break; + case TMFB_SPIN: + busttype = BT_SPIN; + break; + case TMFB_REGULAR: + busttype = BT_REGULAR; + break; + case TMFB_STRONG: + busttype = BT_STRONG; + break; + } + + if (lines[i].args[2] & TMFB_PUSHABLES) + bustflags |= BF_PUSHABLES; + if (lines[i].args[2] & TMFB_EXECUTOR) + bustflags |= BF_EXECUTOR; + if (lines[i].args[2] & TMFB_ONLYBOTTOM) + bustflags |= BF_ONLYBOTTOM; + + for (l = -1; (l = P_FindLineFromTag(lines[i].args[0], l)) >= 0 ;) + { + if (lines[l].special < 100 || lines[l].special >= 300) + continue; + + for (s = -1; (s = P_FindSectorFromTag(lines[l].args[0], s)) >= 0 ;) + { + ffloor_t *rover; + + for (rover = sectors[s].ffloors; rover; rover = rover->next) + { + if (rover->master != lines + l) + continue; + + rover->flags |= FF_BUSTUP; + rover->busttype = busttype; + rover->bustflags = bustflags; + rover->busttag = lines[i].args[3]; + CheckForBustableBlocks = true; + break; + } + } + } + break; + } + } + } + // Allocate each list for (i = 0; i < numsectors; i++) if(secthinkers[i].thinkers) From 25219b614ed7d2fb3c071fa572578cdf194362cb Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 2 May 2020 22:07:42 +0200 Subject: [PATCH 040/377] Implement "Make FOF quicksand" linedef type --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 19 +++++++++++++++++++ src/lua_maplib.c | 10 ++++++++++ src/p_spec.c | 7 ++++++- src/p_user.c | 12 ++++-------- src/r_defs.h | 4 ++++ 5 files changed, 43 insertions(+), 9 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index d1696df2e..99ec6ec79 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2047,6 +2047,25 @@ udmf type = 15; } } + + 265 + { + title = "Make FOF Quicksand"; + prefix = "(265)"; + arg0 + { + title = "Control linedef tag"; + type = 15; + } + arg1 + { + title = "Sinking speed"; + } + arg2 + { + title = "Friction"; + } + } } linedefexecmisc diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 6ea82e2bf..282605b19 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -190,6 +190,8 @@ enum ffloor_e { ffloor_busttype, ffloor_bustflags, ffloor_busttag, + ffloor_sinkspeed, + ffloor_friction, }; static const char *const ffloor_opt[] = { @@ -211,6 +213,8 @@ static const char *const ffloor_opt[] = { "busttype", "bustflags", "busttag", + "sinkspeed", + "friction", NULL}; #ifdef HAVE_LUA_SEGS @@ -1767,6 +1771,12 @@ static int ffloor_get(lua_State *L) case ffloor_busttag: lua_pushinteger(L, ffloor->busttag); return 1; + case ffloor_sinkspeed: + lua_pushfixed(L, ffloor->sinkspeed); + return 1; + case ffloor_friction: + lua_pushfixed(L, ffloor->friction); + return 1; } return 0; } diff --git a/src/p_spec.c b/src/p_spec.c index 2d8b1e48a..a324e5a15 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6943,7 +6943,12 @@ void P_SpawnSpecials(boolean fromnetsave) if (!(lines[i].args[1])) ffloorflags |= FF_RIPPLE; - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); + for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0], s)) >= 0 ;) + { + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, ffloorflags, secthinkers); + fflr->sinkspeed = abs(lines[i].args[2]) << (FRACBITS - 1); + fflr->fricttion = abs(lines[i].args[3]) << (FRACBITS - 6); + } break; case 258: // Laser block diff --git a/src/p_user.c b/src/p_user.c index 14e466fde..07fa00566 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2862,7 +2862,7 @@ bouncydone: static void P_CheckQuicksand(player_t *player) { ffloor_t *rover; - fixed_t sinkspeed, friction; + fixed_t sinkspeed; fixed_t topheight, bottomheight; if (!(player->mo->subsector->sector->ffloors && player->mo->momz <= 0)) @@ -2880,9 +2880,7 @@ static void P_CheckQuicksand(player_t *player) if (topheight >= player->mo->z && bottomheight < player->mo->z + player->mo->height) { - sinkspeed = abs(rover->master->args[2]) << (FRACBITS - 1); - - sinkspeed = FixedDiv(sinkspeed,TICRATE*FRACUNIT); + sinkspeed = FixedDiv(rover->sinkspeed,TICRATE*FRACUNIT); if (player->mo->eflags & MFE_VERTICALFLIP) { @@ -2909,10 +2907,8 @@ static void P_CheckQuicksand(player_t *player) P_PlayerHitFloor(player, false); } - friction = abs(rover->master->args[3]) << (FRACBITS - 6); - - player->mo->momx = FixedMul(player->mo->momx, friction); - player->mo->momy = FixedMul(player->mo->momy, friction); + player->mo->momx = FixedMul(player->mo->momx, rover->friction); + player->mo->momy = FixedMul(player->mo->momy, rover->friction); } } } diff --git a/src/r_defs.h b/src/r_defs.h index 38f80954a..508b1f062 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -200,6 +200,10 @@ typedef struct ffloor_s UINT8 bustflags; INT16 busttag; + // Only relevant for FF_QUICKSAND + fixed_t sinkspeed; + fixed_t friction; + // these are saved for netgames, so do not let Lua touch these! ffloortype_e spawnflags; // flags the 3D floor spawned with INT32 spawnalpha; // alpha the 3D floor spawned with From 0d4d7bfc3873e9f127c645cba635debd1e65a81f Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 2 May 2020 23:00:22 +0200 Subject: [PATCH 041/377] Adapt custom FOF setup --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 48 +++++++++++++ src/p_setup.c | 14 ++++ src/p_spec.c | 74 ++++++++++++++++++-- src/r_defs.h | 6 ++ 4 files changed, 136 insertions(+), 6 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 99ec6ec79..54ddd17bb 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1917,6 +1917,54 @@ udmf } } + 259 + { + title = "Custom"; + prefix = "(259)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Exists"; + 2 = "Block player"; + 4 = "Block others"; + 8 = "Render sides"; + 16 = "Render planes"; + 32 = "Water"; + 64 = "No shadow"; + 128 = "Cut solid walls"; + 256 = "Cut extra walls"; + 512 = "Split sprites"; + 1024 = "Render inside planes"; + 2048 = "Extra"; + 4096 = "Translucent"; + 8192 = "Fog"; + 16384 = "Only render inside planes"; + 32768 = "Render inside walls"; + 65536 = "Only render inside walls"; + 131072 = "Double shadow"; + 262144 = "Water bobbing"; + 524288 = "Don't respawn"; + 1048576 = "Crumbling"; + 2097152 = "Goo water"; + 4194304 = "Mario block"; + 8388608 = "Bustable"; + 16777216 = "Quicksand"; + 33554432 = "Intangible from below"; + 67108864 = "Intangible from above"; + 1073741824 = "Ripple effect"; + 2147483648 = "Don't copy light level"; + } + } + } + 260 { title = "Add Raise Thinker"; diff --git a/src/p_setup.c b/src/p_setup.c index a3876888b..2b47464ff 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3157,6 +3157,20 @@ static void P_ConvertBinaryMap(void) if (lines[i].flags & ML_EFFECT1) lines[i].args[1] = 1; break; + case 259: //Custom FOF + if (lines[i].sidenum[1] == 0xffff) + I_Error("Custom FOF (tag %d) found without a linedef back side!", lines[i].tag); + + lines[i].args[0] = lines[i].tag; + lines[i].args[1] = sides[lines[i].sidenum[1]].toptexture; + if (lines[i].args[1] & FF_TRANSLUCENT) + { + if (sides[lines[i].sidenum[0]].toptexture > 0) + lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; + else + lines[i].alpha = FRACUNIT/2; + } + break; case 443: //Call Lua function if (lines[i].text) { diff --git a/src/p_spec.c b/src/p_spec.c index a324e5a15..6040ac6eb 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6947,7 +6947,7 @@ void P_SpawnSpecials(boolean fromnetsave) { ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, ffloorflags, secthinkers); fflr->sinkspeed = abs(lines[i].args[2]) << (FRACBITS - 1); - fflr->fricttion = abs(lines[i].args[3]) << (FRACBITS - 6); + fflr->friction = abs(lines[i].args[3]) << (FRACBITS - 6); } break; @@ -6957,13 +6957,39 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 259: // Custom FOF - if (lines[i].sidenum[1] != 0xffff) + for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0], s)) >= 0 ;) { - ffloortype_e fofflags = sides[lines[i].sidenum[1]].toptexture; - P_AddFakeFloorsByLine(i, fofflags, secthinkers); + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], secthinkers); + if (!udmf) // Ugly backwards compatibility stuff + { + if (lines[i].args[1] & FF_QUICKSAND) + { + fflr->sinkspeed = abs(lines[i].dx) >> 1; + fflr->friction = abs(lines[i].dy) >> 6; + } + if (lines[i].args[1] & FF_BUSTUP) + { + if (lines[i].args[1] & BFF_SHATTER) + fflr->busttype = BT_TOUCH; + else if (lines[i].args[1] & BFF_SPINBUST) + fflr->busttype = BT_SPIN; + else if (lines[i].args[1] & BFF_STRONGBUST) + fflr->busttype = BT_STRONG; + else + fflr->busttype = BT_REGULAR; + + if (lines[i].args[1] & BFF_SHATTERBOTTOM) + fflr->bustflags |= BF_ONLYBOTTOM; + if (lines[i].flags & ML_EFFECT4) + fflr->bustflags |= BF_PUSHABLES; + if (lines[i].flags & ML_EFFECT5) + { + fflr->bustflags |= BF_EXECUTOR; + fflr->busttag = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + } + } + } } - else - I_Error("Custom FOF (tag %d) found without a linedef back side!", lines[i].tag); break; case 260: // Add raise thinker to FOF @@ -7326,6 +7352,7 @@ void P_SpawnSpecials(boolean fromnetsave) continue; rover->flags |= FF_BUSTUP; + rover->spawnflags |= FF_BUSTUP; rover->busttype = busttype; rover->bustflags = bustflags; rover->busttag = lines[i].args[3]; @@ -7336,9 +7363,44 @@ void P_SpawnSpecials(boolean fromnetsave) } break; } + + case 265: // Make FOF quicksand + { + if (!udmf) + break; + + for (l = -1; (l = P_FindLineFromTag(lines[i].args[0], l)) >= 0 ;) + { + if (lines[l].special < 100 || lines[l].special >= 300) + continue; + + for (s = -1; (s = P_FindSectorFromTag(lines[l].args[0], s)) >= 0 ;) + { + ffloor_t *rover; + + for (rover = sectors[s].ffloors; rover; rover = rover->next) + { + if (rover->master != lines + l) + continue; + + rover->flags |= FF_QUICKSAND; + rover->spawnflags |= FF_QUICKSAND; + rover->sinkspeed = abs(lines[i].args[1]) << (FRACBITS - 1); + rover->friction = abs(lines[i].args[2]) << (FRACBITS - 6); + CheckForQuicksand = true; + break; + } + } + } + break; + } } } + + + + // Allocate each list for (i = 0; i < numsectors; i++) if(secthinkers[i].thinkers) diff --git a/src/r_defs.h b/src/r_defs.h index 508b1f062..c791117ba 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -148,6 +148,12 @@ typedef enum FF_COLORMAPONLY = 0x80000000, ///< Only copy the colormap, not the lightlevel } ffloortype_e; +//Binary map format ffloor flags, for backwards compatibility only +#define BFF_SHATTERBOTTOM 0x200000 +#define BFF_SHATTER 0x8000000 +#define BFF_SPINBUST 0x10000000 +#define BFF_STRONGBUST 0x20000000 + typedef enum { BT_TOUCH, From f8f773d6e702988eb38b07ab1a683d9d1a1e43fa Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 2 May 2020 23:06:44 +0200 Subject: [PATCH 042/377] Remove "bustable" and "quicksand" flags from custom FOF in the UDB config, since you're not supposed to set them that way --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 2 -- 1 file changed, 2 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 54ddd17bb..0494ae544 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1955,8 +1955,6 @@ udmf 1048576 = "Crumbling"; 2097152 = "Goo water"; 4194304 = "Mario block"; - 8388608 = "Bustable"; - 16777216 = "Quicksand"; 33554432 = "Intangible from below"; 67108864 = "Intangible from above"; 1073741824 = "Ripple effect"; From 6949b70dbf63aec524134d550ca78e7f26c24678 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 2 May 2020 23:33:07 +0200 Subject: [PATCH 043/377] Remove temporary FOF setup code --- src/p_setup.c | 11 ----------- src/p_spec.c | 7 ------- 2 files changed, 18 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 2b47464ff..6551f3b4a 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3309,17 +3309,6 @@ static void P_ConvertBinaryMap(void) case 908: //Translucent wall (90%) lines[i].alpha = ((909 - lines[i].special) << FRACBITS)/10; break; - default: - // \todo Remove once all FOF types are converted - if (lines[i].special >= 100 && lines[i].special < 300) - { - lines[i].args[0] = lines[i].tag; - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; - else - lines[i].alpha = FRACUNIT/2; - } - break; } } diff --git a/src/p_spec.c b/src/p_spec.c index 6040ac6eb..ddd09f173 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5807,13 +5807,6 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f if (sec2->hasslope) sec->hasslope = true; - // \todo Remove once all FOFs are adapted - if ((flags & FF_SOLID) && (master->flags & ML_EFFECT1)) // Block player only - flags &= ~FF_BLOCKOTHERS; - - if ((flags & FF_SOLID) && (master->flags & ML_EFFECT2)) // Block all BUT player - flags &= ~FF_BLOCKPLAYER; - fflr->spawnflags = fflr->flags = flags; fflr->master = master; fflr->norender = INFTICS; From 96a464c8817845c11955702c42ef642a2b55f722 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 3 May 2020 08:43:16 +0200 Subject: [PATCH 044/377] Move FOF modifier linedef type to the 70s range, to avoid being considered FOFs themselves --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 305 ++++++++++--------- src/p_spec.c | 126 ++++---- 2 files changed, 218 insertions(+), 213 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 0494ae544..2b70e9a7d 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1516,6 +1516,161 @@ udmf } } + fofmodifiers + { + title = "FOF Modifiers"; + + 70 + { + title = "Add Raise Thinker"; + prefix = "(70)"; + arg0 + { + title = "Control linedef tag"; + type = 15; + } + arg1 + { + title = "Speed"; + } + arg2 + { + title = "Destination height"; + } + arg3 + { + title = "Require spindash?"; + type = 11; + enum = "noyes"; + } + } + + 71 + { + title = "Add Air Bobbing Thinker"; + prefix = "(71)"; + arg0 + { + title = "Control linedef tag"; + type = 15; + } + arg1 + { + title = "Bobbing distance"; + } + arg2 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Raise"; + 2 = "Require spindash"; + 4 = "Dynamic"; + } + } + } + + 72 + { + title = "Add Thwomp Thinker"; + prefix = "(72)"; + arg0 + { + title = "Control linedef tag"; + type = 15; + } + arg1 + { + title = "Falling speed"; + } + arg2 + { + title = "Rising speed"; + } + stringarg0 + { + title = "Crushing sound"; + type = 2; + } + } + + 73 + { + title = "Add Laser Thinker"; + prefix = "(73)"; + arg0 + { + title = "Control linedef tag"; + type = 15; + } + arg1 + { + title = "Damage bosses?"; + type = 11; + enum = "yesno"; + } + } + + 74 + { + title = "Make FOF Bustable"; + prefix = "(74)"; + arg0 + { + title = "Control linedef tag"; + type = 15; + } + arg1 + { + title = "Bustable type"; + type = 11; + enum + { + 0 = "Touch"; + 1 = "Spin"; + 2 = "Regular"; + 3 = "Strong"; + } + } + arg2 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Bustable by pushables"; + 2 = "Trigger linedef executor"; + 4 = "Only bustable from below"; + } + } + arg3 + { + title = "Linedef executor tag"; + type = 15; + } + } + + 75 + { + title = "Make FOF Quicksand"; + prefix = "(75)"; + arg0 + { + title = "Control linedef tag"; + type = 15; + } + arg1 + { + title = "Sinking speed"; + } + arg2 + { + title = "Friction"; + } + } + } + fof { title = "FOF"; @@ -1962,156 +2117,6 @@ udmf } } } - - 260 - { - title = "Add Raise Thinker"; - prefix = "(260)"; - arg0 - { - title = "Control linedef tag"; - type = 15; - } - arg1 - { - title = "Speed"; - } - arg2 - { - title = "Destination height"; - } - arg3 - { - title = "Require spindash?"; - type = 11; - enum = "noyes"; - } - } - - 261 - { - title = "Add Air Bobbing Thinker"; - prefix = "(261)"; - arg0 - { - title = "Control linedef tag"; - type = 15; - } - arg1 - { - title = "Bobbing distance"; - } - arg2 - { - title = "Flags"; - type = 12; - enum - { - 1 = "Raise"; - 2 = "Require spindash"; - 4 = "Dynamic"; - } - } - } - - 262 - { - title = "Add Thwomp Thinker"; - prefix = "(262)"; - arg0 - { - title = "Control linedef tag"; - type = 15; - } - arg1 - { - title = "Falling speed"; - } - arg2 - { - title = "Rising speed"; - } - stringarg0 - { - title = "Crushing sound"; - type = 2; - } - } - - 263 - { - title = "Add Laser Thinker"; - prefix = "(263)"; - arg0 - { - title = "Control linedef tag"; - type = 15; - } - arg1 - { - title = "Damage bosses?"; - type = 11; - enum = "yesno"; - } - } - - 264 - { - title = "Make FOF Bustable"; - prefix = "(264)"; - arg0 - { - title = "Control linedef tag"; - type = 15; - } - arg1 - { - title = "Bustable type"; - type = 11; - enum - { - 0 = "Touch"; - 1 = "Spin"; - 2 = "Regular"; - 3 = "Strong"; - } - } - arg2 - { - title = "Flags"; - type = 12; - enum - { - 1 = "Bustable by pushables"; - 2 = "Trigger linedef executor"; - 4 = "Only bustable from below"; - } - } - arg3 - { - title = "Linedef executor tag"; - type = 15; - } - } - - 265 - { - title = "Make FOF Quicksand"; - prefix = "(265)"; - arg0 - { - title = "Control linedef tag"; - type = 15; - } - arg1 - { - title = "Sinking speed"; - } - arg2 - { - title = "Friction"; - } - } } linedefexecmisc diff --git a/src/p_spec.c b/src/p_spec.c index ddd09f173..a7d773e20 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6617,6 +6617,67 @@ void P_SpawnSpecials(boolean fromnetsave) P_AddPlaneDisplaceThinker(pd_both, P_AproxDistance(lines[i].dx, lines[i].dy)>>8, sides[lines[i].sidenum[0]].sector-sectors, s, !!(lines[i].flags & ML_NOCLIMB)); break; + case 70: // Add raise thinker to FOF + if (udmf) + { + fixed_t destheight = lines[i].args[2] << FRACBITS; + fixed_t startheight, topheight, bottomheight; + + for (l = -1; (l = P_FindLineFromTag(lines[i].args[0], l)) >= 0 ;) + { + if (lines[l].special < 100 || lines[l].special >= 300) + continue; + + startheight = lines[l].frontsector->ceilingheight; + topheight = max(startheight, destheight); + bottomheight = min(startheight, destheight); + + P_AddRaiseThinker(lines[l].frontsector, lines[l].args[0], lines[i].args[1] << FRACBITS, topheight, bottomheight, (destheight < startheight), !!(lines[i].args[3])); + } + } + break; + + case 71: // Add air bob thinker to FOF + if (udmf) + { + for (l = -1; (l = P_FindLineFromTag(lines[i].args[0], l)) >= 0 ;) + { + if (lines[l].special < 100 || lines[l].special >= 300) + continue; + + P_AddAirbob(lines[l].frontsector, lines[l].args[0], lines[i].args[1] << FRACBITS, !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); + } + } + break; + + case 72: // Add thwomp thinker to FOF + if (udmf) + { + UINT16 sound = (lines[i].stringargs[0]) ? get_number(lines[i].stringargs[0]) : sfx_thwomp; + + for (l = -1; (l = P_FindLineFromTag(lines[i].args[0], l)) >= 0 ;) + { + if (lines[l].special < 100 || lines[l].special >= 300) + continue; + + P_AddThwompThinker(lines[l].frontsector, lines[l].args[0], &lines[l], lines[i].args[1] << FRACBITS, lines[i].args[2] << FRACBITS, sound); + } + } + break; + + case 73: // Add laser thinker to FOF + if (udmf) + { + for (l = -1; (l = P_FindLineFromTag(lines[i].args[0], l)) >= 0 ;) + { + if (lines[l].special < 100 || lines[l].special >= 300) + continue; + + P_AddLaserThinker(lines[l].args[0], lines + l, !!(lines[i].args[1])); + } + } + break; + case 100: // FOF (solid) ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; @@ -6985,67 +7046,6 @@ void P_SpawnSpecials(boolean fromnetsave) } break; - case 260: // Add raise thinker to FOF - if (udmf) - { - fixed_t destheight = lines[i].args[2] << FRACBITS; - fixed_t startheight, topheight, bottomheight; - - for (l = -1; (l = P_FindLineFromTag(lines[i].args[0], l)) >= 0 ;) - { - if (lines[l].special < 100 || lines[l].special >= 300) - continue; - - startheight = lines[l].frontsector->ceilingheight; - topheight = max(startheight, destheight); - bottomheight = min(startheight, destheight); - - P_AddRaiseThinker(lines[l].frontsector, lines[l].args[0], lines[i].args[1] << FRACBITS, topheight, bottomheight, (destheight < startheight), !!(lines[i].args[3])); - } - } - break; - - case 261: // Add air bob thinker to FOF - if (udmf) - { - for (l = -1; (l = P_FindLineFromTag(lines[i].args[0], l)) >= 0 ;) - { - if (lines[l].special < 100 || lines[l].special >= 300) - continue; - - P_AddAirbob(lines[l].frontsector, lines[l].args[0], lines[i].args[1] << FRACBITS, !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); - } - } - break; - - case 262: // Add thwomp thinker to FOF - if (udmf) - { - UINT16 sound = (lines[i].stringargs[0]) ? get_number(lines[i].stringargs[0]) : sfx_thwomp; - - for (l = -1; (l = P_FindLineFromTag(lines[i].args[0], l)) >= 0 ;) - { - if (lines[l].special < 100 || lines[l].special >= 300) - continue; - - P_AddThwompThinker(lines[l].frontsector, lines[l].args[0], &lines[l], lines[i].args[1] << FRACBITS, lines[i].args[2] << FRACBITS, sound); - } - } - break; - - case 263: // Add laser thinker to FOF - if (udmf) - { - for (l = -1; (l = P_FindLineFromTag(lines[i].args[0], l)) >= 0 ;) - { - if (lines[l].special < 100 || lines[l].special >= 300) - continue; - - P_AddLaserThinker(lines[l].args[0], lines + l, !!(lines[i].args[1])); - } - } - break; - case 300: // Linedef executor (combines with sector special 974/975) and commands case 302: case 303: @@ -7299,7 +7299,7 @@ void P_SpawnSpecials(boolean fromnetsave) INT32 s; INT32 l; - case 264: // Make FOF bustable + case 74: // Make FOF bustable { UINT8 busttype = BT_REGULAR; UINT8 bustflags = 0; @@ -7357,7 +7357,7 @@ void P_SpawnSpecials(boolean fromnetsave) break; } - case 265: // Make FOF quicksand + case 75: // Make FOF quicksand { if (!udmf) break; From 35e9e5b33ca75bb35eb76998008286bf76ef9fce Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 3 May 2020 09:13:14 +0200 Subject: [PATCH 045/377] Rearrange FOF flags and improve custom FOF backwards compatibility --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 4 ++-- src/p_setup.c | 1 + src/p_spec.c | 25 +++++++++++++------- src/r_defs.h | 10 ++------ 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 2b70e9a7d..a6682cd07 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2112,8 +2112,8 @@ udmf 4194304 = "Mario block"; 33554432 = "Intangible from below"; 67108864 = "Intangible from above"; - 1073741824 = "Ripple effect"; - 2147483648 = "Don't copy light level"; + 134217728 = "Ripple effect"; + 268435456 = "Don't copy light level"; } } } diff --git a/src/p_setup.c b/src/p_setup.c index 6551f3b4a..e21cc150c 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3163,6 +3163,7 @@ static void P_ConvertBinaryMap(void) lines[i].args[0] = lines[i].tag; lines[i].args[1] = sides[lines[i].sidenum[1]].toptexture; + lines[i].args[2] = sides[lines[i].sidenum[1]].midtexture; if (lines[i].args[1] & FF_TRANSLUCENT) { if (sides[lines[i].sidenum[0]].toptexture > 0) diff --git a/src/p_spec.c b/src/p_spec.c index a7d773e20..77bc2407f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7023,16 +7023,23 @@ void P_SpawnSpecials(boolean fromnetsave) } if (lines[i].args[1] & FF_BUSTUP) { - if (lines[i].args[1] & BFF_SHATTER) - fflr->busttype = BT_TOUCH; - else if (lines[i].args[1] & BFF_SPINBUST) - fflr->busttype = BT_SPIN; - else if (lines[i].args[1] & BFF_STRONGBUST) - fflr->busttype = BT_STRONG; - else - fflr->busttype = BT_REGULAR; + switch (lines[i].args[2] % TMFB_ONLYBOTTOM) + { + case TMFB_TOUCH: + fflr->busttype = BT_TOUCH; + break; + case TMFB_SPIN: + fflr->busttype = BT_SPIN; + break; + case TMFB_REGULAR: + fflr->busttype = BT_REGULAR; + break; + case TMFB_STRONG: + fflr->busttype = BT_STRONG; + break; + } - if (lines[i].args[1] & BFF_SHATTERBOTTOM) + if (lines[i].args[2] & TMFB_ONLYBOTTOM) fflr->bustflags |= BF_ONLYBOTTOM; if (lines[i].flags & ML_EFFECT4) fflr->bustflags |= BF_PUSHABLES; diff --git a/src/r_defs.h b/src/r_defs.h index c791117ba..2f7b5622c 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -144,16 +144,10 @@ typedef enum FF_PLATFORM = 0x2000000, ///< You can jump up through this to the top. FF_REVERSEPLATFORM = 0x4000000, ///< A fall-through floor in normal gravity, a platform in reverse gravity. FF_INTANGIBLEFLATS = 0x6000000, ///< Both flats are intangible, but the sides are still solid. - FF_RIPPLE = 0x40000000, ///< Ripple the flats - FF_COLORMAPONLY = 0x80000000, ///< Only copy the colormap, not the lightlevel + FF_RIPPLE = 0x8000000, ///< Ripple the flats + FF_COLORMAPONLY = 0x10000000, ///< Only copy the colormap, not the lightlevel } ffloortype_e; -//Binary map format ffloor flags, for backwards compatibility only -#define BFF_SHATTERBOTTOM 0x200000 -#define BFF_SHATTER 0x8000000 -#define BFF_SPINBUST 0x10000000 -#define BFF_STRONGBUST 0x20000000 - typedef enum { BT_TOUCH, From 1aafc2f463e20eebfe929c9c7edf951ce891b9e7 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 3 May 2020 12:44:30 +0200 Subject: [PATCH 046/377] Replace "bouncy FOF" sector type with "make FOF bouncy" linedef type --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 27 +++++++ extras/conf/udb/Includes/SRB222_sectors.cfg | 2 - src/dehacked.c | 13 ++-- src/lua_maplib.c | 15 ++-- src/p_mobj.c | 6 +- src/p_setup.c | 6 ++ src/p_spec.c | 81 +++++++++++++++----- src/p_user.c | 21 +++-- src/r_defs.h | 24 ++++-- 9 files changed, 142 insertions(+), 53 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index a6682cd07..fcf342e3d 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -130,6 +130,11 @@ doom title = "Bridge Thinker "; prefix = "(65)"; } + 76 + { + title = "Make FOF Bouncy"; + prefix = "(76)"; + } } polyobject @@ -1669,6 +1674,27 @@ udmf title = "Friction"; } } + + 76 + { + title = "Make FOF Bouncy"; + prefix = "(76)"; + arg0 + { + title = "Control linedef tag"; + type = 15; + } + arg1 + { + title = "Bounce strength"; + } + arg2 + { + title = "Dampen?"; + type = 11; + enum = "noyes"; + } + } } fof @@ -2114,6 +2140,7 @@ udmf 67108864 = "Intangible from above"; 134217728 = "Ripple effect"; 268435456 = "Don't copy light level"; + 536870912 = "Bouncy"; } } } diff --git a/extras/conf/udb/Includes/SRB222_sectors.cfg b/extras/conf/udb/Includes/SRB222_sectors.cfg index 5cc14ad0f..aebc8fa29 100644 --- a/extras/conf/udb/Includes/SRB222_sectors.cfg +++ b/extras/conf/udb/Includes/SRB222_sectors.cfg @@ -15,7 +15,6 @@ sectortypes 12 = "Space Countdown"; 13 = "Ramp Sector (double step-up/down)"; 14 = "Non-Ramp Sector (no step-down)"; - 15 = "Bouncy FOF"; 16 = "Trigger Line Ex. (Pushable Objects)"; 32 = "Trigger Line Ex. (Anywhere, All Players)"; 48 = "Trigger Line Ex. (Floor Touch, All Players)"; @@ -63,7 +62,6 @@ gen_sectortypes 12 = "Space Countdown"; 13 = "Ramp Sector (double step-up/down)"; 14 = "Non-Ramp Sector (no step-down)"; - 15 = "Bouncy FOF"; } second diff --git a/src/dehacked.c b/src/dehacked.c index 3051b92d1..8edf0103d 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -9697,6 +9697,14 @@ struct { {"FF_INTANGABLEFLATS",FF_INTANGIBLEFLATS}, ///< Both flats are intangable, but the sides are still solid. {"FF_RIPPLE",FF_RIPPLE}, ///< Ripple the flats {"FF_COLORMAPONLY",FF_COLORMAPONLY}, ///< Only copy the colormap, not the lightlevel + {"FF_BOUNCY",FF_BOUNCY}, ///< Bounces players + + // FOF special flags + {"FS_PUSHABLES",FS_PUSHABLES}, + {"FS_EXECUTOR",FS_EXECUTOR}, + {"FS_ONLYBOTTOM",FS_ONLYBOTTOM}, + {"FS_BUSTMASK",FS_BUSTMASK}, + {"FS_DAMPEN",FS_DAMPEN}, // Bustable FOF type {"BT_TOUCH",BT_TOUCH}, @@ -9704,11 +9712,6 @@ struct { {"BT_REGULAR",BT_REGULAR}, {"BT_STRONG",BT_STRONG}, - // Bustable FOF flags - {"BF_PUSHABLES",BF_PUSHABLES}, - {"BF_EXECUTOR",BF_EXECUTOR}, - {"BF_ONLYBOTTOM",BF_ONLYBOTTOM}, - #ifdef HAVE_LUA_SEGS // Node flags {"NF_SUBSECTOR",NF_SUBSECTOR}, // Indicate a leaf. diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 282605b19..e5de3de37 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -187,11 +187,12 @@ enum ffloor_e { ffloor_next, ffloor_prev, ffloor_alpha, + ffloor_specialflags, ffloor_busttype, - ffloor_bustflags, ffloor_busttag, ffloor_sinkspeed, ffloor_friction, + ffloor_bouncestrength, }; static const char *const ffloor_opt[] = { @@ -210,11 +211,12 @@ static const char *const ffloor_opt[] = { "next", "prev", "alpha", + "specialflags", "busttype", - "bustflags", "busttag", "sinkspeed", "friction", + "bouncestrength", NULL}; #ifdef HAVE_LUA_SEGS @@ -1762,12 +1764,12 @@ static int ffloor_get(lua_State *L) case ffloor_alpha: lua_pushinteger(L, ffloor->alpha); return 1; + case ffloor_specialflags: + lua_pushinteger(L, ffloor->specialflags); + return 1; case ffloor_busttype: lua_pushinteger(L, ffloor->busttype); return 1; - case ffloor_bustflags: - lua_pushinteger(L, ffloor->bustflags); - return 1; case ffloor_busttag: lua_pushinteger(L, ffloor->busttag); return 1; @@ -1777,6 +1779,9 @@ static int ffloor_get(lua_State *L) case ffloor_friction: lua_pushfixed(L, ffloor->friction); return 1; + case ffloor_bouncestrength: + lua_pushfixed(L, ffloor->bouncestrength); + return 1; } return 0; } diff --git a/src/p_mobj.c b/src/p_mobj.c index 62aa7770a..97cc76667 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1691,7 +1691,7 @@ static void P_PushableCheckBustables(mobj_t *mo) if (!(rover->flags & FF_BUSTUP)) continue; - if (!(rover->bustflags & BF_PUSHABLES)) + if (!(rover->specialflags & FS_PUSHABLES)) continue; if (rover->master->frontsector->crumblestate != CRUMBLE_NONE) @@ -1701,7 +1701,7 @@ static void P_PushableCheckBustables(mobj_t *mo) bottomheight = P_GetFOFBottomZ(mo, node->m_sector, rover, mo->x, mo->y, NULL); // Height checks - if (rover->bustflags & BF_ONLYBOTTOM) + if (rover->specialflags & FS_ONLYBOTTOM) { if (mo->z + mo->momz + mo->height < bottomheight) continue; @@ -1743,7 +1743,7 @@ static void P_PushableCheckBustables(mobj_t *mo) EV_CrumbleChain(NULL, rover); // node->m_sector // Run a linedef executor?? - if (rover->bustflags & BF_EXECUTOR) + if (rover->specialflags & FS_EXECUTOR) P_LinedefExecute(rover->busttag, mo, node->m_sector); goto bustupdone; diff --git a/src/p_setup.c b/src/p_setup.c index e21cc150c..bd312652a 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2800,6 +2800,12 @@ static void P_ConvertBinaryMap(void) { switch (lines[i].special) { + case 76: //Make FOF bouncy + lines[i].args[0] = lines[i].tag; + lines[i].args[1] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + if (lines[i].flags & ML_BOUNCY) + lines[i].args[2] = 1; + break; case 100: //FOF: solid, opaque, shadowcasting case 101: //FOF: solid, opaque, non-shadowcasting case 102: //FOF: solid, translucent diff --git a/src/p_spec.c b/src/p_spec.c index 77bc2407f..0262bc0e9 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4443,7 +4443,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers break; case 13: // Ramp Sector (Increase step-up/down) case 14: // Non-Ramp Sector (Don't step-down) - case 15: // Bouncy Sector (FOF Control Only) + case 15: // Unused break; } @@ -6287,6 +6287,36 @@ static void P_ApplyFlatAlignment(line_t *master, sector_t *sector, angle_t flata } +static void P_MakeFOFBouncy(line_t *paramline, line_t *masterline) +{ + INT32 s; + + if (masterline->special < 100 || masterline->special >= 300) + return; + + for (s = -1; (s = P_FindSectorFromTag(masterline->args[0], s)) >= 0 ;) + { + ffloor_t *rover; + + for (rover = sectors[s].ffloors; rover; rover = rover->next) + { + if (rover->master != masterline) + continue; + + rover->flags |= FF_BOUNCY; + rover->spawnflags |= FF_BOUNCY; + rover->bouncestrength = (paramline->args[1]<< FRACBITS)/100; + if (paramline->args[2]) + rover->specialflags |= FS_DAMPEN; + else + rover->specialflags &= ~FS_DAMPEN; + CheckForBouncySector = true; + break; + } + } + +} + /** After the map has loaded, scans for specials that spawn 3Dfloors and * thinkers. * @@ -6327,10 +6357,6 @@ void P_SpawnSpecials(boolean fromnetsave) //Yes, this also affects other specials on the same sector. Sorry. sector->flags |= SF_TRIGGERSPECIAL_TOUCH; break; - - case 15: // Bouncy sector - CheckForBouncySector = true; - break; } // Process Section 2 @@ -6947,7 +6973,7 @@ void P_SpawnSpecials(boolean fromnetsave) case 254: // Bustable block { UINT8 busttype = BT_REGULAR; - UINT8 bustflags = 0; + ffloorspecialflags_e bustflags = 0; ffloorflags = FF_EXISTS|FF_BLOCKOTHERS|FF_RENDERALL|FF_BUSTUP; @@ -6974,20 +7000,20 @@ void P_SpawnSpecials(boolean fromnetsave) //Flags if (lines[i].args[3] & TMFB_PUSHABLES) - bustflags |= BF_PUSHABLES; + bustflags |= FS_PUSHABLES; if (lines[i].args[3] & TMFB_EXECUTOR) - bustflags |= BF_EXECUTOR; + bustflags |= FS_EXECUTOR; if (lines[i].args[3] & TMFB_ONLYBOTTOM) - bustflags |= BF_ONLYBOTTOM; + bustflags |= FS_ONLYBOTTOM; - if (busttype != BT_TOUCH || bustflags & BF_ONLYBOTTOM) + if (busttype != BT_TOUCH || bustflags & FS_ONLYBOTTOM) ffloorflags |= FF_BLOCKPLAYER; for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0], s)) >= 0 ;) { ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, ffloorflags, secthinkers); fflr->busttype = busttype; - fflr->bustflags = bustflags; + fflr->specialflags = bustflags; fflr->busttag = lines[i].args[4]; } break; @@ -7040,12 +7066,12 @@ void P_SpawnSpecials(boolean fromnetsave) } if (lines[i].args[2] & TMFB_ONLYBOTTOM) - fflr->bustflags |= BF_ONLYBOTTOM; + fflr->specialflags |= FS_ONLYBOTTOM; if (lines[i].flags & ML_EFFECT4) - fflr->bustflags |= BF_PUSHABLES; + fflr->specialflags |= FS_PUSHABLES; if (lines[i].flags & ML_EFFECT5) { - fflr->bustflags |= BF_EXECUTOR; + fflr->specialflags |= FS_EXECUTOR; fflr->busttag = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; } } @@ -7309,7 +7335,7 @@ void P_SpawnSpecials(boolean fromnetsave) case 74: // Make FOF bustable { UINT8 busttype = BT_REGULAR; - UINT8 bustflags = 0; + ffloorspecialflags_e bustflags = 0; if (!udmf) break; @@ -7331,11 +7357,11 @@ void P_SpawnSpecials(boolean fromnetsave) } if (lines[i].args[2] & TMFB_PUSHABLES) - bustflags |= BF_PUSHABLES; + bustflags |= FS_PUSHABLES; if (lines[i].args[2] & TMFB_EXECUTOR) - bustflags |= BF_EXECUTOR; + bustflags |= FS_EXECUTOR; if (lines[i].args[2] & TMFB_ONLYBOTTOM) - bustflags |= BF_ONLYBOTTOM; + bustflags |= FS_ONLYBOTTOM; for (l = -1; (l = P_FindLineFromTag(lines[i].args[0], l)) >= 0 ;) { @@ -7354,7 +7380,8 @@ void P_SpawnSpecials(boolean fromnetsave) rover->flags |= FF_BUSTUP; rover->spawnflags |= FF_BUSTUP; rover->busttype = busttype; - rover->bustflags = bustflags; + rover->specialflags &= ~FS_BUSTMASK; + rover->specialflags |= bustflags; rover->busttag = lines[i].args[3]; CheckForBustableBlocks = true; break; @@ -7394,6 +7421,22 @@ void P_SpawnSpecials(boolean fromnetsave) } break; } + + case 76: // Make FOF bouncy + { + if (udmf) + { + for (l = -1; (l = P_FindLineFromTag(lines[i].args[0], l)) >= 0 ;) + P_MakeFOFBouncy(lines + i, lines + l); + } + else + { + for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0], s)) >= 0 ;) + for (j = 0; (unsigned)j < sectors[s].linecount; j++) + P_MakeFOFBouncy(lines + i, sectors[s].lines[j]); + } + break; + } } } diff --git a/src/p_user.c b/src/p_user.c index 8d16b0e7a..26dfb7a91 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2643,7 +2643,7 @@ static void P_CheckBustableBlocks(player_t *player) } // Height checks - if (rover->bustflags & BF_ONLYBOTTOM) + if (rover->specialflags & FS_ONLYBOTTOM) { if (player->mo->z + player->mo->momz + player->mo->height < bottomheight) continue; @@ -2697,7 +2697,7 @@ static void P_CheckBustableBlocks(player_t *player) EV_CrumbleChain(NULL, rover); // node->m_sector // Run a linedef executor?? - if (rover->bustflags & BF_EXECUTOR) + if (rover->specialflags & FS_EXECUTOR) P_LinedefExecute(rover->busttag, player->mo, node->m_sector); goto bustupdone; @@ -2743,14 +2743,13 @@ static void P_CheckBouncySectors(player_t *player) for (rover = node->m_sector->ffloors; rover; rover = rover->next) { - fixed_t bouncestrength; fixed_t topheight, bottomheight; if (!(rover->flags & FF_EXISTS)) continue; // FOFs should not be bouncy if they don't even "exist" - if (GETSECSPECIAL(rover->master->frontsector->special, 1) != 15) - continue; // this sector type is required for FOFs to be bouncy + if (!(rover->flags & FF_BOUNCY)) + continue; topheight = P_GetFOFTopZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL); bottomheight = P_GetFOFBottomZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL); @@ -2761,13 +2760,13 @@ static void P_CheckBouncySectors(player_t *player) if (player->mo->z + player->mo->height < bottomheight) continue; - bouncestrength = P_AproxDistance(rover->master->dx, rover->master->dy)/100; + //bouncestrength = P_AproxDistance(rover->master->dx, rover->master->dy)/100; if (oldz < P_GetFOFTopZ(player->mo, node->m_sector, rover, oldx, oldy, NULL) && oldz + player->mo->height > P_GetFOFBottomZ(player->mo, node->m_sector, rover, oldx, oldy, NULL)) { - player->mo->momx = -FixedMul(player->mo->momx,bouncestrength); - player->mo->momy = -FixedMul(player->mo->momy,bouncestrength); + player->mo->momx = -FixedMul(player->mo->momx,rover->bouncestrength); + player->mo->momy = -FixedMul(player->mo->momy,rover->bouncestrength); if (player->pflags & PF_SPINNING) { @@ -2788,12 +2787,12 @@ static void P_CheckBouncySectors(player_t *player) if (slope) P_ReverseQuantizeMomentumToSlope(&momentum, slope); - newmom = momentum.z = -FixedMul(momentum.z,bouncestrength)/2; + newmom = momentum.z = -FixedMul(momentum.z,rover->bouncestrength)/2; - if (abs(newmom) < (bouncestrength*2)) + if (abs(newmom) < (rover->bouncestrength*2)) goto bouncydone; - if (!(rover->master->flags & ML_BOUNCY)) + if (!(rover->specialflags & FS_DAMPEN)) { if (newmom > 0) { diff --git a/src/r_defs.h b/src/r_defs.h index 2f7b5622c..160bcac2a 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -146,8 +146,18 @@ typedef enum FF_INTANGIBLEFLATS = 0x6000000, ///< Both flats are intangible, but the sides are still solid. FF_RIPPLE = 0x8000000, ///< Ripple the flats FF_COLORMAPONLY = 0x10000000, ///< Only copy the colormap, not the lightlevel + FF_BOUNCY = 0x20000000, ///< Bounces players } ffloortype_e; +typedef enum +{ + FS_PUSHABLES = 0x1, // FF_BUSTABLE: Bustable by pushables + FS_EXECUTOR = 0x2, // FF_BUSTABLE: Trigger linedef executor + FS_ONLYBOTTOM = 0x4, // FF_BUSTABLE: Only bustable from below + FS_BUSTMASK = 0x7, + FS_DAMPEN = 0x8, // FF_BOUNCY: Dampen bounce +} ffloorspecialflags_e; + typedef enum { BT_TOUCH, @@ -156,13 +166,6 @@ typedef enum BT_STRONG, } busttype_e; -typedef enum -{ - BF_PUSHABLES = 1, - BF_EXECUTOR = 1<<1, - BF_ONLYBOTTOM = 1<<2, -} bustflags_e; - typedef struct ffloor_s { fixed_t *topheight; @@ -195,15 +198,20 @@ typedef struct ffloor_s INT32 alpha; tic_t norender; // for culling + // Flags that are only relevant for special ffloor types + ffloorspecialflags_e specialflags; + // Only relevant for FF_BUSTUP UINT8 busttype; - UINT8 bustflags; INT16 busttag; // Only relevant for FF_QUICKSAND fixed_t sinkspeed; fixed_t friction; + // Only relevant for FF_BOUNCY + fixed_t bouncestrength; + // these are saved for netgames, so do not let Lua touch these! ffloortype_e spawnflags; // flags the 3D floor spawned with INT32 spawnalpha; // alpha the 3D floor spawned with From a79862285e1b62edc0e96cf00a442e53407448ea Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 12 Jun 2020 08:16:50 +0200 Subject: [PATCH 047/377] Step 1 in refactoring FOF alpha setup: Pass alpha value to FOF adding functions as a parameter --- src/p_spec.c | 49 ++++++++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 5cbb4727c..6d260758d 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -117,7 +117,7 @@ static void Add_ColormapFader(sector_t *sector, extracolormap_t *source_exc, ext static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, UINT16 tag, line_t *sourceline); //static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); -static void P_AddFakeFloorsByLine(size_t line, ffloortype_e ffloorflags, thinkerlist_t *secthinkers); +static void P_AddFakeFloorsByLine(size_t line, INT32 alpha, ffloortype_e ffloorflags, thinkerlist_t *secthinkers); static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec); static void Add_Friction(INT32 friction, INT32 movefactor, INT32 affectee, INT32 referrer); static void P_AddPlaneDisplaceThinker(INT32 type, fixed_t speed, INT32 control, INT32 affectee, UINT8 reverse); @@ -5617,12 +5617,13 @@ static inline void P_AddFFloorToList(sector_t *sec, ffloor_t *fflr) * \param sec Target sector. * \param sec2 Control sector. * \param master Control linedef. + * \param alpha Alpha value (0-255). * \param flags Options affecting this 3Dfloor. * \param secthinkers List of relevant thinkers sorted by sector. May be NULL. * \return Pointer to the new 3Dfloor. * \sa P_AddFFloor, P_AddFakeFloorsByLine, P_SpawnSpecials */ -static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, ffloortype_e flags, thinkerlist_t *secthinkers) +static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, INT32 alpha, ffloortype_e flags, thinkerlist_t *secthinkers) { ffloor_t *fflr; thinker_t *th; @@ -5743,7 +5744,12 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f else th = th->next; } - fflr->alpha = (flags & FF_TRANSLUCENT) ? (master->alpha * 0xff) >> FRACBITS : 0xff; + fflr->alpha = max(0, min(0xff, alpha)); + if (fflr->alpha == 0xff) + { + fflr->flags |= FF_TRANSLUCENT; + fflr->spawnflags = fflr->flags; + } fflr->spawnalpha = fflr->alpha; // save for netgames if (flags & FF_QUICKSAND) @@ -6633,7 +6639,7 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags |= FF_CUTLEVEL; } - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers); break; case 120: // FOF (water) @@ -6650,7 +6656,7 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags |= FF_RIPPLE; if (lines[i].args[1] & TMFW_GOOWATER) ffloorflags |= FF_GOOWATER; - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers); break; case 150: // FOF (Air bobbing) @@ -6672,7 +6678,7 @@ void P_SpawnSpecials(boolean fromnetsave) else ffloorflags |= FF_CUTLEVEL; - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); P_AddAirbob(lines[i].frontsector, lines[i].args[0], lines[i].args[1] << FRACBITS, !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); break; @@ -6698,7 +6704,7 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags |= FF_ALLSIDES; } - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); break; case 170: // FOF (Crumbling) @@ -6739,7 +6745,7 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags |= FF_ALLSIDES; } - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers); if (lines[i].args[2] & TMFC_AIRBOB) P_AddAirbob(lines[i].frontsector, lines[i].args[0], 16*FRACUNIT, false, false, false); break; @@ -6790,7 +6796,7 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags |= FF_CUTLEVEL; } - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers); P_AddRaiseThinker(lines[i].frontsector, lines[i].args[0], lines[i].args[4] << FRACBITS, ceilingtop, ceilingbottom, !!(lines[i].args[5] & TMFR_REVERSE), !!(lines[i].args[5] & TMFR_SPINDASH)); break; } @@ -6798,7 +6804,7 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags = FF_EXISTS|FF_CUTSPRITES; if (!lines[i].args[1]) ffloorflags |= FF_DOUBLESHADOW; - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); break; case 202: // Fog @@ -6807,7 +6813,7 @@ void P_SpawnSpecials(boolean fromnetsave) // SoM: Because it's fog, check for an extra colormap and set the fog flag... if (sectors[sec].extra_colormap) sectors[sec].extra_colormap->flags = CMF_FOG; - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); break; case 220: //Intangible @@ -6832,11 +6838,11 @@ void P_SpawnSpecials(boolean fromnetsave) if (lines[i].args[2] & TMFA_NOSHADE) ffloorflags |= FF_NOSHADE; - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers); break; case 223: // FOF (intangible, invisible) - for combining specials in a sector - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_NOSHADE, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_NOSHADE, secthinkers); break; case 250: // Mario Block @@ -6846,14 +6852,14 @@ void P_SpawnSpecials(boolean fromnetsave) if (lines[i].args[1] & TMFM_INVISIBLE) ffloorflags &= ~(FF_SOLID|FF_RENDERALL|FF_CUTLEVEL); - P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); break; case 251: // A THWOMP! { UINT16 sound = (lines[i].stringargs[0]) ? get_number(lines[i].stringargs[0]) : sfx_thwomp; P_AddThwompThinker(lines[i].frontsector, lines[i].args[0], &lines[i], lines[i].args[1] << FRACBITS, lines[i].args[2] << FRACBITS, sound); - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); break; } @@ -6898,7 +6904,7 @@ void P_SpawnSpecials(boolean fromnetsave) for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0], s)) >= 0 ;) { - ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, ffloorflags, secthinkers); + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers); fflr->busttype = busttype; fflr->specialflags = bustflags; fflr->busttag = lines[i].args[4]; @@ -6912,7 +6918,7 @@ void P_SpawnSpecials(boolean fromnetsave) for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0], s)) >= 0 ;) { - ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, ffloorflags, secthinkers); + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, 0xff, ffloorflags, secthinkers); fflr->sinkspeed = abs(lines[i].args[2]) << (FRACBITS - 1); fflr->friction = abs(lines[i].args[3]) << (FRACBITS - 6); } @@ -6920,13 +6926,13 @@ void P_SpawnSpecials(boolean fromnetsave) case 258: // Laser block P_AddLaserThinker(lines[i].args[0], lines + i, !!(lines[i].args[1])); - P_AddFakeFloorsByLine(i, FF_EXISTS|FF_RENDERALL|FF_NOSHADE|FF_EXTRA|FF_CUTEXTRA|FF_TRANSLUCENT, secthinkers); + P_AddFakeFloorsByLine(i, (lines[i].alpha * 0xff) >> FRACBITS, FF_EXISTS|FF_RENDERALL|FF_NOSHADE|FF_EXTRA|FF_CUTEXTRA|FF_TRANSLUCENT, secthinkers); break; case 259: // Custom FOF for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0], s)) >= 0 ;) { - ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], secthinkers); + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, (lines[i].args[1] & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, lines[i].args[1], secthinkers); if (!udmf) // Ugly backwards compatibility stuff { if (lines[i].args[1] & FF_QUICKSAND) @@ -7368,18 +7374,19 @@ void P_SpawnSpecials(boolean fromnetsave) /** Adds 3Dfloors as appropriate based on a common control linedef. * * \param line Control linedef to use. + * \param alpha Alpha value (0-255). * \param ffloorflags 3Dfloor flags to use. * \param secthkiners Lists of thinkers sorted by sector. May be NULL. * \sa P_SpawnSpecials, P_AddFakeFloor * \author Graue */ -static void P_AddFakeFloorsByLine(size_t line, ffloortype_e ffloorflags, thinkerlist_t *secthinkers) +static void P_AddFakeFloorsByLine(size_t line, INT32 alpha, ffloortype_e ffloorflags, thinkerlist_t *secthinkers) { INT32 s; size_t sec = sides[*lines[line].sidenum].sector-sectors; for (s = -1; (s = P_FindSectorFromTag(lines[line].args[0], s)) >= 0 ;) - P_AddFakeFloor(§ors[s], §ors[sec], lines+line, ffloorflags, secthinkers); + P_AddFakeFloor(§ors[s], §ors[sec], lines+line, alpha, ffloorflags, secthinkers); } /* From 8dd3c78b053162df58bfb107b1b729bfc7ecb662 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 12 Jun 2020 08:27:10 +0200 Subject: [PATCH 048/377] Add FOF flag for splat flat rendering --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 1 + src/dehacked.c | 1 + src/p_spec.c | 2 ++ src/r_defs.h | 1 + src/r_plane.c | 2 +- 5 files changed, 6 insertions(+), 1 deletion(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 4f45c12c1..cdf9bdd40 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2186,6 +2186,7 @@ udmf 134217728 = "Ripple effect"; 268435456 = "Don't copy light level"; 536870912 = "Bouncy"; + 1073741824 = "Cut cyan flat pixels"; } } } diff --git a/src/dehacked.c b/src/dehacked.c index b416eed4d..a55362ec0 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -9820,6 +9820,7 @@ struct { {"FF_RIPPLE",FF_RIPPLE}, ///< Ripple the flats {"FF_COLORMAPONLY",FF_COLORMAPONLY}, ///< Only copy the colormap, not the lightlevel {"FF_BOUNCY",FF_BOUNCY}, ///< Bounces players + {"FF_SPLAT",FF_SPLAT}, ///< Use splat flat renderer (treat cyan pixels as invisible) // FOF special flags {"FS_PUSHABLES",FS_PUSHABLES}, diff --git a/src/p_spec.c b/src/p_spec.c index 6d260758d..b39594ee7 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5697,6 +5697,8 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, I if (sec2->hasslope) sec->hasslope = true; + if (!udmf && master->flags & ML_EFFECT6) + fflr->flags |= FF_SPLAT; //TODO: Temporary fflr->spawnflags = fflr->flags = flags; fflr->master = master; fflr->norender = INFTICS; diff --git a/src/r_defs.h b/src/r_defs.h index ff65a5dc5..0e0adb7c6 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -147,6 +147,7 @@ typedef enum FF_RIPPLE = 0x8000000, ///< Ripple the flats FF_COLORMAPONLY = 0x10000000, ///< Only copy the colormap, not the lightlevel FF_BOUNCY = 0x20000000, ///< Bounces players + FF_SPLAT = 0x40000000, ///< Use splat flat renderer (treat cyan pixels as invisible) } ffloortype_e; typedef enum diff --git a/src/r_plane.c b/src/r_plane.c index 92795d0fb..7f91d7465 100644 --- a/src/r_plane.c +++ b/src/r_plane.c @@ -984,7 +984,7 @@ void R_DrawSinglePlane(visplane_t *pl) if (pl->ffloor->flags & FF_TRANSLUCENT) { - spanfunctype = (pl->ffloor->master->flags & ML_EFFECT6) ? SPANDRAWFUNC_TRANSSPLAT : SPANDRAWFUNC_TRANS; + spanfunctype = (pl->ffloor->flags & FF_SPLAT) ? SPANDRAWFUNC_TRANSSPLAT : SPANDRAWFUNC_TRANS; // Hacked up support for alpha value in software mode Tails 09-24-2002 if (pl->ffloor->alpha < 12) From 1ad8f75538dc11b282a4a4e7b8a01f055bd2311a Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 12 Jun 2020 09:00:06 +0200 Subject: [PATCH 049/377] Revamp alpha setup for water FOFs --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 17 +++++++++------ src/p_setup.c | 22 ++++++++++++-------- src/p_spec.c | 18 ++++++++-------- src/p_spec.h | 12 +++++------ 4 files changed, 39 insertions(+), 30 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index cdf9bdd40..884865f95 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1794,17 +1794,22 @@ udmf type = 13; } arg1 + { + title = "Alpha"; + default = 128; + } + arg2 { title = "Flags"; type = 12; enum { - 1 = "Opaque"; - 2 = "Don't render sides"; - 4 = "Render separate light level"; - 8 = "Use target light level"; - 16 = "No ripple effect"; - 32 = "Goo physics"; + 1 = "Don't render sides"; + 2 = "Render separate light level"; + 4 = "Use target light level"; + 8 = "No ripple effect"; + 16 = "Goo physics"; + 32 = "Cut cyan flat pixels"; } } } diff --git a/src/p_setup.c b/src/p_setup.c index 26132251c..0ef1a9793 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3056,32 +3056,36 @@ static void P_ConvertBinaryMap(void) case 125: //FOF: goo water, translucent, no sides lines[i].args[0] = lines[i].tag; - //Opaque? + //Alpha if (lines[i].special == 120 || lines[i].special == 122) - lines[i].args[1] |= TMFW_OPAQUE; + lines[i].args[1] = 255; else { if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; + lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; else - lines[i].alpha = FRACUNIT/2; + lines[i].args[1] = 128; } //No sides? if (lines[i].special == 122 || lines[i].special == 123 || lines[i].special == 125) - lines[i].args[1] |= TMFW_NOSIDES; + lines[i].args[2] |= TMFW_NOSIDES; //Flags if (lines[i].flags & ML_NOCLIMB) - lines[i].args[1] |= TMFW_DOUBLESHADOW; + lines[i].args[2] |= TMFW_DOUBLESHADOW; if (lines[i].flags & ML_EFFECT4) - lines[i].args[1] |= TMFW_COLORMAPONLY; + lines[i].args[2] |= TMFW_COLORMAPONLY; if (!(lines[i].flags & ML_EFFECT5)) - lines[i].args[1] |= TMFW_NORIPPLE; + lines[i].args[2] |= TMFW_NORIPPLE; //Goo? if (lines[i].special >= 124) - lines[i].args[1] |= TMFW_GOOWATER; + lines[i].args[2] |= TMFW_GOOWATER; + + //Splat rendering? + if (lines[i].flags & ML_EFFECT6) + lines[i].args[2] |= TMFW_SPLAT; lines[i].special = 120; break; diff --git a/src/p_spec.c b/src/p_spec.c index b39594ee7..84d399a55 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5747,7 +5747,7 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, I } fflr->alpha = max(0, min(0xff, alpha)); - if (fflr->alpha == 0xff) + if (fflr->alpha < 0xff) { fflr->flags |= FF_TRANSLUCENT; fflr->spawnflags = fflr->flags; @@ -6646,19 +6646,19 @@ void P_SpawnSpecials(boolean fromnetsave) case 120: // FOF (water) ffloorflags = FF_EXISTS|FF_RENDERPLANES|FF_SWIMMABLE|FF_BOTHPLANES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; - if (!(lines[i].args[1] & TMFW_OPAQUE)) - ffloorflags |= FF_TRANSLUCENT; - if (!(lines[i].args[1] & TMFW_NOSIDES)) + if (!(lines[i].args[2] & TMFW_NOSIDES)) ffloorflags |= FF_RENDERSIDES|FF_ALLSIDES; - if (lines[i].args[1] & TMFW_DOUBLESHADOW) + if (lines[i].args[2] & TMFW_DOUBLESHADOW) ffloorflags |= FF_DOUBLESHADOW; - if (lines[i].args[1] & TMFW_COLORMAPONLY) + if (lines[i].args[2] & TMFW_COLORMAPONLY) ffloorflags |= FF_COLORMAPONLY; - if (!(lines[i].args[1] & TMFW_NORIPPLE)) + if (!(lines[i].args[2] & TMFW_NORIPPLE)) ffloorflags |= FF_RIPPLE; - if (lines[i].args[1] & TMFW_GOOWATER) + if (lines[i].args[2] & TMFW_GOOWATER) ffloorflags |= FF_GOOWATER; - P_AddFakeFloorsByLine(i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers); + if (lines[i].args[2] & TMFW_SPLAT) + ffloorflags |= FF_SPLAT; + P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); break; case 150: // FOF (Air bobbing) diff --git a/src/p_spec.h b/src/p_spec.h index ef69e83ea..16f992780 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -46,12 +46,12 @@ typedef enum typedef enum { - TMFW_OPAQUE = 1, - TMFW_NOSIDES = 1<<1, - TMFW_DOUBLESHADOW = 1<<2, - TMFW_COLORMAPONLY = 1<<3, - TMFW_NORIPPLE = 1<<4, - TMFW_GOOWATER = 1<<5, + TMFW_NOSIDES = 1, + TMFW_DOUBLESHADOW = 1<<1, + TMFW_COLORMAPONLY = 1<<2, + TMFW_NORIPPLE = 1<<3, + TMFW_GOOWATER = 1<<4, + TMFW_SPLAT = 1<<5, } textmapfofwater_t; typedef enum From ac549eddeb4d6b145a29485c57585a0649aedbc1 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 12 Jun 2020 09:28:41 +0200 Subject: [PATCH 050/377] Revamp alpha setup for crumbling FOFs --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 17 +++++---- src/p_setup.c | 37 ++++++++++++-------- src/p_spec.c | 26 +++++++------- src/p_spec.h | 10 +++--- 4 files changed, 51 insertions(+), 39 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 884865f95..95986acc7 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1873,22 +1873,27 @@ udmf type = 13; } arg1 + { + title = "Alpha"; + default = 255; + } + arg2 { title = "Tangibility"; type = 12; enum = "tangibility"; } - arg2 + arg3 { title = "Flags"; type = 12; enum { - 1 = "Translucent"; - 2 = "No shadow"; - 4 = "No respawn"; - 8 = "Air bobbing"; - 16 = "Float on water"; + 1 = "No shadow"; + 2 = "No respawn"; + 4 = "Air bobbing"; + 8 = "Float on water"; + 16 = "Cut cyan flat pixels"; } } } diff --git a/src/p_setup.c b/src/p_setup.c index 0ef1a9793..e0f64fcba 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3180,31 +3180,38 @@ static void P_ConvertBinaryMap(void) case 179: //FOF: Crumbling, no respawn, floating case 180: //FOF: Crumbling, respawn, air bobbing lines[i].args[0] = lines[i].tag; - if (lines[i].special >= 172 && lines[i].special <= 175) - { - lines[i].args[1] |= TMFT_INTANGIBLEBOTTOM; - if (lines[i].flags & ML_NOCLIMB) - lines[i].args[2] |= TMFC_NOSHADE; - } + + //Alpha if (lines[i].special >= 174 && lines[i].special <= 175) { - lines[i].args[2] |= TMFC_TRANSLUCENT; if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; + lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; else - lines[i].alpha = FRACUNIT/2; + lines[i].args[1] = 128; } + else + lines[i].args[1] = 255; + + if (lines[i].special >= 172 && lines[i].special <= 175) + { + lines[i].args[2] |= TMFT_INTANGIBLEBOTTOM; + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[3] |= TMFC_NOSHADE; + } + if (lines[i].special % 2 == 1) - lines[i].args[2] |= TMFC_NORETURN; + lines[i].args[3] |= TMFC_NORETURN; if (lines[i].special == 176 || lines[i].special == 177 || lines[i].special == 180) - lines[i].args[2] |= TMFC_AIRBOB; + lines[i].args[3] |= TMFC_AIRBOB; if (lines[i].special >= 176 && lines[i].special <= 179) - lines[i].args[2] |= TMFC_FLOATBOB; + lines[i].args[3] |= TMFC_FLOATBOB; + if (lines[i].flags & ML_EFFECT6) + lines[i].args[3] |= TMFC_SPLAT; if (lines[i].flags & ML_EFFECT1) - lines[i].args[1] |= TMFT_DONTBLOCKOTHERS; + lines[i].args[2] |= TMFT_DONTBLOCKOTHERS; if (lines[i].flags & ML_EFFECT2) - lines[i].args[1] |= TMFT_DONTBLOCKPLAYER; + lines[i].args[2] |= TMFT_DONTBLOCKPLAYER; lines[i].special = 170; break; @@ -3338,7 +3345,7 @@ static void P_ConvertBinaryMap(void) //Translucency if (lines[i].special == 253 || lines[i].special == 256) { - lines[i].args[2] = TMFC_TRANSLUCENT; + lines[i].args[2] = 1; if (sides[lines[i].sidenum[0]].toptexture > 0) lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; else diff --git a/src/p_spec.c b/src/p_spec.c index 84d399a55..2e7290271 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6713,33 +6713,33 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CRUMBLE; //Tangibility settings - if (lines[i].args[1] & TMFT_INTANGIBLETOP) + if (lines[i].args[2] & TMFT_INTANGIBLETOP) ffloorflags |= FF_REVERSEPLATFORM; - if (lines[i].args[1] & TMFT_INTANGIBLEBOTTOM) + if (lines[i].args[2] & TMFT_INTANGIBLEBOTTOM) ffloorflags |= FF_PLATFORM; - if (lines[i].args[1] & TMFT_DONTBLOCKPLAYER) + if (lines[i].args[2] & TMFT_DONTBLOCKPLAYER) ffloorflags &= ~FF_BLOCKPLAYER; - if (lines[i].args[1] & TMFT_DONTBLOCKOTHERS) + if (lines[i].args[2] & TMFT_DONTBLOCKOTHERS) ffloorflags &= ~FF_BLOCKOTHERS; //Flags - if (lines[i].args[2] & TMFC_TRANSLUCENT) - ffloorflags |= FF_TRANSLUCENT; - if (lines[i].args[2] & TMFC_NOSHADE) + if (lines[i].args[3] & TMFC_NOSHADE) ffloorflags |= FF_NOSHADE; - if (lines[i].args[2] & TMFC_NORETURN) + if (lines[i].args[3] & TMFC_NORETURN) ffloorflags |= FF_NORETURN; - if (lines[i].args[2] & TMFC_FLOATBOB) + if (lines[i].args[3] & TMFC_FLOATBOB) ffloorflags |= FF_FLOATBOB; + if (lines[i].args[3] & TMFC_SPLAT) + ffloorflags |= FF_SPLAT; //If translucent or player can enter it, cut inner walls - if ((ffloorflags & FF_TRANSLUCENT) || (lines[i].args[1] & TMFT_VISIBLEFROMINSIDE)) + if (lines[i].args[1] < 0xff || (lines[i].args[2] & TMFT_VISIBLEFROMINSIDE)) ffloorflags |= FF_CUTEXTRA|FF_EXTRA; else ffloorflags |= FF_CUTLEVEL; //If player can enter it, render insides - if (lines[i].args[1] & TMFT_VISIBLEFROMINSIDE) + if (lines[i].args[2] & TMFT_VISIBLEFROMINSIDE) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_BOTHPLANES; @@ -6747,8 +6747,8 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags |= FF_ALLSIDES; } - P_AddFakeFloorsByLine(i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers); - if (lines[i].args[2] & TMFC_AIRBOB) + P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); + if (lines[i].args[3] & TMFC_AIRBOB) P_AddAirbob(lines[i].frontsector, lines[i].args[0], 16*FRACUNIT, false, false, false); break; diff --git a/src/p_spec.h b/src/p_spec.h index 16f992780..59aeb9f4d 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -63,11 +63,11 @@ typedef enum typedef enum { - TMFC_TRANSLUCENT = 1, - TMFC_NOSHADE = 1<<1, - TMFC_NORETURN = 1<<2, - TMFC_AIRBOB = 1<<3, - TMFC_FLOATBOB = 1<<4, + TMFC_NOSHADE = 1, + TMFC_NORETURN = 1<<1, + TMFC_AIRBOB = 1<<2, + TMFC_FLOATBOB = 1<<3, + TMFC_SPLAT = 1<<4, } textmapfofcrumbling_t; typedef enum From d6a104f8a5eec263652610754172d78ca0a48e5a Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 12 Jun 2020 09:57:56 +0200 Subject: [PATCH 051/377] Revamp alpha setup for custom FOFs --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 6 +++++- src/p_setup.c | 14 +++++++++----- src/p_spec.c | 10 +++++----- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 95986acc7..b0e7543aa 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2163,6 +2163,11 @@ udmf type = 13; } arg1 + { + title = "Alpha"; + default = 255; + } + arg2 { title = "Flags"; type = 12; @@ -2180,7 +2185,6 @@ udmf 512 = "Split sprites"; 1024 = "Render inside planes"; 2048 = "Extra"; - 4096 = "Translucent"; 8192 = "Fog"; 16384 = "Only render inside planes"; 32768 = "Render inside walls"; diff --git a/src/p_setup.c b/src/p_setup.c index e0f64fcba..a75cf7cb3 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3381,15 +3381,19 @@ static void P_ConvertBinaryMap(void) I_Error("Custom FOF (tag %d) found without a linedef back side!", lines[i].tag); lines[i].args[0] = lines[i].tag; - lines[i].args[1] = sides[lines[i].sidenum[1]].toptexture; - lines[i].args[2] = sides[lines[i].sidenum[1]].midtexture; - if (lines[i].args[1] & FF_TRANSLUCENT) + lines[i].args[2] = sides[lines[i].sidenum[1]].toptexture; + if (lines[i].flags & ML_EFFECT6) + lines[i].args[2] |= FF_SPLAT; + lines[i].args[3] = sides[lines[i].sidenum[1]].midtexture; + if (lines[i].args[2] & FF_TRANSLUCENT) { if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; + lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; else - lines[i].alpha = FRACUNIT/2; + lines[i].args[1] = 128; } + else + lines[i].args[1] = 255; break; case 443: //Call Lua function if (lines[i].text) diff --git a/src/p_spec.c b/src/p_spec.c index 2e7290271..ce01cb669 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6934,17 +6934,17 @@ void P_SpawnSpecials(boolean fromnetsave) case 259: // Custom FOF for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0], s)) >= 0 ;) { - ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, (lines[i].args[1] & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, lines[i].args[1], secthinkers); + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], lines[i].args[2], secthinkers); if (!udmf) // Ugly backwards compatibility stuff { - if (lines[i].args[1] & FF_QUICKSAND) + if (lines[i].args[2] & FF_QUICKSAND) { fflr->sinkspeed = abs(lines[i].dx) >> 1; fflr->friction = abs(lines[i].dy) >> 6; } - if (lines[i].args[1] & FF_BUSTUP) + if (lines[i].args[2] & FF_BUSTUP) { - switch (lines[i].args[2] % TMFB_ONLYBOTTOM) + switch (lines[i].args[3] % TMFB_ONLYBOTTOM) { case TMFB_TOUCH: fflr->busttype = BT_TOUCH; @@ -6960,7 +6960,7 @@ void P_SpawnSpecials(boolean fromnetsave) break; } - if (lines[i].args[2] & TMFB_ONLYBOTTOM) + if (lines[i].args[3] & TMFB_ONLYBOTTOM) fflr->specialflags |= FS_ONLYBOTTOM; if (lines[i].flags & ML_EFFECT4) fflr->specialflags |= FS_PUSHABLES; From cadb03fd12f8be18386f318809f2092a85475cb6 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 12 Jun 2020 10:03:27 +0200 Subject: [PATCH 052/377] Revamp alpha setup for laser FOFs --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 5 +++++ src/p_setup.c | 6 +++++- src/p_spec.c | 4 ++-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index b0e7543aa..448e98dc7 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2146,6 +2146,11 @@ udmf type = 13; } arg1 + { + title = "Alpha"; + default = 128; + } + arg2 { title = "Damage bosses?"; type = 11; diff --git a/src/p_setup.c b/src/p_setup.c index a75cf7cb3..c72887c7a 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3373,8 +3373,12 @@ static void P_ConvertBinaryMap(void) break; case 258: //FOF: Laser lines[i].args[0] = lines[i].tag; + if (sides[lines[i].sidenum[0]].toptexture > 0) + lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; + else + lines[i].args[1] = 128; if (lines[i].flags & ML_EFFECT1) - lines[i].args[1] = 1; + lines[i].args[2] = 1; break; case 259: //Custom FOF if (lines[i].sidenum[1] == 0xffff) diff --git a/src/p_spec.c b/src/p_spec.c index ce01cb669..214e7e1c0 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6927,8 +6927,8 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 258: // Laser block - P_AddLaserThinker(lines[i].args[0], lines + i, !!(lines[i].args[1])); - P_AddFakeFloorsByLine(i, (lines[i].alpha * 0xff) >> FRACBITS, FF_EXISTS|FF_RENDERALL|FF_NOSHADE|FF_EXTRA|FF_CUTEXTRA|FF_TRANSLUCENT, secthinkers); + P_AddLaserThinker(lines[i].args[0], lines + i, !!(lines[i].args[2])); + P_AddFakeFloorsByLine(i, lines[i].args[1], FF_EXISTS|FF_RENDERALL|FF_NOSHADE|FF_EXTRA|FF_CUTEXTRA|FF_TRANSLUCENT, secthinkers); break; case 259: // Custom FOF From cc6820187cee5b7b351dc4fc2292bc7b16e760e0 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 12 Jun 2020 10:17:52 +0200 Subject: [PATCH 053/377] Handle splat flag for laser FOFs --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 10 +++++++--- src/p_setup.c | 9 ++++++++- src/p_spec.c | 7 +++++-- src/p_spec.h | 6 ++++++ 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 448e98dc7..84ff06385 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2152,9 +2152,13 @@ udmf } arg2 { - title = "Damage bosses?"; - type = 11; - enum = "yesno"; + title = "Flags"; + type = 12; + enum + { + 1 = "Don't damage bosses"; + 2 = "Cut cyan flat pixels"; + } } } diff --git a/src/p_setup.c b/src/p_setup.c index c72887c7a..2ae01f869 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3373,12 +3373,19 @@ static void P_ConvertBinaryMap(void) break; case 258: //FOF: Laser lines[i].args[0] = lines[i].tag; + + //Alpha if (sides[lines[i].sidenum[0]].toptexture > 0) lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; else lines[i].args[1] = 128; + + //Flags if (lines[i].flags & ML_EFFECT1) - lines[i].args[2] = 1; + lines[i].args[2] = TMFL_NOBOSSES; + if (lines[i].flags & ML_EFFECT6) + lines[i].args[2] = TMFL_SPLAT; + break; case 259: //Custom FOF if (lines[i].sidenum[1] == 0xffff) diff --git a/src/p_spec.c b/src/p_spec.c index 214e7e1c0..66ad1893a 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6927,8 +6927,11 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 258: // Laser block - P_AddLaserThinker(lines[i].args[0], lines + i, !!(lines[i].args[2])); - P_AddFakeFloorsByLine(i, lines[i].args[1], FF_EXISTS|FF_RENDERALL|FF_NOSHADE|FF_EXTRA|FF_CUTEXTRA|FF_TRANSLUCENT, secthinkers); + ffloorflags = FF_EXISTS|FF_RENDERALL|FF_NOSHADE|FF_EXTRA|FF_CUTEXTRA|FF_TRANSLUCENT; + P_AddLaserThinker(lines[i].args[0], lines + i, !!(lines[i].args[2] & TMFL_NOBOSSES)); + if (lines[i].args[2] & TMFL_SPLAT) + ffloorflags |= FF_SPLAT; + P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); break; case 259: // Custom FOF diff --git a/src/p_spec.h b/src/p_spec.h index 59aeb9f4d..661b74738 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -97,6 +97,12 @@ typedef enum TMFB_ONLYBOTTOM = 1<<2, } textmapfofbustflags_t; +typedef enum +{ + TMFL_NOBOSSES = 1, + TMFL_SPLAT = 1<<1, +} textmapfoflaserflags_t; + // GETSECSPECIAL (specialval, section) // // Pulls out the special # from a particular section. From f4e28f5cc4b1684091e9f2d05d6c1872efe17c48 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 12 Jun 2020 10:23:16 +0200 Subject: [PATCH 054/377] Revamp alpha setup for quicksand FOFs --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 17 +++++++++++++---- src/p_setup.c | 9 ++++++--- src/p_spec.c | 10 ++++++---- src/p_spec.h | 6 ++++++ 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 84ff06385..50d59f1a4 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2122,15 +2122,24 @@ udmf } arg1 { - title = "Ripple effect?"; - type = 11; - enum = "yesno"; + title = "Alpha"; + default = 255; } arg2 { - title = "Sinking speed"; + title = "Ripple effect?"; + type = 12; + enum + { + 1 = "No ripple effect"; + 2 = "Cut cyan flat pixels"; + } } arg3 + { + title = "Sinking speed"; + } + arg4 { title = "Friction"; } diff --git a/src/p_setup.c b/src/p_setup.c index 2ae01f869..79a030e6d 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3366,10 +3366,13 @@ static void P_ConvertBinaryMap(void) break; case 257: //FOF: Quicksand lines[i].args[0] = lines[i].tag; + lines[i].args[1] = 255; if (!(lines[i].flags & ML_EFFECT5)) - lines[i].args[1] = 1; //No ripple effect - lines[i].args[2] = lines[i].dx >> FRACBITS; //Sinking speed - lines[i].args[3] = lines[i].dy >> FRACBITS; //Friction + lines[i].args[2] |= TMFQ_NORIPPLE; + if (lines[i].flags & ML_EFFECT6) + lines[i].args[2] |= TMFQ_SPLAT; + lines[i].args[3] = lines[i].dx >> FRACBITS; //Sinking speed + lines[i].args[4] = lines[i].dy >> FRACBITS; //Friction break; case 258: //FOF: Laser lines[i].args[0] = lines[i].tag; diff --git a/src/p_spec.c b/src/p_spec.c index 66ad1893a..86f153bce 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6915,14 +6915,16 @@ void P_SpawnSpecials(boolean fromnetsave) } case 257: // Quicksand ffloorflags = FF_EXISTS|FF_QUICKSAND|FF_RENDERALL|FF_ALLSIDES|FF_CUTSPRITES; - if (!(lines[i].args[1])) + if (!(lines[i].args[2] & TMFQ_NORIPPLE)) ffloorflags |= FF_RIPPLE; + if (lines[i].args[2] & TMFQ_SPLAT) + ffloorflags |= FF_SPLAT; for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0], s)) >= 0 ;) { - ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, 0xff, ffloorflags, secthinkers); - fflr->sinkspeed = abs(lines[i].args[2]) << (FRACBITS - 1); - fflr->friction = abs(lines[i].args[3]) << (FRACBITS - 6); + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], ffloorflags, secthinkers); + fflr->sinkspeed = abs(lines[i].args[3]) << (FRACBITS - 1); + fflr->friction = abs(lines[i].args[4]) << (FRACBITS - 6); } break; diff --git a/src/p_spec.h b/src/p_spec.h index 661b74738..ef4c003a8 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -97,6 +97,12 @@ typedef enum TMFB_ONLYBOTTOM = 1<<2, } textmapfofbustflags_t; +typedef enum +{ + TMFQ_NORIPPLE = 1, + TMFQ_SPLAT = 1<<1, +} textmapfofquicksandflags_t; + typedef enum { TMFL_NOBOSSES = 1, From 3317827151c443395ff6ca7675c194b1bdb32c29 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 12 Jun 2020 10:31:26 +0200 Subject: [PATCH 055/377] Revamp alpha setup for bustable FOFs --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 12 +++---- src/p_setup.c | 34 +++++++++++--------- src/p_spec.c | 10 +++--- src/p_spec.h | 1 + 4 files changed, 30 insertions(+), 27 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 50d59f1a4..1ab8ba927 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2076,6 +2076,11 @@ udmf type = 13; } arg1 + { + title = "Alpha"; + default = 255; + } + arg2 { title = "Bustable type"; type = 11; @@ -2087,12 +2092,6 @@ udmf 3 = "Strong"; } } - arg2 - { - title = "Translucent?"; - type = 11; - enum = "noyes"; - } arg3 { title = "Flags"; @@ -2102,6 +2101,7 @@ udmf 1 = "Bustable by pushables"; 2 = "Trigger linedef executor"; 4 = "Only bustable from below"; + 8 = "Cut cyan flat pixels"; } } arg4 diff --git a/src/p_setup.c b/src/p_setup.c index 79a030e6d..1c2550200 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3332,26 +3332,28 @@ static void P_ConvertBinaryMap(void) case 256: //FOF: Spin-bustable block, translucent lines[i].args[0] = lines[i].tag; - //Bustable type - if (lines[i].special <= 253) - lines[i].args[1] = TMFB_TOUCH; - else if (lines[i].special >= 255) - lines[i].args[1] = TMFB_SPIN; - else if (lines[i].flags & ML_NOCLIMB) - lines[i].args[1] = TMFB_STRONG; - else - lines[i].args[1] = TMFB_REGULAR; - - //Translucency + //Alpha if (lines[i].special == 253 || lines[i].special == 256) { - lines[i].args[2] = 1; if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; + lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; else - lines[i].alpha = FRACUNIT/2; + lines[i].args[1] = 128; } + else + lines[i].args[1] = 255; + //Bustable type + if (lines[i].special <= 253) + lines[i].args[2] = TMFB_TOUCH; + else if (lines[i].special >= 255) + lines[i].args[2] = TMFB_SPIN; + else if (lines[i].flags & ML_NOCLIMB) + lines[i].args[2] = TMFB_STRONG; + else + lines[i].args[2] = TMFB_REGULAR; + + //Flags if (lines[i].flags & ML_EFFECT4) lines[i].args[3] |= TMFB_PUSHABLES; if (lines[i].flags & ML_EFFECT5) @@ -3360,7 +3362,9 @@ static void P_ConvertBinaryMap(void) lines[i].args[4] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; } if (lines[i].special == 252 && lines[i].flags & ML_NOCLIMB) - lines[i].args[4] |= TMFB_ONLYBOTTOM; + lines[i].args[3] |= TMFB_ONLYBOTTOM; + if (lines[i].flags & ML_EFFECT6) + lines[i].args[3] |= TMFB_SPLAT; lines[i].special = 254; break; diff --git a/src/p_spec.c b/src/p_spec.c index 86f153bce..e03ec3205 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6873,7 +6873,7 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags = FF_EXISTS|FF_BLOCKOTHERS|FF_RENDERALL|FF_BUSTUP; //Bustable type - switch (lines[i].args[1]) + switch (lines[i].args[2]) { case TMFB_TOUCH: busttype = BT_TOUCH; @@ -6889,10 +6889,6 @@ void P_SpawnSpecials(boolean fromnetsave) break; } - //Translucent? - if (lines[i].args[2]) - ffloorflags |= FF_TRANSLUCENT; - //Flags if (lines[i].args[3] & TMFB_PUSHABLES) bustflags |= FS_PUSHABLES; @@ -6900,13 +6896,15 @@ void P_SpawnSpecials(boolean fromnetsave) bustflags |= FS_EXECUTOR; if (lines[i].args[3] & TMFB_ONLYBOTTOM) bustflags |= FS_ONLYBOTTOM; + if (lines[i].args[3] & TMFB_SPLAT) + ffloorflags |= FF_SPLAT; if (busttype != BT_TOUCH || bustflags & FS_ONLYBOTTOM) ffloorflags |= FF_BLOCKPLAYER; for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0], s)) >= 0 ;) { - ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers); + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], ffloorflags, secthinkers); fflr->busttype = busttype; fflr->specialflags = bustflags; fflr->busttag = lines[i].args[4]; diff --git a/src/p_spec.h b/src/p_spec.h index ef4c003a8..a5717e1d1 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -95,6 +95,7 @@ typedef enum TMFB_PUSHABLES = 1, TMFB_EXECUTOR = 1<<1, TMFB_ONLYBOTTOM = 1<<2, + TMFB_SPLAT = 1<<3, } textmapfofbustflags_t; typedef enum From 6521496d8ab30704c33f0dff6366d18d43d86e1d Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 12 Jun 2020 10:53:27 +0200 Subject: [PATCH 056/377] Revamp alpha setup for bobbing FOFs --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 26 ++++++++- src/p_setup.c | 34 +++++++----- src/p_spec.c | 58 +++++++++++--------- 3 files changed, 75 insertions(+), 43 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 1ab8ba927..934e60962 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1825,9 +1825,20 @@ udmf } arg1 { - title = "Bobbing distance"; + title = "Alpha"; + default = 255; } arg2 + { + title = "Cut cyan flat pixels?"; + type = 11; + enum = "noyes"; + } + arg3 + { + title = "Bobbing distance"; + } + arg4 { title = "Flags"; type = 12; @@ -1838,7 +1849,7 @@ udmf 4 = "Dynamic"; } } - arg3 + arg5 { title = "Tangibility"; type = 12; @@ -1856,6 +1867,17 @@ udmf type = 13; } arg1 + { + title = "Alpha"; + default = 255; + } + arg2 + { + title = "Cut cyan flat pixels?"; + type = 11; + enum = "noyes"; + } + arg3 { title = "Tangibility"; type = 12; diff --git a/src/p_setup.c b/src/p_setup.c index 1c2550200..2eec9820a 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3140,15 +3140,30 @@ static void P_ConvertBinaryMap(void) case 152: //FOF: Reverse air bobbing (adjustable) case 153: //FOF: Dynamically sinking platform lines[i].args[0] = lines[i].tag; - lines[i].args[1] = (lines[i].special == 150) ? 16 : (P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS); + lines[i].args[1] = 255; + lines[i].args[2] = !!(lines[i].flags & ML_EFFECT6); + lines[i].args[3] = (lines[i].special == 150) ? 16 : (P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS); //Flags if (lines[i].special == 152) - lines[i].args[2] |= TMFB_REVERSE; + lines[i].args[4] |= TMFB_REVERSE; if (lines[i].flags & ML_NOCLIMB) - lines[i].args[2] |= TMFB_SPINDASH; + lines[i].args[4] |= TMFB_SPINDASH; if (lines[i].special == 153) - lines[i].args[2] |= TMFB_DYNAMIC; + lines[i].args[4] |= TMFB_DYNAMIC; + + //Tangibility + if (lines[i].flags & ML_EFFECT1) + lines[i].args[5] |= TMFT_DONTBLOCKOTHERS; + if (lines[i].flags & ML_EFFECT2) + lines[i].args[5] |= TMFT_DONTBLOCKPLAYER; + + lines[i].special = 150; + break; + case 160: //FOF: Water bobbing + lines[i].args[0] = lines[i].tag; + lines[i].args[1] = 255; + lines[i].args[2] = !!(lines[i].flags & ML_EFFECT6); //Tangibility if (lines[i].flags & ML_EFFECT1) @@ -3156,17 +3171,6 @@ static void P_ConvertBinaryMap(void) if (lines[i].flags & ML_EFFECT2) lines[i].args[3] |= TMFT_DONTBLOCKPLAYER; - lines[i].special = 150; - break; - case 160: //FOF: Water bobbing - lines[i].args[0] = lines[i].tag; - - //Tangibility - if (lines[i].flags & ML_EFFECT1) - lines[i].args[1] |= TMFT_DONTBLOCKOTHERS; - if (lines[i].flags & ML_EFFECT2) - lines[i].args[1] |= TMFT_DONTBLOCKPLAYER; - break; case 170: //FOF: Crumbling, respawn case 171: //FOF: Crumbling, no respawn diff --git a/src/p_spec.c b/src/p_spec.c index e03ec3205..6373478b8 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6664,6 +6664,35 @@ void P_SpawnSpecials(boolean fromnetsave) case 150: // FOF (Air bobbing) ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; + if (lines[i].args[2]) + ffloorflags |= FF_SPLAT; + + //Tangibility settings + if (lines[i].args[5] & TMFT_INTANGIBLETOP) + ffloorflags |= FF_REVERSEPLATFORM; + if (lines[i].args[5] & TMFT_INTANGIBLEBOTTOM) + ffloorflags |= FF_PLATFORM; + if (lines[i].args[5] & TMFT_DONTBLOCKPLAYER) + ffloorflags &= ~FF_BLOCKPLAYER; + if (lines[i].args[5] & TMFT_DONTBLOCKOTHERS) + ffloorflags &= ~FF_BLOCKOTHERS; + + //If player can enter it, cut inner walls + if (lines[i].args[5] & TMFT_VISIBLEFROMINSIDE) + ffloorflags |= FF_CUTEXTRA|FF_EXTRA; + else + ffloorflags |= FF_CUTLEVEL; + + P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); + P_AddAirbob(lines[i].frontsector, lines[i].args[0], lines[i].args[3] << FRACBITS, !!(lines[i].args[4] & TMFB_REVERSE), !!(lines[i].args[4] & TMFB_SPINDASH), !!(lines[i].args[4] & TMFB_DYNAMIC)); + break; + + case 160: // FOF (Water bobbing) + ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_FLOATBOB; + + if (lines[i].args[2]) + ffloorflags |= FF_SPLAT; + //Tangibility settings if (lines[i].args[3] & TMFT_INTANGIBLETOP) ffloorflags |= FF_REVERSEPLATFORM; @@ -6674,31 +6703,8 @@ void P_SpawnSpecials(boolean fromnetsave) if (lines[i].args[3] & TMFT_DONTBLOCKOTHERS) ffloorflags &= ~FF_BLOCKOTHERS; - //If player can enter it, cut inner walls - if (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE) - ffloorflags |= FF_CUTEXTRA|FF_EXTRA; - else - ffloorflags |= FF_CUTLEVEL; - - P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); - P_AddAirbob(lines[i].frontsector, lines[i].args[0], lines[i].args[1] << FRACBITS, !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); - break; - - case 160: // FOF (Water bobbing) - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_FLOATBOB; - - //Tangibility settings - if (lines[i].args[1] & TMFT_INTANGIBLETOP) - ffloorflags |= FF_REVERSEPLATFORM; - if (lines[i].args[1] & TMFT_INTANGIBLEBOTTOM) - ffloorflags |= FF_PLATFORM; - if (lines[i].args[1] & TMFT_DONTBLOCKPLAYER) - ffloorflags &= ~FF_BLOCKPLAYER; - if (lines[i].args[1] & TMFT_DONTBLOCKOTHERS) - ffloorflags &= ~FF_BLOCKOTHERS; - //If player can enter it, render insides - if (lines[i].args[1] & TMFT_VISIBLEFROMINSIDE) + if (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_BOTHPLANES; @@ -6706,7 +6712,7 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags |= FF_ALLSIDES; } - P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); break; case 170: // FOF (Crumbling) @@ -6927,7 +6933,7 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 258: // Laser block - ffloorflags = FF_EXISTS|FF_RENDERALL|FF_NOSHADE|FF_EXTRA|FF_CUTEXTRA|FF_TRANSLUCENT; + ffloorflags = FF_EXISTS|FF_RENDERALL|FF_NOSHADE|FF_EXTRA|FF_CUTEXTRA; P_AddLaserThinker(lines[i].args[0], lines + i, !!(lines[i].args[2] & TMFL_NOBOSSES)); if (lines[i].args[2] & TMFL_SPLAT) ffloorflags |= FF_SPLAT; From 5f9af65aa08ba1936f1d724dfbebfd25283b829e Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 12 Jun 2020 16:45:18 +0200 Subject: [PATCH 057/377] Revamp alpha setup for the remaining FOFs --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 62 ++++---- src/p_setup.c | 156 ++++++++++--------- src/p_spec.c | 93 ++++++----- src/p_spec.h | 18 +-- 4 files changed, 171 insertions(+), 158 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 934e60962..44da4134b 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1757,31 +1757,29 @@ udmf } arg1 { - title = "Visibility"; + title = "Alpha"; + default = 255; + } + arg2 + { + title = "Appearance"; type = 12; enum { 1 = "Don't render planes"; 2 = "Don't render sides"; 4 = "Render insides"; + 8 = "Render only insides"; + 16 = "No shadow"; + 32 = "Cut cyan flat pixels"; } } - arg2 + arg3 { title = "Tangibility"; type = 12; enum = "tangibility"; } - arg3 - { - title = "Appearance"; - type = 12; - enum - { - 1 = "Translucent"; - 2 = "No shadow"; - } - } } 120 @@ -1931,31 +1929,29 @@ udmf } arg1 { - title = "Visibility"; + title = "Alpha"; + default = 255; + } + arg2 + { + title = "Appearance"; type = 12; enum { 1 = "Don't render planes"; 2 = "Don't render sides"; 4 = "Render insides"; + 8 = "Render only insides"; + 16 = "No shadow"; + 32 = "Cut cyan flat pixels"; } } - arg2 + arg3 { title = "Tangibility"; type = 12; enum = "tangibility"; } - arg3 - { - title = "Appearance"; - type = 12; - enum - { - 1 = "Translucent"; - 2 = "No shadow"; - } - } arg4 { title = "Speed"; @@ -2011,14 +2007,8 @@ udmf } arg1 { - title = "Visibility"; - type = 12; - enum - { - 1 = "Don't render planes"; - 2 = "Don't render sides"; - 4 = "Don't render insides"; - } + title = "Alpha"; + default = 255; } arg2 { @@ -2026,8 +2016,12 @@ udmf type = 12; enum { - 1 = "Translucent"; - 2 = "No shadow"; + 1 = "Don't render planes"; + 2 = "Don't render sides"; + 4 = "Don't render insides"; + 8 = "Render only insides"; + 16 = "No shadow"; + 32 = "Cut cyan flat pixels"; } } } diff --git a/src/p_setup.c b/src/p_setup.c index 2eec9820a..c2df65397 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3016,35 +3016,36 @@ static void P_ConvertBinaryMap(void) case 105: //FOF: solid, invisible lines[i].args[0] = lines[i].tag; - //Visibility + //Alpha + if (lines[i].special == 102) + { + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[2] |= TMFA_INSIDES; + if (sides[lines[i].sidenum[0]].toptexture > 0) + lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; + else + lines[i].args[1] = 128; + } + else + lines[i].args[1] = 255; + + //Appearance if (lines[i].special == 105) - lines[i].args[1] = TMFV_NOPLANES|TMFV_NOSIDES; + lines[i].args[2] = TMFA_NOPLANES|TMFA_NOSIDES; else if (lines[i].special == 104) - lines[i].args[1] = TMFV_NOSIDES; + lines[i].args[2] = TMFA_NOSIDES; else if (lines[i].special == 103) - lines[i].args[1] = TMFV_NOPLANES; + lines[i].args[2] = TMFA_NOPLANES; + if (lines[i].special != 100 && (lines[i].special != 104 || !(lines[i].flags & ML_NOCLIMB))) + lines[i].args[2] |= TMFA_NOSHADE; + if (lines[i].flags & ML_EFFECT6) + lines[i].args[2] |= TMFA_SPLAT; //Tangibility if (lines[i].flags & ML_EFFECT1) - lines[i].args[2] |= TMFT_DONTBLOCKOTHERS; + lines[i].args[3] |= TMFT_DONTBLOCKOTHERS; if (lines[i].flags & ML_EFFECT2) - lines[i].args[2] |= TMFT_DONTBLOCKPLAYER; - - //Translucency - if (lines[i].special == 102) - { - lines[i].args[3] |= TMFA_TRANSLUCENT; - if (lines[i].flags & ML_NOCLIMB) - lines[i].args[1] |= TMFV_TOGGLEINSIDES; - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; - else - lines[i].alpha = FRACUNIT/2; - } - - //Shadow? - if (lines[i].special != 100 && (lines[i].special != 104 || !(lines[i].flags & ML_NOCLIMB))) - lines[i].args[3] |= TMFA_NOSHADE; + lines[i].args[3] |= TMFT_DONTBLOCKPLAYER; lines[i].special = 100; break; @@ -3098,40 +3099,41 @@ static void P_ConvertBinaryMap(void) case 146: //FOF: only tangible from sides lines[i].args[0] = lines[i].tag; - //Visibility + //Alpha + if (lines[i].special == 141 || lines[i].special == 142 || lines[i].special == 144 || lines[i].special == 145) + { + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[2] |= TMFA_INSIDES; + if (sides[lines[i].sidenum[0]].toptexture > 0) + lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; + else + lines[i].args[1] = 128; + } + else + lines[i].args[1] = 255; + + //Appearance if (lines[i].special == 142 || lines[i].special == 145) - lines[i].args[1] = TMFV_NOSIDES; + lines[i].args[2] = TMFA_NOSIDES; else if (lines[i].special == 146) - lines[i].args[1] = TMFV_NOPLANES; + lines[i].args[2] = TMFA_NOPLANES; + if (lines[i].special != 146 && (lines[i].flags & ML_NOCLIMB)) + lines[i].args[2] |= TMFA_NOSHADE; + if (lines[i].flags & ML_EFFECT6) + lines[i].args[2] |= TMFA_SPLAT; //Tangibility if (lines[i].special <= 142) - lines[i].args[2] |= TMFT_INTANGIBLEBOTTOM; + lines[i].args[3] |= TMFT_INTANGIBLEBOTTOM; else if (lines[i].special <= 145) - lines[i].args[2] |= TMFT_INTANGIBLETOP; + lines[i].args[3] |= TMFT_INTANGIBLETOP; else - lines[i].args[2] |= TMFT_INTANGIBLEBOTTOM|TMFT_INTANGIBLETOP; + lines[i].args[3] |= TMFT_INTANGIBLEBOTTOM|TMFT_INTANGIBLETOP; if (lines[i].flags & ML_EFFECT1) - lines[i].args[2] |= TMFT_DONTBLOCKOTHERS; + lines[i].args[3] |= TMFT_DONTBLOCKOTHERS; if (lines[i].flags & ML_EFFECT2) - lines[i].args[2] |= TMFT_DONTBLOCKPLAYER; - - //Translucency - if (lines[i].special == 141 || lines[i].special == 142 || lines[i].special == 144 || lines[i].special == 145) - { - lines[i].args[3] |= TMFA_TRANSLUCENT; - if (lines[i].flags & ML_NOCLIMB) - lines[i].args[1] |= TMFV_TOGGLEINSIDES; - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; - else - lines[i].alpha = FRACUNIT/2; - } - - //Shadow? - if (lines[i].special != 146 && (lines[i].flags & ML_NOCLIMB)) - lines[i].args[3] |= TMFA_NOSHADE; + lines[i].args[3] |= TMFT_DONTBLOCKPLAYER; lines[i].special = 100; break; @@ -3227,33 +3229,34 @@ static void P_ConvertBinaryMap(void) case 195: // FOF: Rising, intangible from bottom, translucent lines[i].args[0] = lines[i].tag; - //Visibility - if (lines[i].special == 193) - lines[i].args[1] = TMFV_NOPLANES|TMFV_NOSIDES; - if (lines[i].special >= 194) - lines[i].args[1] = TMFV_TOGGLEINSIDES; - - //Tangibility - if (lines[i].flags & ML_EFFECT1) - lines[i].args[2] |= TMFT_DONTBLOCKOTHERS; - if (lines[i].flags & ML_EFFECT2) - lines[i].args[2] |= TMFT_DONTBLOCKPLAYER; - if (lines[i].special >= 194) - lines[i].args[2] |= TMFT_INTANGIBLEBOTTOM; - //Translucency if (lines[i].special == 192 || lines[i].special == 195) { - lines[i].args[3] |= TMFA_TRANSLUCENT; if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; + lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; else - lines[i].alpha = FRACUNIT/2; + lines[i].args[1] = 128; } + else + lines[i].args[1] = 255; - //Shadow? + //Appearance + if (lines[i].special == 193) + lines[i].args[2] = TMFA_NOPLANES|TMFA_NOSIDES; + if (lines[i].special >= 194) + lines[i].args[2] = TMFA_INSIDES; if (lines[i].special != 190 && (lines[i].special <= 193 || lines[i].flags & ML_NOCLIMB)) - lines[i].args[3] |= TMFA_NOSHADE; + lines[i].args[2] |= TMFA_NOSHADE; + if (lines[i].flags & ML_EFFECT6) + lines[i].args[2] |= TMFA_SPLAT; + + //Tangibility + if (lines[i].flags & ML_EFFECT1) + lines[i].args[3] |= TMFT_DONTBLOCKOTHERS; + if (lines[i].flags & ML_EFFECT2) + lines[i].args[3] |= TMFT_DONTBLOCKPLAYER; + if (lines[i].special >= 194) + lines[i].args[3] |= TMFT_INTANGIBLEBOTTOM; //Speed lines[i].args[4] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; @@ -3282,23 +3285,26 @@ static void P_ConvertBinaryMap(void) case 222: //FOF: Intangible, sides only lines[i].args[0] = lines[i].tag; - //Visibility - if (lines[i].special == 222) - lines[i].args[1] |= TMFV_NOPLANES; - if (lines[i].special == 221) - lines[i].args[1] |= TMFV_TOGGLEINSIDES; - - //Appearance + //Alpha if (lines[i].special == 221) { - lines[i].args[2] |= TMFA_TRANSLUCENT; if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255; + lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; else - lines[i].alpha = FRACUNIT/2; + lines[i].args[1] = 128; } + else + lines[i].args[1] = 255; + + //Appearance + if (lines[i].special == 222) + lines[i].args[2] |= TMFA_NOPLANES; + if (lines[i].special != 221) + lines[i].args[2] |= TMFA_INSIDES; if (lines[i].special != 220 && !(lines[i].flags & ML_NOCLIMB)) lines[i].args[2] |= TMFA_NOSHADE; + if (lines[i].flags & ML_EFFECT6) + lines[i].args[2] |= TMFA_SPLAT; lines[i].special = 220; break; diff --git a/src/p_spec.c b/src/p_spec.c index 6373478b8..1c0a4ce9d 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6602,46 +6602,51 @@ void P_SpawnSpecials(boolean fromnetsave) case 100: // FOF (solid) ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; - //Visibility settings - if (lines[i].args[1] & TMFV_NOPLANES) + //Appearance settings + if (lines[i].args[2] & TMFA_NOPLANES) ffloorflags &= ~FF_RENDERPLANES; - if (lines[i].args[1] & TMFV_NOSIDES) + if (lines[i].args[2] & TMFA_NOSIDES) ffloorflags &= ~FF_RENDERSIDES; - if (lines[i].args[1] & TMFV_TOGGLEINSIDES) + if (lines[i].args[2] & TMFA_INSIDES) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_BOTHPLANES; if (ffloorflags & FF_RENDERSIDES) ffloorflags |= FF_ALLSIDES; } + if (lines[i].args[2] & TMFA_ONLYINSIDES) + { + if (ffloorflags & FF_RENDERPLANES) + ffloorflags |= FF_INVERTPLANES; + if (ffloorflags & FF_RENDERSIDES) + ffloorflags |= FF_INVERTSIDES; + } + if (lines[i].args[2] & TMFA_NOSHADE) + ffloorflags |= FF_NOSHADE; + if (lines[i].args[2] & TMFA_SPLAT) + ffloorflags |= FF_SPLAT; //Tangibility settings - if (lines[i].args[2] & TMFT_INTANGIBLETOP) + if (lines[i].args[3] & TMFT_INTANGIBLETOP) ffloorflags |= FF_REVERSEPLATFORM; - if (lines[i].args[2] & TMFT_INTANGIBLEBOTTOM) + if (lines[i].args[3] & TMFT_INTANGIBLEBOTTOM) ffloorflags |= FF_PLATFORM; - if (lines[i].args[2] & TMFT_DONTBLOCKPLAYER) + if (lines[i].args[3] & TMFT_DONTBLOCKPLAYER) ffloorflags &= ~FF_BLOCKPLAYER; - if (lines[i].args[2] & TMFT_DONTBLOCKOTHERS) + if (lines[i].args[3] & TMFT_DONTBLOCKOTHERS) ffloorflags &= ~FF_BLOCKOTHERS; - //Appearance settings - if ((lines[i].args[3] & TMFA_TRANSLUCENT) && (ffloorflags & FF_RENDERALL)) //Translucent - ffloorflags |= FF_TRANSLUCENT; - if (lines[i].args[3] & TMFA_NOSHADE) - ffloorflags |= FF_NOSHADE; - //Cutting options if (ffloorflags & FF_RENDERALL) { //If translucent or player can enter it, cut inner walls - if ((ffloorflags & FF_TRANSLUCENT) || (lines[i].args[2] & TMFT_VISIBLEFROMINSIDE)) + if ((lines[i].args[1] < 255) || (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE)) ffloorflags |= FF_CUTEXTRA|FF_EXTRA; else ffloorflags |= FF_CUTLEVEL; } - P_AddFakeFloorsByLine(i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); break; case 120: // FOF (water) @@ -6765,40 +6770,45 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; - //Visibility settings - if (lines[i].args[1] & TMFV_NOPLANES) + //Appearance settings + if (lines[i].args[2] & TMFA_NOPLANES) ffloorflags &= ~FF_RENDERPLANES; - if (lines[i].args[1] & TMFV_NOSIDES) + if (lines[i].args[2] & TMFA_NOSIDES) ffloorflags &= ~FF_RENDERSIDES; - if (lines[i].args[1] & TMFV_TOGGLEINSIDES) + if (lines[i].args[2] & TMFA_INSIDES) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_BOTHPLANES; if (ffloorflags & FF_RENDERSIDES) ffloorflags |= FF_ALLSIDES; } + if (lines[i].args[2] & TMFA_ONLYINSIDES) + { + if (ffloorflags & FF_RENDERPLANES) + ffloorflags |= FF_INVERTPLANES; + if (ffloorflags & FF_RENDERSIDES) + ffloorflags |= FF_INVERTSIDES; + } + if (lines[i].args[2] & TMFA_NOSHADE) + ffloorflags |= FF_NOSHADE; + if (lines[i].args[2] & TMFA_SPLAT) + ffloorflags |= FF_SPLAT; //Tangibility settings - if (lines[i].args[2] & TMFT_INTANGIBLETOP) + if (lines[i].args[3] & TMFT_INTANGIBLETOP) ffloorflags |= FF_REVERSEPLATFORM; - if (lines[i].args[2] & TMFT_INTANGIBLEBOTTOM) + if (lines[i].args[3] & TMFT_INTANGIBLEBOTTOM) ffloorflags |= FF_PLATFORM; - if (lines[i].args[2] & TMFT_DONTBLOCKPLAYER) + if (lines[i].args[3] & TMFT_DONTBLOCKPLAYER) ffloorflags &= ~FF_BLOCKPLAYER; - if (lines[i].args[2] & TMFT_DONTBLOCKOTHERS) + if (lines[i].args[3] & TMFT_DONTBLOCKOTHERS) ffloorflags &= ~FF_BLOCKOTHERS; - //Appearance settings - if ((lines[i].args[3] & TMFA_TRANSLUCENT) && (ffloorflags & FF_RENDERALL)) //Translucent - ffloorflags |= FF_TRANSLUCENT; - if (lines[i].args[3] & TMFA_NOSHADE) - ffloorflags |= FF_NOSHADE; - //Cutting options if (ffloorflags & FF_RENDERALL) { //If translucent or player can enter it, cut inner walls - if ((ffloorflags & FF_TRANSLUCENT) || (lines[i].args[2] & TMFT_VISIBLEFROMINSIDE)) + if ((lines[i].args[1] < 255) || (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE)) ffloorflags |= FF_CUTEXTRA|FF_EXTRA; else ffloorflags |= FF_CUTLEVEL; @@ -6827,24 +6837,29 @@ void P_SpawnSpecials(boolean fromnetsave) case 220: //Intangible ffloorflags = FF_EXISTS|FF_RENDERALL|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; - //Visibility settings - if (lines[i].args[1] & TMFV_NOPLANES) + //Appearance settings + if (lines[i].args[2] & TMFA_NOPLANES) ffloorflags &= ~FF_RENDERPLANES; - if (lines[i].args[1] & TMFV_NOSIDES) + if (lines[i].args[2] & TMFA_NOSIDES) ffloorflags &= ~FF_RENDERSIDES; - if (!(lines[i].args[1] & TMFV_TOGGLEINSIDES)) + if (!(lines[i].args[2] & TMFA_INSIDES)) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_BOTHPLANES; if (ffloorflags & FF_RENDERSIDES) ffloorflags |= FF_ALLSIDES; } - - //Appearance settings - if ((lines[i].args[2] & TMFA_TRANSLUCENT) && (ffloorflags & FF_RENDERALL)) - ffloorflags |= FF_TRANSLUCENT; + if (lines[i].args[2] & TMFA_ONLYINSIDES) + { + if (ffloorflags & FF_RENDERPLANES) + ffloorflags |= FF_INVERTPLANES; + if (ffloorflags & FF_RENDERSIDES) + ffloorflags |= FF_INVERTSIDES; + } if (lines[i].args[2] & TMFA_NOSHADE) ffloorflags |= FF_NOSHADE; + if (lines[i].args[2] & TMFA_SPLAT) + ffloorflags |= FF_SPLAT; P_AddFakeFloorsByLine(i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers); break; diff --git a/src/p_spec.h b/src/p_spec.h index a5717e1d1..52dcf6786 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -24,10 +24,13 @@ extern mobj_t *skyboxcenterpnts[16]; // array of MT_SKYBOX centerpoint mobjs //FOF flags typedef enum { - TMFV_NOPLANES = 1, - TMFV_NOSIDES = 1<<1, - TMFV_TOGGLEINSIDES = 1<<2, -} textmapfofvisibility_t; + TMFA_NOPLANES = 1, + TMFA_NOSIDES = 1<<1, + TMFA_INSIDES = 1<<2, + TMFA_ONLYINSIDES = 1<<3, + TMFA_NOSHADE = 1<<4, + TMFA_SPLAT = 1<<5, +} textmapfofappearance_t; typedef enum { @@ -36,14 +39,9 @@ typedef enum TMFT_DONTBLOCKPLAYER = 1<<2, TMFT_VISIBLEFROMINSIDE = (TMFT_INTANGIBLETOP|TMFT_INTANGIBLEBOTTOM|TMFT_DONTBLOCKPLAYER), TMFT_DONTBLOCKOTHERS = 1<<3, + TMFT_INTANGIBLE = (TMFT_DONTBLOCKPLAYER|TMFT_DONTBLOCKOTHERS), } textmapfoftangibility_t; -typedef enum -{ - TMFA_TRANSLUCENT = 1, - TMFA_NOSHADE = 1<<1, -} textmapfofappearance_t; - typedef enum { TMFW_NOSIDES = 1, From 06b581dcdfb2b08f1c11ae0d99a6ab4f21611600 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 12 Jun 2020 17:48:43 +0200 Subject: [PATCH 058/377] Trim down options for the bobbing FOF preset types --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 36 +------------- src/p_setup.c | 25 ++-------- src/p_spec.c | 51 ++------------------ 3 files changed, 8 insertions(+), 104 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 44da4134b..b88d97aef 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1822,21 +1822,10 @@ udmf type = 13; } arg1 - { - title = "Alpha"; - default = 255; - } - arg2 - { - title = "Cut cyan flat pixels?"; - type = 11; - enum = "noyes"; - } - arg3 { title = "Bobbing distance"; } - arg4 + arg2 { title = "Flags"; type = 12; @@ -1847,12 +1836,6 @@ udmf 4 = "Dynamic"; } } - arg5 - { - title = "Tangibility"; - type = 12; - enum = "tangibility"; - } } 160 @@ -1864,23 +1847,6 @@ udmf title = "Target sector tag"; type = 13; } - arg1 - { - title = "Alpha"; - default = 255; - } - arg2 - { - title = "Cut cyan flat pixels?"; - type = 11; - enum = "noyes"; - } - arg3 - { - title = "Tangibility"; - type = 12; - enum = "tangibility"; - } } 170 diff --git a/src/p_setup.c b/src/p_setup.c index c2df65397..5a2b7e580 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3142,37 +3142,20 @@ static void P_ConvertBinaryMap(void) case 152: //FOF: Reverse air bobbing (adjustable) case 153: //FOF: Dynamically sinking platform lines[i].args[0] = lines[i].tag; - lines[i].args[1] = 255; - lines[i].args[2] = !!(lines[i].flags & ML_EFFECT6); - lines[i].args[3] = (lines[i].special == 150) ? 16 : (P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS); + lines[i].args[1] = (lines[i].special == 150) ? 16 : (P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS); //Flags if (lines[i].special == 152) - lines[i].args[4] |= TMFB_REVERSE; + lines[i].args[2] |= TMFB_REVERSE; if (lines[i].flags & ML_NOCLIMB) - lines[i].args[4] |= TMFB_SPINDASH; + lines[i].args[2] |= TMFB_SPINDASH; if (lines[i].special == 153) - lines[i].args[4] |= TMFB_DYNAMIC; - - //Tangibility - if (lines[i].flags & ML_EFFECT1) - lines[i].args[5] |= TMFT_DONTBLOCKOTHERS; - if (lines[i].flags & ML_EFFECT2) - lines[i].args[5] |= TMFT_DONTBLOCKPLAYER; + lines[i].args[2] |= TMFB_DYNAMIC; lines[i].special = 150; break; case 160: //FOF: Water bobbing lines[i].args[0] = lines[i].tag; - lines[i].args[1] = 255; - lines[i].args[2] = !!(lines[i].flags & ML_EFFECT6); - - //Tangibility - if (lines[i].flags & ML_EFFECT1) - lines[i].args[3] |= TMFT_DONTBLOCKOTHERS; - if (lines[i].flags & ML_EFFECT2) - lines[i].args[3] |= TMFT_DONTBLOCKPLAYER; - break; case 170: //FOF: Crumbling, respawn case 171: //FOF: Crumbling, no respawn diff --git a/src/p_spec.c b/src/p_spec.c index 1c0a4ce9d..2998478d5 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6667,57 +6667,12 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 150: // FOF (Air bobbing) - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; - - if (lines[i].args[2]) - ffloorflags |= FF_SPLAT; - - //Tangibility settings - if (lines[i].args[5] & TMFT_INTANGIBLETOP) - ffloorflags |= FF_REVERSEPLATFORM; - if (lines[i].args[5] & TMFT_INTANGIBLEBOTTOM) - ffloorflags |= FF_PLATFORM; - if (lines[i].args[5] & TMFT_DONTBLOCKPLAYER) - ffloorflags &= ~FF_BLOCKPLAYER; - if (lines[i].args[5] & TMFT_DONTBLOCKOTHERS) - ffloorflags &= ~FF_BLOCKOTHERS; - - //If player can enter it, cut inner walls - if (lines[i].args[5] & TMFT_VISIBLEFROMINSIDE) - ffloorflags |= FF_CUTEXTRA|FF_EXTRA; - else - ffloorflags |= FF_CUTLEVEL; - - P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); - P_AddAirbob(lines[i].frontsector, lines[i].args[0], lines[i].args[3] << FRACBITS, !!(lines[i].args[4] & TMFB_REVERSE), !!(lines[i].args[4] & TMFB_SPINDASH), !!(lines[i].args[4] & TMFB_DYNAMIC)); + P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_SOLID|FF_RENDERALL, secthinkers); + P_AddAirbob(lines[i].frontsector, lines[i].args[0], lines[i].args[1] << FRACBITS, !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); break; case 160: // FOF (Water bobbing) - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_FLOATBOB; - - if (lines[i].args[2]) - ffloorflags |= FF_SPLAT; - - //Tangibility settings - if (lines[i].args[3] & TMFT_INTANGIBLETOP) - ffloorflags |= FF_REVERSEPLATFORM; - if (lines[i].args[3] & TMFT_INTANGIBLEBOTTOM) - ffloorflags |= FF_PLATFORM; - if (lines[i].args[3] & TMFT_DONTBLOCKPLAYER) - ffloorflags &= ~FF_BLOCKPLAYER; - if (lines[i].args[3] & TMFT_DONTBLOCKOTHERS) - ffloorflags &= ~FF_BLOCKOTHERS; - - //If player can enter it, render insides - if (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE) - { - if (ffloorflags & FF_RENDERPLANES) - ffloorflags |= FF_BOTHPLANES; - if (ffloorflags & FF_RENDERSIDES) - ffloorflags |= FF_ALLSIDES; - } - - P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_FLOATBOB, secthinkers); break; case 170: // FOF (Crumbling) From 698c18bd408e80a95946732ce1f2d9604849e705 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 12 Jun 2020 17:57:24 +0200 Subject: [PATCH 059/377] Remove temporary splat rendering special case --- src/p_spec.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 2998478d5..ade4501a6 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5697,8 +5697,6 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, I if (sec2->hasslope) sec->hasslope = true; - if (!udmf && master->flags & ML_EFFECT6) - fflr->flags |= FF_SPLAT; //TODO: Temporary fflr->spawnflags = fflr->flags = flags; fflr->master = master; fflr->norender = INFTICS; From 88aad41310b59bb605e0a119d76c1192ca62190f Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 12 Jun 2020 18:22:16 +0200 Subject: [PATCH 060/377] Remove unnecessary options from quicksand FOF again --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 17 ++++------------- src/p_setup.c | 9 +++------ src/p_spec.c | 10 ++++------ src/p_spec.h | 6 ------ 4 files changed, 11 insertions(+), 31 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index b88d97aef..a899f9488 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2104,24 +2104,15 @@ udmf } arg1 { - title = "Alpha"; - default = 255; + title = "Ripple effect?"; + type = 11; + enum = "yesno"; } arg2 - { - title = "Ripple effect?"; - type = 12; - enum - { - 1 = "No ripple effect"; - 2 = "Cut cyan flat pixels"; - } - } - arg3 { title = "Sinking speed"; } - arg4 + arg3 { title = "Friction"; } diff --git a/src/p_setup.c b/src/p_setup.c index 5a2b7e580..49b5ffcb5 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3363,13 +3363,10 @@ static void P_ConvertBinaryMap(void) break; case 257: //FOF: Quicksand lines[i].args[0] = lines[i].tag; - lines[i].args[1] = 255; if (!(lines[i].flags & ML_EFFECT5)) - lines[i].args[2] |= TMFQ_NORIPPLE; - if (lines[i].flags & ML_EFFECT6) - lines[i].args[2] |= TMFQ_SPLAT; - lines[i].args[3] = lines[i].dx >> FRACBITS; //Sinking speed - lines[i].args[4] = lines[i].dy >> FRACBITS; //Friction + lines[i].args[1] = 1; //No ripple effect + lines[i].args[2] = lines[i].dx >> FRACBITS; //Sinking speed + lines[i].args[3] = lines[i].dy >> FRACBITS; //Friction break; case 258: //FOF: Laser lines[i].args[0] = lines[i].tag; diff --git a/src/p_spec.c b/src/p_spec.c index ade4501a6..4bc02ba79 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6887,16 +6887,14 @@ void P_SpawnSpecials(boolean fromnetsave) } case 257: // Quicksand ffloorflags = FF_EXISTS|FF_QUICKSAND|FF_RENDERALL|FF_ALLSIDES|FF_CUTSPRITES; - if (!(lines[i].args[2] & TMFQ_NORIPPLE)) + if (!(lines[i].args[1])) ffloorflags |= FF_RIPPLE; - if (lines[i].args[2] & TMFQ_SPLAT) - ffloorflags |= FF_SPLAT; for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0], s)) >= 0 ;) { - ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], ffloorflags, secthinkers); - fflr->sinkspeed = abs(lines[i].args[3]) << (FRACBITS - 1); - fflr->friction = abs(lines[i].args[4]) << (FRACBITS - 6); + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, 0xff, ffloorflags, secthinkers); + fflr->sinkspeed = abs(lines[i].args[2]) << (FRACBITS - 1); + fflr->friction = abs(lines[i].args[3]) << (FRACBITS - 6); } break; diff --git a/src/p_spec.h b/src/p_spec.h index 52dcf6786..94648b840 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -96,12 +96,6 @@ typedef enum TMFB_SPLAT = 1<<3, } textmapfofbustflags_t; -typedef enum -{ - TMFQ_NORIPPLE = 1, - TMFQ_SPLAT = 1<<1, -} textmapfofquicksandflags_t; - typedef enum { TMFL_NOBOSSES = 1, From ac8590132be12a864d8780619c672e36f4a20554 Mon Sep 17 00:00:00 2001 From: Nev3r Date: Mon, 13 Jul 2020 11:09:19 +0200 Subject: [PATCH 061/377] Add a provisional GZDoom-esque 3D floor setup for the sake of immediate UDB usability. --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 45 ++++++++++++++ src/p_spec.c | 65 ++++++++++++++++++++ 2 files changed, 110 insertions(+) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index a899f9488..0b92442e6 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2195,6 +2195,51 @@ udmf } } } + 260 + { + title = "Generalized 3D Floor"; + id = "Sector_Set3dFloor"; + requiresactivation = false; + + arg0 + { + title = "Sector Tag"; + type = 13; + } + arg1 + { + title = "Type"; + type = 26; + default = 1; + enum + { + 1 = "Solid"; + 2 = "Water"; + 3 = "Intangible"; + } + flags + { + 4 = "Render Both Sides"; + 16 = "Invert Sides"; + } + } + arg2 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Disable shadowcast"; + 2 = "Double shadowcast"; + 4 = "Fog block"; + } + } + arg3 + { + title = "Opacity"; + default = 255; + } + } } linedefexecmisc diff --git a/src/p_spec.c b/src/p_spec.c index 5baf99700..c76136fb8 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6963,6 +6963,71 @@ void P_SpawnSpecials(boolean fromnetsave) } break; + case 260: // GZDoom-like 3D Floor. + { + UINT8 dtype = lines[i].args[1] & 3; + UINT8 dflags1 = lines[i].args[1] - dtype; + UINT8 dflags2 = lines[i].args[2]; + UINT8 dopacity = lines[i].args[3]; + boolean isfog = false; + + if (dtype == 0) + dtype = 1; + + ffloorflags = FF_EXISTS; + + if (dflags2 & 1) ffloorflags |= FF_NOSHADE; // Disable light effects (Means no shadowcast) + if (dflags2 & 2) ffloorflags |= FF_DOUBLESHADOW; // Restrict light inside (Means doubleshadow) + if (dflags2 & 4) isfog = true; // Fog effect (Explicitly render like a fog block) + + if (dflags1 & 4) ffloorflags |= FF_BOTHPLANES|FF_ALLSIDES; // Render-inside + if (dflags1 & 16) ffloorflags |= FF_INVERTSIDES|FF_INVERTPLANES; // Invert visibility rules + + // Fog block + if (isfog) + ffloorflags |= FF_RENDERALL|FF_CUTEXTRA|FF_CUTSPRITES|FF_BOTHPLANES|FF_EXTRA|FF_FOG|FF_INVERTPLANES|FF_ALLSIDES|FF_INVERTSIDES; + else + { + ffloorflags |= FF_RENDERALL; + + // Solid + if (dtype == 1) + ffloorflags |= FF_SOLID|FF_CUTLEVEL; + // Water + else if (dtype == 2) + ffloorflags |= FF_SWIMMABLE|FF_CUTEXTRA|FF_CUTSPRITES|FF_EXTRA|FF_RIPPLE; + // Intangible + else if (dtype == 3) + ffloorflags |= FF_CUTEXTRA|FF_CUTSPRITES|FF_EXTRA; + } + + // Non-opaque + if (dopacity < 255) + { + // Invisible + if (dopacity == 0) + { + // True invisible + if (ffloorflags & FF_NOSHADE) + ffloorflags &= ~(FF_RENDERALL|FF_CUTEXTRA|FF_CUTSPRITES|FF_EXTRA|FF_BOTHPLANES|FF_ALLSIDES|FF_CUTLEVEL); + // Shadow block + else + { + ffloorflags |= FF_CUTSPRITES; + ffloorflags &= ~(FF_RENDERALL|FF_CUTEXTRA|FF_EXTRA|FF_BOTHPLANES|FF_ALLSIDES|FF_CUTLEVEL); + } + } + else + { + ffloorflags |= FF_TRANSLUCENT|FF_CUTEXTRA|FF_EXTRA; + ffloorflags &= ~FF_CUTLEVEL; + } + } + + P_AddFakeFloorsByLine(i, dopacity, ffloorflags, secthinkers); + } + break; + case 300: // Linedef executor (combines with sector special 974/975) and commands case 302: case 303: From ad9e3411a13e8cd23e22624ab294248c74587a04 Mon Sep 17 00:00:00 2001 From: Nev3r Date: Tue, 27 Oct 2020 22:13:10 +0100 Subject: [PATCH 062/377] Rename bustable type BT_SPIN to BT_SPINBUST to avoid conflicts with next. --- src/dehacked.c | 2 +- src/p_mobj.c | 2 +- src/p_spec.c | 6 +++--- src/p_user.c | 6 +++--- src/r_defs.h | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 5ff4da47a..250fddd0f 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -9918,7 +9918,7 @@ struct { // Bustable FOF type {"BT_TOUCH",BT_TOUCH}, - {"BT_SPIN",BT_SPIN}, + {"BT_SPINBUST",BT_SPINBUST}, {"BT_REGULAR",BT_REGULAR}, {"BT_STRONG",BT_STRONG}, diff --git a/src/p_mobj.c b/src/p_mobj.c index 603375aba..2ef7452cb 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1722,7 +1722,7 @@ static void P_PushableCheckBustables(mobj_t *mo) continue; break; - case BT_SPIN: + case BT_SPINBUST: if (mo->z + mo->momz > topheight) continue; diff --git a/src/p_spec.c b/src/p_spec.c index c76136fb8..27eb24342 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6867,7 +6867,7 @@ void P_SpawnSpecials(boolean fromnetsave) busttype = BT_TOUCH; break; case TMFB_SPIN: - busttype = BT_SPIN; + busttype = BT_SPINBUST; break; case TMFB_REGULAR: busttype = BT_REGULAR; @@ -6939,7 +6939,7 @@ void P_SpawnSpecials(boolean fromnetsave) fflr->busttype = BT_TOUCH; break; case TMFB_SPIN: - fflr->busttype = BT_SPIN; + fflr->busttype = BT_SPINBUST; break; case TMFB_REGULAR: fflr->busttype = BT_REGULAR; @@ -7298,7 +7298,7 @@ void P_SpawnSpecials(boolean fromnetsave) busttype = BT_TOUCH; break; case TMFB_SPIN: - busttype = BT_SPIN; + busttype = BT_SPINBUST; break; case TMFB_REGULAR: busttype = BT_REGULAR; diff --git a/src/p_user.c b/src/p_user.c index efe03d307..e0b1d69f1 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2552,7 +2552,7 @@ static boolean P_PlayerCanBust(player_t *player, ffloor_t *rover) { case BT_TOUCH: // Shatters on contact return true; - case BT_SPIN: // Can be busted by spinning (either from jumping or spindashing) + case BT_SPINBUST: // Can be busted by spinning (either from jumping or spindashing) if ((player->pflags & PF_SPINNING) && !(player->pflags & PF_STARTDASH)) return true; @@ -2668,7 +2668,7 @@ static void P_CheckBustableBlocks(player_t *player) continue; break; - case BT_SPIN: + case BT_SPINBUST: if (player->mo->z + player->mo->momz > topheight) continue; @@ -2688,7 +2688,7 @@ static void P_CheckBustableBlocks(player_t *player) } // Impede the player's fall a bit - if (((rover->busttype == BT_TOUCH) || (rover->busttype == BT_SPIN)) && player->mo->z >= topheight) + if (((rover->busttype == BT_TOUCH) || (rover->busttype == BT_SPINBUST)) && player->mo->z >= topheight) player->mo->momz >>= 1; else if (rover->busttype == BT_TOUCH) { diff --git a/src/r_defs.h b/src/r_defs.h index fd77dd396..4cbcc49e7 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -162,7 +162,7 @@ typedef enum typedef enum { BT_TOUCH, - BT_SPIN, + BT_SPINBUST, BT_REGULAR, BT_STRONG, } busttype_e; From 5df079c65355f0b82aab7e0b1c2afd378af74d4d Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 23 Jun 2021 22:21:19 +0200 Subject: [PATCH 063/377] Backwards compatibility: Add back bouncy FOF sector type, but mark it as deprecated --- extras/conf/udb/Includes/SRB222_sectors.cfg | 2 ++ src/p_spec.c | 6 +++++- src/p_user.c | 13 +++++++++++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_sectors.cfg b/extras/conf/udb/Includes/SRB222_sectors.cfg index aebc8fa29..d0b7ba082 100644 --- a/extras/conf/udb/Includes/SRB222_sectors.cfg +++ b/extras/conf/udb/Includes/SRB222_sectors.cfg @@ -15,6 +15,7 @@ sectortypes 12 = "Space Countdown"; 13 = "Ramp Sector (double step-up/down)"; 14 = "Non-Ramp Sector (no step-down)"; + 15 = "Bouncy FOF "; 16 = "Trigger Line Ex. (Pushable Objects)"; 32 = "Trigger Line Ex. (Anywhere, All Players)"; 48 = "Trigger Line Ex. (Floor Touch, All Players)"; @@ -62,6 +63,7 @@ gen_sectortypes 12 = "Space Countdown"; 13 = "Ramp Sector (double step-up/down)"; 14 = "Non-Ramp Sector (no step-down)"; + 15 = "Bouncy FOF "; } second diff --git a/src/p_spec.c b/src/p_spec.c index 95aa8f8c9..6a5bb9451 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4336,7 +4336,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers break; case 13: // Ramp Sector (Increase step-up/down) case 14: // Non-Ramp Sector (Don't step-down) - case 15: // Unused + case 15: // Bouncy FOF (deprecated) break; } @@ -6140,6 +6140,10 @@ void P_SpawnSpecials(boolean fromnetsave) //Yes, this also affects other specials on the same sector. Sorry. sector->flags |= SF_TRIGGERSPECIAL_TOUCH; break; + case 15: // Bouncy FOF + CONS_Alert(CONS_WARNING, M_GetText("Deprecated bouncy FOF sector type detected. Please use linedef type 76 instead.\n")); + CheckForBouncySector = true; + break; } // Process Section 2 diff --git a/src/p_user.c b/src/p_user.c index 7ef6a8f37..048f2f1f9 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2761,6 +2761,17 @@ static void P_CheckBouncySectors(player_t *player) if (!(rover->flags & FF_EXISTS)) continue; // FOFs should not be bouncy if they don't even "exist" + // Handle deprecated bouncy FOF sector type + if (GETSECSPECIAL(rover->master->frontsector->special, 1) == 15) + { + rover->flags |= FF_BOUNCY; + rover->bouncestrength = P_AproxDistance(rover->master->dx, rover->master->dy)/100; + if (rover->master->flags & ML_BOUNCY) + rover->specialflags |= FS_DAMPEN; + else + rover->specialflags &= ~FS_DAMPEN; + } + if (!(rover->flags & FF_BOUNCY)) continue; @@ -2773,8 +2784,6 @@ static void P_CheckBouncySectors(player_t *player) if (player->mo->z + player->mo->height < bottomheight) continue; - //bouncestrength = P_AproxDistance(rover->master->dx, rover->master->dy)/100; - if (oldz < P_GetFOFTopZ(player->mo, node->m_sector, rover, oldx, oldy, NULL) && oldz + player->mo->height > P_GetFOFBottomZ(player->mo, node->m_sector, rover, oldx, oldy, NULL)) { From ffece845e47cb9b75c25587a0adc5d8953b0dce1 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 23 Jun 2021 23:02:25 +0200 Subject: [PATCH 064/377] UDB config: Add prefix to generalized 3D floor --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 0b92442e6..88a97e6ed 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2198,6 +2198,7 @@ udmf 260 { title = "Generalized 3D Floor"; + prefix = "(260)"; id = "Sector_Set3dFloor"; requiresactivation = false; From 4bedca6ba7673ebaa65c6911e078147e97559de1 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 25 Jun 2021 08:44:35 +0200 Subject: [PATCH 065/377] Rename some of the generalized 3D floor args --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 88a97e6ed..d4f24e4ab 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2204,7 +2204,7 @@ udmf arg0 { - title = "Sector Tag"; + title = "Target sector tag"; type = 13; } arg1 @@ -2220,8 +2220,8 @@ udmf } flags { - 4 = "Render Both Sides"; - 16 = "Invert Sides"; + 4 = "Render insides"; + 16 = "Only render insides"; } } arg2 @@ -2230,14 +2230,14 @@ udmf type = 12; enum { - 1 = "Disable shadowcast"; - 2 = "Double shadowcast"; - 4 = "Fog block"; + 1 = "No shadow"; + 2 = "Double shadow"; + 4 = "Fog"; } } arg3 { - title = "Opacity"; + title = "Alpha"; default = 255; } } From 7025f12d95bd68abbb0680cd5d7c75f26113ea2b Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 25 Jun 2021 10:12:16 +0200 Subject: [PATCH 066/377] -Pass tag as argument to EV_ functions -Get rid of junk linedefs for specialized EV_ calls -Store tag in args[0] --- src/p_ceilng.c | 8 +++--- src/p_enemy.c | 21 +++------------ src/p_floor.c | 6 ++--- src/p_inter.c | 8 +----- src/p_setup.c | 42 ++++++++++++++++++++++++++++++ src/p_spec.c | 70 +++++++++++++++++--------------------------------- src/p_spec.h | 8 +++--- 7 files changed, 80 insertions(+), 83 deletions(-) diff --git a/src/p_ceilng.c b/src/p_ceilng.c index 43f3cc1d5..6349820bc 100644 --- a/src/p_ceilng.c +++ b/src/p_ceilng.c @@ -383,18 +383,18 @@ void T_CrushCeiling(ceiling_t *ceiling) /** Starts a ceiling mover. * + * \param tag Tag. * \param line The source line. * \param type The type of ceiling movement. * \return 1 if at least one ceiling mover was started, 0 otherwise. * \sa EV_DoCrush, EV_DoFloor, EV_DoElevator, T_MoveCeiling */ -INT32 EV_DoCeiling(line_t *line, ceiling_e type) +INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type) { INT32 rtn = 0, firstone = 1; INT32 secnum = -1; sector_t *sec; ceiling_t *ceiling; - mtag_t tag = Tag_FGet(&line->tags); TAG_ITER_SECTORS(tag, secnum) { @@ -603,19 +603,19 @@ INT32 EV_DoCeiling(line_t *line, ceiling_e type) /** Starts a ceiling crusher. * + * \param tag Tag. * \param line The source line. * \param type The type of ceiling, either ::crushAndRaise or * ::fastCrushAndRaise. * \return 1 if at least one crusher was started, 0 otherwise. * \sa EV_DoCeiling, EV_DoFloor, EV_DoElevator, T_CrushCeiling */ -INT32 EV_DoCrush(line_t *line, ceiling_e type) +INT32 EV_DoCrush(mtag_t tag, line_t *line, ceiling_e type) { INT32 rtn = 0; INT32 secnum = -1; sector_t *sec; ceiling_t *ceiling; - mtag_t tag = Tag_FGet(&line->tags); TAG_ITER_SECTORS(tag, secnum) { diff --git a/src/p_enemy.c b/src/p_enemy.c index 6a92c5d33..09cd82894 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3873,7 +3873,6 @@ void A_BossDeath(mobj_t *mo) { thinker_t *th; mobj_t *mo2; - line_t junk; INT32 i; if (LUA_CallAction(A_BOSSDEATH, mo)) @@ -3925,18 +3924,11 @@ void A_BossDeath(mobj_t *mo) } else { - // Initialize my junk - junk.tags.tags = NULL; - junk.tags.count = 0; - // Bring the egg trap up to the surface // Incredibly shitty code ahead - Tag_FSet(&junk.tags, LE_CAPSULE0); - EV_DoElevator(&junk, elevateHighest, false); - Tag_FSet(&junk.tags, LE_CAPSULE1); - EV_DoElevator(&junk, elevateUp, false); - Tag_FSet(&junk.tags, LE_CAPSULE2); - EV_DoElevator(&junk, elevateHighest, false); + EV_DoElevator(LE_CAPSULE0, NULL, elevateHighest, false); + EV_DoElevator(LE_CAPSULE1, NULL, elevateUp, false); + EV_DoElevator(LE_CAPSULE2, NULL, elevateHighest, false); if (mapheaderinfo[gamemap-1]->muspostbossname[0] && S_MusicExists(mapheaderinfo[gamemap-1]->muspostbossname, !midi_disabled, !digital_disabled)) @@ -4058,12 +4050,7 @@ bossjustdie: } case MT_KOOPA: { - // Initialize my junk - junk.tags.tags = NULL; - junk.tags.count = 0; - - Tag_FSet(&junk.tags, LE_KOOPA); - EV_DoCeiling(&junk, raiseToHighest); + EV_DoCeiling(LE_KOOPA, NULL, raiseToHighest); return; } case MT_FANG: diff --git a/src/p_floor.c b/src/p_floor.c index 102ac67e0..e06f65f5c 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -1805,13 +1805,12 @@ void T_PlaneDisplace(planedisplace_t *pd) // (egg capsule button), P_PlayerInSpecialSector (buttons), // and P_SpawnSpecials (continuous floor movers and instant lower). // -void EV_DoFloor(line_t *line, floor_e floortype) +void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype) { INT32 firstone = 1; INT32 secnum = -1; sector_t *sec; floormove_t *dofloor; - mtag_t tag = Tag_FGet(&line->tags); TAG_ITER_SECTORS(tag, secnum) { @@ -2022,12 +2021,11 @@ void EV_DoFloor(line_t *line, floor_e floortype) // // jff 2/22/98 new type to move floor and ceiling in parallel // -void EV_DoElevator(line_t *line, elevator_e elevtype, boolean customspeed) +void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype, boolean customspeed) { INT32 secnum = -1; sector_t *sec; elevator_t *elevator; - mtag_t tag = Tag_FGet(&line->tags); // act on all sectors with the same tag as the triggering linedef TAG_ITER_SECTORS(tag, secnum) diff --git a/src/p_inter.c b/src/p_inter.c index 89989d1af..33052c3b8 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1381,19 +1381,13 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) return; case MT_AXE: { - line_t junk; thinker_t *th; mobj_t *mo2; if (player->bot) return; - // Initialize my junk - junk.tags.tags = NULL; - junk.tags.count = 0; - - Tag_FSet(&junk.tags, LE_AXE); - EV_DoElevator(&junk, bridgeFall, false); + EV_DoElevator(LE_AXE, NULL, bridgeFall, false); // scan the remaining thinkers to find koopa for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) diff --git a/src/p_setup.c b/src/p_setup.c index b0488dbbb..9bea8f868 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3081,6 +3081,28 @@ static void P_ConvertBinaryMap(void) break; } + case 50: //Instantly lower floor on level load + case 51: //Instantly raise ceiling on level load + lines[i].args[0] = tag; + break; + case 53: //Continuous floor/ceiling mover + case 54: //Continuous floor mover + case 55: //Continuous ceiling mover + lines[i].args[0] = tag; + break; + case 56: //Continuous two-speed floor/ceiling mover + case 57: //Continuous two-speed floor mover + case 58: //Continuous two-speed ceiling mover + lines[i].args[0] = tag; + break; + case 59: //Activate moving platform + case 60: //Activate moving platform (adjustable speed) + lines[i].args[0] = tag; + break; + case 61: //Crusher (Ceiling to floor) + case 62: //Crusher (Floor to ceiling) + lines[i].args[0] = tag; + break; case 76: //Make FOF bouncy lines[i].args[0] = tag; lines[i].args[1] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; @@ -3482,6 +3504,26 @@ static void P_ConvertBinaryMap(void) else lines[i].args[1] = 255; break; + case 400: //Set tagged sector's floor height/texture + case 401: //Set tagged sector's ceiling height/texture + lines[i].args[0] = tag; + break; + case 403: //Move tagged sector's floor + case 404: //Move tagged sector's ceiling + lines[i].args[0] = tag; + break; + case 405: //Move floor according to front texture offsets + case 407: //Move ceiling according to front texture offsets + lines[i].args[0] = tag; + break; + case 428: //Start platform movement + lines[i].args[0] = tag; + break; + case 429: //Crush ceiling once + case 430: //Crush floor once + case 431: //Crush floor and ceiling once + lines[i].args[0] = tag; + break; case 443: //Call Lua function if (lines[i].text) { diff --git a/src/p_spec.c b/src/p_spec.c index 6a5bb9451..936551e0e 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2234,11 +2234,11 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) switch (line->special) { case 400: // Set tagged sector's floor height/pic - EV_DoFloor(line, instantMoveFloorByFrontSector); + EV_DoFloor(line->args[0], line, instantMoveFloorByFrontSector); break; case 401: // Set tagged sector's ceiling height/pic - EV_DoCeiling(line, instantMoveCeilingByFrontSector); + EV_DoCeiling(line->args[0], line, instantMoveCeilingByFrontSector); break; case 402: // Set tagged sector's light level @@ -2272,37 +2272,21 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; case 403: // Move floor, linelen = speed, frontsector floor = dest height - EV_DoFloor(line, moveFloorByFrontSector); + EV_DoFloor(line->args[0], line, moveFloorByFrontSector); break; case 404: // Move ceiling, linelen = speed, frontsector ceiling = dest height - EV_DoCeiling(line, moveCeilingByFrontSector); + EV_DoCeiling(line->args[0], line, moveCeilingByFrontSector); break; case 405: // Move floor by front side texture offsets, offset x = speed, offset y = amount to raise/lower - EV_DoFloor(line, moveFloorByFrontTexture); + EV_DoFloor(line->args[0], line, moveFloorByFrontTexture); break; case 407: // Move ceiling by front side texture offsets, offset x = speed, offset y = amount to raise/lower - EV_DoCeiling(line, moveCeilingByFrontTexture); + EV_DoCeiling(line->args[0], line, moveCeilingByFrontTexture); break; -/* case 405: // Lower floor by line, dx = speed, dy = amount to lower - EV_DoFloor(line, lowerFloorByLine); - break; - - case 406: // Raise floor by line, dx = speed, dy = amount to raise - EV_DoFloor(line, raiseFloorByLine); - break; - - case 407: // Lower ceiling by line, dx = speed, dy = amount to lower - EV_DoCeiling(line, lowerCeilingByLine); - break; - - case 408: // Raise ceiling by line, dx = speed, dy = amount to raise - EV_DoCeiling(line, raiseCeilingByLine); - break;*/ - case 409: // Change tagged sectors' tag // (formerly "Change calling sectors' tag", but behavior was changed) { @@ -2886,19 +2870,19 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; case 428: // Start floating platform movement - EV_DoElevator(line, elevateContinuous, true); + EV_DoElevator(line->args[0], line, elevateContinuous, true); break; case 429: // Crush Ceiling Down Once - EV_DoCrush(line, crushCeilOnce); + EV_DoCrush(line->args[0], line, crushCeilOnce); break; case 430: // Crush Floor Up Once - EV_DoFloor(line, crushFloorOnce); + EV_DoFloor(line->args[0], line, crushFloorOnce); break; case 431: // Crush Floor & Ceiling to middle Once - EV_DoCrush(line, crushBothOnce); + EV_DoCrush(line->args[0], line, crushBothOnce); break; case 432: // Enable 2D Mode (Disable if noclimb) @@ -4414,7 +4398,6 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers { thinker_t *th; mobj_t *mo2; - line_t junk; if (player->bot || sector->ceilingdata || sector->floordata) return; @@ -4434,20 +4417,13 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers // clear the special so you can't push the button twice. sector->special = 0; - // Initialize my junk - junk.tags.tags = NULL; - junk.tags.count = 0; - // Move the button down - Tag_FSet(&junk.tags, LE_CAPSULE0); - EV_DoElevator(&junk, elevateDown, false); + EV_DoElevator(LE_CAPSULE0, NULL, elevateDown, false); // Open the top FOF - Tag_FSet(&junk.tags, LE_CAPSULE1); - EV_DoFloor(&junk, raiseFloorToNearestFast); + EV_DoFloor(LE_CAPSULE1, NULL, raiseFloorToNearestFast); // Open the bottom FOF - Tag_FSet(&junk.tags, LE_CAPSULE2); - EV_DoCeiling(&junk, lowerToLowestFast); + EV_DoCeiling(LE_CAPSULE2, NULL, lowerToLowestFast); // Mark all players with the time to exit thingy! for (i = 0; i < MAXPLAYERS; i++) @@ -6342,11 +6318,11 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 50: // Insta-Lower Sector - EV_DoFloor(&lines[i], instantLower); + EV_DoFloor(lines[i].args[0], &lines[i], instantLower); break; case 51: // Instant raise for ceilings - EV_DoCeiling(&lines[i], instantRaise); + EV_DoCeiling(lines[i].args[0], &lines[i], instantRaise); break; case 52: // Continuously Falling sector @@ -6356,20 +6332,20 @@ void P_SpawnSpecials(boolean fromnetsave) case 53: // New super cool and awesome moving floor and ceiling type case 54: // New super cool and awesome moving floor type if (lines[i].backsector) - EV_DoFloor(&lines[i], bounceFloor); + EV_DoFloor(lines[i].args[0], &lines[i], bounceFloor); if (lines[i].special == 54) break; /* FALLTHRU */ case 55: // New super cool and awesome moving ceiling type if (lines[i].backsector) - EV_DoCeiling(&lines[i], bounceCeiling); + EV_DoCeiling(lines[i].args[0], &lines[i], bounceCeiling); break; case 56: // New super cool and awesome moving floor and ceiling crush type case 57: // New super cool and awesome moving floor crush type if (lines[i].backsector) - EV_DoFloor(&lines[i], bounceFloorCrush); + EV_DoFloor(lines[i].args[0], &lines[i], bounceFloorCrush); if (lines[i].special == 57) break; //only move the floor @@ -6377,23 +6353,23 @@ void P_SpawnSpecials(boolean fromnetsave) case 58: // New super cool and awesome moving ceiling crush type if (lines[i].backsector) - EV_DoCeiling(&lines[i], bounceCeilingCrush); + EV_DoCeiling(lines[i].args[0], &lines[i], bounceCeilingCrush); break; case 59: // Activate floating platform - EV_DoElevator(&lines[i], elevateContinuous, false); + EV_DoElevator(lines[i].args[0], &lines[i], elevateContinuous, false); break; case 60: // Floating platform with adjustable speed - EV_DoElevator(&lines[i], elevateContinuous, true); + EV_DoElevator(lines[i].args[0], &lines[i], elevateContinuous, true); break; case 61: // Crusher! - EV_DoCrush(&lines[i], crushAndRaise); + EV_DoCrush(lines[i].args[0], &lines[i], crushAndRaise); break; case 62: // Crusher (up and then down)! - EV_DoCrush(&lines[i], fastCrushAndRaise); + EV_DoCrush(lines[i].args[0], &lines[i], fastCrushAndRaise); break; case 63: // support for drawn heights coming from different sector diff --git a/src/p_spec.h b/src/p_spec.h index 536b6c313..a06c677e3 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -307,9 +307,9 @@ typedef struct #define CEILSPEED (FRACUNIT) -INT32 EV_DoCeiling(line_t *line, ceiling_e type); +INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type); -INT32 EV_DoCrush(line_t *line, ceiling_e type); +INT32 EV_DoCrush(mtag_t tag, line_t *line, ceiling_e type); void T_CrushCeiling(ceiling_t *ceiling); void T_MoveCeiling(ceiling_t *ceiling); @@ -520,8 +520,8 @@ typedef enum result_e T_MovePlane(sector_t *sector, fixed_t speed, fixed_t dest, boolean crush, boolean ceiling, INT32 direction); -void EV_DoFloor(line_t *line, floor_e floortype); -void EV_DoElevator(line_t *line, elevator_e elevtype, boolean customspeed); +void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype); +void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype, boolean customspeed); void EV_CrumbleChain(sector_t *sec, ffloor_t *rover); void EV_BounceSector(sector_t *sector, fixed_t momz, line_t *sourceline); From 259700be3c4b2fc894c7232697dd581c0bc81e3e Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 25 Jun 2021 11:11:16 +0200 Subject: [PATCH 067/377] Get rid of customspeed in EV_DoElevator and read speed from args[1] --- src/p_enemy.c | 6 +++--- src/p_floor.c | 33 ++++++-------------------------- src/p_inter.c | 2 +- src/p_setup.c | 7 +++++++ src/p_spec.c | 53 +++++++++++++++++++++------------------------------ src/p_spec.h | 2 +- 6 files changed, 40 insertions(+), 63 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index 09cd82894..6fa653c0e 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3926,9 +3926,9 @@ void A_BossDeath(mobj_t *mo) { // Bring the egg trap up to the surface // Incredibly shitty code ahead - EV_DoElevator(LE_CAPSULE0, NULL, elevateHighest, false); - EV_DoElevator(LE_CAPSULE1, NULL, elevateUp, false); - EV_DoElevator(LE_CAPSULE2, NULL, elevateHighest, false); + EV_DoElevator(LE_CAPSULE0, NULL, elevateHighest); + EV_DoElevator(LE_CAPSULE1, NULL, elevateUp); + EV_DoElevator(LE_CAPSULE2, NULL, elevateHighest); if (mapheaderinfo[gamemap-1]->muspostbossname[0] && S_MusicExists(mapheaderinfo[gamemap-1]->muspostbossname, !midi_disabled, !digital_disabled)) diff --git a/src/p_floor.c b/src/p_floor.c index e06f65f5c..604f110ff 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -2021,13 +2021,13 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype) // // jff 2/22/98 new type to move floor and ceiling in parallel // -void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype, boolean customspeed) +void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype) { INT32 secnum = -1; sector_t *sec; elevator_t *elevator; - // act on all sectors with the same tag as the triggering linedef + // act on all sectors with the given tag TAG_ITER_SECTORS(tag, secnum) { sec = §ors[secnum]; @@ -2055,8 +2055,6 @@ void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype, boolean custom elevator->sector = sec; elevator->speed = ELEVATORSPEED/2; // half speed elevator->floordestheight = P_FindNextLowestFloor(sec, sec->floorheight); - elevator->ceilingdestheight = elevator->floordestheight - + sec->ceilingheight - sec->floorheight; break; // elevator up to next floor @@ -2065,8 +2063,6 @@ void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype, boolean custom elevator->sector = sec; elevator->speed = ELEVATORSPEED/4; // quarter speed elevator->floordestheight = P_FindNextHighestFloor(sec, sec->floorheight); - elevator->ceilingdestheight = elevator->floordestheight - + sec->ceilingheight - sec->floorheight; break; // elevator up to highest floor @@ -2075,8 +2071,6 @@ void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype, boolean custom elevator->sector = sec; elevator->speed = ELEVATORSPEED/4; // quarter speed elevator->floordestheight = P_FindHighestFloorSurrounding(sec); - elevator->ceilingdestheight = elevator->floordestheight - + sec->ceilingheight - sec->floorheight; break; // elevator to floor height of activating switch's front sector @@ -2084,23 +2078,12 @@ void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype, boolean custom elevator->sector = sec; elevator->speed = ELEVATORSPEED; elevator->floordestheight = line->frontsector->floorheight; - elevator->ceilingdestheight = elevator->floordestheight - + sec->ceilingheight - sec->floorheight; elevator->direction = elevator->floordestheight > sec->floorheight? 1 : -1; break; case elevateContinuous: - if (customspeed) - { - elevator->origspeed = P_AproxDistance(line->dx, line->dy); - elevator->origspeed = FixedDiv(elevator->origspeed,4*FRACUNIT); - elevator->speed = elevator->origspeed; - } - else - { - elevator->speed = ELEVATORSPEED/2; - elevator->origspeed = elevator->speed; - } + elevator->origspeed = line->args[1] << (FRACBITS - 2); + elevator->speed = elevator->origspeed; elevator->sector = sec; elevator->low = !(line->flags & ML_NOCLIMB); // go down first unless noclimb is on @@ -2108,15 +2091,11 @@ void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype, boolean custom { elevator->direction = 1; elevator->floordestheight = P_FindNextHighestFloor(sec, sec->floorheight); - elevator->ceilingdestheight = elevator->floordestheight - + sec->ceilingheight - sec->floorheight; } else { elevator->direction = -1; elevator->floordestheight = P_FindNextLowestFloor(sec,sec->floorheight); - elevator->ceilingdestheight = elevator->floordestheight - + sec->ceilingheight - sec->floorheight; } elevator->floorwasheight = elevator->sector->floorheight; elevator->ceilingwasheight = elevator->sector->ceilingheight; @@ -2130,13 +2109,13 @@ void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype, boolean custom elevator->sector = sec; elevator->speed = ELEVATORSPEED*4; // quadruple speed elevator->floordestheight = P_FindNextLowestFloor(sec, sec->floorheight); - elevator->ceilingdestheight = elevator->floordestheight - + sec->ceilingheight - sec->floorheight; break; default: break; } + + elevator->ceilingdestheight = elevator->floordestheight + sec->ceilingheight - sec->floorheight; } } diff --git a/src/p_inter.c b/src/p_inter.c index 33052c3b8..6689165ea 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1387,7 +1387,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (player->bot) return; - EV_DoElevator(LE_AXE, NULL, bridgeFall, false); + EV_DoElevator(LE_AXE, NULL, bridgeFall); // scan the remaining thinkers to find koopa for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) diff --git a/src/p_setup.c b/src/p_setup.c index 9bea8f868..67d5f669f 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3089,15 +3089,21 @@ static void P_ConvertBinaryMap(void) case 54: //Continuous floor mover case 55: //Continuous ceiling mover lines[i].args[0] = tag; + lines[i].args[1] = (lines[i].special == 53) ? 2 : lines[i].special - 54; + lines[i].special = 53; break; case 56: //Continuous two-speed floor/ceiling mover case 57: //Continuous two-speed floor mover case 58: //Continuous two-speed ceiling mover lines[i].args[0] = tag; + lines[i].args[1] = (lines[i].special == 56) ? 2 : lines[i].special - 57; + lines[i].special = 56; break; case 59: //Activate moving platform case 60: //Activate moving platform (adjustable speed) lines[i].args[0] = tag; + lines[i].args[1] = (lines[i].special == 60) ? P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS : 8; + lines[i].special = 60; break; case 61: //Crusher (Ceiling to floor) case 62: //Crusher (Floor to ceiling) @@ -3518,6 +3524,7 @@ static void P_ConvertBinaryMap(void) break; case 428: //Start platform movement lines[i].args[0] = tag; + lines[i].args[1] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; break; case 429: //Crush ceiling once case 430: //Crush floor once diff --git a/src/p_spec.c b/src/p_spec.c index 936551e0e..e72013590 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2870,7 +2870,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; case 428: // Start floating platform movement - EV_DoElevator(line->args[0], line, elevateContinuous, true); + EV_DoElevator(line->args[0], line, elevateContinuous); break; case 429: // Crush Ceiling Down Once @@ -4418,7 +4418,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers sector->special = 0; // Move the button down - EV_DoElevator(LE_CAPSULE0, NULL, elevateDown, false); + EV_DoElevator(LE_CAPSULE0, NULL, elevateDown); // Open the top FOF EV_DoFloor(LE_CAPSULE1, NULL, raiseFloorToNearestFast); @@ -6318,50 +6318,41 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 50: // Insta-Lower Sector - EV_DoFloor(lines[i].args[0], &lines[i], instantLower); + if (!udmf) + EV_DoFloor(lines[i].args[0], &lines[i], instantLower); break; case 51: // Instant raise for ceilings - EV_DoCeiling(lines[i].args[0], &lines[i], instantRaise); + if (!udmf) + EV_DoCeiling(lines[i].args[1], &lines[i], instantRaise); break; case 52: // Continuously Falling sector EV_DoContinuousFall(lines[i].frontsector, lines[i].backsector, P_AproxDistance(lines[i].dx, lines[i].dy), (lines[i].flags & ML_NOCLIMB)); break; - case 53: // New super cool and awesome moving floor and ceiling type - case 54: // New super cool and awesome moving floor type + case 53: // Continuous plane movement (slowdown) if (lines[i].backsector) - EV_DoFloor(lines[i].args[0], &lines[i], bounceFloor); - if (lines[i].special == 54) - break; - /* FALLTHRU */ - - case 55: // New super cool and awesome moving ceiling type - if (lines[i].backsector) - EV_DoCeiling(lines[i].args[0], &lines[i], bounceCeiling); + { + if (lines[i].args[1] != 1) + EV_DoFloor(lines[i].args[0], &lines[i], bounceFloor); + if (lines[i].args[1] != 0) + EV_DoCeiling(lines[i].args[0], &lines[i], bounceCeiling); + } break; - case 56: // New super cool and awesome moving floor and ceiling crush type - case 57: // New super cool and awesome moving floor crush type + case 56: // Continuous plane movement (constant) if (lines[i].backsector) - EV_DoFloor(lines[i].args[0], &lines[i], bounceFloorCrush); - - if (lines[i].special == 57) - break; //only move the floor - /* FALLTHRU */ - - case 58: // New super cool and awesome moving ceiling crush type - if (lines[i].backsector) - EV_DoCeiling(lines[i].args[0], &lines[i], bounceCeilingCrush); + { + if (lines[i].args[1] != 1) + EV_DoFloor(lines[i].args[0], &lines[i], bounceFloorCrush); + if (lines[i].args[1] != 0) + EV_DoCeiling(lines[i].args[0], &lines[i], bounceCeilingCrush); + } break; - case 59: // Activate floating platform - EV_DoElevator(lines[i].args[0], &lines[i], elevateContinuous, false); - break; - - case 60: // Floating platform with adjustable speed - EV_DoElevator(lines[i].args[0], &lines[i], elevateContinuous, true); + case 60: // Moving platform + EV_DoElevator(lines[i].args[0], &lines[i], elevateContinuous); break; case 61: // Crusher! diff --git a/src/p_spec.h b/src/p_spec.h index a06c677e3..1829188a9 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -521,7 +521,7 @@ typedef enum result_e T_MovePlane(sector_t *sector, fixed_t speed, fixed_t dest, boolean crush, boolean ceiling, INT32 direction); void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype); -void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype, boolean customspeed); +void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype); void EV_CrumbleChain(sector_t *sec, ffloor_t *rover); void EV_BounceSector(sector_t *sector, fixed_t momz, line_t *sourceline); From 770612bc9d4846c6c6b7bea58f3b05f4cb06a77d Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 25 Jun 2021 11:33:16 +0200 Subject: [PATCH 068/377] Adapt moving platform linedef specials to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 76 ++++++++++++++++++++ src/p_floor.c | 13 ++-- src/p_setup.c | 6 ++ 3 files changed, 86 insertions(+), 9 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index d4f24e4ab..4c35e8723 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1566,6 +1566,44 @@ udmf } } + planemove + { + title = "Plane Movement"; + + 60 + { + title = "Activate Moving Platform"; + prefix = "(60)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Speed"; + } + arg2 + { + title = "Starting delay"; + } + arg3 + { + title = "Delay before flip"; + } + arg4 + { + title = "Starting direction"; + type = 11; + enum + { + 0 = "Down"; + 1 = "Up"; + } + } + } + } + fofmodifiers { title = "FOF Modifiers"; @@ -2243,6 +2281,44 @@ udmf } } + linedefexecplane + { + title = "Linedef Executor (plane movement)"; + + 428 + { + title = "Start Platform Movement"; + prefix = "(428)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Speed"; + } + arg2 + { + title = "Starting delay"; + } + arg3 + { + title = "Delay before flip"; + } + arg4 + { + title = "Starting direction"; + type = 11; + enum + { + 0 = "Down"; + 1 = "Up"; + } + } + } + } + linedefexecmisc { title = "Linedef Executor (misc.)"; diff --git a/src/p_floor.c b/src/p_floor.c index 604f110ff..4ff319f1a 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -2045,6 +2045,7 @@ void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype) elevator->type = elevtype; elevator->sourceline = line; elevator->distance = 1; // Always crush unless otherwise + elevator->sector = sec; // set up the fields according to the type of elevator action switch (elevtype) @@ -2052,7 +2053,6 @@ void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype) // elevator down to next floor case elevateDown: elevator->direction = -1; - elevator->sector = sec; elevator->speed = ELEVATORSPEED/2; // half speed elevator->floordestheight = P_FindNextLowestFloor(sec, sec->floorheight); break; @@ -2060,7 +2060,6 @@ void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype) // elevator up to next floor case elevateUp: elevator->direction = 1; - elevator->sector = sec; elevator->speed = ELEVATORSPEED/4; // quarter speed elevator->floordestheight = P_FindNextHighestFloor(sec, sec->floorheight); break; @@ -2068,14 +2067,12 @@ void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype) // elevator up to highest floor case elevateHighest: elevator->direction = 1; - elevator->sector = sec; elevator->speed = ELEVATORSPEED/4; // quarter speed elevator->floordestheight = P_FindHighestFloorSurrounding(sec); break; // elevator to floor height of activating switch's front sector case elevateCurrent: - elevator->sector = sec; elevator->speed = ELEVATORSPEED; elevator->floordestheight = line->frontsector->floorheight; elevator->direction = elevator->floordestheight > sec->floorheight? 1 : -1; @@ -2085,8 +2082,7 @@ void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype) elevator->origspeed = line->args[1] << (FRACBITS - 2); elevator->speed = elevator->origspeed; - elevator->sector = sec; - elevator->low = !(line->flags & ML_NOCLIMB); // go down first unless noclimb is on + elevator->low = !line->args[4]; // go down first unless args[4] is set if (elevator->low) { elevator->direction = 1; @@ -2100,13 +2096,12 @@ void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype) elevator->floorwasheight = elevator->sector->floorheight; elevator->ceilingwasheight = elevator->sector->ceilingheight; - elevator->delay = sides[line->sidenum[0]].textureoffset >> FRACBITS; - elevator->delaytimer = sides[line->sidenum[0]].rowoffset >> FRACBITS; // Initial delay + elevator->delay = line->args[3]; + elevator->delaytimer = line->args[2]; // Initial delay break; case bridgeFall: elevator->direction = -1; - elevator->sector = sec; elevator->speed = ELEVATORSPEED*4; // quadruple speed elevator->floordestheight = P_FindNextLowestFloor(sec, sec->floorheight); break; diff --git a/src/p_setup.c b/src/p_setup.c index 67d5f669f..324fe5f17 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3103,6 +3103,9 @@ static void P_ConvertBinaryMap(void) case 60: //Activate moving platform (adjustable speed) lines[i].args[0] = tag; lines[i].args[1] = (lines[i].special == 60) ? P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS : 8; + lines[i].args[2] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[3] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[4] = (lines[i].flags & ML_NOCLIMB) ? 1 : 0; lines[i].special = 60; break; case 61: //Crusher (Ceiling to floor) @@ -3525,6 +3528,9 @@ static void P_ConvertBinaryMap(void) case 428: //Start platform movement lines[i].args[0] = tag; lines[i].args[1] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + lines[i].args[2] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[3] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[4] = (lines[i].flags & ML_NOCLIMB) ? 1 : 0; break; case 429: //Crush ceiling once case 430: //Crush floor once From 825b4b384ae4854153733dfe0456c95036408af7 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 25 Jun 2021 11:40:19 +0200 Subject: [PATCH 069/377] Remove unused elevateCurrent elevator type --- src/p_floor.c | 7 ------- src/p_spec.h | 1 - 2 files changed, 8 deletions(-) diff --git a/src/p_floor.c b/src/p_floor.c index 4ff319f1a..e6d5684e3 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -2071,13 +2071,6 @@ void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype) elevator->floordestheight = P_FindHighestFloorSurrounding(sec); break; - // elevator to floor height of activating switch's front sector - case elevateCurrent: - elevator->speed = ELEVATORSPEED; - elevator->floordestheight = line->frontsector->floorheight; - elevator->direction = elevator->floordestheight > sec->floorheight? 1 : -1; - break; - case elevateContinuous: elevator->origspeed = line->args[1] << (FRACBITS - 2); elevator->speed = elevator->origspeed; diff --git a/src/p_spec.h b/src/p_spec.h index 1829188a9..4e1e949b2 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -343,7 +343,6 @@ typedef enum { elevateUp, elevateDown, - elevateCurrent, elevateContinuous, elevateBounce, elevateHighest, From 6abcba6876ede5b9c92846a5b3f1057230ee6705 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 25 Jun 2021 18:34:56 +0200 Subject: [PATCH 070/377] Adapt linedef types 400-401 to UDMF + some EV_ cleanup --- src/p_ceilng.c | 61 +++++++++++++++----------------------------------- src/p_floor.c | 49 +++++----------------------------------- src/p_setup.c | 3 +++ src/p_spec.c | 11 +++++---- src/p_spec.h | 6 ----- 5 files changed, 32 insertions(+), 98 deletions(-) diff --git a/src/p_ceilng.c b/src/p_ceilng.c index 6349820bc..418145265 100644 --- a/src/p_ceilng.c +++ b/src/p_ceilng.c @@ -80,7 +80,6 @@ void T_MoveCeiling(ceiling_t *ceiling) ceiling->sector->ceilingpic = ceiling->texture; /* FALLTHRU */ case raiseToHighest: -// case raiseCeilingByLine: case moveCeilingByFrontTexture: ceiling->sector->ceilingdata = NULL; ceiling->sector->ceilspeed = 0; @@ -202,10 +201,6 @@ void T_MoveCeiling(ceiling_t *ceiling) /* FALLTHRU */ // in all other cases, just remove the active ceiling - case lowerAndCrush: - case lowerToLowest: - case raiseToLowest: -// case lowerCeilingByLine: case moveCeilingByFrontTexture: ceiling->sector->ceilingdata = NULL; ceiling->sector->ceilspeed = 0; @@ -279,7 +274,6 @@ void T_MoveCeiling(ceiling_t *ceiling) switch (ceiling->type) { case crushAndRaise: - case lowerAndCrush: ceiling->speed = FixedDiv(CEILSPEED,8*FRACUNIT); break; @@ -426,8 +420,6 @@ INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type) case crushAndRaise: ceiling->crush = true; ceiling->topheight = sec->ceilingheight; - /* FALLTHRU */ - case lowerAndCrush: ceiling->bottomheight = sec->floorheight; ceiling->bottomheight += 4*FRACUNIT; ceiling->direction = -1; @@ -440,19 +432,6 @@ INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type) ceiling->speed = CEILSPEED; break; - //SoM: 3/6/2000: Added Boom types - case lowerToLowest: - ceiling->bottomheight = P_FindLowestCeilingSurrounding(sec); - ceiling->direction = -1; - ceiling->speed = CEILSPEED; - break; - - case raiseToLowest: // Graue 09-07-2004 - ceiling->topheight = P_FindLowestCeilingSurrounding(sec) - 4*FRACUNIT; - ceiling->direction = 1; - ceiling->speed = line->dx; // hack - break; - case lowerToLowestFast: ceiling->bottomheight = P_FindLowestCeilingSurrounding(sec); ceiling->direction = -1; @@ -502,17 +481,27 @@ INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type) case instantMoveCeilingByFrontSector: ceiling->speed = INT32_MAX/2; - if (line->frontsector->ceilingheight >= sec->ceilingheight) // Move up + if (lines->args[1] & 2) + { + if (line->frontsector->ceilingheight >= sec->ceilingheight) // Move up + { + ceiling->direction = 1; + ceiling->topheight = line->frontsector->ceilingheight; + } + else // Move down + { + ceiling->direction = -1; + ceiling->bottomheight = line->frontsector->ceilingheight; + } + } + else { ceiling->direction = 1; - ceiling->topheight = line->frontsector->ceilingheight; + ceiling->topheight = sec->ceilingheight; } - else // Move down - { - ceiling->direction = -1; - ceiling->bottomheight = line->frontsector->ceilingheight; - } - ceiling->texture = line->frontsector->ceilingpic; + + // If flag is set, change ceiling texture after moving + ceiling->texture = (line->args[2] & 2) ? line->frontsector->ceilingpic : -1; break; case moveCeilingByFrontTexture: @@ -531,20 +520,6 @@ INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type) } break; -/* - case lowerCeilingByLine: - ceiling->speed = FixedDiv(abs(line->dx),8*FRACUNIT); - ceiling->direction = -1; // Move down - ceiling->bottomheight = sec->ceilingheight - abs(line->dy); - break; - - case raiseCeilingByLine: - ceiling->speed = FixedDiv(abs(line->dx),8*FRACUNIT); - ceiling->direction = 1; // Move up - ceiling->topheight = sec->ceilingheight + abs(line->dy); - break; -*/ - case bounceCeiling: ceiling->speed = P_AproxDistance(line->dx, line->dy); // same speed as elevateContinuous ceiling->speed = FixedDiv(ceiling->speed,4*FRACUNIT); diff --git a/src/p_floor.c b/src/p_floor.c index e6d5684e3..0ee70ece7 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -1834,23 +1834,15 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype) switch (floortype) { - // Lowers a floor to the lowest surrounding floor. - case lowerFloorToLowest: - dofloor->direction = -1; // down - dofloor->speed = FLOORSPEED*2; // 2 fracunits per tic - dofloor->floordestheight = P_FindLowestFloorSurrounding(sec); - break; - - // Used for part of the Egg Capsule, when an FOF with type 666 is - // contacted by the player. + // Used to open the top of an Egg Capsule. case raiseFloorToNearestFast: dofloor->direction = -1; // down dofloor->speed = FLOORSPEED*4; // 4 fracunits per tic dofloor->floordestheight = P_FindNextHighestFloor(sec, sec->floorheight); break; - // Used for sectors tagged to 50 linedefs (effectively - // changing the base height for placing things in that sector). + // Instantly lower floor to surrounding sectors. + // Used as a hack in the binary map format to allow thing heights above 4096. case instantLower: dofloor->direction = -1; // down dofloor->speed = INT32_MAX/2; // "instant" means "takes one tic" @@ -1861,22 +1853,15 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype) // Front sector floor = destination height. case instantMoveFloorByFrontSector: dofloor->speed = INT32_MAX/2; // as above, "instant" is one tic - dofloor->floordestheight = line->frontsector->floorheight; + dofloor->floordestheight = (line->args[1] & 1) ? line->frontsector->floorheight : sec->floorheight; if (dofloor->floordestheight >= sec->floorheight) dofloor->direction = 1; // up else dofloor->direction = -1; // down - // New for 1.09: now you can use the no climb flag to - // DISABLE the flat changing. This makes it work - // totally opposite the way linetype 106 does. Yet - // another reason I'll be glad to break backwards - // compatibility for the final. - if (line->flags & ML_NOCLIMB) - dofloor->texture = -1; // don't mess with the floorpic - else - dofloor->texture = line->frontsector->floorpic; + // If flag is set, change floor texture after moving + dofloor->texture = (line->args[2] & 1) ? line->frontsector->floorpic : -1; break; // Linedef executor command, linetype 106. @@ -1923,28 +1908,6 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype) dofloor->direction = -1; // down break; -/* - // Linedef executor command, linetype 108. - // dx = speed, dy = amount to lower. - case lowerFloorByLine: - dofloor->direction = -1; // down - dofloor->speed = FixedDiv(abs(line->dx),8*FRACUNIT); - dofloor->floordestheight = sec->floorheight - abs(line->dy); - if (dofloor->floordestheight > sec->floorheight) // wrapped around - I_Error("Can't lower sector %d\n", secnum); - break; - - // Linedef executor command, linetype 109. - // dx = speed, dy = amount to raise. - case raiseFloorByLine: - dofloor->direction = 1; // up - dofloor->speed = FixedDiv(abs(line->dx),8*FRACUNIT); - dofloor->floordestheight = sec->floorheight + abs(line->dy); - if (dofloor->floordestheight < sec->floorheight) // wrapped around - I_Error("Can't raise sector %d\n", secnum); - break; -*/ - // Linetypes 2/3. // Move floor up and down indefinitely like the old elevators. case bounceFloor: diff --git a/src/p_setup.c b/src/p_setup.c index 324fe5f17..97ea643cf 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3516,6 +3516,9 @@ static void P_ConvertBinaryMap(void) case 400: //Set tagged sector's floor height/texture case 401: //Set tagged sector's ceiling height/texture lines[i].args[0] = tag; + lines[i].args[1] = lines[i].special - 399; + lines[i].args[2] = (lines[i].flags & ML_NOCLIMB) ? 0 : lines[i].special - 399; + lines[i].special = 400; break; case 403: //Move tagged sector's floor case 404: //Move tagged sector's ceiling diff --git a/src/p_spec.c b/src/p_spec.c index e72013590..de27718c6 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2233,12 +2233,11 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) // note: only commands with linedef types >= 400 && < 500 can be used switch (line->special) { - case 400: // Set tagged sector's floor height/pic - EV_DoFloor(line->args[0], line, instantMoveFloorByFrontSector); - break; - - case 401: // Set tagged sector's ceiling height/pic - EV_DoCeiling(line->args[0], line, instantMoveCeilingByFrontSector); + case 400: // Set tagged sector's heights/flats + if (line->args[1] & 1 || line->args[2] & 1) + EV_DoFloor(line->args[0], line, instantMoveFloorByFrontSector); + if (line->args[1] & 2 || line->args[2] & 2) + EV_DoCeiling(line->args[0], line, instantMoveCeilingByFrontSector); break; case 402: // Set tagged sector's light level diff --git a/src/p_spec.h b/src/p_spec.h index 4e1e949b2..e03f745ce 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -259,13 +259,10 @@ typedef enum typedef enum { raiseToHighest, - lowerToLowest, - raiseToLowest, lowerToLowestFast, instantRaise, // instant-move for ceilings - lowerAndCrush, crushAndRaise, fastCrushAndRaise, crushCeilOnce, @@ -319,9 +316,6 @@ void T_MoveCeiling(ceiling_t *ceiling); // typedef enum { - // lower floor to lowest surrounding floor - lowerFloorToLowest, - // raise floor to next highest surrounding floor raiseFloorToNearestFast, From df965b157882f76caf996125f8618deb95e0b00b Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 25 Jun 2021 18:41:14 +0200 Subject: [PATCH 071/377] Fix thwomps going too fast by a factor of 8 --- src/p_spec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 6a5bb9451..a3c356194 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6476,7 +6476,7 @@ void P_SpawnSpecials(boolean fromnetsave) if (lines[l].special < 100 || lines[l].special >= 300) continue; - P_AddThwompThinker(lines[l].frontsector, &lines[l], lines[i].args[1] << FRACBITS, lines[i].args[2] << FRACBITS, sound); + P_AddThwompThinker(lines[l].frontsector, &lines[l], lines[i].args[1] << (FRACBITS - 3), lines[i].args[2] << (FRACBITS - 3), sound); } } break; @@ -6731,7 +6731,7 @@ void P_SpawnSpecials(boolean fromnetsave) case 251: // A THWOMP! { UINT16 sound = (lines[i].stringargs[0]) ? get_number(lines[i].stringargs[0]) : sfx_thwomp; - P_AddThwompThinker(lines[i].frontsector, &lines[i], lines[i].args[1] << FRACBITS, lines[i].args[2] << FRACBITS, sound); + P_AddThwompThinker(lines[i].frontsector, &lines[i], lines[i].args[1] << (FRACBITS - 3), lines[i].args[2] << (FRACBITS - 3), sound); P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); break; } From 0eabbf0170d00e1cd06d83707213c21d90f2ba7d Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 25 Jun 2021 22:06:04 +0200 Subject: [PATCH 072/377] Instant ceiling movement: Only change texture if it's not -1 --- src/p_ceilng.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/p_ceilng.c b/src/p_ceilng.c index 418145265..1debca35b 100644 --- a/src/p_ceilng.c +++ b/src/p_ceilng.c @@ -67,7 +67,8 @@ void T_MoveCeiling(ceiling_t *ceiling) switch (ceiling->type) { case instantMoveCeilingByFrontSector: - ceiling->sector->ceilingpic = ceiling->texture; + if (ceiling->texture > -1) // flat changing + ceiling->sector->ceilingpic = ceiling->texture; ceiling->sector->ceilingdata = NULL; ceiling->sector->ceilspeed = 0; P_RemoveThinker(&ceiling->thinker); @@ -185,7 +186,8 @@ void T_MoveCeiling(ceiling_t *ceiling) break; case instantMoveCeilingByFrontSector: - ceiling->sector->ceilingpic = ceiling->texture; + if (ceiling->texture > -1) // flat changing + ceiling->sector->ceilingpic = ceiling->texture; ceiling->sector->ceilingdata = NULL; ceiling->sector->ceilspeed = 0; P_RemoveThinker(&ceiling->thinker); From 53976e4b52f22f529a1715392475bfa9ac9e9f51 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 26 Jun 2021 08:31:59 +0200 Subject: [PATCH 073/377] Adapt linedef types 403-404 to UDMF --- src/p_ceilng.c | 18 +++++------------- src/p_floor.c | 21 +++++---------------- src/p_setup.c | 16 ++++++++++++++++ src/p_spec.c | 11 +++++------ 4 files changed, 31 insertions(+), 35 deletions(-) diff --git a/src/p_ceilng.c b/src/p_ceilng.c index 1debca35b..65bdd025b 100644 --- a/src/p_ceilng.c +++ b/src/p_ceilng.c @@ -448,8 +448,7 @@ INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type) // Linedef executor excellence case moveCeilingByFrontSector: - ceiling->speed = P_AproxDistance(line->dx, line->dy); - ceiling->speed = FixedDiv(ceiling->speed,8*FRACUNIT); + ceiling->speed = line->args[2] << (FRACBITS - 3); if (line->frontsector->ceilingheight >= sec->ceilingheight) // Move up { ceiling->direction = 1; @@ -462,18 +461,11 @@ INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type) } // chained linedef executing ability - if (line->flags & ML_BLOCKMONSTERS) - { - // only set it on ONE of the moving sectors (the smallest numbered) - // and front side x offset must be positive - if (firstone && sides[line->sidenum[0]].textureoffset > 0) - ceiling->texture = (sides[line->sidenum[0]].textureoffset>>FRACBITS) - 32769; - else - ceiling->texture = -1; - } - + // only set it on ONE of the moving sectors (the smallest numbered) + if (line->args[3] > 0) + ceiling->texture = firstone ? line->args[3] - INT16_MAX - 2 : -1; // flat changing ability - else if (line->flags & ML_NOCLIMB) + else if (line->args[4]) ceiling->texture = line->frontsector->ceilingpic; else ceiling->texture = -1; diff --git a/src/p_floor.c b/src/p_floor.c index 0ee70ece7..f3d7e036e 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -1864,11 +1864,8 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype) dofloor->texture = (line->args[2] & 1) ? line->frontsector->floorpic : -1; break; - // Linedef executor command, linetype 106. - // Line length = speed, front sector floor = destination height. case moveFloorByFrontSector: - dofloor->speed = P_AproxDistance(line->dx, line->dy); - dofloor->speed = FixedDiv(dofloor->speed,8*FRACUNIT); + dofloor->speed = line->args[2] << (FRACBITS - 3); dofloor->floordestheight = line->frontsector->floorheight; if (dofloor->floordestheight >= sec->floorheight) @@ -1877,19 +1874,11 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype) dofloor->direction = -1; // down // chained linedef executing ability - if (line->flags & ML_BLOCKMONSTERS) - { - // Only set it on one of the moving sectors (the - // smallest numbered) and only if the front side - // x offset is positive, indicating a valid tag. - if (firstone && sides[line->sidenum[0]].textureoffset > 0) - dofloor->texture = (sides[line->sidenum[0]].textureoffset>>FRACBITS) - 32769; - else - dofloor->texture = -1; - } - + // Only set it on one of the moving sectors (the smallest numbered) + if (line->args[3] > 0) + dofloor->texture = firstone ? line->args[3] - INT16_MAX - 2 : -1; // flat changing ability - else if (line->flags & ML_NOCLIMB) + else if (line->args[4]) dofloor->texture = line->frontsector->floorpic; else dofloor->texture = -1; // nothing special to do after movement completes diff --git a/src/p_setup.c b/src/p_setup.c index 97ea643cf..9f7ba9504 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3523,6 +3523,22 @@ static void P_ConvertBinaryMap(void) case 403: //Move tagged sector's floor case 404: //Move tagged sector's ceiling lines[i].args[0] = tag; + lines[i].args[1] = lines[i].special - 403; + lines[i].args[2] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + if (lines[i].flags & ML_BLOCKMONSTERS) + { + if (sides[lines[i].sidenum[0]].textureoffset > 0) + lines[i].args[3] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + else + lines[i].args[3] = 0; + lines[i].args[4] = 0; + } + else + { + lines[i].args[3] = 0; + lines[i].args[4] = !!(lines[i].flags & ML_NOCLIMB); + } + lines[i].special = 403; break; case 405: //Move floor according to front texture offsets case 407: //Move ceiling according to front texture offsets diff --git a/src/p_spec.c b/src/p_spec.c index de27718c6..4141e924f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2270,12 +2270,11 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) } break; - case 403: // Move floor, linelen = speed, frontsector floor = dest height - EV_DoFloor(line->args[0], line, moveFloorByFrontSector); - break; - - case 404: // Move ceiling, linelen = speed, frontsector ceiling = dest height - EV_DoCeiling(line->args[0], line, moveCeilingByFrontSector); + case 403: // Move planes by front sector + if (line->args[1] != 1) + EV_DoFloor(line->args[0], line, moveFloorByFrontSector); + if (line->args[1] != 0) + EV_DoCeiling(line->args[0], line, moveCeilingByFrontSector); break; case 405: // Move floor by front side texture offsets, offset x = speed, offset y = amount to raise/lower From 8f39e2310583ea9fbe1cfbc9f2ab77f604c4b118 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 26 Jun 2021 08:43:35 +0200 Subject: [PATCH 074/377] Adapt linedef type 405 and 407 to UDMF --- src/p_ceilng.c | 14 +++++++------- src/p_floor.c | 8 ++++---- src/p_setup.c | 5 +++++ src/p_spec.c | 11 +++++------ src/p_spec.h | 4 ++-- 5 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/p_ceilng.c b/src/p_ceilng.c index 65bdd025b..7aa504416 100644 --- a/src/p_ceilng.c +++ b/src/p_ceilng.c @@ -81,7 +81,7 @@ void T_MoveCeiling(ceiling_t *ceiling) ceiling->sector->ceilingpic = ceiling->texture; /* FALLTHRU */ case raiseToHighest: - case moveCeilingByFrontTexture: + case moveCeilingByDistance: ceiling->sector->ceilingdata = NULL; ceiling->sector->ceilspeed = 0; P_RemoveThinker(&ceiling->thinker); @@ -203,7 +203,7 @@ void T_MoveCeiling(ceiling_t *ceiling) /* FALLTHRU */ // in all other cases, just remove the active ceiling - case moveCeilingByFrontTexture: + case moveCeilingByDistance: ceiling->sector->ceilingdata = NULL; ceiling->sector->ceilspeed = 0; P_RemoveThinker(&ceiling->thinker); @@ -498,19 +498,19 @@ INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type) ceiling->texture = (line->args[2] & 2) ? line->frontsector->ceilingpic : -1; break; - case moveCeilingByFrontTexture: - if (line->flags & ML_NOCLIMB) + case moveCeilingByDistance: + if (line->args[4]) ceiling->speed = INT32_MAX/2; // as above, "instant" is one tic else - ceiling->speed = FixedDiv(sides[line->sidenum[0]].textureoffset,8*FRACUNIT); // texture x offset + ceiling->speed = line->args[3] << (FRACBITS - 3); if (sides[line->sidenum[0]].rowoffset > 0) { ceiling->direction = 1; // up - ceiling->topheight = sec->ceilingheight + sides[line->sidenum[0]].rowoffset; // texture y offset + ceiling->topheight = sec->ceilingheight + (line->args[2] << FRACBITS); } else { ceiling->direction = -1; // down - ceiling->bottomheight = sec->ceilingheight + sides[line->sidenum[0]].rowoffset; // texture y offset + ceiling->bottomheight = sec->ceilingheight + (line->args[2] << FRACBITS); } break; diff --git a/src/p_floor.c b/src/p_floor.c index f3d7e036e..c64c1bb20 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -1885,12 +1885,12 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype) break; - case moveFloorByFrontTexture: - if (line->flags & ML_NOCLIMB) + case moveFloorByDistance: + if (line->args[4]) dofloor->speed = INT32_MAX/2; // as above, "instant" is one tic else - dofloor->speed = FixedDiv(sides[line->sidenum[0]].textureoffset,8*FRACUNIT); // texture x offset - dofloor->floordestheight = sec->floorheight + sides[line->sidenum[0]].rowoffset; // texture y offset + dofloor->speed = line->args[3] << (FRACBITS - 3); + dofloor->floordestheight = sec->floorheight + (line->args[2] << FRACBITS); if (dofloor->floordestheight > sec->floorheight) dofloor->direction = 1; // up else diff --git a/src/p_setup.c b/src/p_setup.c index 9f7ba9504..6e7801618 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3543,6 +3543,11 @@ static void P_ConvertBinaryMap(void) case 405: //Move floor according to front texture offsets case 407: //Move ceiling according to front texture offsets lines[i].args[0] = tag; + lines[i].args[1] = (lines[i].special == 405) ? 0 : 1; + lines[i].args[2] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[3] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[4] = !!(lines[i].flags & ML_NOCLIMB); + lines[i].special = 405; break; case 428: //Start platform movement lines[i].args[0] = tag; diff --git a/src/p_spec.c b/src/p_spec.c index 4141e924f..222077e3d 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2277,12 +2277,11 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) EV_DoCeiling(line->args[0], line, moveCeilingByFrontSector); break; - case 405: // Move floor by front side texture offsets, offset x = speed, offset y = amount to raise/lower - EV_DoFloor(line->args[0], line, moveFloorByFrontTexture); - break; - - case 407: // Move ceiling by front side texture offsets, offset x = speed, offset y = amount to raise/lower - EV_DoCeiling(line->args[0], line, moveCeilingByFrontTexture); + case 405: // Move planes by distance + if (line->args[1] != 1) + EV_DoFloor(line->args[0], line, moveFloorByDistance); + if (line->args[1] != 0) + EV_DoCeiling(line->args[0], line, moveCeilingByDistance); break; case 409: // Change tagged sectors' tag diff --git a/src/p_spec.h b/src/p_spec.h index e03f745ce..e6ea5a534 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -271,7 +271,7 @@ typedef enum moveCeilingByFrontSector, instantMoveCeilingByFrontSector, - moveCeilingByFrontTexture, + moveCeilingByDistance, bounceCeiling, bounceCeilingCrush, @@ -325,7 +325,7 @@ typedef enum moveFloorByFrontSector, instantMoveFloorByFrontSector, - moveFloorByFrontTexture, + moveFloorByDistance, bounceFloor, bounceFloorCrush, From d5490132b9973471eca90d1b4f1f51ff4262575e Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 26 Jun 2021 09:30:17 +0200 Subject: [PATCH 075/377] Remove crusher types from T_MoveCeiling (they're handled by T_CrushCeiling) --- src/p_ceilng.c | 43 ------------------------------------------- 1 file changed, 43 deletions(-) diff --git a/src/p_ceilng.c b/src/p_ceilng.c index 7aa504416..272878876 100644 --- a/src/p_ceilng.c +++ b/src/p_ceilng.c @@ -88,11 +88,6 @@ void T_MoveCeiling(ceiling_t *ceiling) dontupdate = true; break; - case fastCrushAndRaise: - case crushAndRaise: - ceiling->direction = -1; - break; - case bounceCeiling: { fixed_t dest = ceiling->topheight; @@ -176,15 +171,6 @@ void T_MoveCeiling(ceiling_t *ceiling) { switch (ceiling->type) { - // make platform stop at bottom of all crusher strokes - // except generalized ones, reset speed, start back up - case crushAndRaise: - ceiling->speed = CEILSPEED; - /* FALLTHRU */ - case fastCrushAndRaise: - ceiling->direction = 1; - break; - case instantMoveCeilingByFrontSector: if (ceiling->texture > -1) // flat changing ceiling->sector->ceilingpic = ceiling->texture; @@ -267,18 +253,6 @@ void T_MoveCeiling(ceiling_t *ceiling) break; } - default: - break; - } - } - else if (res == crushed) - { - switch (ceiling->type) - { - case crushAndRaise: - ceiling->speed = FixedDiv(CEILSPEED,8*FRACUNIT); - break; - default: break; } @@ -411,23 +385,6 @@ INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type) switch (type) { - case fastCrushAndRaise: - ceiling->crush = true; - ceiling->topheight = sec->ceilingheight; - ceiling->bottomheight = sec->floorheight + (8*FRACUNIT); - ceiling->direction = -1; - ceiling->speed = CEILSPEED * 2; - break; - - case crushAndRaise: - ceiling->crush = true; - ceiling->topheight = sec->ceilingheight; - ceiling->bottomheight = sec->floorheight; - ceiling->bottomheight += 4*FRACUNIT; - ceiling->direction = -1; - ceiling->speed = line->dx; - break; - case raiseToHighest: ceiling->topheight = P_FindHighestCeilingSurrounding(sec); ceiling->direction = 1; From de462f12132c0fea3822937341ecc1439316bc25 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 26 Jun 2021 09:43:46 +0200 Subject: [PATCH 076/377] Refactor T_MoveCeiling --- src/p_ceilng.c | 312 +++++++++++++++---------------------------------- 1 file changed, 92 insertions(+), 220 deletions(-) diff --git a/src/p_ceilng.c b/src/p_ceilng.c index 272878876..a12d9d56f 100644 --- a/src/p_ceilng.c +++ b/src/p_ceilng.c @@ -34,7 +34,6 @@ INT32 ceilmovesound = sfx_None; void T_MoveCeiling(ceiling_t *ceiling) { result_e res; - boolean dontupdate = false; if (ceiling->delaytimer) { @@ -42,227 +41,100 @@ void T_MoveCeiling(ceiling_t *ceiling) return; } - switch (ceiling->direction) + res = T_MovePlane(ceiling->sector, ceiling->speed, (ceiling->direction == 1) ? ceiling->topheight : ceiling->bottomheight, false, true, ceiling->direction); + + if (ceiling->type == bounceCeiling) { - case 0: // IN STASIS - break; - case 1: // UP - res = T_MovePlane(ceiling->sector, ceiling->speed, ceiling->topheight, false, true, ceiling->direction); - - if (ceiling->type == bounceCeiling) - { - const fixed_t origspeed = FixedDiv(ceiling->origspeed,(ELEVATORSPEED/2)); - const fixed_t fs = abs(ceiling->sector->ceilingheight - lines[ceiling->texture].frontsector->ceilingheight); - const fixed_t bs = abs(ceiling->sector->ceilingheight - lines[ceiling->texture].backsector->ceilingheight); - if (fs < bs) - ceiling->speed = FixedDiv(fs,25*FRACUNIT) + FRACUNIT/4; - else - ceiling->speed = FixedDiv(bs,25*FRACUNIT) + FRACUNIT/4; - - ceiling->speed = FixedMul(ceiling->speed,origspeed); - } - - if (res == pastdest) - { - switch (ceiling->type) - { - case instantMoveCeilingByFrontSector: - if (ceiling->texture > -1) // flat changing - ceiling->sector->ceilingpic = ceiling->texture; - ceiling->sector->ceilingdata = NULL; - ceiling->sector->ceilspeed = 0; - P_RemoveThinker(&ceiling->thinker); - dontupdate = true; - break; - case moveCeilingByFrontSector: - if (ceiling->texture < -1) // chained linedef executing - P_LinedefExecute((INT16)(ceiling->texture + INT16_MAX + 2), NULL, NULL); - if (ceiling->texture > -1) // flat changing - ceiling->sector->ceilingpic = ceiling->texture; - /* FALLTHRU */ - case raiseToHighest: - case moveCeilingByDistance: - ceiling->sector->ceilingdata = NULL; - ceiling->sector->ceilspeed = 0; - P_RemoveThinker(&ceiling->thinker); - dontupdate = true; - break; - - case bounceCeiling: - { - fixed_t dest = ceiling->topheight; - - if (dest == lines[ceiling->texture].frontsector->ceilingheight) - dest = lines[ceiling->texture].backsector->ceilingheight; - else - dest = lines[ceiling->texture].frontsector->ceilingheight; - - if (dest < ceiling->sector->ceilingheight) // must move down - { - ceiling->direction = -1; - ceiling->bottomheight = dest; - } - else // must move up - { - ceiling->direction = 1; - ceiling->topheight = dest; - } - - ceiling->delaytimer = ceiling->delay; - - // That's it. Do not set dontupdate, do not remove the thinker. - break; - } - - case bounceCeilingCrush: - { - fixed_t dest = ceiling->topheight; - - if (dest == lines[ceiling->texture].frontsector->ceilingheight) - { - dest = lines[ceiling->texture].backsector->ceilingheight; - ceiling->speed = ceiling->origspeed = FixedDiv(abs(lines[ceiling->texture].dy),4*FRACUNIT); // return trip, use dy - } - else - { - dest = lines[ceiling->texture].frontsector->ceilingheight; - ceiling->speed = ceiling->origspeed = FixedDiv(abs(lines[ceiling->texture].dx),4*FRACUNIT); // going frontways, use dx - } - - if (dest < ceiling->sector->ceilingheight) // must move down - { - ceiling->direction = -1; - ceiling->bottomheight = dest; - } - else // must move up - { - ceiling->direction = 1; - ceiling->topheight = dest; - } - - ceiling->delaytimer = ceiling->delay; - - // That's it. Do not set dontupdate, do not remove the thinker. - break; - } - - default: - break; - } - } - break; - - case -1: // DOWN - res = T_MovePlane(ceiling->sector, ceiling->speed, ceiling->bottomheight, ceiling->crush, true, ceiling->direction); - - if (ceiling->type == bounceCeiling) - { - const fixed_t origspeed = FixedDiv(ceiling->origspeed,(ELEVATORSPEED/2)); - const fixed_t fs = abs(ceiling->sector->ceilingheight - lines[ceiling->texture].frontsector->ceilingheight); - const fixed_t bs = abs(ceiling->sector->ceilingheight - lines[ceiling->texture].backsector->ceilingheight); - if (fs < bs) - ceiling->speed = FixedDiv(fs,25*FRACUNIT) + FRACUNIT/4; - else - ceiling->speed = FixedDiv(bs,25*FRACUNIT) + FRACUNIT/4; - ceiling->speed = FixedMul(ceiling->speed,origspeed); - } - - if (res == pastdest) - { - switch (ceiling->type) - { - case instantMoveCeilingByFrontSector: - if (ceiling->texture > -1) // flat changing - ceiling->sector->ceilingpic = ceiling->texture; - ceiling->sector->ceilingdata = NULL; - ceiling->sector->ceilspeed = 0; - P_RemoveThinker(&ceiling->thinker); - dontupdate = true; - break; - - case moveCeilingByFrontSector: - if (ceiling->texture < -1) // chained linedef executing - P_LinedefExecute((INT16)(ceiling->texture + INT16_MAX + 2), NULL, NULL); - if (ceiling->texture > -1) // flat changing - ceiling->sector->ceilingpic = ceiling->texture; - // don't break - /* FALLTHRU */ - - // in all other cases, just remove the active ceiling - case moveCeilingByDistance: - ceiling->sector->ceilingdata = NULL; - ceiling->sector->ceilspeed = 0; - P_RemoveThinker(&ceiling->thinker); - dontupdate = true; - break; - case bounceCeiling: - { - fixed_t dest = ceiling->bottomheight; - - if (dest == lines[ceiling->texture].frontsector->ceilingheight) - dest = lines[ceiling->texture].backsector->ceilingheight; - else - dest = lines[ceiling->texture].frontsector->ceilingheight; - - if (dest < ceiling->sector->ceilingheight) // must move down - { - ceiling->direction = -1; - ceiling->bottomheight = dest; - } - else // must move up - { - ceiling->direction = 1; - ceiling->topheight = dest; - } - - ceiling->delaytimer = ceiling->delay; - - // That's it. Do not set dontupdate, do not remove the thinker. - break; - } - - case bounceCeilingCrush: - { - fixed_t dest = ceiling->bottomheight; - - if (dest == lines[ceiling->texture].frontsector->ceilingheight) - { - dest = lines[ceiling->texture].backsector->ceilingheight; - ceiling->speed = ceiling->origspeed = FixedDiv(abs(lines[ceiling->texture].dy),4*FRACUNIT); // return trip, use dy - } - else - { - dest = lines[ceiling->texture].frontsector->ceilingheight; - ceiling->speed = ceiling->origspeed = FixedDiv(abs(lines[ceiling->texture].dx),4*FRACUNIT); // going frontways, use dx - } - - if (dest < ceiling->sector->ceilingheight) // must move down - { - ceiling->direction = -1; - ceiling->bottomheight = dest; - } - else // must move up - { - ceiling->direction = 1; - ceiling->topheight = dest; - } - - ceiling->delaytimer = ceiling->delay; - - // That's it. Do not set dontupdate, do not remove the thinker. - break; - } - - default: - break; - } - } - break; + const fixed_t origspeed = FixedDiv(ceiling->origspeed, (ELEVATORSPEED/2)); + const fixed_t fs = abs(ceiling->sector->ceilingheight - lines[ceiling->texture].frontsector->ceilingheight); + const fixed_t bs = abs(ceiling->sector->ceilingheight - lines[ceiling->texture].backsector->ceilingheight); + if (fs < bs) + ceiling->speed = FixedDiv(fs, 25*FRACUNIT) + FRACUNIT/4; + else + ceiling->speed = FixedDiv(bs, 25*FRACUNIT) + FRACUNIT/4; + ceiling->speed = FixedMul(ceiling->speed, origspeed); } - if (!dontupdate) - ceiling->sector->ceilspeed = ceiling->speed*ceiling->direction; - else - ceiling->sector->ceilspeed = 0; + + if (res == pastdest) + { + switch (ceiling->type) + { + case instantMoveCeilingByFrontSector: + if (ceiling->texture > -1) // flat changing + ceiling->sector->ceilingpic = ceiling->texture; + ceiling->sector->ceilingdata = NULL; + ceiling->sector->ceilspeed = 0; + P_RemoveThinker(&ceiling->thinker); + return; + case moveCeilingByFrontSector: + if (ceiling->texture < -1) // chained linedef executing + P_LinedefExecute((INT16)(ceiling->texture + INT16_MAX + 2), NULL, NULL); + if (ceiling->texture > -1) // flat changing + ceiling->sector->ceilingpic = ceiling->texture; + /* FALLTHRU */ + case raiseToHighest: + case moveCeilingByDistance: + ceiling->sector->ceilingdata = NULL; + ceiling->sector->ceilspeed = 0; + P_RemoveThinker(&ceiling->thinker); + return; + case bounceCeiling: + { + fixed_t dest = (ceiling->direction == 1) ? ceiling->topheight : ceiling->bottomheight; + + if (dest == lines[ceiling->texture].frontsector->ceilingheight) + dest = lines[ceiling->texture].backsector->ceilingheight; + else + dest = lines[ceiling->texture].frontsector->ceilingheight; + + if (dest < ceiling->sector->ceilingheight) // must move down + { + ceiling->direction = -1; + ceiling->bottomheight = dest; + } + else // must move up + { + ceiling->direction = 1; + ceiling->topheight = dest; + } + + ceiling->delaytimer = ceiling->delay; + break; + } + case bounceCeilingCrush: + { + fixed_t dest = (ceiling->direction == 1) ? ceiling->topheight : ceiling->bottomheight; + + if (dest == lines[ceiling->texture].frontsector->ceilingheight) + { + dest = lines[ceiling->texture].backsector->ceilingheight; + ceiling->speed = ceiling->origspeed = FixedDiv(abs(lines[ceiling->texture].dy), 4*FRACUNIT); // return trip, use dy + } + else + { + dest = lines[ceiling->texture].frontsector->ceilingheight; + ceiling->speed = ceiling->origspeed = FixedDiv(abs(lines[ceiling->texture].dx), 4*FRACUNIT); // going frontways, use dx + } + + if (dest < ceiling->sector->ceilingheight) // must move down + { + ceiling->direction = -1; + ceiling->bottomheight = dest; + } + else // must move up + { + ceiling->direction = 1; + ceiling->topheight = dest; + } + + ceiling->delaytimer = ceiling->delay; + break; + } + default: + break; + } + } + ceiling->sector->ceilspeed = ceiling->speed*ceiling->direction; } /** Moves a ceiling crusher. From 5b1a42af4ca1bcee7193695a948e2deb98c799dd Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 26 Jun 2021 10:00:40 +0200 Subject: [PATCH 077/377] Refactor T_MoveFloor --- src/p_floor.c | 147 +++++++++++++++++--------------------------------- 1 file changed, 50 insertions(+), 97 deletions(-) diff --git a/src/p_floor.c b/src/p_floor.c index c64c1bb20..ed86140f2 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -162,7 +162,7 @@ result_e T_MovePlane(sector_t *sector, fixed_t speed, fixed_t dest, boolean crus void T_MoveFloor(floormove_t *movefloor) { result_e res = 0; - boolean dontupdate = false; + boolean remove = false; if (movefloor->delaytimer) { @@ -190,113 +190,66 @@ void T_MoveFloor(floormove_t *movefloor) if (res == pastdest) { - if (movefloor->direction == 1) + switch (movefloor->type) { - switch (movefloor->type) - { - case moveFloorByFrontSector: - if (movefloor->texture < -1) // chained linedef executing - P_LinedefExecute((INT16)(movefloor->texture + INT16_MAX + 2), NULL, NULL); - /* FALLTHRU */ - case instantMoveFloorByFrontSector: - if (movefloor->texture > -1) // flat changing - movefloor->sector->floorpic = movefloor->texture; - break; - case bounceFloor: // Graue 03-12-2004 - if (movefloor->floordestheight == lines[movefloor->texture].frontsector->floorheight) - movefloor->floordestheight = lines[movefloor->texture].backsector->floorheight; - else - movefloor->floordestheight = lines[movefloor->texture].frontsector->floorheight; - movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1; - movefloor->sector->floorspeed = movefloor->speed * movefloor->direction; - movefloor->delaytimer = movefloor->delay; - P_RecalcPrecipInSector(movefloor->sector); - return; // not break, why did this work? Graue 04-03-2004 - case bounceFloorCrush: // Graue 03-27-2004 - if (movefloor->floordestheight == lines[movefloor->texture].frontsector->floorheight) - { - movefloor->floordestheight = lines[movefloor->texture].backsector->floorheight; - movefloor->speed = movefloor->origspeed = FixedDiv(abs(lines[movefloor->texture].dy),4*FRACUNIT); // return trip, use dy - } - else - { - movefloor->floordestheight = lines[movefloor->texture].frontsector->floorheight; - movefloor->speed = movefloor->origspeed = FixedDiv(abs(lines[movefloor->texture].dx),4*FRACUNIT); // forward again, use dx - } - movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1; - movefloor->sector->floorspeed = movefloor->speed * movefloor->direction; - movefloor->delaytimer = movefloor->delay; - P_RecalcPrecipInSector(movefloor->sector); - return; // not break, why did this work? Graue 04-03-2004 - case crushFloorOnce: + case moveFloorByFrontSector: + if (movefloor->texture < -1) // chained linedef executing + P_LinedefExecute((INT16)(movefloor->texture + INT16_MAX + 2), NULL, NULL); + /* FALLTHRU */ + case instantMoveFloorByFrontSector: + if (movefloor->texture > -1) // flat changing + movefloor->sector->floorpic = movefloor->texture; + remove = true; + break; + case bounceFloor: // Graue 03-12-2004 + if (movefloor->floordestheight == lines[movefloor->texture].frontsector->floorheight) + movefloor->floordestheight = lines[movefloor->texture].backsector->floorheight; + else + movefloor->floordestheight = lines[movefloor->texture].frontsector->floorheight; + movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1; + movefloor->delaytimer = movefloor->delay; + remove = false; + break; + case bounceFloorCrush: // Graue 03-27-2004 + if (movefloor->floordestheight == lines[movefloor->texture].frontsector->floorheight) + { + movefloor->floordestheight = lines[movefloor->texture].backsector->floorheight; + movefloor->speed = movefloor->origspeed = FixedDiv(abs(lines[movefloor->texture].dy), 4*FRACUNIT); // return trip, use dy + } + else + { + movefloor->floordestheight = lines[movefloor->texture].frontsector->floorheight; + movefloor->speed = movefloor->origspeed = FixedDiv(abs(lines[movefloor->texture].dx), 4*FRACUNIT); // forward again, use dx + } + movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1; + movefloor->delaytimer = movefloor->delay; + remove = false; + break; + case crushFloorOnce: + if (movefloor->direction == 1) + { movefloor->floordestheight = lines[movefloor->texture].frontsector->floorheight; movefloor->direction = -1; movefloor->sector->soundorg.z = movefloor->sector->floorheight; - S_StartSound(&movefloor->sector->soundorg,sfx_pstop); - P_RecalcPrecipInSector(movefloor->sector); - return; - default: - break; - } - } - else if (movefloor->direction == -1) - { - switch (movefloor->type) - { - case moveFloorByFrontSector: - if (movefloor->texture < -1) // chained linedef executing - P_LinedefExecute((INT16)(movefloor->texture + INT16_MAX + 2), NULL, NULL); - /* FALLTHRU */ - case instantMoveFloorByFrontSector: - if (movefloor->texture > -1) // flat changing - movefloor->sector->floorpic = movefloor->texture; - break; - case bounceFloor: // Graue 03-12-2004 - if (movefloor->floordestheight == lines[movefloor->texture].frontsector->floorheight) - movefloor->floordestheight = lines[movefloor->texture].backsector->floorheight; - else - movefloor->floordestheight = lines[movefloor->texture].frontsector->floorheight; - movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1; - movefloor->sector->floorspeed = movefloor->speed * movefloor->direction; - movefloor->delaytimer = movefloor->delay; - P_RecalcPrecipInSector(movefloor->sector); - return; // not break, why did this work? Graue 04-03-2004 - case bounceFloorCrush: // Graue 03-27-2004 - if (movefloor->floordestheight == lines[movefloor->texture].frontsector->floorheight) - { - movefloor->floordestheight = lines[movefloor->texture].backsector->floorheight; - movefloor->speed = movefloor->origspeed = FixedDiv(abs(lines[movefloor->texture].dy),4*FRACUNIT); // return trip, use dy - } - else - { - movefloor->floordestheight = lines[movefloor->texture].frontsector->floorheight; - movefloor->speed = movefloor->origspeed = FixedDiv(abs(lines[movefloor->texture].dx),4*FRACUNIT); // forward again, use dx - } - movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1; - movefloor->sector->floorspeed = movefloor->speed * movefloor->direction; - movefloor->delaytimer = movefloor->delay; - P_RecalcPrecipInSector(movefloor->sector); - return; // not break, why did this work? Graue 04-03-2004 - case crushFloorOnce: - movefloor->sector->floordata = NULL; // Clear up the thinker so others can use it - P_RemoveThinker(&movefloor->thinker); - movefloor->sector->floorspeed = 0; - P_RecalcPrecipInSector(movefloor->sector); - return; - default: - break; - } + S_StartSound(&movefloor->sector->soundorg, sfx_pstop); + remove = false; + } + else + remove = true; + break; + default: + break; } + } + if (remove) + { movefloor->sector->floordata = NULL; // Clear up the thinker so others can use it movefloor->sector->floorspeed = 0; P_RemoveThinker(&movefloor->thinker); - dontupdate = true; } - if (!dontupdate) - movefloor->sector->floorspeed = movefloor->speed*movefloor->direction; else - movefloor->sector->floorspeed = 0; + movefloor->sector->floorspeed = movefloor->speed*movefloor->direction; P_RecalcPrecipInSector(movefloor->sector); } From c8bb18b389e407caa857256f0934cfa994781227 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 26 Jun 2021 10:23:12 +0200 Subject: [PATCH 078/377] Adapt linedef type 53-58 to UDMF --- src/p_ceilng.c | 54 +++++--------------------------------------------- src/p_floor.c | 43 +++++++--------------------------------- src/p_setup.c | 8 ++++++++ 3 files changed, 20 insertions(+), 85 deletions(-) diff --git a/src/p_ceilng.c b/src/p_ceilng.c index a12d9d56f..6da547b5c 100644 --- a/src/p_ceilng.c +++ b/src/p_ceilng.c @@ -79,28 +79,6 @@ void T_MoveCeiling(ceiling_t *ceiling) P_RemoveThinker(&ceiling->thinker); return; case bounceCeiling: - { - fixed_t dest = (ceiling->direction == 1) ? ceiling->topheight : ceiling->bottomheight; - - if (dest == lines[ceiling->texture].frontsector->ceilingheight) - dest = lines[ceiling->texture].backsector->ceilingheight; - else - dest = lines[ceiling->texture].frontsector->ceilingheight; - - if (dest < ceiling->sector->ceilingheight) // must move down - { - ceiling->direction = -1; - ceiling->bottomheight = dest; - } - else // must move up - { - ceiling->direction = 1; - ceiling->topheight = dest; - } - - ceiling->delaytimer = ceiling->delay; - break; - } case bounceCeilingCrush: { fixed_t dest = (ceiling->direction == 1) ? ceiling->topheight : ceiling->bottomheight; @@ -108,12 +86,12 @@ void T_MoveCeiling(ceiling_t *ceiling) if (dest == lines[ceiling->texture].frontsector->ceilingheight) { dest = lines[ceiling->texture].backsector->ceilingheight; - ceiling->speed = ceiling->origspeed = FixedDiv(abs(lines[ceiling->texture].dy), 4*FRACUNIT); // return trip, use dy + ceiling->speed = ceiling->origspeed = lines[ceiling->texture].args[3] << (FRACBITS - 2); // return trip, use args[3] } else { dest = lines[ceiling->texture].frontsector->ceilingheight; - ceiling->speed = ceiling->origspeed = FixedDiv(abs(lines[ceiling->texture].dx), 4*FRACUNIT); // going frontways, use dx + ceiling->speed = ceiling->origspeed = lines[ceiling->texture].args[2] << (FRACBITS - 2); // going frontways, use args[2] } if (dest < ceiling->sector->ceilingheight) // must move down @@ -344,30 +322,8 @@ INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type) break; case bounceCeiling: - ceiling->speed = P_AproxDistance(line->dx, line->dy); // same speed as elevateContinuous - ceiling->speed = FixedDiv(ceiling->speed,4*FRACUNIT); - ceiling->origspeed = ceiling->speed; - if (line->frontsector->ceilingheight >= sec->ceilingheight) // Move up - { - ceiling->direction = 1; - ceiling->topheight = line->frontsector->ceilingheight; - } - else // Move down - { - ceiling->direction = -1; - ceiling->bottomheight = line->frontsector->ceilingheight; - } - - // Any delay? - ceiling->delay = sides[line->sidenum[0]].textureoffset >> FRACBITS; - ceiling->delaytimer = sides[line->sidenum[0]].rowoffset >> FRACBITS; // Initial delay - - ceiling->texture = (fixed_t)(line - lines); // hack: use texture to store sourceline number - break; - case bounceCeilingCrush: - ceiling->speed = abs(line->dx); // same speed as elevateContinuous - ceiling->speed = FixedDiv(ceiling->speed,4*FRACUNIT); + ceiling->speed = line->args[2] << (FRACBITS - 2); // same speed as elevateContinuous ceiling->origspeed = ceiling->speed; if (line->frontsector->ceilingheight >= sec->ceilingheight) // Move up { @@ -381,8 +337,8 @@ INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type) } // Any delay? - ceiling->delay = sides[line->sidenum[0]].textureoffset >> FRACBITS; - ceiling->delaytimer = sides[line->sidenum[0]].rowoffset >> FRACBITS; // Initial delay + ceiling->delay = line->args[5]; + ceiling->delaytimer = line->args[4]; // Initial delay ceiling->texture = (fixed_t)(line - lines); // hack: use texture to store sourceline number break; diff --git a/src/p_floor.c b/src/p_floor.c index ed86140f2..1e7925511 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -202,24 +202,16 @@ void T_MoveFloor(floormove_t *movefloor) remove = true; break; case bounceFloor: // Graue 03-12-2004 - if (movefloor->floordestheight == lines[movefloor->texture].frontsector->floorheight) - movefloor->floordestheight = lines[movefloor->texture].backsector->floorheight; - else - movefloor->floordestheight = lines[movefloor->texture].frontsector->floorheight; - movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1; - movefloor->delaytimer = movefloor->delay; - remove = false; - break; case bounceFloorCrush: // Graue 03-27-2004 if (movefloor->floordestheight == lines[movefloor->texture].frontsector->floorheight) { movefloor->floordestheight = lines[movefloor->texture].backsector->floorheight; - movefloor->speed = movefloor->origspeed = FixedDiv(abs(lines[movefloor->texture].dy), 4*FRACUNIT); // return trip, use dy + movefloor->speed = movefloor->origspeed = lines[movefloor->texture].args[3] << (FRACBITS - 2); // return trip, use args[3] } else { movefloor->floordestheight = lines[movefloor->texture].frontsector->floorheight; - movefloor->speed = movefloor->origspeed = FixedDiv(abs(lines[movefloor->texture].dx), 4*FRACUNIT); // forward again, use dx + movefloor->speed = movefloor->origspeed = lines[movefloor->texture].args[2] << (FRACBITS - 2); // forward again, use args[2] } movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1; movefloor->delaytimer = movefloor->delay; @@ -1850,32 +1842,11 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype) dofloor->direction = -1; // down break; - // Linetypes 2/3. - // Move floor up and down indefinitely like the old elevators. + // Move floor up and down indefinitely. + // bounceFloor has slowdown at the top and bottom of movement. case bounceFloor: - dofloor->speed = P_AproxDistance(line->dx, line->dy); // same speed as elevateContinuous - dofloor->speed = FixedDiv(dofloor->speed,4*FRACUNIT); - dofloor->origspeed = dofloor->speed; // it gets slowed down at the top and bottom - dofloor->floordestheight = line->frontsector->floorheight; - - if (dofloor->floordestheight >= sec->floorheight) - dofloor->direction = 1; // up - else - dofloor->direction = -1; // down - - // Any delay? - dofloor->delay = sides[line->sidenum[0]].textureoffset >> FRACBITS; - dofloor->delaytimer = sides[line->sidenum[0]].rowoffset >> FRACBITS; // Initial delay - - dofloor->texture = (fixed_t)(line - lines); // hack: store source line number - break; - - // Linetypes 6/7. - // Like 2/3, but no slowdown at the top and bottom of movement, - // and the speed is line->dx the first way, line->dy for the - // return trip. Good for crushers. case bounceFloorCrush: - dofloor->speed = FixedDiv(abs(line->dx),4*FRACUNIT); + dofloor->speed = line->args[2] << (FRACBITS - 2); // same speed as elevateContinuous dofloor->origspeed = dofloor->speed; dofloor->floordestheight = line->frontsector->floorheight; @@ -1885,8 +1856,8 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype) dofloor->direction = -1; // down // Any delay? - dofloor->delay = sides[line->sidenum[0]].textureoffset >> FRACBITS; - dofloor->delaytimer = sides[line->sidenum[0]].rowoffset >> FRACBITS; // Initial delay + dofloor->delay = line->args[5]; + dofloor->delaytimer = line->args[4]; // Initial delay dofloor->texture = (fixed_t)(line - lines); // hack: store source line number break; diff --git a/src/p_setup.c b/src/p_setup.c index 6e7801618..af8ec51a0 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3090,6 +3090,10 @@ static void P_ConvertBinaryMap(void) case 55: //Continuous ceiling mover lines[i].args[0] = tag; lines[i].args[1] = (lines[i].special == 53) ? 2 : lines[i].special - 54; + lines[i].args[2] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + lines[i].args[3] = lines[i].args[2]; + lines[i].args[4] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[5] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].special = 53; break; case 56: //Continuous two-speed floor/ceiling mover @@ -3097,6 +3101,10 @@ static void P_ConvertBinaryMap(void) case 58: //Continuous two-speed ceiling mover lines[i].args[0] = tag; lines[i].args[1] = (lines[i].special == 56) ? 2 : lines[i].special - 57; + lines[i].args[2] = abs(lines[i].dx) >> FRACBITS; + lines[i].args[3] = abs(lines[i].dy) >> FRACBITS; + lines[i].args[4] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[5] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].special = 56; break; case 59: //Activate moving platform From 9fdd9060e46a6160c3cabb75b4b2d51d5e387a9d Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 26 Jun 2021 12:53:14 +0200 Subject: [PATCH 079/377] Adapt crusher linedefs to UDMF --- src/p_ceilng.c | 38 +++++++++----------------------------- src/p_floor.c | 8 ++------ src/p_setup.c | 24 ++++++++++++++++++++++++ src/p_spec.c | 23 ++++++++--------------- src/p_spec.h | 2 +- 5 files changed, 44 insertions(+), 51 deletions(-) diff --git a/src/p_ceilng.c b/src/p_ceilng.c index 6da547b5c..02dea243e 100644 --- a/src/p_ceilng.c +++ b/src/p_ceilng.c @@ -140,11 +140,7 @@ void T_CrushCeiling(ceiling_t *ceiling) if (res == pastdest) { ceiling->direction = -1; - - if (lines[ceiling->sourceline].flags & ML_EFFECT4) - ceiling->speed = ceiling->oldspeed; - else - ceiling->speed = ceiling->oldspeed*2; + ceiling->speed = lines[ceiling->sourceline].args[2] << (FRACBITS - 2); if (ceiling->type == crushCeilOnce || ceiling->type == crushBothOnce) @@ -185,12 +181,8 @@ void T_CrushCeiling(ceiling_t *ceiling) ceiling->sector->soundorg.z = ceiling->sector->floorheight; S_StartSound(mp,sfx_pstop); - if (lines[ceiling->sourceline].flags & ML_EFFECT4) - ceiling->speed = ceiling->oldspeed; - else - ceiling->speed = ceiling->oldspeed/2; - ceiling->direction = 1; + ceiling->speed = lines[ceiling->sourceline].args[3] << (FRACBITS - 2); } break; } @@ -387,41 +379,29 @@ INT32 EV_DoCrush(mtag_t tag, line_t *line, ceiling_e type) ceiling->sector = sec; ceiling->crush = true; ceiling->sourceline = (INT32)(line-lines); - - if (line->flags & ML_EFFECT4) - ceiling->oldspeed = FixedDiv(abs(line->dx),4*FRACUNIT); - else - ceiling->oldspeed = (R_PointToDist2(line->v2->x, line->v2->y, line->v1->x, line->v1->y)/16); + ceiling->speed = ceiling->oldspeed = line->args[2] << (FRACBITS - 2); switch(type) { - case fastCrushAndRaise: // Up and then down + case raiseAndCrush: // Up and then down ceiling->topheight = P_FindHighestCeilingSurrounding(sec); ceiling->direction = 1; - ceiling->speed = ceiling->oldspeed; + // Retain stupid behavior for backwards compatibility + if (!udmf && !(line->flags & ML_EFFECT4)) + ceiling->speed /= 2; + else + ceiling->speed = line->args[3] << (FRACBITS - 2); ceiling->bottomheight = sec->floorheight + FRACUNIT; break; case crushBothOnce: ceiling->topheight = sec->ceilingheight; ceiling->bottomheight = sec->floorheight + (sec->ceilingheight-sec->floorheight)/2; ceiling->direction = -1; - - if (line->flags & ML_EFFECT4) - ceiling->speed = ceiling->oldspeed; - else - ceiling->speed = ceiling->oldspeed*2; - break; case crushCeilOnce: default: // Down and then up. ceiling->topheight = sec->ceilingheight; ceiling->direction = -1; - - if (line->flags & ML_EFFECT4) - ceiling->speed = ceiling->oldspeed; - else - ceiling->speed = ceiling->oldspeed*2; - ceiling->bottomheight = sec->floorheight + FRACUNIT; break; } diff --git a/src/p_floor.c b/src/p_floor.c index 1e7925511..73592f7d7 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -222,6 +222,7 @@ void T_MoveFloor(floormove_t *movefloor) { movefloor->floordestheight = lines[movefloor->texture].frontsector->floorheight; movefloor->direction = -1; + movefloor->speed = lines[movefloor->texture].args[3] << (FRACBITS - 2); movefloor->sector->soundorg.z = movefloor->sector->floorheight; S_StartSound(&movefloor->sector->soundorg, sfx_pstop); remove = false; @@ -1863,8 +1864,7 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype) break; case crushFloorOnce: - dofloor->speed = FixedDiv(abs(line->dx),4*FRACUNIT); - dofloor->origspeed = dofloor->speed; + dofloor->speed = dofloor->origspeed = line->args[2] << (FRACBITS - 2); dofloor->floordestheight = line->frontsector->ceilingheight; if (dofloor->floordestheight >= sec->floorheight) @@ -1872,10 +1872,6 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype) else dofloor->direction = -1; // down - // Any delay? - dofloor->delay = sides[line->sidenum[0]].textureoffset >> FRACBITS; - dofloor->delaytimer = sides[line->sidenum[0]].rowoffset >> FRACBITS; - dofloor->texture = (fixed_t)(line - lines); // hack: store source line number break; diff --git a/src/p_setup.c b/src/p_setup.c index af8ec51a0..2158af62d 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3119,6 +3119,18 @@ static void P_ConvertBinaryMap(void) case 61: //Crusher (Ceiling to floor) case 62: //Crusher (Floor to ceiling) lines[i].args[0] = tag; + lines[i].args[1] = lines[i].special - 61; + if (lines[i].flags & ML_EFFECT4) + { + lines[i].args[2] = abs(lines[i].dx) >> FRACBITS; + lines[i].args[3] = lines[i].args[2]; + } + else + { + lines[i].args[2] = R_PointToDist2(lines[i].v2->x, lines[i].v2->y, lines[i].v1->x, lines[i].v1->y) >> (FRACBITS + 1); + lines[i].args[3] = lines[i].args[2] / 4; + } + lines[i].special = 61; break; case 76: //Make FOF bouncy lines[i].args[0] = tag; @@ -3568,6 +3580,18 @@ static void P_ConvertBinaryMap(void) case 430: //Crush floor once case 431: //Crush floor and ceiling once lines[i].args[0] = tag; + lines[i].args[1] = (lines[i].special == 429) ? 1 : ((lines[i].special == 430) ? 0 : 2); + if (lines[i].special == 430 || lines[i].flags & ML_EFFECT4) + { + lines[i].args[2] = abs(lines[i].dx) >> FRACBITS; + lines[i].args[3] = lines[i].args[2]; + } + else + { + lines[i].args[2] = R_PointToDist2(lines[i].v2->x, lines[i].v2->y, lines[i].v1->x, lines[i].v1->y) >> (FRACBITS + 1); + lines[i].args[3] = lines[i].args[2] / 4; + } + lines[i].special = 429; break; case 443: //Call Lua function if (lines[i].text) diff --git a/src/p_spec.c b/src/p_spec.c index 222077e3d..e434d90c0 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2870,16 +2870,13 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) EV_DoElevator(line->args[0], line, elevateContinuous); break; - case 429: // Crush Ceiling Down Once - EV_DoCrush(line->args[0], line, crushCeilOnce); - break; - - case 430: // Crush Floor Up Once - EV_DoFloor(line->args[0], line, crushFloorOnce); - break; - - case 431: // Crush Floor & Ceiling to middle Once - EV_DoCrush(line->args[0], line, crushBothOnce); + case 429: // Crush planes once + if (line->args[1] == 0) + EV_DoFloor(line->args[0], line, crushFloorOnce); + else if (line->args[1] == 1) + EV_DoCrush(line->args[0], line, crushCeilOnce); + else + EV_DoCrush(line->args[0], line, crushBothOnce); break; case 432: // Enable 2D Mode (Disable if noclimb) @@ -6353,11 +6350,7 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 61: // Crusher! - EV_DoCrush(lines[i].args[0], &lines[i], crushAndRaise); - break; - - case 62: // Crusher (up and then down)! - EV_DoCrush(lines[i].args[0], &lines[i], fastCrushAndRaise); + EV_DoCrush(lines[i].args[0], &lines[i], lines[i].args[1] ? raiseAndCrush : crushAndRaise); break; case 63: // support for drawn heights coming from different sector diff --git a/src/p_spec.h b/src/p_spec.h index e6ea5a534..b24d40579 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -264,7 +264,7 @@ typedef enum instantRaise, // instant-move for ceilings crushAndRaise, - fastCrushAndRaise, + raiseAndCrush, crushCeilOnce, crushBothOnce, From 63eafff5fe2ab064af45597985ff2c98071546cb Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 26 Jun 2021 14:53:14 +0200 Subject: [PATCH 080/377] Linedef type 403: Don't run the linedef executor twice --- src/p_ceilng.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/p_ceilng.c b/src/p_ceilng.c index 02dea243e..05973dfa8 100644 --- a/src/p_ceilng.c +++ b/src/p_ceilng.c @@ -261,7 +261,8 @@ INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type) // chained linedef executing ability // only set it on ONE of the moving sectors (the smallest numbered) - if (line->args[3] > 0) + // only set it if there isn't also a floor mover + if (line->args[3] > 0 && line->args[1] == 1) ceiling->texture = firstone ? line->args[3] - INT16_MAX - 2 : -1; // flat changing ability else if (line->args[4]) From 446e78b6e2363fd48a5a9ee9d88b0a11d698c5b5 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 26 Jun 2021 15:28:28 +0200 Subject: [PATCH 081/377] Linedef type 403: Allow executor chaining and flat change at the same time --- src/p_ceilng.c | 16 ++++++---------- src/p_floor.c | 15 ++++++--------- src/p_saveg.c | 6 ++++-- src/p_setup.c | 15 ++------------- src/p_spec.h | 3 ++- 5 files changed, 20 insertions(+), 35 deletions(-) diff --git a/src/p_ceilng.c b/src/p_ceilng.c index 05973dfa8..39eb07457 100644 --- a/src/p_ceilng.c +++ b/src/p_ceilng.c @@ -67,8 +67,8 @@ void T_MoveCeiling(ceiling_t *ceiling) P_RemoveThinker(&ceiling->thinker); return; case moveCeilingByFrontSector: - if (ceiling->texture < -1) // chained linedef executing - P_LinedefExecute((INT16)(ceiling->texture + INT16_MAX + 2), NULL, NULL); + if (ceiling->tag) // chained linedef executing + P_LinedefExecute(ceiling->tag, NULL, NULL); if (ceiling->texture > -1) // flat changing ceiling->sector->ceilingpic = ceiling->texture; /* FALLTHRU */ @@ -262,13 +262,11 @@ INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type) // chained linedef executing ability // only set it on ONE of the moving sectors (the smallest numbered) // only set it if there isn't also a floor mover - if (line->args[3] > 0 && line->args[1] == 1) - ceiling->texture = firstone ? line->args[3] - INT16_MAX - 2 : -1; + if (line->args[3] && line->args[1] == 1) + ceiling->tag = firstone ? (INT16)line->args[3] : 0; + // flat changing ability - else if (line->args[4]) - ceiling->texture = line->frontsector->ceilingpic; - else - ceiling->texture = -1; + ceiling->texture = line->args[4] ? line->frontsector->ceilingpic : -1; break; // More linedef executor junk @@ -341,7 +339,6 @@ INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type) } - ceiling->tag = tag; ceiling->type = type; firstone = 0; } @@ -407,7 +404,6 @@ INT32 EV_DoCrush(mtag_t tag, line_t *line, ceiling_e type) break; } - ceiling->tag = tag; ceiling->type = type; } return rtn; diff --git a/src/p_floor.c b/src/p_floor.c index 73592f7d7..4ad78d86c 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -193,8 +193,8 @@ void T_MoveFloor(floormove_t *movefloor) switch (movefloor->type) { case moveFloorByFrontSector: - if (movefloor->texture < -1) // chained linedef executing - P_LinedefExecute((INT16)(movefloor->texture + INT16_MAX + 2), NULL, NULL); + if (movefloor->tag) // chained linedef executing + P_LinedefExecute(movefloor->tag, NULL, NULL); /* FALLTHRU */ case instantMoveFloorByFrontSector: if (movefloor->texture > -1) // flat changing @@ -1821,14 +1821,11 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype) // chained linedef executing ability // Only set it on one of the moving sectors (the smallest numbered) - if (line->args[3] > 0) - dofloor->texture = firstone ? line->args[3] - INT16_MAX - 2 : -1; - // flat changing ability - else if (line->args[4]) - dofloor->texture = line->frontsector->floorpic; - else - dofloor->texture = -1; // nothing special to do after movement completes + if (line->args[3]) + dofloor->tag = firstone ? (INT16)line->args[3] : -1; + // flat changing ability + dofloor->texture = line->args[4] ? line->frontsector->floorpic : -1; break; case moveFloorByDistance: diff --git a/src/p_saveg.c b/src/p_saveg.c index 770c641b9..e5c2a1f6a 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1991,7 +1991,7 @@ static void SaveCeilingThinker(const thinker_t *th, const UINT8 type) WRITEUINT8(save_p, ht->crush); WRITEINT32(save_p, ht->texture); WRITEINT32(save_p, ht->direction); - WRITEINT32(save_p, ht->tag); + WRITEINT16(save_p, ht->tag); WRITEINT32(save_p, ht->olddirection); WRITEFIXED(save_p, ht->origspeed); WRITEFIXED(save_p, ht->sourceline); @@ -2011,6 +2011,7 @@ static void SaveFloormoveThinker(const thinker_t *th, const UINT8 type) WRITEFIXED(save_p, ht->origspeed); WRITEFIXED(save_p, ht->delay); WRITEFIXED(save_p, ht->delaytimer); + WRITEINT16(save_p, ht->tag); } static void SaveLightflashThinker(const thinker_t *th, const UINT8 type) @@ -3097,7 +3098,7 @@ static thinker_t* LoadCeilingThinker(actionf_p1 thinker) ht->crush = READUINT8(save_p); ht->texture = READINT32(save_p); ht->direction = READINT32(save_p); - ht->tag = READINT32(save_p); + ht->tag = READINT16(save_p); ht->olddirection = READINT32(save_p); ht->origspeed = READFIXED(save_p); ht->sourceline = READFIXED(save_p); @@ -3120,6 +3121,7 @@ static thinker_t* LoadFloormoveThinker(actionf_p1 thinker) ht->origspeed = READFIXED(save_p); ht->delay = READFIXED(save_p); ht->delaytimer = READFIXED(save_p); + ht->tag = READINT16(save_p); if (ht->sector) ht->sector->floordata = ht; return &ht->thinker; diff --git a/src/p_setup.c b/src/p_setup.c index 2158af62d..4679a8dc7 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3545,19 +3545,8 @@ static void P_ConvertBinaryMap(void) lines[i].args[0] = tag; lines[i].args[1] = lines[i].special - 403; lines[i].args[2] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; - if (lines[i].flags & ML_BLOCKMONSTERS) - { - if (sides[lines[i].sidenum[0]].textureoffset > 0) - lines[i].args[3] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; - else - lines[i].args[3] = 0; - lines[i].args[4] = 0; - } - else - { - lines[i].args[3] = 0; - lines[i].args[4] = !!(lines[i].flags & ML_NOCLIMB); - } + lines[i].args[3] = (lines[i].flags & ML_BLOCKMONSTERS) ? sides[lines[i].sidenum[0]].textureoffset >> FRACBITS : 0; + lines[i].args[4] = !!(lines[i].flags & ML_NOCLIMB); lines[i].special = 403; break; case 405: //Move floor according to front texture offsets diff --git a/src/p_spec.h b/src/p_spec.h index b24d40579..2ae8320fc 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -296,7 +296,7 @@ typedef struct INT32 direction; ///< 1 = up, 0 = waiting, -1 = down. // ID - INT32 tag; + INT16 tag; ///< Tag of linedef executor to run when movement is done. INT32 olddirection; fixed_t origspeed; ///< The original, "real" speed. INT32 sourceline; ///< Index of the source linedef @@ -356,6 +356,7 @@ typedef struct fixed_t origspeed; fixed_t delay; fixed_t delaytimer; + INT16 tag; } floormove_t; typedef struct From 299b2dcff2c685094ea60ca4695d42960a59b9d7 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 26 Jun 2021 15:29:42 +0200 Subject: [PATCH 082/377] Fix a small oversight --- src/p_ceilng.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_ceilng.c b/src/p_ceilng.c index 39eb07457..e834c5d1d 100644 --- a/src/p_ceilng.c +++ b/src/p_ceilng.c @@ -301,7 +301,7 @@ INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type) ceiling->speed = INT32_MAX/2; // as above, "instant" is one tic else ceiling->speed = line->args[3] << (FRACBITS - 3); - if (sides[line->sidenum[0]].rowoffset > 0) + if (line->args[2] > 0) { ceiling->direction = 1; // up ceiling->topheight = sec->ceilingheight + (line->args[2] << FRACBITS); From 202c56054e0e28d99b34b1d8a29252707105c067 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 26 Jun 2021 16:15:38 +0200 Subject: [PATCH 083/377] Remove unused ceiling_t variables --- src/p_ceilng.c | 2 +- src/p_saveg.c | 4 ---- src/p_spec.h | 2 -- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/p_ceilng.c b/src/p_ceilng.c index e834c5d1d..83c342712 100644 --- a/src/p_ceilng.c +++ b/src/p_ceilng.c @@ -377,7 +377,7 @@ INT32 EV_DoCrush(mtag_t tag, line_t *line, ceiling_e type) ceiling->sector = sec; ceiling->crush = true; ceiling->sourceline = (INT32)(line-lines); - ceiling->speed = ceiling->oldspeed = line->args[2] << (FRACBITS - 2); + ceiling->speed = ceiling->origspeed = line->args[2] << (FRACBITS - 2); switch(type) { diff --git a/src/p_saveg.c b/src/p_saveg.c index e5c2a1f6a..600561c8d 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1985,14 +1985,12 @@ static void SaveCeilingThinker(const thinker_t *th, const UINT8 type) WRITEFIXED(save_p, ht->bottomheight); WRITEFIXED(save_p, ht->topheight); WRITEFIXED(save_p, ht->speed); - WRITEFIXED(save_p, ht->oldspeed); WRITEFIXED(save_p, ht->delay); WRITEFIXED(save_p, ht->delaytimer); WRITEUINT8(save_p, ht->crush); WRITEINT32(save_p, ht->texture); WRITEINT32(save_p, ht->direction); WRITEINT16(save_p, ht->tag); - WRITEINT32(save_p, ht->olddirection); WRITEFIXED(save_p, ht->origspeed); WRITEFIXED(save_p, ht->sourceline); } @@ -3092,14 +3090,12 @@ static thinker_t* LoadCeilingThinker(actionf_p1 thinker) ht->bottomheight = READFIXED(save_p); ht->topheight = READFIXED(save_p); ht->speed = READFIXED(save_p); - ht->oldspeed = READFIXED(save_p); ht->delay = READFIXED(save_p); ht->delaytimer = READFIXED(save_p); ht->crush = READUINT8(save_p); ht->texture = READINT32(save_p); ht->direction = READINT32(save_p); ht->tag = READINT16(save_p); - ht->olddirection = READINT32(save_p); ht->origspeed = READFIXED(save_p); ht->sourceline = READFIXED(save_p); if (ht->sector) diff --git a/src/p_spec.h b/src/p_spec.h index 2ae8320fc..4ad817ab2 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -287,7 +287,6 @@ typedef struct fixed_t bottomheight; ///< The lowest height to move to. fixed_t topheight; ///< The highest height to move to. fixed_t speed; ///< Ceiling speed. - fixed_t oldspeed; fixed_t delay; fixed_t delaytimer; UINT8 crush; ///< Whether to crush things or not. @@ -297,7 +296,6 @@ typedef struct // ID INT16 tag; ///< Tag of linedef executor to run when movement is done. - INT32 olddirection; fixed_t origspeed; ///< The original, "real" speed. INT32 sourceline; ///< Index of the source linedef } ceiling_t; From 588c56b22425e4ebc8a148771269617cdd60d921 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 26 Jun 2021 16:25:14 +0200 Subject: [PATCH 084/377] Floor/ceiling movers: Stop abusing the texture variable to store the sourceline --- src/p_ceilng.c | 16 +++++++--------- src/p_floor.c | 23 ++++++++++------------- src/p_saveg.c | 2 ++ src/p_spec.h | 1 + 4 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/p_ceilng.c b/src/p_ceilng.c index 83c342712..b64d496fb 100644 --- a/src/p_ceilng.c +++ b/src/p_ceilng.c @@ -46,8 +46,8 @@ void T_MoveCeiling(ceiling_t *ceiling) if (ceiling->type == bounceCeiling) { const fixed_t origspeed = FixedDiv(ceiling->origspeed, (ELEVATORSPEED/2)); - const fixed_t fs = abs(ceiling->sector->ceilingheight - lines[ceiling->texture].frontsector->ceilingheight); - const fixed_t bs = abs(ceiling->sector->ceilingheight - lines[ceiling->texture].backsector->ceilingheight); + const fixed_t fs = abs(ceiling->sector->ceilingheight - lines[ceiling->sourceline].frontsector->ceilingheight); + const fixed_t bs = abs(ceiling->sector->ceilingheight - lines[ceiling->sourceline].backsector->ceilingheight); if (fs < bs) ceiling->speed = FixedDiv(fs, 25*FRACUNIT) + FRACUNIT/4; else @@ -83,15 +83,15 @@ void T_MoveCeiling(ceiling_t *ceiling) { fixed_t dest = (ceiling->direction == 1) ? ceiling->topheight : ceiling->bottomheight; - if (dest == lines[ceiling->texture].frontsector->ceilingheight) + if (dest == lines[ceiling->sourceline].frontsector->ceilingheight) { - dest = lines[ceiling->texture].backsector->ceilingheight; - ceiling->speed = ceiling->origspeed = lines[ceiling->texture].args[3] << (FRACBITS - 2); // return trip, use args[3] + dest = lines[ceiling->sourceline].backsector->ceilingheight; + ceiling->speed = ceiling->origspeed = lines[ceiling->sourceline].args[3] << (FRACBITS - 2); // return trip, use args[3] } else { - dest = lines[ceiling->texture].frontsector->ceilingheight; - ceiling->speed = ceiling->origspeed = lines[ceiling->texture].args[2] << (FRACBITS - 2); // going frontways, use args[2] + dest = lines[ceiling->sourceline].frontsector->ceilingheight; + ceiling->speed = ceiling->origspeed = lines[ceiling->sourceline].args[2] << (FRACBITS - 2); // going frontways, use args[2] } if (dest < ceiling->sector->ceilingheight) // must move down @@ -330,8 +330,6 @@ INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type) // Any delay? ceiling->delay = line->args[5]; ceiling->delaytimer = line->args[4]; // Initial delay - - ceiling->texture = (fixed_t)(line - lines); // hack: use texture to store sourceline number break; default: diff --git a/src/p_floor.c b/src/p_floor.c index 4ad78d86c..e388657cf 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -178,8 +178,8 @@ void T_MoveFloor(floormove_t *movefloor) if (movefloor->type == bounceFloor) { const fixed_t origspeed = FixedDiv(movefloor->origspeed,(ELEVATORSPEED/2)); - const fixed_t fs = abs(movefloor->sector->floorheight - lines[movefloor->texture].frontsector->floorheight); - const fixed_t bs = abs(movefloor->sector->floorheight - lines[movefloor->texture].backsector->floorheight); + const fixed_t fs = abs(movefloor->sector->floorheight - lines[movefloor->sourceline].frontsector->floorheight); + const fixed_t bs = abs(movefloor->sector->floorheight - lines[movefloor->sourceline].backsector->floorheight); if (fs < bs) movefloor->speed = FixedDiv(fs,25*FRACUNIT) + FRACUNIT/4; else @@ -203,15 +203,15 @@ void T_MoveFloor(floormove_t *movefloor) break; case bounceFloor: // Graue 03-12-2004 case bounceFloorCrush: // Graue 03-27-2004 - if (movefloor->floordestheight == lines[movefloor->texture].frontsector->floorheight) + if (movefloor->floordestheight == lines[movefloor->sourceline].frontsector->floorheight) { - movefloor->floordestheight = lines[movefloor->texture].backsector->floorheight; - movefloor->speed = movefloor->origspeed = lines[movefloor->texture].args[3] << (FRACBITS - 2); // return trip, use args[3] + movefloor->floordestheight = lines[movefloor->sourceline].backsector->floorheight; + movefloor->speed = movefloor->origspeed = lines[movefloor->sourceline].args[3] << (FRACBITS - 2); // return trip, use args[3] } else { - movefloor->floordestheight = lines[movefloor->texture].frontsector->floorheight; - movefloor->speed = movefloor->origspeed = lines[movefloor->texture].args[2] << (FRACBITS - 2); // forward again, use args[2] + movefloor->floordestheight = lines[movefloor->sourceline].frontsector->floorheight; + movefloor->speed = movefloor->origspeed = lines[movefloor->sourceline].args[2] << (FRACBITS - 2); // forward again, use args[2] } movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1; movefloor->delaytimer = movefloor->delay; @@ -220,9 +220,9 @@ void T_MoveFloor(floormove_t *movefloor) case crushFloorOnce: if (movefloor->direction == 1) { - movefloor->floordestheight = lines[movefloor->texture].frontsector->floorheight; + movefloor->floordestheight = lines[movefloor->sourceline].frontsector->floorheight; movefloor->direction = -1; - movefloor->speed = lines[movefloor->texture].args[3] << (FRACBITS - 2); + movefloor->speed = lines[movefloor->sourceline].args[3] << (FRACBITS - 2); movefloor->sector->soundorg.z = movefloor->sector->floorheight; S_StartSound(&movefloor->sector->soundorg, sfx_pstop); remove = false; @@ -1777,6 +1777,7 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype) dofloor->type = floortype; dofloor->crush = false; // default: types that crush will change this dofloor->sector = sec; + dofloor->sourceline = (INT32)(line - lines); switch (floortype) { @@ -1856,8 +1857,6 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype) // Any delay? dofloor->delay = line->args[5]; dofloor->delaytimer = line->args[4]; // Initial delay - - dofloor->texture = (fixed_t)(line - lines); // hack: store source line number break; case crushFloorOnce: @@ -1868,8 +1867,6 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype) dofloor->direction = 1; // up else dofloor->direction = -1; // down - - dofloor->texture = (fixed_t)(line - lines); // hack: store source line number break; default: diff --git a/src/p_saveg.c b/src/p_saveg.c index 600561c8d..bf28b11a5 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2010,6 +2010,7 @@ static void SaveFloormoveThinker(const thinker_t *th, const UINT8 type) WRITEFIXED(save_p, ht->delay); WRITEFIXED(save_p, ht->delaytimer); WRITEINT16(save_p, ht->tag); + WRITEFIXED(save_p, ht->sourceline); } static void SaveLightflashThinker(const thinker_t *th, const UINT8 type) @@ -3118,6 +3119,7 @@ static thinker_t* LoadFloormoveThinker(actionf_p1 thinker) ht->delay = READFIXED(save_p); ht->delaytimer = READFIXED(save_p); ht->tag = READINT16(save_p); + ht->sourceline = READFIXED(save_p); if (ht->sector) ht->sector->floordata = ht; return &ht->thinker; diff --git a/src/p_spec.h b/src/p_spec.h index 4ad817ab2..921af714e 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -355,6 +355,7 @@ typedef struct fixed_t delay; fixed_t delaytimer; INT16 tag; + INT32 sourceline; } floormove_t; typedef struct From 92982be76b7abbe9e3ca4f2c83fe0d234b971b38 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 27 Jun 2021 09:53:57 +0200 Subject: [PATCH 085/377] Adapt the remaining plane movement linedef types to UDMF --- src/p_setup.c | 15 +++++++++++++++ src/p_spec.c | 18 +++++------------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 4679a8dc7..9c1a2d68c 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3085,6 +3085,10 @@ static void P_ConvertBinaryMap(void) case 51: //Instantly raise ceiling on level load lines[i].args[0] = tag; break; + case 52: //Continuously falling sector + lines[i].args[0] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + lines[i].args[1] = !!(lines[i].flags & ML_NOCLIMB); + break; case 53: //Continuous floor/ceiling mover case 54: //Continuous floor mover case 55: //Continuous ceiling mover @@ -3132,6 +3136,14 @@ static void P_ConvertBinaryMap(void) } lines[i].special = 61; break; + case 66: //Move floor by displacement + case 67: //Move ceiling by displacement + case 68: //Move floor and ceiling by displacement + lines[i].args[0] = tag; + lines[i].args[1] = lines[i].special - 66; + lines[i].args[2] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + lines[i].special = 66; + break; case 76: //Make FOF bouncy lines[i].args[0] = tag; lines[i].args[1] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; @@ -3558,6 +3570,9 @@ static void P_ConvertBinaryMap(void) lines[i].args[4] = !!(lines[i].flags & ML_NOCLIMB); lines[i].special = 405; break; + case 411: //Stop plane movement + lines[i].args[0] = tag; + break; case 428: //Start platform movement lines[i].args[0] = tag; lines[i].args[1] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; diff --git a/src/p_spec.c b/src/p_spec.c index e434d90c0..0bf158f29 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2297,7 +2297,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; case 411: // Stop floor/ceiling movement in tagged sector(s) - TAG_ITER_SECTORS(tag, secnum) + TAG_ITER_SECTORS(line->args[0], secnum) { if (sectors[secnum].floordata) { @@ -6322,7 +6322,7 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 52: // Continuously Falling sector - EV_DoContinuousFall(lines[i].frontsector, lines[i].backsector, P_AproxDistance(lines[i].dx, lines[i].dy), (lines[i].flags & ML_NOCLIMB)); + EV_DoContinuousFall(lines[i].frontsector, lines[i].backsector, lines[i].args[0] << FRACBITS, lines[i].args[1]); break; case 53: // Continuous plane movement (slowdown) @@ -6377,17 +6377,9 @@ void P_SpawnSpecials(boolean fromnetsave) } break; - case 66: // Displace floor by front sector - TAG_ITER_SECTORS(tag, s) - P_AddPlaneDisplaceThinker(pd_floor, P_AproxDistance(lines[i].dx, lines[i].dy)>>8, sides[lines[i].sidenum[0]].sector-sectors, s, !!(lines[i].flags & ML_NOCLIMB)); - break; - case 67: // Displace ceiling by front sector - TAG_ITER_SECTORS(tag, s) - P_AddPlaneDisplaceThinker(pd_ceiling, P_AproxDistance(lines[i].dx, lines[i].dy)>>8, sides[lines[i].sidenum[0]].sector-sectors, s, !!(lines[i].flags & ML_NOCLIMB)); - break; - case 68: // Displace both floor AND ceiling by front sector - TAG_ITER_SECTORS(tag, s) - P_AddPlaneDisplaceThinker(pd_both, P_AproxDistance(lines[i].dx, lines[i].dy)>>8, sides[lines[i].sidenum[0]].sector-sectors, s, !!(lines[i].flags & ML_NOCLIMB)); + case 66: // Displace planes by front sector + TAG_ITER_SECTORS(lines[i].args[0], s) + P_AddPlaneDisplaceThinker(lines[i].args[1], abs(lines[i].args[2])<<8, sides[lines[i].sidenum[0]].sector-sectors, s, lines[i].args[2] < 0); break; case 70: // Add raise thinker to FOF From 4b0e3117406eb7422be306c0a24703499e465ab6 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 27 Jun 2021 09:54:48 +0200 Subject: [PATCH 086/377] Fix typo --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index 0bf158f29..723b71b9b 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6318,7 +6318,7 @@ void P_SpawnSpecials(boolean fromnetsave) case 51: // Instant raise for ceilings if (!udmf) - EV_DoCeiling(lines[i].args[1], &lines[i], instantRaise); + EV_DoCeiling(lines[i].args[0], &lines[i], instantRaise); break; case 52: // Continuously Falling sector From 13eb4cb35924eeedefa2e1b4360fffd6b944c129 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 27 Jun 2021 10:33:05 +0200 Subject: [PATCH 087/377] Add plane mover linedef types to UDB config --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 272 ++++++++++++++++++- extras/conf/udb/Includes/SRB222_misc.cfg | 7 + 2 files changed, 277 insertions(+), 2 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 4c35e8723..4cf3159e2 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1570,6 +1570,92 @@ udmf { title = "Plane Movement"; + 52 + { + title = "Continuously Falling Sector"; + prefix = "(52)"; + arg0 + { + title = "Speed"; + } + arg1 + { + title = "Direction"; + type = 11; + enum + { + 0 = "Fall"; + 1 = "Rise"; + } + } + } + + 53 + { + title = "Continuous Plane Mover (Slowdown)"; + prefix = "(53)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Affected planes"; + type = 11; + enum = "floorceiling"; + } + arg2 + { + title = "Forward speed"; + } + arg3 + { + title = "Return speed"; + } + arg4 + { + title = "Starting delay"; + } + arg5 + { + title = "Delay before flip"; + } + } + + 56 + { + title = "Continuous Plane Mover (Constant)"; + prefix = "(56)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Affected planes"; + type = 11; + enum = "floorceiling"; + } + arg2 + { + title = "Forward speed"; + } + arg3 + { + title = "Return speed"; + } + arg4 + { + title = "Starting delay"; + } + arg5 + { + title = "Delay before flip"; + } + } + 60 { title = "Activate Moving Platform"; @@ -1592,15 +1678,62 @@ udmf title = "Delay before flip"; } arg4 + { + title = "Starting direction"; + type = 11; + enum = "downup"; + } + } + + 61 + { + title = "Ceiling Crusher"; + prefix = "(61)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 { title = "Starting direction"; type = 11; enum { - 0 = "Down"; - 1 = "Up"; + 0 = "Crush"; + 1 = "Retract"; } } + arg2 + { + title = "Crush speed"; + } + arg3 + { + title = "Retract speed"; + } + } + + 66 + { + title = "Move Planes by Displacement"; + prefix = "(66)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Affected planes"; + type = 11; + enum = "floorceiling"; + } + arg2 + { + title = "Translation factor"; + default = 256; + } } } @@ -2281,10 +2414,120 @@ udmf } } + linedefexecsector + { + title = "Linedef Executor (sector)"; + + 400 + { + title = "Set Tagged Sector's Heights/Textures"; + prefix = "(400)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Set heights?"; + type = 12; + enum + { + 1 = "Floor"; + 2 = "Ceiling"; + } + } + arg2 + { + title = "Set flats?"; + type = 12; + enum + { + 1 = "Floor"; + 2 = "Ceiling"; + } + } + } + } + linedefexecplane { title = "Linedef Executor (plane movement)"; + 403 + { + title = "Move Tagged Sector's Planes"; + prefix = "(403)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Affected planes"; + type = 11; + enum = "floorceiling"; + } + arg2 + { + title = "Speed"; + } + arg3 + { + title = "Linedef executor tag"; + type = 15; + } + arg4 + { + title = "Set flats?"; + type = 11; + enum = "noyes"; + } + } + + 405 + { + title = "Move Planes by Distance"; + prefix = "(405)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Affected planes"; + type = 11; + enum = "floorceiling"; + } + arg2 + { + title = "Distance"; + } + arg3 + { + title = "Speed"; + } + arg4 + { + title = "Instant?"; + type = 11; + enum = "noyes"; + } + } + + 411 + { + title = "Stop Plane Movement"; + prefix = "(411)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + } + 428 { title = "Start Platform Movement"; @@ -2317,6 +2560,31 @@ udmf } } } + + 429 + { + title = "Crush Planes Once"; + prefix = "(429)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Affected planes"; + type = 11; + enum = "floorceiling"; + } + arg2 + { + title = "Crush speed"; + } + arg3 + { + title = "Retract speed"; + } + } } linedefexecmisc diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 68629149e..1fa98a212 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -444,6 +444,13 @@ enums 4 = "Don't block players"; 8 = "Don't block non-players"; } + + floorceiling + { + 0 = "Floor"; + 1 = "Ceiling"; + 2 = "Both"; + } } //Default things filters From 099cea0a19c95cf94868f91258f1ff59521788f6 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 27 Jun 2021 11:56:06 +0200 Subject: [PATCH 088/377] Implement "set flats" linedef type --- extras/conf/SRB2-22.cfg | 8 +++++++ extras/conf/udb/Includes/SRB222_linedefs.cfg | 22 ++++++++++++++++++++ src/p_setup.c | 14 +++++++++++++ src/p_spec.c | 12 +++++++++++ 4 files changed, 56 insertions(+) diff --git a/extras/conf/SRB2-22.cfg b/extras/conf/SRB2-22.cfg index f457fe972..467856344 100644 --- a/extras/conf/SRB2-22.cfg +++ b/extras/conf/SRB2-22.cfg @@ -2009,6 +2009,14 @@ linedeftypes flags8text = "[3] Set delay by backside sector"; } + 408 + { + title = "Set Tagged Sector's Flats"; + prefix = "(408)"; + flags64text = "[6] Don't set floor flat"; + flags512text = "[9] Don't set ceiling flat"; + } + 409 { title = "Change Tagged Sector's Tag"; diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 4cf3159e2..0e110cfb6 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -765,6 +765,11 @@ doom title = "Set Tagged Sector's Light Level"; prefix = "(402)"; } + 408 + { + title = "Set Tagged Sector's Flats"; + prefix = "(408)"; + } 409 { title = "Change Tagged Sector's Tag"; @@ -2448,6 +2453,23 @@ udmf } } } + + 408 + { + title = "Set Tagged Sector's Flats"; + prefix = "(408)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Affected planes"; + type = 11; + enum = "floorceiling"; + } + } } linedefexecplane diff --git a/src/p_setup.c b/src/p_setup.c index 9c1a2d68c..56c3ed78b 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3570,6 +3570,20 @@ static void P_ConvertBinaryMap(void) lines[i].args[4] = !!(lines[i].flags & ML_NOCLIMB); lines[i].special = 405; break; + case 408: //Set flats + lines[i].args[0] = tag; + if ((lines[i].flags & (ML_NOCLIMB|ML_EFFECT4)) == (ML_NOCLIMB|ML_EFFECT4)) + { + CONS_Alert(CONS_WARNING, M_GetText("Set flats linedef (tag %d) doesn't have anything to do.\nConsider changing the linedef's flag configuration or removing it entirely.\n"), tag); + lines[i].special = 0; + } + else if (lines[i].flags & ML_NOCLIMB) + lines[i].args[1] = 1; + else if (lines[i].flags & ML_EFFECT4) + lines[i].args[1] = 0; + else + lines[i].args[1] = 2; + break; case 411: //Stop plane movement lines[i].args[0] = tag; break; diff --git a/src/p_spec.c b/src/p_spec.c index 723b71b9b..66071d9c6 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2284,6 +2284,18 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) EV_DoCeiling(line->args[0], line, moveCeilingByDistance); break; + case 408: // Set flats + { + TAG_ITER_SECTORS(line->args[0], secnum) + { + if (line->args[1] != 1) + sectors[secnum].floorpic = line->frontsector->floorpic; + if (line->args[1] != 0) + sectors[secnum].ceilingpic = line->frontsector->ceilingpic; + } + break; + } + case 409: // Change tagged sectors' tag // (formerly "Change calling sectors' tag", but behavior was changed) { From 2da5b54e7383bb4017d310bd3d18f85cb1177b86 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 27 Jun 2021 12:21:26 +0200 Subject: [PATCH 089/377] Now that set flats linedef exists, simplify set heights linedef --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 18 ++++----------- src/p_ceilng.c | 24 +++++++------------- src/p_floor.c | 6 ++--- src/p_setup.c | 4 ++-- src/p_spec.c | 4 ++-- 5 files changed, 19 insertions(+), 37 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 0e110cfb6..abe50c1b5 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2434,23 +2434,15 @@ udmf } arg1 { - title = "Set heights?"; - type = 12; - enum - { - 1 = "Floor"; - 2 = "Ceiling"; - } + title = "Affected planes"; + type = 11; + enum = "floorceiling"; } arg2 { title = "Set flats?"; - type = 12; - enum - { - 1 = "Floor"; - 2 = "Ceiling"; - } + type = 11; + enum = "noyes"; } } diff --git a/src/p_ceilng.c b/src/p_ceilng.c index b64d496fb..ed385be33 100644 --- a/src/p_ceilng.c +++ b/src/p_ceilng.c @@ -273,27 +273,19 @@ INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type) case instantMoveCeilingByFrontSector: ceiling->speed = INT32_MAX/2; - if (lines->args[1] & 2) - { - if (line->frontsector->ceilingheight >= sec->ceilingheight) // Move up - { - ceiling->direction = 1; - ceiling->topheight = line->frontsector->ceilingheight; - } - else // Move down - { - ceiling->direction = -1; - ceiling->bottomheight = line->frontsector->ceilingheight; - } - } - else + if (line->frontsector->ceilingheight >= sec->ceilingheight) // Move up { ceiling->direction = 1; - ceiling->topheight = sec->ceilingheight; + ceiling->topheight = line->frontsector->ceilingheight; + } + else // Move down + { + ceiling->direction = -1; + ceiling->bottomheight = line->frontsector->ceilingheight; } // If flag is set, change ceiling texture after moving - ceiling->texture = (line->args[2] & 2) ? line->frontsector->ceilingpic : -1; + ceiling->texture = line->args[2] ? line->frontsector->ceilingpic : -1; break; case moveCeilingByDistance: diff --git a/src/p_floor.c b/src/p_floor.c index e388657cf..eebb9366e 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -1796,11 +1796,9 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype) dofloor->floordestheight = P_FindLowestFloorSurrounding(sec); break; - // Linedef executor command, linetype 101. - // Front sector floor = destination height. case instantMoveFloorByFrontSector: dofloor->speed = INT32_MAX/2; // as above, "instant" is one tic - dofloor->floordestheight = (line->args[1] & 1) ? line->frontsector->floorheight : sec->floorheight; + dofloor->floordestheight = line->frontsector->floorheight; if (dofloor->floordestheight >= sec->floorheight) dofloor->direction = 1; // up @@ -1808,7 +1806,7 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype) dofloor->direction = -1; // down // If flag is set, change floor texture after moving - dofloor->texture = (line->args[2] & 1) ? line->frontsector->floorpic : -1; + dofloor->texture = line->args[2] ? line->frontsector->floorpic : -1; break; case moveFloorByFrontSector: diff --git a/src/p_setup.c b/src/p_setup.c index 56c3ed78b..2b03fe173 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3548,8 +3548,8 @@ static void P_ConvertBinaryMap(void) case 400: //Set tagged sector's floor height/texture case 401: //Set tagged sector's ceiling height/texture lines[i].args[0] = tag; - lines[i].args[1] = lines[i].special - 399; - lines[i].args[2] = (lines[i].flags & ML_NOCLIMB) ? 0 : lines[i].special - 399; + lines[i].args[1] = lines[i].special - 400; + lines[i].args[2] = !!(lines[i].flags & ML_NOCLIMB); lines[i].special = 400; break; case 403: //Move tagged sector's floor diff --git a/src/p_spec.c b/src/p_spec.c index 66071d9c6..a3fdbe629 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2234,9 +2234,9 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) switch (line->special) { case 400: // Set tagged sector's heights/flats - if (line->args[1] & 1 || line->args[2] & 1) + if (line->args[1] != 1) EV_DoFloor(line->args[0], line, instantMoveFloorByFrontSector); - if (line->args[1] & 2 || line->args[2] & 2) + if (line->args[1] != 0) EV_DoCeiling(line->args[0], line, instantMoveCeilingByFrontSector); break; From ac5eb1518dc161619f405b1cae978b382e034da7 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 27 Jun 2021 12:36:46 +0200 Subject: [PATCH 090/377] Add floor/ceiling/both enum --- src/p_setup.c | 14 +++++++------- src/p_spec.c | 28 ++++++++++++++-------------- src/p_spec.h | 7 +++++++ 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 2b03fe173..46397dafb 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3093,7 +3093,7 @@ static void P_ConvertBinaryMap(void) case 54: //Continuous floor mover case 55: //Continuous ceiling mover lines[i].args[0] = tag; - lines[i].args[1] = (lines[i].special == 53) ? 2 : lines[i].special - 54; + lines[i].args[1] = (lines[i].special == 53) ? TMP_BOTH : lines[i].special - 54; lines[i].args[2] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; lines[i].args[3] = lines[i].args[2]; lines[i].args[4] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; @@ -3104,7 +3104,7 @@ static void P_ConvertBinaryMap(void) case 57: //Continuous two-speed floor mover case 58: //Continuous two-speed ceiling mover lines[i].args[0] = tag; - lines[i].args[1] = (lines[i].special == 56) ? 2 : lines[i].special - 57; + lines[i].args[1] = (lines[i].special == 56) ? TMP_BOTH : lines[i].special - 57; lines[i].args[2] = abs(lines[i].dx) >> FRACBITS; lines[i].args[3] = abs(lines[i].dy) >> FRACBITS; lines[i].args[4] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; @@ -3564,7 +3564,7 @@ static void P_ConvertBinaryMap(void) case 405: //Move floor according to front texture offsets case 407: //Move ceiling according to front texture offsets lines[i].args[0] = tag; - lines[i].args[1] = (lines[i].special == 405) ? 0 : 1; + lines[i].args[1] = (lines[i].special == 405) ? TMP_FLOOR : TMP_CEILING; lines[i].args[2] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; lines[i].args[3] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[4] = !!(lines[i].flags & ML_NOCLIMB); @@ -3578,11 +3578,11 @@ static void P_ConvertBinaryMap(void) lines[i].special = 0; } else if (lines[i].flags & ML_NOCLIMB) - lines[i].args[1] = 1; + lines[i].args[1] = TMP_CEILING; else if (lines[i].flags & ML_EFFECT4) - lines[i].args[1] = 0; + lines[i].args[1] = TMP_FLOOR; else - lines[i].args[1] = 2; + lines[i].args[1] = TMP_BOTH; break; case 411: //Stop plane movement lines[i].args[0] = tag; @@ -3598,7 +3598,7 @@ static void P_ConvertBinaryMap(void) case 430: //Crush floor once case 431: //Crush floor and ceiling once lines[i].args[0] = tag; - lines[i].args[1] = (lines[i].special == 429) ? 1 : ((lines[i].special == 430) ? 0 : 2); + lines[i].args[1] = (lines[i].special == 429) ? TMP_CEILING : ((lines[i].special == 430) ? TMP_FLOOR : TMP_BOTH); if (lines[i].special == 430 || lines[i].flags & ML_EFFECT4) { lines[i].args[2] = abs(lines[i].dx) >> FRACBITS; diff --git a/src/p_spec.c b/src/p_spec.c index a3fdbe629..9987a7c6f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2234,9 +2234,9 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) switch (line->special) { case 400: // Set tagged sector's heights/flats - if (line->args[1] != 1) + if (line->args[1] != TMP_CEILING) EV_DoFloor(line->args[0], line, instantMoveFloorByFrontSector); - if (line->args[1] != 0) + if (line->args[1] != TMP_FLOOR) EV_DoCeiling(line->args[0], line, instantMoveCeilingByFrontSector); break; @@ -2271,16 +2271,16 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; case 403: // Move planes by front sector - if (line->args[1] != 1) + if (line->args[1] != TMP_CEILING) EV_DoFloor(line->args[0], line, moveFloorByFrontSector); - if (line->args[1] != 0) + if (line->args[1] != TMP_FLOOR) EV_DoCeiling(line->args[0], line, moveCeilingByFrontSector); break; case 405: // Move planes by distance - if (line->args[1] != 1) + if (line->args[1] != TMP_CEILING) EV_DoFloor(line->args[0], line, moveFloorByDistance); - if (line->args[1] != 0) + if (line->args[1] != TMP_FLOOR) EV_DoCeiling(line->args[0], line, moveCeilingByDistance); break; @@ -2288,9 +2288,9 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) { TAG_ITER_SECTORS(line->args[0], secnum) { - if (line->args[1] != 1) + if (line->args[1] != TMP_CEILING) sectors[secnum].floorpic = line->frontsector->floorpic; - if (line->args[1] != 0) + if (line->args[1] != TMP_FLOOR) sectors[secnum].ceilingpic = line->frontsector->ceilingpic; } break; @@ -2883,9 +2883,9 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; case 429: // Crush planes once - if (line->args[1] == 0) + if (line->args[1] == TMP_FLOOR) EV_DoFloor(line->args[0], line, crushFloorOnce); - else if (line->args[1] == 1) + else if (line->args[1] == TMP_CEILING) EV_DoCrush(line->args[0], line, crushCeilOnce); else EV_DoCrush(line->args[0], line, crushBothOnce); @@ -6340,9 +6340,9 @@ void P_SpawnSpecials(boolean fromnetsave) case 53: // Continuous plane movement (slowdown) if (lines[i].backsector) { - if (lines[i].args[1] != 1) + if (lines[i].args[1] != TMP_CEILING) EV_DoFloor(lines[i].args[0], &lines[i], bounceFloor); - if (lines[i].args[1] != 0) + if (lines[i].args[1] != TMP_FLOOR) EV_DoCeiling(lines[i].args[0], &lines[i], bounceCeiling); } break; @@ -6350,9 +6350,9 @@ void P_SpawnSpecials(boolean fromnetsave) case 56: // Continuous plane movement (constant) if (lines[i].backsector) { - if (lines[i].args[1] != 1) + if (lines[i].args[1] != TMP_CEILING) EV_DoFloor(lines[i].args[0], &lines[i], bounceFloorCrush); - if (lines[i].args[1] != 0) + if (lines[i].args[1] != TMP_FLOOR) EV_DoCeiling(lines[i].args[0], &lines[i], bounceCeilingCrush); } break; diff --git a/src/p_spec.h b/src/p_spec.h index 921af714e..642f7fadf 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -102,6 +102,13 @@ typedef enum TMFL_SPLAT = 1<<1, } textmapfoflaserflags_t; +typedef enum +{ + TMP_FLOOR = 0, + TMP_CEILING = 1, + TMP_BOTH = 2, +} textmapplanes_t; + // GETSECSPECIAL (specialval, section) // // Pulls out the special # from a particular section. From 09bcc918c5a41786ce4407345e9e99ea1941959d Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 27 Jun 2021 17:14:34 +0200 Subject: [PATCH 091/377] Fix alpha for rising and intangible FOFs --- src/p_spec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index a3c356194..6f66cb4a8 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6664,7 +6664,7 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags |= FF_CUTLEVEL; } - P_AddFakeFloorsByLine(i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); P_AddRaiseThinker(lines[i].frontsector, lines[i].args[0], lines[i].args[4] << FRACBITS, ceilingtop, ceilingbottom, !!(lines[i].args[5] & TMFR_REVERSE), !!(lines[i].args[5] & TMFR_SPINDASH)); break; } @@ -6711,7 +6711,7 @@ void P_SpawnSpecials(boolean fromnetsave) if (lines[i].args[2] & TMFA_SPLAT) ffloorflags |= FF_SPLAT; - P_AddFakeFloorsByLine(i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); break; case 223: // FOF (intangible, invisible) - for combining specials in a sector From b0a762a45e710b111c756c5fbf466309fa712e71 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 27 Jun 2021 17:49:00 +0200 Subject: [PATCH 092/377] Add missing null checks after P_AddFakeFloor calls --- src/p_spec.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/p_spec.c b/src/p_spec.c index 6f66cb4a8..0b1b8e90f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6776,6 +6776,8 @@ void P_SpawnSpecials(boolean fromnetsave) TAG_ITER_SECTORS(lines[i].args[0], s) { ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], ffloorflags, secthinkers); + if (!fflr) + continue; fflr->busttype = busttype; fflr->specialflags = bustflags; fflr->busttag = lines[i].args[4]; @@ -6790,6 +6792,8 @@ void P_SpawnSpecials(boolean fromnetsave) TAG_ITER_SECTORS(lines[i].args[0], s) { ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, 0xff, ffloorflags, secthinkers); + if (!fflr) + continue; fflr->sinkspeed = abs(lines[i].args[2]) << (FRACBITS - 1); fflr->friction = abs(lines[i].args[3]) << (FRACBITS - 6); } @@ -6807,6 +6811,8 @@ void P_SpawnSpecials(boolean fromnetsave) TAG_ITER_SECTORS(lines[i].args[0], s) { ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], lines[i].args[2], secthinkers); + if (!fflr) + continue; if (!udmf) // Ugly backwards compatibility stuff { if (lines[i].args[2] & FF_QUICKSAND) From 06e06a1cb652e0df572067b4c54d82ec2f4214f6 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 27 Jun 2021 18:45:56 +0200 Subject: [PATCH 093/377] Replicate old hack in binary maps: Translucent FOFs set to full opacity cut cyan pixels --- src/p_setup.c | 49 +++++++++++++++++++++++++++++++++++++++++-------- src/p_spec.c | 2 +- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index b0488dbbb..c88aa02f5 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3104,17 +3104,21 @@ static void P_ConvertBinaryMap(void) lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; else lines[i].args[1] = 128; + + //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels + if (lines[i].args[1] == 256) + lines[i].args[2] |= TMFA_SPLAT; } else lines[i].args[1] = 255; //Appearance if (lines[i].special == 105) - lines[i].args[2] = TMFA_NOPLANES|TMFA_NOSIDES; + lines[i].args[2] |= TMFA_NOPLANES|TMFA_NOSIDES; else if (lines[i].special == 104) - lines[i].args[2] = TMFA_NOSIDES; + lines[i].args[2] |= TMFA_NOSIDES; else if (lines[i].special == 103) - lines[i].args[2] = TMFA_NOPLANES; + lines[i].args[2] |= TMFA_NOPLANES; if (lines[i].special != 100 && (lines[i].special != 104 || !(lines[i].flags & ML_NOCLIMB))) lines[i].args[2] |= TMFA_NOSHADE; if (lines[i].flags & ML_EFFECT6) @@ -3145,6 +3149,10 @@ static void P_ConvertBinaryMap(void) lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; else lines[i].args[1] = 128; + + //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels + if (lines[i].args[1] == 256) + lines[i].args[2] |= TMFW_SPLAT; } //No sides? @@ -3187,15 +3195,19 @@ static void P_ConvertBinaryMap(void) lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; else lines[i].args[1] = 128; + + //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels + if (lines[i].args[1] == 256) + lines[i].args[2] |= TMFA_SPLAT; } else lines[i].args[1] = 255; //Appearance if (lines[i].special == 142 || lines[i].special == 145) - lines[i].args[2] = TMFA_NOSIDES; + lines[i].args[2] |= TMFA_NOSIDES; else if (lines[i].special == 146) - lines[i].args[2] = TMFA_NOPLANES; + lines[i].args[2] |= TMFA_NOPLANES; if (lines[i].special != 146 && (lines[i].flags & ML_NOCLIMB)) lines[i].args[2] |= TMFA_NOSHADE; if (lines[i].flags & ML_EFFECT6) @@ -3256,6 +3268,10 @@ static void P_ConvertBinaryMap(void) lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; else lines[i].args[1] = 128; + + //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels + if (lines[i].args[1] == 256) + lines[i].args[3] |= TMFC_SPLAT; } else lines[i].args[1] = 255; @@ -3298,15 +3314,19 @@ static void P_ConvertBinaryMap(void) lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; else lines[i].args[1] = 128; + + //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels + if (lines[i].args[1] == 256) + lines[i].args[2] |= TMFA_SPLAT; } else lines[i].args[1] = 255; //Appearance if (lines[i].special == 193) - lines[i].args[2] = TMFA_NOPLANES|TMFA_NOSIDES; + lines[i].args[2] |= TMFA_NOPLANES|TMFA_NOSIDES; if (lines[i].special >= 194) - lines[i].args[2] = TMFA_INSIDES; + lines[i].args[2] |= TMFA_INSIDES; if (lines[i].special != 190 && (lines[i].special <= 193 || lines[i].flags & ML_NOCLIMB)) lines[i].args[2] |= TMFA_NOSHADE; if (lines[i].flags & ML_EFFECT6) @@ -3354,6 +3374,10 @@ static void P_ConvertBinaryMap(void) lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; else lines[i].args[1] = 128; + + //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels + if (lines[i].args[1] == 256) + lines[i].args[2] |= TMFA_SPLAT; } else lines[i].args[1] = 255; @@ -3411,6 +3435,10 @@ static void P_ConvertBinaryMap(void) lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; else lines[i].args[1] = 128; + + //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels + if (lines[i].args[1] == 256) + lines[i].args[3] |= TMFB_SPLAT; } else lines[i].args[1] = 255; @@ -3459,7 +3487,8 @@ static void P_ConvertBinaryMap(void) //Flags if (lines[i].flags & ML_EFFECT1) lines[i].args[2] = TMFL_NOBOSSES; - if (lines[i].flags & ML_EFFECT6) + //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels + if (lines[i].flags & ML_EFFECT6 || lines[i].args[1] == 256) lines[i].args[2] = TMFL_SPLAT; break; @@ -3478,6 +3507,10 @@ static void P_ConvertBinaryMap(void) lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; else lines[i].args[1] = 128; + + //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels + if (lines[i].args[1] == 256) + lines[i].args[2] |= FF_SPLAT; } else lines[i].args[1] = 255; diff --git a/src/p_spec.c b/src/p_spec.c index 0b1b8e90f..ae144307e 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5635,7 +5635,7 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, I } fflr->alpha = max(0, min(0xff, alpha)); - if (fflr->alpha < 0xff) + if (fflr->alpha < 0xff || flags & FF_SPLAT) { fflr->flags |= FF_TRANSLUCENT; fflr->spawnflags = fflr->flags; From 977887f4566d0bb7d580cb23bc9a319c0c181262 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 30 Jun 2021 23:50:54 +0200 Subject: [PATCH 094/377] Adapt scroller linedefs to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 93 +++++++++++ extras/conf/udb/Includes/SRB222_misc.cfg | 21 +++ src/p_setup.c | 86 ++++++++++ src/p_spec.c | 166 ++++++------------- src/p_spec.h | 26 +++ 5 files changed, 279 insertions(+), 113 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index abe50c1b5..f67372e88 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2731,6 +2731,99 @@ udmf } } + scroll + { + title = "Wall and Plane Scrolling"; + + 500 + { + title = "Scroll Walls"; + prefix = "(500)"; + arg0 + { + title = "Side"; + type = 11; + enum = "frontbackboth"; + } + arg1 + { + title = "Horizontal speed"; + } + arg2 + { + title = "Vertical speed"; + } + } + + 502 + { + title = "Scroll Walls Remotely"; + prefix = "(502)"; + arg0 + { + title = "Linedef tag"; + type = 15; + } + arg1 + { + title = "Side"; + type = 11; + enum = "frontbackboth"; + } + arg2 + { + title = "Horizontal speed"; + } + arg3 + { + title = "Vertical speed"; + } + arg4 + { + title = "Type"; + type = 11; + enum = "scrolltype"; + } + } + + 510 + { + title = "Scroll Planes"; + prefix = "(510)"; + arg0 + { + title = "Sector tag"; + type = 13; + } + arg1 + { + title = "Affected planes"; + type = 11; + enum = "floorceiling"; + } + arg2 + { + title = "Scroll/Carry?"; + type = 11; + enum = "scrollcarry"; + } + arg3 + { + title = "Base speed"; + } + arg4 + { + title = "Type"; + type = 26; + enum = "scrolltype"; + flags + { + 4 = "Exclusive"; + } + } + } + } + light { 606 diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 1fa98a212..8a4bc29e2 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -437,6 +437,13 @@ enums 2 = "Back"; } + frontbackboth + { + 0 = "Front"; + 1 = "Back"; + 2 = "Front and back"; + } + tangibility { 1 = "Intangible from top"; @@ -451,6 +458,20 @@ enums 1 = "Ceiling"; 2 = "Both"; } + + scrollcarry + { + 0 = "Scroll and carry"; + 1 = "Scroll"; + 2 = "Carry"; + } + + scrolltype + { + 0 = "Regular"; + 1 = "Accelerative"; + 2 = "Displacement"; + } } //Default things filters diff --git a/src/p_setup.c b/src/p_setup.c index 46397dafb..9bc87af94 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3659,6 +3659,92 @@ static void P_ConvertBinaryMap(void) case 456: //Stop fading colormap lines[i].args[0] = Tag_FGet(&lines[i].tags); break; + case 500: //Scroll front wall left + case 501: //Scroll front wall right + lines[i].args[0] = 0; + lines[i].args[1] = (lines[i].special == 500) ? -1 : 1; + lines[i].args[2] = 0; + lines[i].special = 500; + break; + case 502: //Scroll tagged wall + case 503: //Scroll tagged wall (accelerative) + case 504: //Scroll tagged wall (displacement) + lines[i].args[0] = tag; + if (lines[i].flags & ML_EFFECT3) + { + if (lines[i].sidenum[1] == 0xffff) + { + CONS_Debug(DBG_GAMELOGIC, "Line special %d (line #%s) missing back side!\n", lines[i].special, sizeu1(i)); + lines[i].special = 0; + break; + } + lines[i].args[1] = 1; + } + else + lines[i].args[1] = 0; + if (lines[i].flags & ML_EFFECT2) + { + lines[i].args[2] = lines[i].dx >> (FRACBITS + SCROLL_SHIFT); + lines[i].args[3] = lines[i].dy >> (FRACBITS + SCROLL_SHIFT); + } + else + { + lines[i].args[2] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[3] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + } + lines[i].args[4] = lines[i].special - 502; + lines[i].special = 502; + break; + case 505: //Scroll front wall by front side offsets + case 506: //Scroll front wall by back side offsets + case 507: //Scroll back wall by front side offsets + case 508: //Scroll back wall by back side offsets + lines[i].args[0] = lines[i].special >= 507; + if (lines[i].special % 2 == 0) + { + if (lines[i].sidenum[1] == 0xffff) + { + CONS_Debug(DBG_GAMELOGIC, "Line special %d (line #%s) missing back side!\n", lines[i].special, sizeu1(i)); + lines[i].special = 0; + break; + } + lines[i].args[1] = sides[lines[i].sidenum[1]].rowoffset >> FRACBITS; + lines[i].args[2] = sides[lines[i].sidenum[1]].textureoffset >> FRACBITS; + } + else + { + lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[2] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + } + lines[i].special = 500; + break; + case 510: //Scroll floor texture + case 511: //Scroll floor texture (accelerative) + case 512: //Scroll floor texture (displacement) + case 513: //Scroll ceiling texture + case 514: //Scroll ceiling texture (accelerative) + case 515: //Scroll ceiling texture (displacement) + case 520: //Carry objects on floor + case 521: //Carry objects on floor (accelerative) + case 522: //Carry objects on floor (displacement) + case 523: //Carry objects on ceiling + case 524: //Carry objects on ceiling (accelerative) + case 525: //Carry objects on ceiling (displacement) + case 530: //Scroll floor texture and carry objects + case 531: //Scroll floor texture and carry objects (accelerative) + case 532: //Scroll floor texture and carry objects (displacement) + case 533: //Scroll ceiling texture and carry objects + case 534: //Scroll ceiling texture and carry objects (accelerative) + case 535: //Scroll ceiling texture and carry objects (displacement) + lines[i].args[0] = tag; + lines[i].args[1] = ((lines[i].special % 10) < 3) ? TMP_FLOOR : TMP_CEILING; + lines[i].args[2] = ((lines[i].special - 510)/10 + 1) % 3; + lines[i].args[3] = R_PointToDist2(lines[i].v2->x, lines[i].v2->y, lines[i].v1->x, lines[i].v1->y) >> FRACBITS; + lines[i].args[4] = (lines[i].special % 10) % 3; + if (lines[i].args[2] != 1 && lines[i].flags & ML_NOCLIMB) + lines[i].args[4] |= 4; + lines[i].special = 510; + break; case 606: //Colormap lines[i].args[0] = Tag_FGet(&lines[i].tags); break; diff --git a/src/p_spec.c b/src/p_spec.c index 9987a7c6f..cf6dc5fdd 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -51,9 +51,6 @@ mobj_t *skyboxmo[2]; // current skybox mobjs: 0 = viewpoint, 1 = centerpoint mobj_t *skyboxviewpnts[16]; // array of MT_SKYBOX viewpoint mobjs mobj_t *skyboxcenterpnts[16]; // array of MT_SKYBOX centerpoint mobjs -// Amount (dx, dy) vector linedef is shifted right to get scroll amount -#define SCROLL_SHIFT 5 - /** Animated texture descriptor * This keeps track of an animated texture or an animated flat. * \sa P_UpdateSpecials, P_InitPicAnims, animdef_t @@ -7596,6 +7593,24 @@ static void Add_Scroller(INT32 type, fixed_t dx, fixed_t dy, INT32 control, INT3 P_AddThinker(THINK_MAIN, &s->thinker); } +static void P_SpawnPlaneScroller(line_t *l, fixed_t dx, fixed_t dy, INT32 control, INT32 affectee, INT32 accel, INT32 exclusive) +{ + if (l->args[1] != TMP_CEILING) + { + if (l->args[2] != TMS_SCROLLONLY) + Add_Scroller(sc_carry, FixedMul(dx, CARRYFACTOR), FixedMul(dy, CARRYFACTOR), control, affectee, accel, exclusive); + if (l->args[2] != TMS_CARRYONLY) + Add_Scroller(sc_floor, -dx, dy, control, affectee, accel, exclusive); + } + if (l->args[1] != TMP_FLOOR) + { + if (l->args[2] != TMS_SCROLLONLY) + Add_Scroller(sc_carry_ceiling, FixedMul(dx, CARRYFACTOR), FixedMul(dy, CARRYFACTOR), control, affectee, accel, exclusive); + if (l->args[2] != TMS_CARRYONLY) + Add_Scroller(sc_ceiling, -dx, dy, control, affectee, accel, exclusive); + } +} + /** Initializes the scrollers. * * \todo Get rid of all the magic numbers. @@ -7605,140 +7620,65 @@ static void P_SpawnScrollers(void) { size_t i; line_t *l = lines; - mtag_t tag; for (i = 0; i < numlines; i++, l++) { - fixed_t dx = l->dx >> SCROLL_SHIFT; // direction and speed of scrolling - fixed_t dy = l->dy >> SCROLL_SHIFT; INT32 control = -1, accel = 0; // no control sector or acceleration - INT32 special = l->special; - tag = Tag_FGet(&l->tags); - - // These types are same as the ones they get set to except that the - // first side's sector's heights cause scrolling when they change, and - // this linedef controls the direction and speed of the scrolling. The - // most complicated linedef since donuts, but powerful :) - - if (special == 515 || special == 512 || special == 522 || special == 532 || special == 504) // displacement scrollers + if (l->special == 502 || l->special == 510) { - special -= 2; - control = (INT32)(sides[*l->sidenum].sector - sectors); - } - else if (special == 514 || special == 511 || special == 521 || special == 531 || special == 503) // accelerative scrollers - { - special--; - accel = 1; - control = (INT32)(sides[*l->sidenum].sector - sectors); - } - else if (special == 535 || special == 525) // displacement scrollers - { - special -= 2; - control = (INT32)(sides[*l->sidenum].sector - sectors); - } - else if (special == 534 || special == 524) // accelerative scrollers - { - accel = 1; - special--; - control = (INT32)(sides[*l->sidenum].sector - sectors); + if ((l->args[4] & TMST_TYPEMASK) != TMST_REGULAR) + control = (INT32)(sides[*l->sidenum].sector - sectors); + if ((l->args[4] & TMST_TYPEMASK) == TMST_ACCELERATIVE) + accel = 1; } - switch (special) + switch (l->special) { register INT32 s; - case 513: // scroll effect ceiling - case 533: // scroll and carry objects on ceiling - TAG_ITER_SECTORS(tag, s) - Add_Scroller(sc_ceiling, -dx, dy, control, s, accel, l->flags & ML_NOCLIMB); - if (special != 533) - break; - /* FALLTHRU */ + case 510: // plane scroller + { + fixed_t length = R_PointToDist2(l->v2->x, l->v2->y, l->v1->x, l->v1->y); + fixed_t speed = l->args[3] << FRACBITS; + fixed_t dx = FixedMul(FixedDiv(l->dx, length), speed) >> SCROLL_SHIFT; + fixed_t dy = FixedMul(FixedDiv(l->dy, length), speed) >> SCROLL_SHIFT; - case 523: // carry objects on ceiling - dx = FixedMul(dx, CARRYFACTOR); - dy = FixedMul(dy, CARRYFACTOR); - TAG_ITER_SECTORS(tag, s) - Add_Scroller(sc_carry_ceiling, dx, dy, control, s, accel, l->flags & ML_NOCLIMB); - break; - - case 510: // scroll effect floor - case 530: // scroll and carry objects on floor - TAG_ITER_SECTORS(tag, s) - Add_Scroller(sc_floor, -dx, dy, control, s, accel, l->flags & ML_NOCLIMB); - if (special != 530) - break; - /* FALLTHRU */ - - case 520: // carry objects on floor - dx = FixedMul(dx, CARRYFACTOR); - dy = FixedMul(dy, CARRYFACTOR); - TAG_ITER_SECTORS(tag, s) - Add_Scroller(sc_carry, dx, dy, control, s, accel, l->flags & ML_NOCLIMB); + if (l->args[0] == 0) + P_SpawnPlaneScroller(l, dx, dy, control, (INT32)(l->frontsector - sectors), accel, l->args[4] & TMST_EXCLUSIVE); + else + { + TAG_ITER_SECTORS(l->args[0], s) + P_SpawnPlaneScroller(l, dx, dy, control, s, accel, l->args[4] & TMST_EXCLUSIVE); + } break; + } // scroll wall according to linedef // (same direction and speed as scrolling floors) case 502: { - TAG_ITER_LINES(tag, s) + TAG_ITER_LINES(l->args[0], s) if (s != (INT32)i) { - if (l->flags & ML_EFFECT2) // use texture offsets instead - { - dx = sides[l->sidenum[0]].textureoffset; - dy = sides[l->sidenum[0]].rowoffset; - } - if (l->flags & ML_EFFECT3) - { - if (lines[s].sidenum[1] != 0xffff) - Add_Scroller(sc_side, dx, dy, control, lines[s].sidenum[1], accel, 0); - } - else - Add_Scroller(sc_side, dx, dy, control, lines[s].sidenum[0], accel, 0); + if (l->args[1] != TMSD_BACK) + Add_Scroller(sc_side, l->args[2] << FRACBITS, l->args[3] << FRACBITS, control, lines[s].sidenum[0], accel, 0); + if (l->args[1] != TMSD_FRONT && lines[s].sidenum[1] != 0xffff) + Add_Scroller(sc_side, l->args[2] << FRACBITS, l->args[3] << FRACBITS, control, lines[s].sidenum[1], accel, 0); } break; } - case 505: - s = lines[i].sidenum[0]; - Add_Scroller(sc_side, -sides[s].textureoffset, sides[s].rowoffset, -1, s, accel, 0); - break; - - case 506: - s = lines[i].sidenum[1]; - - if (s != 0xffff) - Add_Scroller(sc_side, -sides[s].textureoffset, sides[s].rowoffset, -1, lines[i].sidenum[0], accel, 0); - else - CONS_Debug(DBG_GAMELOGIC, "Line special 506 (line #%s) missing back side!\n", sizeu1(i)); - break; - - case 507: - s = lines[i].sidenum[0]; - - if (lines[i].sidenum[1] != 0xffff) - Add_Scroller(sc_side, -sides[s].textureoffset, sides[s].rowoffset, -1, lines[i].sidenum[1], accel, 0); - else - CONS_Debug(DBG_GAMELOGIC, "Line special 507 (line #%s) missing back side!\n", sizeu1(i)); - break; - - case 508: - s = lines[i].sidenum[1]; - - if (s != 0xffff) - Add_Scroller(sc_side, -sides[s].textureoffset, sides[s].rowoffset, -1, s, accel, 0); - else - CONS_Debug(DBG_GAMELOGIC, "Line special 508 (line #%s) missing back side!\n", sizeu1(i)); - break; - - case 500: // scroll first side - Add_Scroller(sc_side, FRACUNIT, 0, -1, lines[i].sidenum[0], accel, 0); - break; - - case 501: // jff 1/30/98 2-way scroll - Add_Scroller(sc_side, -FRACUNIT, 0, -1, lines[i].sidenum[0], accel, 0); + case 500: + if (l->args[0] != TMSD_BACK) + Add_Scroller(sc_side, -l->args[1] << FRACBITS, l->args[2] << FRACBITS, -1, l->sidenum[0], accel, 0); + if (l->args[0] != TMSD_FRONT) + { + if (l->sidenum[1] != 0xffff) + Add_Scroller(sc_side, -l->args[1] << FRACBITS, l->args[2] << FRACBITS, -1, l->sidenum[1], accel, 0); + else + CONS_Debug(DBG_GAMELOGIC, "Line special 500 (line #%s) missing back side!\n", sizeu1(i)); + } break; } } diff --git a/src/p_spec.h b/src/p_spec.h index 642f7fadf..aa9f85bc8 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -21,6 +21,9 @@ extern mobj_t *skyboxmo[2]; // current skybox mobjs: 0 = viewpoint, 1 = centerpo extern mobj_t *skyboxviewpnts[16]; // array of MT_SKYBOX viewpoint mobjs extern mobj_t *skyboxcenterpnts[16]; // array of MT_SKYBOX centerpoint mobjs +// Amount (dx, dy) vector linedef is shifted right to get scroll amount +#define SCROLL_SHIFT 5 + //FOF flags typedef enum { @@ -109,6 +112,29 @@ typedef enum TMP_BOTH = 2, } textmapplanes_t; +typedef enum +{ + TMSD_FRONT = 0, + TMSD_BACK = 1, + TMSD_FRONTBACK = 2, +} textmapsides_t; + +typedef enum +{ + TMS_SCROLLCARRY = 0, + TMS_SCROLLONLY = 1, + TMS_CARRYONLY = 2, +} textmapscroll_t; + +typedef enum +{ + TMST_REGULAR = 0, + TMST_ACCELERATIVE = 1, + TMST_DISPLACEMENT = 2, + TMST_TYPEMASK = 3, + TMST_EXCLUSIVE = 4, +} textmapscrolltype_t; + // GETSECSPECIAL (specialval, section) // // Pulls out the special # from a particular section. From 052bfe130ce5f96ae29f12f2e7183800c863d638 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 1 Jul 2021 00:47:56 +0200 Subject: [PATCH 095/377] Make exclusive scrolling the default --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 2 +- src/p_setup.c | 4 ++-- src/p_spec.c | 4 ++-- src/p_spec.h | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index f67372e88..449691cdc 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2818,7 +2818,7 @@ udmf enum = "scrolltype"; flags { - 4 = "Exclusive"; + 4 = "Non-exclusive"; } } } diff --git a/src/p_setup.c b/src/p_setup.c index 9bc87af94..575998d20 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3741,8 +3741,8 @@ static void P_ConvertBinaryMap(void) lines[i].args[2] = ((lines[i].special - 510)/10 + 1) % 3; lines[i].args[3] = R_PointToDist2(lines[i].v2->x, lines[i].v2->y, lines[i].v1->x, lines[i].v1->y) >> FRACBITS; lines[i].args[4] = (lines[i].special % 10) % 3; - if (lines[i].args[2] != 1 && lines[i].flags & ML_NOCLIMB) - lines[i].args[4] |= 4; + if (lines[i].args[2] != TMS_SCROLLONLY && !(lines[i].flags & ML_NOCLIMB)) + lines[i].args[4] |= TMST_NONEXCLUSIVE; lines[i].special = 510; break; case 606: //Colormap diff --git a/src/p_spec.c b/src/p_spec.c index cf6dc5fdd..32b935959 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7645,11 +7645,11 @@ static void P_SpawnScrollers(void) fixed_t dy = FixedMul(FixedDiv(l->dy, length), speed) >> SCROLL_SHIFT; if (l->args[0] == 0) - P_SpawnPlaneScroller(l, dx, dy, control, (INT32)(l->frontsector - sectors), accel, l->args[4] & TMST_EXCLUSIVE); + P_SpawnPlaneScroller(l, dx, dy, control, (INT32)(l->frontsector - sectors), accel, l->args[4] & TMST_NONEXCLUSIVE); else { TAG_ITER_SECTORS(l->args[0], s) - P_SpawnPlaneScroller(l, dx, dy, control, s, accel, l->args[4] & TMST_EXCLUSIVE); + P_SpawnPlaneScroller(l, dx, dy, control, s, accel, l->args[4] & TMST_NONEXCLUSIVE); } break; } diff --git a/src/p_spec.h b/src/p_spec.h index aa9f85bc8..c2b6953cf 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -132,7 +132,7 @@ typedef enum TMST_ACCELERATIVE = 1, TMST_DISPLACEMENT = 2, TMST_TYPEMASK = 3, - TMST_EXCLUSIVE = 4, + TMST_NONEXCLUSIVE = 4, } textmapscrolltype_t; // GETSECSPECIAL (specialval, section) From d0888c4ac5e4b9d58f48f3b8c209bd561ab76e16 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 1 Jul 2021 18:48:18 +0200 Subject: [PATCH 096/377] Split wind/current and point push/pull thinkers --- src/p_saveg.c | 38 +++++++++++++++++++++ src/p_spec.c | 92 +++++++++++++++++++++++++++++++-------------------- src/p_spec.h | 13 +++++++- src/p_tick.c | 8 ++++- 4 files changed, 114 insertions(+), 37 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index bf28b11a5..ea81e9853 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1483,6 +1483,7 @@ typedef enum tc_scroll, tc_friction, tc_pusher, + tc_pointpusher, tc_laserflash, tc_lightfade, tc_executor, @@ -2141,6 +2142,19 @@ static inline void SavePusherThinker(const thinker_t *th, const UINT8 type) WRITEINT32(save_p, ht->slider); } +static inline void SavePointPusherThinker(const thinker_t* th, const UINT8 type) +{ + const pointpusher_t *ht = (const void *)th; + WRITEUINT8(save_p, type); + WRITEINT32(save_p, ht->magnitude); + WRITEINT32(save_p, ht->radius); + WRITEINT32(save_p, ht->x); + WRITEINT32(save_p, ht->y); + WRITEINT32(save_p, ht->z); + WRITEINT32(save_p, ht->affectee); + WRITEINT32(save_p, ht->exclusive); +} + static void SaveLaserThinker(const thinker_t *th, const UINT8 type) { const laserthink_t *ht = (const void *)th; @@ -2460,6 +2474,11 @@ static void P_NetArchiveThinkers(void) SavePusherThinker(th, tc_pusher); continue; } + else if (th->function.acp1 == (actionf_p1)T_PointPusher) + { + SavePointPusherThinker(th, tc_pointpusher); + continue; + } else if (th->function.acp1 == (actionf_p1)T_BounceCheese) { SaveBounceCheeseThinker(th, tc_bouncecheese); @@ -3282,6 +3301,21 @@ static thinker_t* LoadPusherThinker(actionf_p1 thinker) return &ht->thinker; } +static thinker_t* LoadPointPusherThinker(actionf_p1 thinker) +{ + pointpusher_t *ht = Z_Malloc(sizeof(*ht), PU_LEVSPEC, NULL); + ht->thinker.function.acp1 = thinker; + ht->magnitude = READINT32(save_p); + ht->radius = READINT32(save_p); + ht->x = READINT32(save_p); + ht->y = READINT32(save_p); + ht->z = READINT32(save_p); + ht->affectee = READINT32(save_p); + ht->exclusive = READINT32(save_p); + ht->source = P_GetPushThing(ht->affectee); + return &ht->thinker; +} + static inline thinker_t* LoadLaserThinker(actionf_p1 thinker) { laserthink_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); @@ -3744,6 +3778,10 @@ static void P_NetUnArchiveThinkers(void) th = LoadPusherThinker((actionf_p1)T_Pusher); break; + case tc_pointpusher: + th = LoadPointPusherThinker((actionf_p1)T_PointPusher); + break; + default: I_Error("P_UnarchiveSpecials: Unknown tclass %d in savegame", tclass); } diff --git a/src/p_spec.c b/src/p_spec.c index 32b935959..e05f1f066 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -98,6 +98,7 @@ typedef struct static void P_SpawnScrollers(void); static void P_SpawnFriction(void); static void P_SpawnPushers(void); +static void Add_PointPusher(INT32 magnitude, mobj_t *source, INT32 affectee, INT32 exclusive); static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t *source, INT32 affectee, INT32 referrer, INT32 exclusive, INT32 slider); //SoM: 3/9/2000 static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finalize); @@ -5608,6 +5609,13 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, I if (p->affectee == (INT32)sec2num) Add_Pusher(p->type, p->x_mag<y_mag<source, (INT32)(sec-sectors), p->affectee, p->exclusive, p->slider); } + else if (th->function.acp1 == (actionf_p1)T_PointPusher) + { + pointpusher_t *pp = (pointpusher_t *)th; + + if (pp->affectee == (INT32)sec2num) + Add_PointPusher(pp->magnitude, pp->source, pp->affectee, pp->exclusive); + } if(secthinkers) i++; else th = th->next; @@ -6169,6 +6177,8 @@ void P_SpawnSpecials(boolean fromnetsave) secthinkers[((friction_t *)th)->affectee].count++; else if (th->function.acp1 == (actionf_p1)T_Pusher) secthinkers[((pusher_t *)th)->affectee].count++; + else if (th->function.acp1 == (actionf_p1)T_PointPusher) + secthinkers[((pointpusher_t *)th)->affectee].count++; } // Allocate each list, and then zero the count so we can use it to track @@ -6189,6 +6199,8 @@ void P_SpawnSpecials(boolean fromnetsave) secnum = ((friction_t *)th)->affectee; else if (th->function.acp1 == (actionf_p1)T_Pusher) secnum = ((pusher_t *)th)->affectee; + else if (th->function.acp1 == (actionf_p1)T_PointPusher) + secnum = ((pointpusher_t *)th)->affectee; if (secnum != (size_t)-1) secthinkers[secnum].thinkers[secthinkers[secnum].count++] = th; @@ -8497,6 +8509,26 @@ static void P_SpawnFriction(void) #define PUSH_FACTOR 7 +static void Add_PointPusher(INT32 magnitude, mobj_t *source, INT32 affectee, INT32 exclusive) +{ + pointpusher_t *p = Z_Calloc(sizeof * p, PU_LEVSPEC, NULL); + + p->thinker.function.acp1 = (actionf_p1)T_PointPusher; + p->source = source; + p->magnitude = magnitude; + p->exclusive = exclusive; + + if (source) // point source exist? + { + p->radius = AngleFixed(source->angle); + p->x = p->source->x; + p->y = p->source->y; + p->z = p->source->z; + } + p->affectee = affectee; + P_AddThinker(THINK_MAIN, &p->thinker); +} + /** Adds a pusher. * * \param type Type of push/pull effect. @@ -8535,12 +8567,7 @@ static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t * p->magnitude = P_AproxDistance(p->x_mag,p->y_mag); if (source) // point source exist? { - // where force goes to zero - if (type == p_push) - p->radius = AngleFixed(source->angle); - else - p->radius = (p->magnitude)<<(FRACBITS+1); - + p->radius = (p->magnitude)<<(FRACBITS+1); p->x = p->source->x; p->y = p->source->y; p->z = p->source->z; @@ -8549,10 +8576,9 @@ static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t * P_AddThinker(THINK_MAIN, &p->thinker); } - // PIT_PushThing determines the angle and magnitude of the effect. // The object's x and y momentum values are changed. -static pusher_t *tmpusher; // pusher structure for blockmap searches +static pointpusher_t *tmpusher; // pointpusher structure for blockmap searches /** Applies a point pusher/puller to a thing. * @@ -8702,6 +8728,28 @@ static inline boolean PIT_PushThing(mobj_t *thing) return true; } +void T_PointPusher(pointpusher_t *p) +{ + INT32 xl, xh, yl, yh, bx, by; + + // Seek out all pushable things within the force radius of this + // point pusher. Crosses sectors, so use blockmap. + + tmpusher = p; // MT_PUSH/MT_PULL point source + tmbbox[BOXTOP] = p->y + p->radius; + tmbbox[BOXBOTTOM] = p->y - p->radius; + tmbbox[BOXRIGHT] = p->x + p->radius; + tmbbox[BOXLEFT] = p->x - p->radius; + + xl = (unsigned)(tmbbox[BOXLEFT] - bmaporgx - MAXRADIUS)>>MAPBLOCKSHIFT; + xh = (unsigned)(tmbbox[BOXRIGHT] - bmaporgx + MAXRADIUS)>>MAPBLOCKSHIFT; + yl = (unsigned)(tmbbox[BOXBOTTOM] - bmaporgy - MAXRADIUS)>>MAPBLOCKSHIFT; + yh = (unsigned)(tmbbox[BOXTOP] - bmaporgy + MAXRADIUS)>>MAPBLOCKSHIFT; + for (bx = xl; bx <= xh; bx++) + for (by = yl; by <= yh; by++) + P_BlockThingsIterator(bx, by, PIT_PushThing); +} + /** Applies a pusher to all affected objects. * * \param p Thinker for the pusher effect. @@ -8714,9 +8762,6 @@ void T_Pusher(pusher_t *p) mobj_t *thing; msecnode_t *node; INT32 xspeed = 0,yspeed = 0; - INT32 xl, xh, yl, yh, bx, by; - INT32 radius; - //INT32 ht = 0; boolean inFOF; boolean touching; boolean moved; @@ -8756,29 +8801,6 @@ void T_Pusher(pusher_t *p) // // In Phase II, you can apply these effects to Things other than players. - if (p->type == p_push) - { - - // Seek out all pushable things within the force radius of this - // point pusher. Crosses sectors, so use blockmap. - - tmpusher = p; // MT_PUSH/MT_PULL point source - radius = p->radius; // where force goes to zero - tmbbox[BOXTOP] = p->y + radius; - tmbbox[BOXBOTTOM] = p->y - radius; - tmbbox[BOXRIGHT] = p->x + radius; - tmbbox[BOXLEFT] = p->x - radius; - - xl = (unsigned)(tmbbox[BOXLEFT] - bmaporgx - MAXRADIUS)>>MAPBLOCKSHIFT; - xh = (unsigned)(tmbbox[BOXRIGHT] - bmaporgx + MAXRADIUS)>>MAPBLOCKSHIFT; - yl = (unsigned)(tmbbox[BOXBOTTOM] - bmaporgy - MAXRADIUS)>>MAPBLOCKSHIFT; - yh = (unsigned)(tmbbox[BOXTOP] - bmaporgy + MAXRADIUS)>>MAPBLOCKSHIFT; - for (bx = xl; bx <= xh; bx++) - for (by = yl; by <= yh; by++) - P_BlockThingsIterator(bx,by, PIT_PushThing); - return; - } - // constant pushers p_wind and p_current node = sec->touching_thinglist; // things touching this sector for (; node; node = node->m_thinglist_next) @@ -9022,7 +9044,7 @@ static void P_SpawnPushers(void) { thing = P_GetPushThing(s); if (thing) // No MT_P* means no effect - Add_Pusher(p_push, l->dx, l->dy, thing, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); + Add_PointPusher(P_AproxDistance(l->dx >> FRACBITS, l->dy >> FRACBITS), thing, s, l->flags & ML_NOCLIMB); } break; case 545: // current up diff --git a/src/p_spec.h b/src/p_spec.h index c2b6953cf..10e7c9368 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -632,7 +632,6 @@ void T_Friction(friction_t *f); typedef enum { - p_push, ///< Point pusher or puller. p_wind, ///< Wind. p_current, ///< Current. p_upcurrent, ///< Upwards current. @@ -661,6 +660,17 @@ typedef struct INT32 slider; /// < Should the player go into an uncontrollable slide? } pusher_t; +typedef struct +{ + thinker_t thinker; ///< Thinker structure for push/pull effect. + mobj_t *source; ///< Point source. + INT32 magnitude; ///< Vector strength. + INT32 radius; ///< Effective radius. + INT32 x, y, z; ///< Point source. + INT32 affectee; ///< Number of affected sector. + INT32 exclusive; /// < Once this affect has been applied to a mobj, no other pushers may affect it. +} pointpusher_t; + // Model for disappearing/reappearing FOFs typedef struct { @@ -719,6 +729,7 @@ void T_FadeColormap(fadecolormap_t *d); // Prototype functions for pushers void T_Pusher(pusher_t *p); +void T_PointPusher(pointpusher_t *p); mobj_t *P_GetPushThing(UINT32 s); // Plane displacement diff --git a/src/p_tick.c b/src/p_tick.c index d7357eb82..1a8242db7 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -66,7 +66,8 @@ void Command_Numthinkers_f(void) "\t2: P_NullPrecipThinker\n" "\t3: T_Friction\n" "\t4: T_Pusher\n" - "\t5: P_RemoveThinkerDelayed\n"); + "\t5: T_PointPusher\n" + "\t6: P_RemoveThinkerDelayed\n"); return; } @@ -103,6 +104,11 @@ void Command_Numthinkers_f(void) CONS_Printf(M_GetText("Number of %s: "), "T_Pusher"); break; case 5: + start = end = THINK_MAIN; + action = (actionf_p1)T_PointPusher; + CONS_Printf(M_GetText("Number of %s: "), "T_PointPusher"); + break; + case 6: action = (actionf_p1)P_RemoveThinkerDelayed; CONS_Printf(M_GetText("Number of %s: "), "P_RemoveThinkerDelayed"); break; From 6f698b30650bc60fa7a17faee9c3df059447be22 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 1 Jul 2021 20:05:23 +0200 Subject: [PATCH 097/377] Refactor wind/current thinker --- src/p_saveg.c | 21 +++----- src/p_spec.c | 143 +++++++++++++++----------------------------------- src/p_spec.h | 21 +++----- 3 files changed, 55 insertions(+), 130 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index ea81e9853..567f75c4e 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2128,13 +2128,9 @@ static inline void SavePusherThinker(const thinker_t *th, const UINT8 type) const pusher_t *ht = (const void *)th; WRITEUINT8(save_p, type); WRITEUINT8(save_p, ht->type); - WRITEINT32(save_p, ht->x_mag); - WRITEINT32(save_p, ht->y_mag); - WRITEINT32(save_p, ht->magnitude); - WRITEINT32(save_p, ht->radius); - WRITEINT32(save_p, ht->x); - WRITEINT32(save_p, ht->y); - WRITEINT32(save_p, ht->z); + WRITEFIXED(save_p, ht->x_mag); + WRITEFIXED(save_p, ht->y_mag); + WRITEFIXED(save_p, ht->z_mag); WRITEINT32(save_p, ht->affectee); WRITEUINT8(save_p, ht->roverpusher); WRITEINT32(save_p, ht->referrer); @@ -3285,19 +3281,14 @@ static thinker_t* LoadPusherThinker(actionf_p1 thinker) pusher_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; ht->type = READUINT8(save_p); - ht->x_mag = READINT32(save_p); - ht->y_mag = READINT32(save_p); - ht->magnitude = READINT32(save_p); - ht->radius = READINT32(save_p); - ht->x = READINT32(save_p); - ht->y = READINT32(save_p); - ht->z = READINT32(save_p); + ht->x_mag = READFIXED(save_p); + ht->y_mag = READFIXED(save_p); + ht->z_mag = READFIXED(save_p); ht->affectee = READINT32(save_p); ht->roverpusher = READUINT8(save_p); ht->referrer = READINT32(save_p); ht->exclusive = READINT32(save_p); ht->slider = READINT32(save_p); - ht->source = P_GetPushThing(ht->affectee); return &ht->thinker; } diff --git a/src/p_spec.c b/src/p_spec.c index e05f1f066..232e1d0e7 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -99,7 +99,7 @@ static void P_SpawnScrollers(void); static void P_SpawnFriction(void); static void P_SpawnPushers(void); static void Add_PointPusher(INT32 magnitude, mobj_t *source, INT32 affectee, INT32 exclusive); -static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t *source, INT32 affectee, INT32 referrer, INT32 exclusive, INT32 slider); //SoM: 3/9/2000 +static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, fixed_t z_mag, INT32 affectee, INT32 referrer, INT32 exclusive, INT32 slider); //SoM: 3/9/2000 static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finalize); #define P_RemoveFakeFloorFader(l) P_ResetFakeFloorFader(l, NULL, false); @@ -5499,6 +5499,7 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, I thinker_t *th; friction_t *f; pusher_t *p; + pointpusher_t *pp; size_t sec2num; size_t i; @@ -5607,11 +5608,11 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, I p = (pusher_t *)th; if (p->affectee == (INT32)sec2num) - Add_Pusher(p->type, p->x_mag<y_mag<source, (INT32)(sec-sectors), p->affectee, p->exclusive, p->slider); + Add_Pusher(p->type, p->x_mag, p->y_mag, p->z_mag, (INT32)(sec-sectors), p->affectee, p->exclusive, p->slider); } else if (th->function.acp1 == (actionf_p1)T_PointPusher) { - pointpusher_t *pp = (pointpusher_t *)th; + pp = (pointpusher_t *)th; if (pp->affectee == (INT32)sec2num) Add_PointPusher(pp->magnitude, pp->source, pp->affectee, pp->exclusive); @@ -8534,20 +8535,20 @@ static void Add_PointPusher(INT32 magnitude, mobj_t *source, INT32 affectee, INT * \param type Type of push/pull effect. * \param x_mag X magnitude. * \param y_mag Y magnitude. - * \param source For a point pusher/puller, the source object. + * \param z_mag Z magnitude. * \param affectee Target sector. * \param referrer What sector set it * \sa T_Pusher, P_GetPushThing, P_SpawnPushers */ -static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t *source, INT32 affectee, INT32 referrer, INT32 exclusive, INT32 slider) +static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, fixed_t z_mag, INT32 affectee, INT32 referrer, INT32 exclusive, INT32 slider) { pusher_t *p = Z_Calloc(sizeof *p, PU_LEVSPEC, NULL); p->thinker.function.acp1 = (actionf_p1)T_Pusher; - p->source = source; p->type = type; - p->x_mag = x_mag>>FRACBITS; - p->y_mag = y_mag>>FRACBITS; + p->x_mag = x_mag; + p->y_mag = y_mag; + p->z_mag = z_mag; p->exclusive = exclusive; p->slider = slider; @@ -8559,19 +8560,6 @@ static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t * else p->roverpusher = false; - // "The right triangle of the square of the length of the hypotenuse is equal to the sum of the squares of the lengths of the other two sides." - // "Bah! Stupid brains! Don't you know anything besides the Pythagorean Theorem?" - Earthworm Jim - if (type == p_downcurrent || type == p_upcurrent || type == p_upwind || type == p_downwind) - p->magnitude = P_AproxDistance(p->x_mag,p->y_mag)<<(FRACBITS-PUSH_FACTOR); - else - p->magnitude = P_AproxDistance(p->x_mag,p->y_mag); - if (source) // point source exist? - { - p->radius = (p->magnitude)<<(FRACBITS+1); - p->x = p->source->x; - p->y = p->source->y; - p->z = p->source->z; - } p->affectee = affectee; P_AddThinker(THINK_MAIN, &p->thinker); } @@ -8761,12 +8749,15 @@ void T_Pusher(pusher_t *p) sector_t *sec, *referrer = NULL; mobj_t *thing; msecnode_t *node; - INT32 xspeed = 0,yspeed = 0; + fixed_t x_mag, y_mag, z_mag; + fixed_t xspeed = 0, yspeed = 0, zspeed = 0; boolean inFOF; boolean touching; boolean moved; - xspeed = yspeed = 0; + x_mag = p->x_mag >> PUSH_FACTOR; + y_mag = p->y_mag >> PUSH_FACTOR; + z_mag = p->z_mag >> PUSH_FACTOR; sec = sectors + p->affectee; @@ -8875,84 +8866,36 @@ void T_Pusher(pusher_t *p) if (!touching && !inFOF) // Object is out of range of effect continue; - if (p->type == p_wind) + if (inFOF || (p->type == p_current && touching)) { - if (touching) // on ground - { - xspeed = (p->x_mag)>>1; // half force - yspeed = (p->y_mag)>>1; - moved = true; - } - else if (inFOF) - { - xspeed = (p->x_mag); // full force - yspeed = (p->y_mag); - moved = true; - } + xspeed = x_mag; // full force + yspeed = y_mag; + zspeed = z_mag; + moved = true; } - else if (p->type == p_upwind) + else if (p->type == p_wind && touching) { - if (touching) // on ground - { - thing->momz += (p->magnitude)>>1; - moved = true; - } - else if (inFOF) - { - thing->momz += p->magnitude; - moved = true; - } - } - else if (p->type == p_downwind) - { - if (touching) // on ground - { - thing->momz -= (p->magnitude)>>1; - moved = true; - } - else if (inFOF) - { - thing->momz -= p->magnitude; - moved = true; - } - } - else // p_current - { - if (!touching && !inFOF) // Not in water at all - xspeed = yspeed = 0; // no force - else // underwater / touching water - { - if (p->type == p_upcurrent) - thing->momz += p->magnitude; - else if (p->type == p_downcurrent) - thing->momz -= p->magnitude; - else - { - xspeed = p->x_mag; // full force - yspeed = p->y_mag; - } - moved = true; - } + xspeed = x_mag>>1; // half force + yspeed = y_mag>>1; + zspeed = z_mag>>1; + moved = true; } - if (p->type != p_downcurrent && p->type != p_upcurrent - && p->type != p_upwind && p->type != p_downwind) + thing->momx += xspeed; + thing->momy += yspeed; + thing->momz += xspeed; + if (thing->player) { - thing->momx += xspeed<<(FRACBITS-PUSH_FACTOR); - thing->momy += yspeed<<(FRACBITS-PUSH_FACTOR); - if (thing->player) - { - thing->player->cmomx += xspeed<<(FRACBITS-PUSH_FACTOR); - thing->player->cmomy += yspeed<<(FRACBITS-PUSH_FACTOR); - thing->player->cmomx = FixedMul(thing->player->cmomx, ORIG_FRICTION); - thing->player->cmomy = FixedMul(thing->player->cmomy, ORIG_FRICTION); - } - - // Tumbleweeds bounce a bit... - if (thing->type == MT_LITTLETUMBLEWEED || thing->type == MT_BIGTUMBLEWEED) - thing->momz += P_AproxDistance(xspeed<<(FRACBITS-PUSH_FACTOR), yspeed<<(FRACBITS-PUSH_FACTOR)) >> 2; + thing->player->cmomx += xspeed; + thing->player->cmomy += yspeed; + thing->player->cmomx = FixedMul(thing->player->cmomx, ORIG_FRICTION); + thing->player->cmomy = FixedMul(thing->player->cmomy, ORIG_FRICTION); } + // Tumbleweeds bounce a bit... + if (thing->type == MT_LITTLETUMBLEWEED || thing->type == MT_BIGTUMBLEWEED) + thing->momz += P_AproxDistance(xspeed, yspeed) >> 2; + if (moved) { if (p->slider && thing->player) @@ -8964,7 +8907,7 @@ void T_Pusher(pusher_t *p) thing->player->pflags |= jumped; thing->player->pflags |= PF_SLIDING; - thing->angle = R_PointToAngle2 (0, 0, xspeed<<(FRACBITS-PUSH_FACTOR), yspeed<<(FRACBITS-PUSH_FACTOR)); + thing->angle = R_PointToAngle2(0, 0, xspeed, yspeed); if (!demoplayback || P_ControlStyle(thing->player) == CS_LMAOGALOG) { @@ -9033,11 +8976,11 @@ static void P_SpawnPushers(void) { case 541: // wind TAG_ITER_SECTORS(tag, s) - Add_Pusher(p_wind, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); + Add_Pusher(p_wind, l->dx, l->dy, 0, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); break; case 544: // current TAG_ITER_SECTORS(tag, s) - Add_Pusher(p_current, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); + Add_Pusher(p_current, l->dx, l->dy, 0, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); break; case 547: // push/pull TAG_ITER_SECTORS(tag, s) @@ -9049,19 +8992,19 @@ static void P_SpawnPushers(void) break; case 545: // current up TAG_ITER_SECTORS(tag, s) - Add_Pusher(p_upcurrent, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); + Add_Pusher(p_current, 0, 0, P_AproxDistance(l->dx, l->dy), s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); break; case 546: // current down TAG_ITER_SECTORS(tag, s) - Add_Pusher(p_downcurrent, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); + Add_Pusher(p_current, 0, 0, -P_AproxDistance(l->dx, l->dy), s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); break; case 542: // wind up TAG_ITER_SECTORS(tag, s) - Add_Pusher(p_upwind, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); + Add_Pusher(p_wind, 0, 0, P_AproxDistance(l->dx, l->dy), s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); break; case 543: // wind down TAG_ITER_SECTORS(tag, s) - Add_Pusher(p_downwind, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); + Add_Pusher(p_wind, 0, 0, -P_AproxDistance(l->dx, l->dy), s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); break; } } diff --git a/src/p_spec.h b/src/p_spec.h index 10e7c9368..98cb68161 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -634,27 +634,18 @@ typedef enum { p_wind, ///< Wind. p_current, ///< Current. - p_upcurrent, ///< Upwards current. - p_downcurrent, ///< Downwards current. - p_upwind, ///< Upwards wind. - p_downwind ///< Downwards wind. } pushertype_e; // Model for pushers for push/pull effects typedef struct { - thinker_t thinker; ///< Thinker structure for push/pull effect. - /** Types of push/pull effects. - */ - pushertype_e type; ///< Type of push/pull effect. - mobj_t *source; ///< Point source if point pusher/puller. - INT32 x_mag; ///< X strength. - INT32 y_mag; ///< Y strength. - INT32 magnitude; ///< Vector strength for point pusher/puller. - INT32 radius; ///< Effective radius for point pusher/puller. - INT32 x, y, z; ///< Point source if point pusher/puller. + thinker_t thinker; ///< Thinker structure for pusher effect. + pushertype_e type; ///< Type of pusher effect. + fixed_t x_mag; ///< X strength. + fixed_t y_mag; ///< Y strength. + fixed_t z_mag; ///< Z strength. INT32 affectee; ///< Number of affected sector. - UINT8 roverpusher; ///< flag for whether pusher originated from a FOF or not + UINT8 roverpusher; ///< flag for whether pusher originated from a FOF or not INT32 referrer; ///< If roverpusher == true, then this will contain the sector # of the control sector where the effect was applied. INT32 exclusive; /// < Once this affect has been applied to a mobj, no other pushers may affect it. INT32 slider; /// < Should the player go into an uncontrollable slide? From dcba011cf3adcb64972ba690b7d7b741e229a4d6 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 1 Jul 2021 20:35:13 +0200 Subject: [PATCH 098/377] Adapt wind/current linedefs to UDMF --- src/p_setup.c | 26 ++++++++++++++++++++++++++ src/p_spec.c | 35 +++++++++++------------------------ src/p_spec.h | 6 ++++++ 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 575998d20..1dd172f1a 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3745,6 +3745,32 @@ static void P_ConvertBinaryMap(void) lines[i].args[4] |= TMST_NONEXCLUSIVE; lines[i].special = 510; break; + case 541: //Wind + case 542: //Upwards wind + case 543: //Downwards wind + case 544: //Current + case 545: //Upwards current + case 546: //Downwards current + lines[i].args[0] = tag; + switch ((lines[i].special - 541) % 3) + { + case 0: + lines[i].args[1] = R_PointToDist2(lines[i].v2->x, lines[i].v2->y, lines[i].v1->x, lines[i].v1->y) >> FRACBITS; + break; + case 1: + lines[i].args[2] = R_PointToDist2(lines[i].v2->x, lines[i].v2->y, lines[i].v1->x, lines[i].v1->y) >> FRACBITS; + break; + case 2: + lines[i].args[2] = -R_PointToDist2(lines[i].v2->x, lines[i].v2->y, lines[i].v1->x, lines[i].v1->y) >> FRACBITS; + break; + } + lines[i].args[3] = (lines[i].special >= 544) ? p_current : p_wind; + if (lines[i].flags & ML_EFFECT4) + lines[i].args[4] |= TMPF_SLIDE; + if (!(lines[i].flags & ML_NOCLIMB)) + lines[i].args[4] |= TMPF_NONEXCLUSIVE; + lines[i].special = 541; + break; case 606: //Colormap lines[i].args[0] = Tag_FGet(&lines[i].tags); break; diff --git a/src/p_spec.c b/src/p_spec.c index 232e1d0e7..c200bb6dd 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -8883,7 +8883,7 @@ void T_Pusher(pusher_t *p) thing->momx += xspeed; thing->momy += yspeed; - thing->momz += xspeed; + thing->momz += zspeed; if (thing->player) { thing->player->cmomx += xspeed; @@ -8974,14 +8974,17 @@ static void P_SpawnPushers(void) tag = Tag_FGet(&l->tags); switch (l->special) { - case 541: // wind - TAG_ITER_SECTORS(tag, s) - Add_Pusher(p_wind, l->dx, l->dy, 0, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); - break; - case 544: // current - TAG_ITER_SECTORS(tag, s) - Add_Pusher(p_current, l->dx, l->dy, 0, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); + case 541: // wind/current + { + fixed_t length = R_PointToDist2(l->v2->x, l->v2->y, l->v1->x, l->v1->y); + fixed_t hspeed = l->args[1] << FRACBITS; + fixed_t dx = FixedMul(FixedDiv(l->dx, length), hspeed); + fixed_t dy = FixedMul(FixedDiv(l->dy, length), hspeed); + + TAG_ITER_SECTORS(l->args[0], s) + Add_Pusher(l->args[3], dx, dy, l->args[2] << FRACBITS, s, -1, !(l->args[4] & TMPF_NONEXCLUSIVE), !!(l->args[4] & TMPF_SLIDE)); break; + } case 547: // push/pull TAG_ITER_SECTORS(tag, s) { @@ -8990,22 +8993,6 @@ static void P_SpawnPushers(void) Add_PointPusher(P_AproxDistance(l->dx >> FRACBITS, l->dy >> FRACBITS), thing, s, l->flags & ML_NOCLIMB); } break; - case 545: // current up - TAG_ITER_SECTORS(tag, s) - Add_Pusher(p_current, 0, 0, P_AproxDistance(l->dx, l->dy), s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); - break; - case 546: // current down - TAG_ITER_SECTORS(tag, s) - Add_Pusher(p_current, 0, 0, -P_AproxDistance(l->dx, l->dy), s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); - break; - case 542: // wind up - TAG_ITER_SECTORS(tag, s) - Add_Pusher(p_wind, 0, 0, P_AproxDistance(l->dx, l->dy), s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); - break; - case 543: // wind down - TAG_ITER_SECTORS(tag, s) - Add_Pusher(p_wind, 0, 0, -P_AproxDistance(l->dx, l->dy), s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); - break; } } } diff --git a/src/p_spec.h b/src/p_spec.h index 98cb68161..f08ee2f1f 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -135,6 +135,12 @@ typedef enum TMST_NONEXCLUSIVE = 4, } textmapscrolltype_t; +typedef enum +{ + TMPF_SLIDE = 1, + TMPF_NONEXCLUSIVE = 1<<1, +} textmappusherflags_t; + // GETSECSPECIAL (specialval, section) // // Pulls out the special # from a particular section. From 3542e2205d7a7e939485635975d22e6895419c73 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 1 Jul 2021 20:47:07 +0200 Subject: [PATCH 099/377] Add wind/current linedef to UDB config --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 39 ++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 449691cdc..e4841fd6e 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2822,6 +2822,45 @@ udmf } } } + + 541 + { + title = "Wind/Current"; + prefix = "(541)"; + arg0 + { + title = "Sector tag"; + type = 13; + } + arg1 + { + title = "Horizontal speed"; + } + arg2 + { + title = "Vertical speed"; + } + arg3 + { + title = "Type"; + type = 11; + enum + { + 0 = "Wind"; + 1 = "Current"; + } + } + arg4 + { + title = "Flags"; + type = 12; + flags + { + 1 = "Slide"; + 2 = "Non-exclusive"; + } + } + } } light From 9718674d3ba1a49d8f6a317c5c0acfafb24eff3c Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 1 Jul 2021 20:59:46 +0200 Subject: [PATCH 100/377] Check for sector type in T_PointPusher --- src/p_spec.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/p_spec.c b/src/p_spec.c index c200bb6dd..bf86fc7e2 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -8719,6 +8719,13 @@ static inline boolean PIT_PushThing(mobj_t *thing) void T_PointPusher(pointpusher_t *p) { INT32 xl, xh, yl, yh, bx, by; + sector_t *sec = sectors + p->affectee; + + // Be sure the special sector type is still turned on. If so, proceed. + // Else, bail out; the sector type has been changed on us. + + if (GETSECSPECIAL(sec->special, 3) != 2) + return; // Seek out all pushable things within the force radius of this // point pusher. Crosses sectors, so use blockmap. From 64b67bcfe06231bc26275df176848fea1cd5b3e8 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 1 Jul 2021 23:15:13 +0200 Subject: [PATCH 101/377] Wind/current linedef: Apply to front sector if tag = 0 --- src/p_spec.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index bf86fc7e2..a9262782f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -8988,8 +8988,13 @@ static void P_SpawnPushers(void) fixed_t dx = FixedMul(FixedDiv(l->dx, length), hspeed); fixed_t dy = FixedMul(FixedDiv(l->dy, length), hspeed); - TAG_ITER_SECTORS(l->args[0], s) - Add_Pusher(l->args[3], dx, dy, l->args[2] << FRACBITS, s, -1, !(l->args[4] & TMPF_NONEXCLUSIVE), !!(l->args[4] & TMPF_SLIDE)); + if (l->args[0] == 0) + Add_Pusher(l->args[3], dx, dy, l->args[2] << FRACBITS, (INT32)(l->frontsector - sectors), -1, !(l->args[4] & TMPF_NONEXCLUSIVE), !!(l->args[4] & TMPF_SLIDE)); + else + { + TAG_ITER_SECTORS(l->args[0], s) + Add_Pusher(l->args[3], dx, dy, l->args[2] << FRACBITS, s, -1, !(l->args[4] & TMPF_NONEXCLUSIVE), !!(l->args[4] & TMPF_SLIDE)); + } break; } case 547: // push/pull From 6dfca597c526222aacaee9d2f7629ef3ea473554 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 1 Jul 2021 23:16:11 +0200 Subject: [PATCH 102/377] UDB config: Merge scroller and pusher sections --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index e4841fd6e..08a31297a 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2731,9 +2731,9 @@ udmf } } - scroll + scrollpush { - title = "Wall and Plane Scrolling"; + title = "Scrollers and Pushers"; 500 { From 805bafd9369a9af83ed2728c919d78a7c024846c Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 2 Jul 2021 12:51:39 +0200 Subject: [PATCH 103/377] Adapt "change plane scroller direction" linedef type to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 15 +++++++++++++++ src/p_setup.c | 4 ++++ src/p_spec.c | 11 ++++++++--- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 08a31297a..25f53ca9b 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2462,6 +2462,21 @@ udmf enum = "floorceiling"; } } + + 435 + { + title = "Change Plane Scroller Direction"; + prefix = "(435)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Speed"; + } + } } linedefexecplane diff --git a/src/p_setup.c b/src/p_setup.c index 1dd172f1a..ca122fa62 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3611,6 +3611,10 @@ static void P_ConvertBinaryMap(void) } lines[i].special = 429; break; + case 435: //Change plane scroller direction + lines[i].args[0] = tag; + lines[i].args[1] = R_PointToDist2(lines[i].v2->x, lines[i].v2->y, lines[i].v1->x, lines[i].v1->y) >> FRACBITS; + break; case 443: //Call Lua function if (lines[i].text) { diff --git a/src/p_spec.c b/src/p_spec.c index a9262782f..59353e835 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2945,17 +2945,22 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) scroll_t *scroller; thinker_t *th; + fixed_t length = R_PointToDist2(line->v2->x, line->v2->y, line->v1->x, line->v1->y); + fixed_t speed = line->args[1] << FRACBITS; + fixed_t dx = FixedMul(FixedMul(FixedDiv(line->dx, length), speed) >> SCROLL_SHIFT, CARRYFACTOR); + fixed_t dy = FixedMul(FixedMul(FixedDiv(line->dy, length), speed) >> SCROLL_SHIFT, CARRYFACTOR); + for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next) { if (th->function.acp1 != (actionf_p1)T_Scroll) continue; scroller = (scroll_t *)th; - if (!Tag_Find(§ors[scroller->affectee].tags, tag)) + if (!Tag_Find(§ors[scroller->affectee].tags, line->args[0])) continue; - scroller->dx = FixedMul(line->dx>>SCROLL_SHIFT, CARRYFACTOR); - scroller->dy = FixedMul(line->dy>>SCROLL_SHIFT, CARRYFACTOR); + scroller->dx = dx; + scroller->dy = dy; } } break; From 3b1d64703db97046105fd9f220f6942dea93abcf Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 2 Jul 2021 17:18:55 +0200 Subject: [PATCH 104/377] Adapt polyobject door move linedef types to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 51 ++++++++++++++++++++ src/p_setup.c | 8 +++ src/p_spec.c | 22 +++------ 3 files changed, 66 insertions(+), 15 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 25f53ca9b..f97da48cc 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2746,6 +2746,57 @@ udmf } } + linedefexecpoly + { + title = "Linedef Executor (polyobject)"; + + 480 + { + title = "Door Slide"; + prefix = "(480)"; + arg0 + { + title = "PolyObject ID"; + type = 14; + } + arg1 + { + title = "Speed"; + } + arg2 + { + title = "Distance"; + } + arg3 + { + title = "Return delay"; + } + } + 481 + { + title = "Door Swing"; + prefix = "(481)"; + arg0 + { + title = "PolyObject ID"; + type = 14; + } + arg1 + { + title = "Speed"; + } + arg2 + { + title = "Angle distance"; + type = 8; + } + arg3 + { + title = "Return delay"; + } + } + } + scrollpush { title = "Scrollers and Pushers"; diff --git a/src/p_setup.c b/src/p_setup.c index ca122fa62..947ec8a1e 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3663,6 +3663,14 @@ static void P_ConvertBinaryMap(void) case 456: //Stop fading colormap lines[i].args[0] = Tag_FGet(&lines[i].tags); break; + case 480: //Polyobject - door slide + case 481: //Polyobject - door move + lines[i].args[0] = tag; + lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[2] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + if (lines[i].sidenum[1] != 0xffff) + lines[i].args[3] = sides[lines[i].sidenum[1]].textureoffset >> FRACBITS; + break; case 500: //Scroll front wall left case 501: //Scroll front wall right lines[i].args[0] = 0; diff --git a/src/p_spec.c b/src/p_spec.c index 59353e835..e167d454e 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -992,30 +992,22 @@ static boolean PolyDoor(line_t *line) { polydoordata_t pdd; - pdd.polyObjNum = Tag_FGet(&line->tags); // polyobject id + pdd.polyObjNum = line->args[0]; // polyobject id switch(line->special) { case 480: // Polyobj_DoorSlide pdd.doorType = POLY_DOOR_SLIDE; - pdd.speed = sides[line->sidenum[0]].textureoffset / 8; + pdd.speed = line->args[1] << (FRACBITS - 3); pdd.angle = R_PointToAngle2(line->v1->x, line->v1->y, line->v2->x, line->v2->y); // angle of motion - pdd.distance = sides[line->sidenum[0]].rowoffset; - - if (line->sidenum[1] != 0xffff) - pdd.delay = sides[line->sidenum[1]].textureoffset >> FRACBITS; // delay in tics - else - pdd.delay = 0; + pdd.distance = line->args[2] << FRACBITS; + pdd.delay = line->args[3]; // delay in tics break; case 481: // Polyobj_DoorSwing pdd.doorType = POLY_DOOR_SWING; - pdd.speed = sides[line->sidenum[0]].textureoffset >> FRACBITS; // angular speed - pdd.distance = sides[line->sidenum[0]].rowoffset >> FRACBITS; // angular distance - - if (line->sidenum[1] != 0xffff) - pdd.delay = sides[line->sidenum[1]].textureoffset >> FRACBITS; // delay in tics - else - pdd.delay = 0; + pdd.speed = line->args[1]; // angular speed + pdd.distance = line->args[2]; // angular distance + pdd.delay = line->args[3]; // delay in tics break; default: return 0; // ??? From 6e9afabd443197aaae2987c2a77a2d61780795b5 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 4 Jul 2021 12:54:48 +0200 Subject: [PATCH 105/377] Adapt polyobject move and rotate linedef types to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 60 +++++++++++++++++++- src/lua_polyobjlib.c | 7 ++- src/p_polyobj.c | 30 +++++----- src/p_polyobj.h | 21 +++++-- src/p_setup.c | 29 ++++++++++ src/p_spec.c | 41 +++++-------- 6 files changed, 139 insertions(+), 49 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index f97da48cc..b04b5e16a 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2772,6 +2772,7 @@ udmf title = "Return delay"; } } + 481 { title = "Door Swing"; @@ -2787,7 +2788,7 @@ udmf } arg2 { - title = "Angle distance"; + title = "Rotation"; type = 8; } arg3 @@ -2795,6 +2796,63 @@ udmf title = "Return delay"; } } + + 482 + { + title = "Move"; + prefix = "(482)"; + arg0 + { + title = "PolyObject ID"; + type = 14; + } + arg1 + { + title = "Speed"; + } + arg2 + { + title = "Distance"; + } + arg3 + { + title = "Override?"; + type = 11; + enum = "noyes"; + } + } + + 484 + { + title = "Rotate"; + prefix = "(484)"; + arg0 + { + title = "PolyObject ID"; + type = 14; + } + arg1 + { + title = "Speed"; + } + arg2 + { + title = "Rotation"; + type = 8; + } + arg3 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Don't turn others"; + 2 = "Turn players"; + 4 = "Continuous rotation"; + 8 = "Override"; + } + } + } } scrollpush diff --git a/src/lua_polyobjlib.c b/src/lua_polyobjlib.c index 5d76a912d..87dfad7f6 100644 --- a/src/lua_polyobjlib.c +++ b/src/lua_polyobjlib.c @@ -244,13 +244,14 @@ static int lib_polyobj_rotate(lua_State *L) { polyobj_t *po = *((polyobj_t **)luaL_checkudata(L, 1, META_POLYOBJ)); angle_t delta = luaL_checkangle(L, 2); - UINT8 turnthings = (UINT8)luaL_optinteger(L, 3, 0); // don't turn anything by default? (could change this if not desired) - boolean checkmobjs = lua_opttrueboolean(L, 4); + boolean turnplayers = lua_opttrueboolean(L, 3); + boolean turnothers = lua_opttrueboolean(L, 4); + boolean checkmobjs = lua_opttrueboolean(L, 5); NOHUD INLEVEL if (!po) return LUA_ErrInvalid(L, "polyobj_t"); - lua_pushboolean(L, Polyobj_rotate(po, delta, turnthings, checkmobjs)); + lua_pushboolean(L, Polyobj_rotate(po, delta, turnplayers, turnothers, checkmobjs)); return 1; } diff --git a/src/p_polyobj.c b/src/p_polyobj.c index 6431e4624..47327c949 100644 --- a/src/p_polyobj.c +++ b/src/p_polyobj.c @@ -1089,7 +1089,7 @@ static void Polyobj_rotateLine(line_t *ld) } // Causes objects resting on top of the rotating polyobject to 'ride' with its movement. -static void Polyobj_rotateThings(polyobj_t *po, vector2_t origin, angle_t delta, UINT8 turnthings) +static void Polyobj_rotateThings(polyobj_t *po, vector2_t origin, angle_t delta, boolean turnplayers, boolean turnothers) { static INT32 pomovecount = 10000; INT32 x, y; @@ -1151,7 +1151,7 @@ static void Polyobj_rotateThings(polyobj_t *po, vector2_t origin, angle_t delta, Polyobj_slideThing(mo, newxoff, newyoff); - if (turnthings == 2 || (turnthings == 1 && !mo->player)) { + if ((turnplayers && mo->player) || (turnothers && !mo->player)) { mo->angle += delta; if (mo->player) P_SetPlayerAngle(mo->player, (angle_t)(mo->player->angleturn << 16) + delta); @@ -1163,7 +1163,7 @@ static void Polyobj_rotateThings(polyobj_t *po, vector2_t origin, angle_t delta, } // Rotates a polyobject around its start point. -boolean Polyobj_rotate(polyobj_t *po, angle_t delta, UINT8 turnthings, boolean checkmobjs) +boolean Polyobj_rotate(polyobj_t *po, angle_t delta, boolean turnplayers, boolean turnothers, boolean checkmobjs) { size_t i; angle_t angle; @@ -1201,7 +1201,7 @@ boolean Polyobj_rotate(polyobj_t *po, angle_t delta, UINT8 turnthings, boolean c for (i = 0; i < po->numLines; ++i) hitflags |= Polyobj_clipThings(po, po->lines[i]); - Polyobj_rotateThings(po, origin, delta, turnthings); + Polyobj_rotateThings(po, origin, delta, turnplayers, turnothers); } if (hitflags & 2) @@ -1409,7 +1409,7 @@ void Polyobj_MoveOnLoad(polyobj_t *po, angle_t angle, fixed_t x, fixed_t y) fixed_t dx, dy; // first, rotate to the saved angle - Polyobj_rotate(po, angle, false, false); + Polyobj_rotate(po, angle, false, false, false); // determine component distances to translate dx = x - po->spawnSpot.x; @@ -1452,7 +1452,7 @@ void T_PolyObjRotate(polyrotate_t *th) // rotate by 'speed' angle per frame // if distance == -1, this polyobject rotates perpetually - if (Polyobj_rotate(po, th->speed, th->turnobjs, true) && th->distance != -1) + if (Polyobj_rotate(po, th->speed, th->turnobjs & PTF_PLAYERS, th->turnobjs & PTF_OTHERS, true) && th->distance != -1) { INT32 avel = abs(th->speed); @@ -1854,7 +1854,7 @@ void T_PolyDoorSwing(polyswingdoor_t *th) // rotate by 'speed' angle per frame // if distance == -1, this polyobject rotates perpetually - if (Polyobj_rotate(po, th->speed, false, true) && th->distance != -1) + if (Polyobj_rotate(po, th->speed, false, false, true) && th->distance != -1) { INT32 avel = abs(th->speed); @@ -1985,7 +1985,7 @@ void T_PolyObjRotDisplace(polyrotdisplace_t *th) rotangle = FixedMul(th->rotscale, delta); - if (Polyobj_rotate(po, FixedAngle(rotangle), th->turnobjs, true)) + if (Polyobj_rotate(po, FixedAngle(rotangle), th->turnobjs & PTF_PLAYERS, th->turnobjs & PTF_OTHERS, true)) th->oldHeights = newheights; } @@ -2014,7 +2014,7 @@ boolean EV_DoPolyObjRotate(polyrotdata_t *prdata) return false; // check for override if this polyobj already has a thinker - if (po->thinker && !prdata->overRide) + if (po->thinker && !(prdata->flags & TMPR_OVERRIDE)) return false; // create a new thinker @@ -2029,10 +2029,10 @@ boolean EV_DoPolyObjRotate(polyrotdata_t *prdata) // use Hexen-style byte angles for speed and distance th->speed = Polyobj_AngSpeed(prdata->speed * prdata->direction); - if (prdata->distance == 360) // 360 means perpetual + if (prdata->flags & TMPR_CONTINUOUS) th->distance = -1; - else if (prdata->distance == 0) // 0 means 360 degrees - th->distance = 0xffffffff - 1; + else if (prdata->distance == 360) + th->distance = ANGLE_MAX - 1; else th->distance = FixedAngle(prdata->distance*FRACUNIT); @@ -2047,7 +2047,11 @@ boolean EV_DoPolyObjRotate(polyrotdata_t *prdata) oldpo = po; - th->turnobjs = prdata->turnobjs; + th->turnobjs = 0; + if (!(prdata->flags & TMPR_DONTROTATEOTHERS)) + th->turnobjs |= PTF_OTHERS; + if (prdata->flags & TMPR_ROTATEPLAYERS) + th->turnobjs |= PTF_PLAYERS; // apply action to mirroring polyobjects as well start = 0; diff --git a/src/p_polyobj.h b/src/p_polyobj.h index 7c814e0bf..9c8094028 100644 --- a/src/p_polyobj.h +++ b/src/p_polyobj.h @@ -137,7 +137,7 @@ typedef struct polyrotate_s INT32 polyObjNum; // numeric id of polyobject (avoid C pointers here) INT32 speed; // speed of movement per frame INT32 distance; // distance to move - UINT8 turnobjs; // turn objects? 0=no, 1=everything but players, 2=everything + UINT8 turnobjs; // turn objects? PTF_ flags } polyrotate_t; typedef struct polymove_s @@ -247,14 +247,27 @@ typedef struct polyfade_s // Line Activation Data Structures // +typedef enum +{ + TMPR_DONTROTATEOTHERS = 1, + TMPR_ROTATEPLAYERS = 1<<1, + TMPR_CONTINUOUS = 1<<2, + TMPR_OVERRIDE = 1<<3, +} textmappolyrotate_t; + +typedef enum +{ + PTF_PLAYERS = 1, // Turn players with movement + PTF_OTHERS = 1<<1, // Turn other mobjs with movement +} polyturnflags_e; + typedef struct polyrotdata_s { INT32 polyObjNum; // numeric id of polyobject to affect INT32 direction; // direction of rotation INT32 speed; // angular speed INT32 distance; // distance to move - UINT8 turnobjs; // rotate objects being carried? - UINT8 overRide; // if true, will override any action on the object + UINT8 flags; // TMPR_ flags } polyrotdata_t; typedef struct polymovedata_s @@ -337,7 +350,7 @@ typedef struct polyfadedata_s // boolean Polyobj_moveXY(polyobj_t *po, fixed_t x, fixed_t y, boolean checkmobjs); -boolean Polyobj_rotate(polyobj_t *po, angle_t delta, UINT8 turnthings, boolean checkmobjs); +boolean Polyobj_rotate(polyobj_t *po, angle_t delta, boolean turnplayers, boolean turnothers, boolean checkmobjs); polyobj_t *Polyobj_GetForNum(INT32 id); void Polyobj_InitLevel(void); void Polyobj_MoveOnLoad(polyobj_t *po, angle_t angle, fixed_t x, fixed_t y); diff --git a/src/p_setup.c b/src/p_setup.c index 947ec8a1e..7617e863f 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3671,6 +3671,35 @@ static void P_ConvertBinaryMap(void) if (lines[i].sidenum[1] != 0xffff) lines[i].args[3] = sides[lines[i].sidenum[1]].textureoffset >> FRACBITS; break; + case 482: //Polyobject - move + case 483: //Polyobject - move, override + lines[i].args[0] = tag; + lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[2] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[3] = lines[i].special == 483; + lines[i].special = 482; + break; + case 484: //Polyobject - rotate right + case 485: //Polyobject - rotate right, override + case 486: //Polyobject - rotate left + case 487: //Polyobject - rotate left, override + lines[i].args[0] = tag; + lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[2] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + if (lines[i].args[2] == 360) + lines[i].args[3] |= TMPR_CONTINUOUS; + else if (lines[i].args[2] == 0) + lines[i].args[2] = 360; + if (lines[i].special < 486) + lines[i].args[2] *= -1; + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[3] |= TMPR_DONTROTATEOTHERS; + else if (lines[i].flags & ML_EFFECT4) + lines[i].args[3] |= TMPR_ROTATEPLAYERS; + if (lines[i].special % 2 == 1) + lines[i].args[3] |= TMPR_OVERRIDE; + lines[i].special = 484; + break; case 500: //Scroll front wall left case 501: //Scroll front wall right lines[i].args[0] = 0; diff --git a/src/p_spec.c b/src/p_spec.c index e167d454e..6434a55d7 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1016,17 +1016,17 @@ static boolean PolyDoor(line_t *line) return EV_DoPolyDoor(&pdd); } -// Parses arguments for parameterized polyobject move specials +// Parses arguments for parameterized polyobject move special static boolean PolyMove(line_t *line) { polymovedata_t pmd; - pmd.polyObjNum = Tag_FGet(&line->tags); - pmd.speed = sides[line->sidenum[0]].textureoffset / 8; + pmd.polyObjNum = line->args[0]; + pmd.speed = line->args[1] << (FRACBITS - 3); pmd.angle = R_PointToAngle2(line->v1->x, line->v1->y, line->v2->x, line->v2->y); - pmd.distance = sides[line->sidenum[0]].rowoffset; + pmd.distance = line->args[2] << FRACBITS; - pmd.overRide = (line->special == 483); // Polyobj_OR_Move + pmd.overRide = !!line->args[3]; // Polyobj_OR_Move return EV_DoPolyObjMove(&pmd); } @@ -1200,27 +1200,16 @@ static boolean PolyWaypoint(line_t *line) return EV_DoPolyObjWaypoint(&pwd); } -// Parses arguments for parameterized polyobject rotate specials +// Parses arguments for parameterized polyobject rotate special static boolean PolyRotate(line_t *line) { polyrotdata_t prd; - prd.polyObjNum = Tag_FGet(&line->tags); - prd.speed = sides[line->sidenum[0]].textureoffset >> FRACBITS; // angular speed - prd.distance = sides[line->sidenum[0]].rowoffset >> FRACBITS; // angular distance - - // Polyobj_(OR_)RotateRight have dir == -1 - prd.direction = (line->special == 484 || line->special == 485) ? -1 : 1; - - // Polyobj_OR types have override set to true - prd.overRide = (line->special == 485 || line->special == 487); - - if (line->flags & ML_NOCLIMB) - prd.turnobjs = 0; - else if (line->flags & ML_EFFECT4) - prd.turnobjs = 2; - else - prd.turnobjs = 1; + prd.polyObjNum = line->args[0]; + prd.speed = line->args[1]; // angular speed + prd.distance = abs(line->args[2]); // angular distance + prd.direction = (line->args[2] < 0) ? -1 : 1; + prd.flags = line->args[3]; return EV_DoPolyObjRotate(&prd); } @@ -1272,9 +1261,9 @@ static boolean PolyRotDisplace(line_t *line) if (line->flags & ML_NOCLIMB) pdd.turnobjs = 0; else if (line->flags & ML_EFFECT4) - pdd.turnobjs = 2; + pdd.turnobjs = PTF_PLAYERS|PTF_OTHERS; else - pdd.turnobjs = 1; + pdd.turnobjs = PTF_OTHERS; return EV_DoPolyObjRotDisplace(&pdd); } @@ -3906,13 +3895,9 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) PolyDoor(line); break; case 482: // Polyobj_Move - case 483: // Polyobj_OR_Move PolyMove(line); break; case 484: // Polyobj_RotateRight - case 485: // Polyobj_OR_RotateRight - case 486: // Polyobj_RotateLeft - case 487: // Polyobj_OR_RotateLeft PolyRotate(line); break; case 488: // Polyobj_Waypoint From 2cbda0e5ac4d84926499a18f1bc36f19a9c0083e Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 4 Jul 2021 13:20:10 +0200 Subject: [PATCH 106/377] Adapt polyobject waypoint movement linedef to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 40 ++++++++++++++++++++ src/p_setup.c | 15 ++++++++ src/p_spec.c | 23 +++-------- 3 files changed, 60 insertions(+), 18 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index b04b5e16a..5d9f32743 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2853,6 +2853,46 @@ udmf } } } + + 488 + { + title = "Move by Waypoints"; + prefix = "(488)"; + arg0 + { + title = "PolyObject ID"; + type = 14; + } + arg1 + { + title = "Speed"; + } + arg2 + { + title = "Waypoint sequence"; + } + arg3 + { + title = "Return behavior"; + type = 11; + enum + { + 0 = "Don't return"; + 1 = "Return to first waypoint"; + 2 = "Repeat sequence in reverse"; + } + } + arg4 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Move in reverse"; + 2 = "Loop movement"; + } + } + } } scrollpush diff --git a/src/p_setup.c b/src/p_setup.c index 7617e863f..6eef43a60 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3700,6 +3700,21 @@ static void P_ConvertBinaryMap(void) lines[i].args[3] |= TMPR_OVERRIDE; lines[i].special = 484; break; + case 488: //Polyobject - move by waypoints + lines[i].args[0] = tag; + lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[2] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + if (lines[i].flags & ML_EFFECT3) + lines[i].args[3] = PWR_WRAP; + else if (lines[i].flags & ML_EFFECT2) + lines[i].args[3] = PWR_COMEBACK; + else + lines[i].args[3] = PWR_STOP; + if (lines[i].flags & ML_EFFECT1) + lines[i].args[4] |= PWF_REVERSE; + if (lines[i].flags & ML_EFFECT4) + lines[i].args[4] |= PWF_LOOP; + break; case 500: //Scroll front wall left case 501: //Scroll front wall right lines[i].args[0] = 0; diff --git a/src/p_spec.c b/src/p_spec.c index 6434a55d7..306a11e4f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1178,24 +1178,11 @@ static boolean PolyWaypoint(line_t *line) { polywaypointdata_t pwd; - pwd.polyObjNum = Tag_FGet(&line->tags); - pwd.speed = sides[line->sidenum[0]].textureoffset / 8; - pwd.sequence = sides[line->sidenum[0]].rowoffset >> FRACBITS; // Sequence # - - // Behavior after reaching the last waypoint? - if (line->flags & ML_EFFECT3) - pwd.returnbehavior = PWR_WRAP; // Wrap back to first waypoint - else if (line->flags & ML_EFFECT2) - pwd.returnbehavior = PWR_COMEBACK; // Go through sequence in reverse - else - pwd.returnbehavior = PWR_STOP; // Stop - - // Flags - pwd.flags = 0; - if (line->flags & ML_EFFECT1) - pwd.flags |= PWF_REVERSE; - if (line->flags & ML_EFFECT4) - pwd.flags |= PWF_LOOP; + pwd.polyObjNum = line->args[0]; + pwd.speed = line->args[1] << (FRACBITS - 3); + pwd.sequence = line->args[2]; + pwd.returnbehavior = line->args[3]; + pwd.flags = line->args[4]; return EV_DoPolyObjWaypoint(&pwd); } From 5c2ce62f00617767e43d43be9c4df3f08067d130 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 4 Jul 2021 13:45:41 +0200 Subject: [PATCH 107/377] Adapt polyobject visibility/tangibility linedefs to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 33 +++++++++++++ src/p_polyobj.h | 14 ++++++ src/p_setup.c | 8 +++ src/p_spec.c | 52 ++++++-------------- 4 files changed, 71 insertions(+), 36 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 5d9f32743..039507404 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2893,6 +2893,39 @@ udmf } } } + + 489 + { + title = "Set Visibility, Tangibility"; + prefix = "(489)"; + arg0 + { + title = "PolyObject ID"; + type = 14; + } + arg1 + { + title = "Visibility"; + type = 11; + enum + { + 0 = "No change"; + 1 = "Visible"; + 2 = "Invisible"; + } + } + arg2 + { + title = "Tangibility"; + type = 11; + enum + { + 0 = "No change"; + 1 = "Tangible"; + 2 = "Intangible"; + } + } + } } scrollpush diff --git a/src/p_polyobj.h b/src/p_polyobj.h index 9c8094028..b37ffa6ef 100644 --- a/src/p_polyobj.h +++ b/src/p_polyobj.h @@ -294,6 +294,20 @@ typedef struct polywaypointdata_s UINT8 flags; // PWF_ flags } polywaypointdata_t; +typedef enum +{ + TMPV_NOCHANGE = 1, + TMPV_VISIBLE = 1<<1, + TMPV_INVISIBLE = 1<<2, +} textmappolyvisibility_t; + +typedef enum +{ + TMPT_NOCHANGE = 1, + TMPT_TANGIBLE = 1<<1, + TMPT_INTANGIBLE = 1<<2, +} textmappolytangibility_t; + // polyobject door types typedef enum { diff --git a/src/p_setup.c b/src/p_setup.c index 6eef43a60..a6c650fc5 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3715,6 +3715,14 @@ static void P_ConvertBinaryMap(void) if (lines[i].flags & ML_EFFECT4) lines[i].args[4] |= PWF_LOOP; break; + case 489: //Polyobject - turn invisible, intangible + case 490: //Polyobject - turn visible, tangible + lines[i].args[0] = tag; + lines[i].args[1] = 491 - lines[i].special; + if (!(lines[i].flags & ML_NOCLIMB)) + lines[i].args[2] = lines[i].args[1]; + lines[i].special = 489; + break; case 500: //Scroll front wall left case 501: //Scroll front wall right lines[i].args[0] = 0; diff --git a/src/p_spec.c b/src/p_spec.c index 306a11e4f..b5f67fedb 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1031,16 +1031,14 @@ static boolean PolyMove(line_t *line) return EV_DoPolyObjMove(&pmd); } -// Makes a polyobject invisible and intangible -// If NOCLIMB is ticked, the polyobject will still be tangible, just not visible. -static void PolyInvisible(line_t *line) +static void PolySetVisibilityTangibility(line_t *line) { - INT32 polyObjNum = Tag_FGet(&line->tags); - polyobj_t *po; + INT32 polyObjNum = line->args[0]; + polyobj_t* po; if (!(po = Polyobj_GetForNum(polyObjNum))) { - CONS_Debug(DBG_POLYOBJ, "PolyInvisible: bad polyobj %d\n", polyObjNum); + CONS_Debug(DBG_POLYOBJ, "PolySetVisibilityTangibility: bad polyobj %d\n", polyObjNum); return; } @@ -1048,38 +1046,23 @@ static void PolyInvisible(line_t *line) if (po->isBad) return; - if (!(line->flags & ML_NOCLIMB)) - po->flags &= ~POF_SOLID; - - po->flags |= POF_NOSPECIALS; - po->flags &= ~POF_RENDERALL; -} - -// Makes a polyobject visible and tangible -// If NOCLIMB is ticked, the polyobject will not be tangible, just visible. -static void PolyVisible(line_t *line) -{ - INT32 polyObjNum = Tag_FGet(&line->tags); - polyobj_t *po; - - if (!(po = Polyobj_GetForNum(polyObjNum))) + if (line->args[1] == TMPV_VISIBLE) { - CONS_Debug(DBG_POLYOBJ, "PolyVisible: bad polyobj %d\n", polyObjNum); - return; + po->flags &= ~POF_NOSPECIALS; + po->flags |= (po->spawnflags & POF_RENDERALL); + } + else if (line->args[1] == TMPV_INVISIBLE) + { + po->flags |= POF_NOSPECIALS; + po->flags &= ~POF_RENDERALL; } - // don't allow line actions to affect bad polyobjects - if (po->isBad) - return; - - if (!(line->flags & ML_NOCLIMB)) + if (line->args[2] == TMPT_TANGIBLE) po->flags |= POF_SOLID; - - po->flags &= ~POF_NOSPECIALS; - po->flags |= (po->spawnflags & POF_RENDERALL); + else if (line->args[2] == TMPT_INTANGIBLE) + po->flags &= ~POF_SOLID; } - // Sets the translucency of a polyobject // Frontsector floor / 100 = translevel static void PolyTranslucency(line_t *line) @@ -3891,10 +3874,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) PolyWaypoint(line); break; case 489: - PolyInvisible(line); - break; - case 490: - PolyVisible(line); + PolySetVisibilityTangibility(line); break; case 491: PolyTranslucency(line); From 429c6588af520ea7a1164814972c0e17247d83b2 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 4 Jul 2021 14:10:11 +0200 Subject: [PATCH 108/377] Adapt polyobject waving flag linedef to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 19 +++++++++++++++++++ src/p_setup.c | 5 +++++ src/p_spec.c | 6 +++--- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 039507404..ff25fee2c 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1569,6 +1569,25 @@ udmf type = 15; } } + + 30 + { + title = "Waving Flag"; + prefix = "(30)"; + arg0 + { + title = "PolyObject ID"; + type = 14; + } + arg1 + { + title = "Speed"; + } + arg2 + { + title = "Distance"; + } + } } planemove diff --git a/src/p_setup.c b/src/p_setup.c index a6c650fc5..2b2efd0f8 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3081,6 +3081,11 @@ static void P_ConvertBinaryMap(void) break; } + case 30: //Polyobject - waving flag + lines[i].args[0] = tag; + lines[i].args[1] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + lines[i].args[2] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + break; case 50: //Instantly lower floor on level load case 51: //Instantly raise ceiling on level load lines[i].args[0] = tag; diff --git a/src/p_spec.c b/src/p_spec.c index b5f67fedb..b98b244b3 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1189,10 +1189,10 @@ static boolean PolyFlag(line_t *line) { polyflagdata_t pfd; - pfd.polyObjNum = Tag_FGet(&line->tags); - pfd.speed = P_AproxDistance(line->dx, line->dy) >> FRACBITS; + pfd.polyObjNum = line->args[0]; + pfd.speed = line->args[1]; pfd.angle = R_PointToAngle2(line->v1->x, line->v1->y, line->v2->x, line->v2->y) >> ANGLETOFINESHIFT; - pfd.momx = sides[line->sidenum[0]].textureoffset >> FRACBITS; + pfd.momx = line->args[2]; return EV_DoPolyObjFlag(&pfd); } From d2ad12c0343098ecc9bfcc16ab2e2ef18a9b5b70 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 4 Jul 2021 14:41:37 +0200 Subject: [PATCH 109/377] Adapt polyobject displacement linedefs to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 46 ++++++++++++++++++++ src/p_setup.c | 13 ++++++ src/p_spec.c | 22 ++++------ 3 files changed, 68 insertions(+), 13 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index ff25fee2c..63e363549 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1588,6 +1588,52 @@ udmf title = "Distance"; } } + + 31 + { + title = "Displacement by Front Sector"; + prefix = "(31)"; + arg0 + { + title = "PolyObject ID"; + type = 14; + } + arg1 + { + title = "Base speed"; + } + } + + 32 + { + title = "Angular Displacement by Front Sector"; + prefix = "(32)"; + arg0 + { + title = "PolyObject ID"; + type = 14; + } + arg1 + { + title = "Plane factor"; + default = 128; + } + arg2 + { + title = "Rotation factor"; + default = 90; + } + arg3 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Don't turn others"; + 2 = "Turn players"; + } + } + } } planemove diff --git a/src/p_setup.c b/src/p_setup.c index 2b2efd0f8..59d8ada8b 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3086,6 +3086,19 @@ static void P_ConvertBinaryMap(void) lines[i].args[1] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; lines[i].args[2] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; break; + case 31: //Polyobject - displacement by front sector + lines[i].args[0] = tag; + lines[i].args[1] = R_PointToDist2(lines[i].v2->x, lines[i].v2->y, lines[i].v1->x, lines[i].v1->y) >> FRACBITS; + break; + case 32: //Polyobject - angular displacement by front sector + lines[i].args[0] = tag; + lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset ? sides[lines[i].sidenum[0]].textureoffset >> FRACBITS : 128; + lines[i].args[2] = sides[lines[i].sidenum[0]].rowoffset ? sides[lines[i].sidenum[0]].rowoffset >> FRACBITS : 90; + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[3] |= TMPR_DONTROTATEOTHERS; + else if (lines[i].flags & ML_EFFECT4) + lines[i].args[3] |= TMPR_ROTATEPLAYERS; + break; case 50: //Instantly lower floor on level load case 51: //Instantly raise ceiling on level load lines[i].args[0] = tag; diff --git a/src/p_spec.c b/src/p_spec.c index b98b244b3..721fe9d74 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1201,12 +1201,14 @@ static boolean PolyFlag(line_t *line) static boolean PolyDisplace(line_t *line) { polydisplacedata_t pdd; + fixed_t length = R_PointToDist2(line->v2->x, line->v2->y, line->v1->x, line->v1->y); + fixed_t speed = line->args[1] << FRACBITS; - pdd.polyObjNum = Tag_FGet(&line->tags); + pdd.polyObjNum = line->args[0]; pdd.controlSector = line->frontsector; - pdd.dx = line->dx>>8; - pdd.dy = line->dy>>8; + pdd.dx = FixedMul(FixedDiv(line->dx, length), speed) >> 8; + pdd.dy = FixedMul(FixedDiv(line->dy, length), speed) >> 8; return EV_DoPolyObjDisplace(&pdd); } @@ -1218,22 +1220,16 @@ static boolean PolyRotDisplace(line_t *line) polyrotdisplacedata_t pdd; fixed_t anginter, distinter; - pdd.polyObjNum = Tag_FGet(&line->tags); + pdd.polyObjNum = line->args[0]; pdd.controlSector = line->frontsector; // Rotate 'anginter' interval for each 'distinter' interval from the control sector. - // Use default values if not provided as fallback. - anginter = sides[line->sidenum[0]].rowoffset ? sides[line->sidenum[0]].rowoffset : 90*FRACUNIT; - distinter = sides[line->sidenum[0]].textureoffset ? sides[line->sidenum[0]].textureoffset : 128*FRACUNIT; + anginter = line->args[2] << FRACBITS; + distinter = line->args[1] << FRACBITS; pdd.rotscale = FixedDiv(anginter, distinter); // Same behavior as other rotators when carrying things. - if (line->flags & ML_NOCLIMB) - pdd.turnobjs = 0; - else if (line->flags & ML_EFFECT4) - pdd.turnobjs = PTF_PLAYERS|PTF_OTHERS; - else - pdd.turnobjs = PTF_OTHERS; + pdd.turnobjs = line->args[3]; return EV_DoPolyObjRotDisplace(&pdd); } From 6d007f388a6416af21c42fc8720f9b8ec380438e Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 4 Jul 2021 15:37:42 +0200 Subject: [PATCH 110/377] Adapt set translucency linedef to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 21 + extras/conf/udb/Includes/SRB222_misc.cfg | 6 + src/p_setup.c | 9 + src/p_spec.c | 19 +- src/p_spec.c.orig | 9150 ++++++++++++++++++ 5 files changed, 9191 insertions(+), 14 deletions(-) create mode 100644 src/p_spec.c.orig diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 63e363549..f73d36044 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2991,6 +2991,27 @@ udmf } } } + + 491 + { + title = "Set Translucency"; + prefix = "(491)"; + arg0 + { + title = "PolyObject ID"; + type = 14; + } + arg1 + { + title = "Translucency level"; + } + arg2 + { + title = "Set/Add?"; + type = 11; + enum = "setadd"; + } + } } scrollpush diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 8a4bc29e2..8e8b1d71a 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -406,6 +406,12 @@ enums 1 = "Yes"; } + setadd + { + 0 = "Set"; + 1 = "Add"; + } + onoff { 0 = "On"; diff --git a/src/p_setup.c b/src/p_setup.c index 59d8ada8b..4bcb5c8e1 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3741,6 +3741,15 @@ static void P_ConvertBinaryMap(void) lines[i].args[2] = lines[i].args[1]; lines[i].special = 489; break; + case 491: //Polyobject - set translucency + lines[i].args[0] = tag; + // If Front X Offset is specified, use that. Else, use floorheight. + lines[i].args[1] = (sides[lines[i].sidenum[0]].textureoffset ? sides[lines[i].sidenum[0]].textureoffset : lines[i].frontsector->floorheight) >> FRACBITS; + // If DONTPEGBOTTOM, specify raw translucency value. Else, take it out of 1000. + if (!(lines[i].flags & ML_DONTPEGBOTTOM)) + lines[i].args[1] /= 100; + lines[i].args[2] = !!(lines[i].flags & ML_EFFECT3); + break; case 500: //Scroll front wall left case 501: //Scroll front wall right lines[i].args[0] = 0; diff --git a/src/p_spec.c b/src/p_spec.c index 721fe9d74..9862ffa2f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1064,16 +1064,14 @@ static void PolySetVisibilityTangibility(line_t *line) } // Sets the translucency of a polyobject -// Frontsector floor / 100 = translevel static void PolyTranslucency(line_t *line) { - INT32 polyObjNum = Tag_FGet(&line->tags); + INT32 polyObjNum = line->args[0]; polyobj_t *po; - INT32 value; if (!(po = Polyobj_GetForNum(polyObjNum))) { - CONS_Debug(DBG_POLYOBJ, "EV_DoPolyObjWaypoint: bad polyobj %d\n", polyObjNum); + CONS_Debug(DBG_POLYOBJ, "PolyTranslucency: bad polyobj %d\n", polyObjNum); return; } @@ -1081,17 +1079,10 @@ static void PolyTranslucency(line_t *line) if (po->isBad) return; - // If Front X Offset is specified, use that. Else, use floorheight. - value = (sides[line->sidenum[0]].textureoffset ? sides[line->sidenum[0]].textureoffset : line->frontsector->floorheight) >> FRACBITS; - - // If DONTPEGBOTTOM, specify raw translucency value. Else, take it out of 1000. - if (!(line->flags & ML_DONTPEGBOTTOM)) - value /= 100; - - if (line->flags & ML_EFFECT3) // relative calc - po->translucency += value; + if (lines->args[2]) // relative calc + po->translucency += line->args[1]; else - po->translucency = value; + po->translucency = line->args[1]; po->translucency = max(min(po->translucency, NUMTRANSMAPS), 0); } diff --git a/src/p_spec.c.orig b/src/p_spec.c.orig new file mode 100644 index 000000000..244f7166b --- /dev/null +++ b/src/p_spec.c.orig @@ -0,0 +1,9150 @@ +// SONIC ROBO BLAST 2 +//----------------------------------------------------------------------------- +// Copyright (C) 1993-1996 by id Software, Inc. +// Copyright (C) 1998-2000 by DooM Legacy Team. +// Copyright (C) 1999-2021 by Sonic Team Junior. +// +// This program is free software distributed under the +// terms of the GNU General Public License, version 2. +// See the 'LICENSE' file for more details. +//----------------------------------------------------------------------------- +/// \file p_spec.c +/// \brief Implements special effects: +/// Texture animation, height or lighting changes +/// according to adjacent sectors, respective +/// utility functions, etc. +/// Line Tag handling. Line and Sector triggers. + +#include "dehacked.h" +#include "doomdef.h" +#include "g_game.h" +#include "p_local.h" +#include "p_setup.h" // levelflats for flat animation +#include "r_data.h" +#include "r_textures.h" +#include "m_random.h" +#include "p_mobj.h" +#include "i_system.h" +#include "s_sound.h" +#include "w_wad.h" +#include "z_zone.h" +#include "r_main.h" //Two extra includes. +#include "r_sky.h" +#include "p_polyobj.h" +#include "p_slopes.h" +#include "hu_stuff.h" +#include "v_video.h" // V_AUTOFADEOUT|V_ALLOWLOWERCASE +#include "m_misc.h" +#include "m_cond.h" //unlock triggers +#include "lua_hook.h" // LUA_HookLinedefExecute +#include "f_finale.h" // control text prompt +#include "r_skins.h" // skins + +#ifdef HW3SOUND +#include "hardware/hw3sound.h" +#endif + +// Not sure if this is necessary, but it was in w_wad.c, so I'm putting it here too -Shadow Hog +#include + +mobj_t *skyboxmo[2]; // current skybox mobjs: 0 = viewpoint, 1 = centerpoint +mobj_t *skyboxviewpnts[16]; // array of MT_SKYBOX viewpoint mobjs +mobj_t *skyboxcenterpnts[16]; // array of MT_SKYBOX centerpoint mobjs + +// Amount (dx, dy) vector linedef is shifted right to get scroll amount +#define SCROLL_SHIFT 5 + +/** Animated texture descriptor + * This keeps track of an animated texture or an animated flat. + * \sa P_UpdateSpecials, P_InitPicAnims, animdef_t + */ +typedef struct +{ + SINT8 istexture; ///< ::true for a texture, ::false for a flat + INT32 picnum; ///< The end flat number + INT32 basepic; ///< The start flat number + INT32 numpics; ///< Number of frames in the animation + tic_t speed; ///< Number of tics for which each frame is shown +} anim_t; + +#if defined(_MSC_VER) +#pragma pack(1) +#endif + +/** Animated texture definition. + * Used for loading an ANIMDEFS lump from a wad. + * + * Animations are defined by the first and last frame (i.e., flat or texture). + * The animation sequence uses all flats between the start and end entry, in + * the order found in the wad. + * + * \sa anim_t + */ +typedef struct +{ + SINT8 istexture; ///< True for a texture, false for a flat. + char endname[9]; ///< Name of the last frame, null-terminated. + char startname[9]; ///< Name of the first frame, null-terminated. + INT32 speed ; ///< Number of tics for which each frame is shown. +} ATTRPACK animdef_t; + +#if defined(_MSC_VER) +#pragma pack() +#endif + +typedef struct +{ + UINT32 count; + thinker_t **thinkers; +} thinkerlist_t; + +static void P_SpawnScrollers(void); +static void P_SpawnFriction(void); +static void P_SpawnPushers(void); +static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t *source, INT32 affectee, INT32 referrer, INT32 exclusive, INT32 slider); //SoM: 3/9/2000 +static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); +static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finalize); +#define P_RemoveFakeFloorFader(l) P_ResetFakeFloorFader(l, NULL, false); +static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 sourcevalue, INT16 destvalue, INT16 speed, boolean ticbased, INT32 *timer, + boolean doexists, boolean dotranslucent, boolean dolighting, boolean docolormap, + boolean docollision, boolean doghostfade, boolean exactalpha); +static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, + INT16 destvalue, INT16 speed, boolean ticbased, boolean relative, + boolean doexists, boolean dotranslucent, boolean dolighting, boolean docolormap, + boolean docollision, boolean doghostfade, boolean exactalpha); +static void P_ResetColormapFader(sector_t *sector); +static void Add_ColormapFader(sector_t *sector, extracolormap_t *source_exc, extracolormap_t *dest_exc, + boolean ticbased, INT32 duration); +static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); +static void P_AddFloatThinker(sector_t *sec, UINT16 tag, line_t *sourceline); +//static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); +static void P_AddFakeFloorsByLine(size_t line, INT32 alpha, ffloortype_e ffloorflags, thinkerlist_t *secthinkers); +static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec); +static void Add_Friction(INT32 friction, INT32 movefactor, INT32 affectee, INT32 referrer); +static void P_AddPlaneDisplaceThinker(INT32 type, fixed_t speed, INT32 control, INT32 affectee, UINT8 reverse); + + +//SoM: 3/7/2000: New sturcture without limits. +static anim_t *lastanim; +static anim_t *anims = NULL; /// \todo free leak +static size_t maxanims; + +// Animating line specials + +// Init animated textures +// - now called at level loading P_SetupLevel() + +static animdef_t *animdefs = NULL; + +// Increase the size of animdefs to make room for a new animation definition +static void GrowAnimDefs(void) +{ + maxanims++; + animdefs = (animdef_t *)Z_Realloc(animdefs, sizeof(animdef_t)*(maxanims + 1), PU_STATIC, NULL); +} + +// A prototype; here instead of p_spec.h, so they're "private" +void P_ParseANIMDEFSLump(INT32 wadNum, UINT16 lumpnum); +void P_ParseAnimationDefintion(SINT8 istexture); + +/** Sets up texture and flat animations. + * + * Converts an ::animdef_t array loaded from a lump into + * ::anim_t format. + * + * Issues an error if any animation cycles are invalid. + * + * \sa P_FindAnimatedFlat, P_SetupLevelFlatAnims + * \author Steven McGranahan (original), Shadow Hog (had to rewrite it to handle multiple WADs), JTE (had to rewrite it to handle multiple WADs _correctly_) + */ +void P_InitPicAnims(void) +{ + // Init animation + INT32 w; // WAD + size_t i; + + I_Assert(animdefs == NULL); + + maxanims = 0; + + for (w = numwadfiles-1; w >= 0; w--) + { + UINT16 animdefsLumpNum; + + // Find ANIMDEFS lump in the WAD + animdefsLumpNum = W_CheckNumForNamePwad("ANIMDEFS", w, 0); + + while (animdefsLumpNum != INT16_MAX) + { + P_ParseANIMDEFSLump(w, animdefsLumpNum); + animdefsLumpNum = W_CheckNumForNamePwad("ANIMDEFS", (UINT16)w, animdefsLumpNum + 1); + } + } + + // Define the last one + animdefs[maxanims].istexture = -1; + strncpy(animdefs[maxanims].endname, "", 9); + strncpy(animdefs[maxanims].startname, "", 9); + animdefs[maxanims].speed = 0; + + if (anims) + free(anims); + + anims = (anim_t *)malloc(sizeof (*anims)*(maxanims + 1)); + if (!anims) + I_Error("Not enough free memory for ANIMDEFS data"); + + lastanim = anims; + for (i = 0; animdefs[i].istexture != -1; i++) + { + if (animdefs[i].istexture) + { + if (R_CheckTextureNumForName(animdefs[i].startname) == -1) + continue; + + lastanim->picnum = R_TextureNumForName(animdefs[i].endname); + lastanim->basepic = R_TextureNumForName(animdefs[i].startname); + } + else + { + if ((W_CheckNumForName(animdefs[i].startname)) == LUMPERROR) + continue; + + lastanim->picnum = R_GetFlatNumForName(animdefs[i].endname); + lastanim->basepic = R_GetFlatNumForName(animdefs[i].startname); + } + + lastanim->istexture = animdefs[i].istexture; + lastanim->numpics = lastanim->picnum - lastanim->basepic + 1; + + if (lastanim->numpics < 2) + { + free(anims); + I_Error("P_InitPicAnims: bad cycle from %s to %s", + animdefs[i].startname, animdefs[i].endname); + } + + lastanim->speed = LONG(animdefs[i].speed); + lastanim++; + } + lastanim->istexture = -1; + R_ClearTextureNumCache(false); + + // Clear animdefs now that we're done with it. + // We'll only be using anims from now on. + Z_Free(animdefs); + animdefs = NULL; +} + +void P_ParseANIMDEFSLump(INT32 wadNum, UINT16 lumpnum) +{ + char *animdefsLump; + size_t animdefsLumpLength; + char *animdefsText; + char *animdefsToken; + char *p; + + // Since lumps AREN'T \0-terminated like I'd assumed they should be, I'll + // need to make a space of memory where I can ensure that it will terminate + // correctly. Start by loading the relevant data from the WAD. + animdefsLump = (char *)W_CacheLumpNumPwad(wadNum,lumpnum,PU_STATIC); + // If that didn't exist, we have nothing to do here. + if (animdefsLump == NULL) return; + // If we're still here, then it DOES exist; figure out how long it is, and allot memory accordingly. + animdefsLumpLength = W_LumpLengthPwad(wadNum,lumpnum); + animdefsText = (char *)Z_Malloc((animdefsLumpLength+1)*sizeof(char),PU_STATIC,NULL); + // Now move the contents of the lump into this new location. + memmove(animdefsText,animdefsLump,animdefsLumpLength); + // Make damn well sure the last character in our new memory location is \0. + animdefsText[animdefsLumpLength] = '\0'; + // Finally, free up the memory from the first data load, because we really + // don't need it. + Z_Free(animdefsLump); + + // Now, let's start parsing this thing + p = animdefsText; + animdefsToken = M_GetToken(p); + while (animdefsToken != NULL) + { + if (stricmp(animdefsToken, "TEXTURE") == 0) + { + Z_Free(animdefsToken); + P_ParseAnimationDefintion(1); + } + else if (stricmp(animdefsToken, "FLAT") == 0) + { + Z_Free(animdefsToken); + P_ParseAnimationDefintion(0); + } + else if (stricmp(animdefsToken, "OSCILLATE") == 0) + { + // This probably came off the tail of an earlier definition. It's technically legal syntax, but we don't support it. + I_Error("Error parsing ANIMDEFS lump: Animation definitions utilizing \"OSCILLATE\" (the animation plays in reverse when it reaches the end) are not supported by SRB2"); + } + else + { + I_Error("Error parsing ANIMDEFS lump: Expected \"TEXTURE\" or \"FLAT\", got \"%s\"",animdefsToken); + } + // parse next line + while (*p != '\0' && *p != '\n') ++p; + if (*p == '\n') ++p; + animdefsToken = M_GetToken(p); + } + Z_Free(animdefsToken); + Z_Free((void *)animdefsText); +} + +void P_ParseAnimationDefintion(SINT8 istexture) +{ + char *animdefsToken; + size_t animdefsTokenLength; + char *endPos; + INT32 animSpeed; + size_t i; + + // Startname + animdefsToken = M_GetToken(NULL); + if (animdefsToken == NULL) + { + I_Error("Error parsing ANIMDEFS lump: Unexpected end of file where start texture/flat name should be"); + } + if (stricmp(animdefsToken, "OPTIONAL") == 0) + { + // This is meaningful to ZDoom - it tells the program NOT to bomb out + // if the textures can't be found - but it's useless in SRB2, so we'll + // just smile, nod, and carry on + Z_Free(animdefsToken); + animdefsToken = M_GetToken(NULL); + + if (animdefsToken == NULL) + { + I_Error("Error parsing ANIMDEFS lump: Unexpected end of file where start texture/flat name should be"); + } + else if (stricmp(animdefsToken, "RANGE") == 0) + { + // Oh. Um. Apparently "OPTIONAL" is a texture name. Naughty. + // I should probably handle this more gracefully, but right now + // I can't be bothered; especially since ZDoom doesn't handle this + // condition at all. + I_Error("Error parsing ANIMDEFS lump: \"OPTIONAL\" is a keyword; you cannot use it as the startname of an animation"); + } + } + animdefsTokenLength = strlen(animdefsToken); + if (animdefsTokenLength>8) + { + I_Error("Error parsing ANIMDEFS lump: lump name \"%s\" exceeds 8 characters", animdefsToken); + } + + // Search for existing animdef + for (i = 0; i < maxanims; i++) + if (animdefs[i].istexture == istexture // Check if it's the same type! + && stricmp(animdefsToken, animdefs[i].startname) == 0) + { + //CONS_Alert(CONS_NOTICE, "Duplicate animation: %s\n", animdefsToken); + + // If we weren't parsing in reverse order, we would `break` here and parse the new data into the existing slot we found. + // Instead, we're just going to skip parsing the rest of this line entirely. + Z_Free(animdefsToken); + return; + } + + // Not found + if (i == maxanims) + { + // Increase the size to make room for the new animation definition + GrowAnimDefs(); + strncpy(animdefs[i].startname, animdefsToken, 9); + } + + // animdefs[i].startname is now set to animdefsToken either way. + Z_Free(animdefsToken); + + // set texture type + animdefs[i].istexture = istexture; + + // "RANGE" + animdefsToken = M_GetToken(NULL); + if (animdefsToken == NULL) + { + I_Error("Error parsing ANIMDEFS lump: Unexpected end of file where \"RANGE\" after \"%s\"'s startname should be", animdefs[i].startname); + } + if (stricmp(animdefsToken, "ALLOWDECALS") == 0) + { + // Another ZDoom keyword, ho-hum. Skip it, move on to the next token. + Z_Free(animdefsToken); + animdefsToken = M_GetToken(NULL); + } + if (stricmp(animdefsToken, "PIC") == 0) + { + // This is technically legitimate ANIMDEFS syntax, but SRB2 doesn't support it. + I_Error("Error parsing ANIMDEFS lump: Animation definitions utilizing \"PIC\" (specific frames instead of a consecutive range) are not supported by SRB2"); + } + if (stricmp(animdefsToken, "RANGE") != 0) + { + I_Error("Error parsing ANIMDEFS lump: Expected \"RANGE\" after \"%s\"'s startname, got \"%s\"", animdefs[i].startname, animdefsToken); + } + Z_Free(animdefsToken); + + // Endname + animdefsToken = M_GetToken(NULL); + if (animdefsToken == NULL) + { + I_Error("Error parsing ANIMDEFS lump: Unexpected end of file where \"%s\"'s end texture/flat name should be", animdefs[i].startname); + } + animdefsTokenLength = strlen(animdefsToken); + if (animdefsTokenLength>8) + { + I_Error("Error parsing ANIMDEFS lump: lump name \"%s\" exceeds 8 characters", animdefsToken); + } + strncpy(animdefs[i].endname, animdefsToken, 9); + Z_Free(animdefsToken); + + // "TICS" + animdefsToken = M_GetToken(NULL); + if (animdefsToken == NULL) + { + I_Error("Error parsing ANIMDEFS lump: Unexpected end of file where \"%s\"'s \"TICS\" should be", animdefs[i].startname); + } + if (stricmp(animdefsToken, "RAND") == 0) + { + // This is technically legitimate ANIMDEFS syntax, but SRB2 doesn't support it. + I_Error("Error parsing ANIMDEFS lump: Animation definitions utilizing \"RAND\" (random duration per frame) are not supported by SRB2"); + } + if (stricmp(animdefsToken, "TICS") != 0) + { + I_Error("Error parsing ANIMDEFS lump: Expected \"TICS\" in animation definition for \"%s\", got \"%s\"", animdefs[i].startname, animdefsToken); + } + Z_Free(animdefsToken); + + // Speed + animdefsToken = M_GetToken(NULL); + if (animdefsToken == NULL) + { + I_Error("Error parsing ANIMDEFS lump: Unexpected end of file where \"%s\"'s animation speed should be", animdefs[i].startname); + } + endPos = NULL; +#ifndef AVOID_ERRNO + errno = 0; +#endif + animSpeed = strtol(animdefsToken,&endPos,10); + if (endPos == animdefsToken // Empty string + || *endPos != '\0' // Not end of string +#ifndef AVOID_ERRNO + || errno == ERANGE // Number out-of-range +#endif + || animSpeed < 0) // Number is not positive + { + I_Error("Error parsing ANIMDEFS lump: Expected a positive integer for \"%s\"'s animation speed, got \"%s\"", animdefs[i].startname, animdefsToken); + } + animdefs[i].speed = animSpeed; + Z_Free(animdefsToken); + +#ifdef WALLFLATS + // hehe... uhh..... + if (!istexture) + { + GrowAnimDefs(); + M_Memcpy(&animdefs[maxanims-1], &animdefs[i], sizeof(animdef_t)); + animdefs[maxanims-1].istexture = 1; + } +#endif +} + +/** Checks for flats in levelflats that are part of a flat animation sequence + * and sets them up for animation. + * + * \param animnum Index into ::anims to find flats for. + * \sa P_SetupLevelFlatAnims + */ +static inline void P_FindAnimatedFlat(INT32 animnum) +{ + size_t i; + lumpnum_t startflatnum, endflatnum; + levelflat_t *foundflats; + + foundflats = levelflats; + startflatnum = anims[animnum].basepic; + endflatnum = anims[animnum].picnum; + + // note: high word of lumpnum is the wad number + if ((startflatnum>>16) != (endflatnum>>16)) + I_Error("AnimatedFlat start %s not in same wad as end %s\n", + animdefs[animnum].startname, animdefs[animnum].endname); + + // + // now search through the levelflats if this anim flat sequence is used + // + for (i = 0; i < numlevelflats; i++, foundflats++) + { + // is that levelflat from the flat anim sequence ? + if ((anims[animnum].istexture) && (foundflats->type == LEVELFLAT_TEXTURE) + && ((UINT16)foundflats->u.texture.num >= startflatnum && (UINT16)foundflats->u.texture.num <= endflatnum)) + { + foundflats->u.texture.basenum = startflatnum; + foundflats->animseq = foundflats->u.texture.num - startflatnum; + foundflats->numpics = endflatnum - startflatnum + 1; + foundflats->speed = anims[animnum].speed; + + CONS_Debug(DBG_SETUP, "animflat: #%03d name:%.8s animseq:%d numpics:%d speed:%d\n", + atoi(sizeu1(i)), foundflats->name, foundflats->animseq, + foundflats->numpics,foundflats->speed); + } + else if ((!anims[animnum].istexture) && (foundflats->type == LEVELFLAT_FLAT) + && (foundflats->u.flat.lumpnum >= startflatnum && foundflats->u.flat.lumpnum <= endflatnum)) + { + foundflats->u.flat.baselumpnum = startflatnum; + foundflats->animseq = foundflats->u.flat.lumpnum - startflatnum; + foundflats->numpics = endflatnum - startflatnum + 1; + foundflats->speed = anims[animnum].speed; + + CONS_Debug(DBG_SETUP, "animflat: #%03d name:%.8s animseq:%d numpics:%d speed:%d\n", + atoi(sizeu1(i)), foundflats->name, foundflats->animseq, + foundflats->numpics,foundflats->speed); + } + } +} + +/** Sets up all flats used in a level. + * + * \sa P_InitPicAnims, P_FindAnimatedFlat + */ +void P_SetupLevelFlatAnims(void) +{ + INT32 i; + + // the original game flat anim sequences + for (i = 0; anims[i].istexture != -1; i++) + P_FindAnimatedFlat(i); +} + +// +// UTILITIES +// + +#if 0 +/** Gets a side from a sector line. + * + * \param currentSector Sector the line is in. + * \param line Index of the line within the sector. + * \param side 0 for front, 1 for back. + * \return Pointer to the side_t of the side you want. + * \sa getSector, twoSided, getNextSector + */ +static inline side_t *getSide(INT32 currentSector, INT32 line, INT32 side) +{ + return &sides[(sectors[currentSector].lines[line])->sidenum[side]]; +} + +/** Gets a sector from a sector line. + * + * \param currentSector Sector the line is in. + * \param line Index of the line within the sector. + * \param side 0 for front, 1 for back. + * \return Pointer to the ::sector_t of the sector on that side. + * \sa getSide, twoSided, getNextSector + */ +static inline sector_t *getSector(INT32 currentSector, INT32 line, INT32 side) +{ + return sides[(sectors[currentSector].lines[line])->sidenum[side]].sector; +} + +/** Determines whether a sector line is two-sided. + * Uses the Boom method, checking if the line's back side is set to -1, rather + * than looking for ::ML_TWOSIDED. + * + * \param sector The sector. + * \param line Line index within the sector. + * \return 1 if the sector is two-sided, 0 otherwise. + * \sa getSide, getSector, getNextSector + */ +static inline boolean twoSided(INT32 sector, INT32 line) +{ + return (sectors[sector].lines[line])->sidenum[1] != 0xffff; +} +#endif + +/** Finds sector next to current. + * + * \param line Pointer to the line to cross. + * \param sec Pointer to the current sector. + * \return Pointer to a ::sector_t of the adjacent sector, or NULL if the line + * is one-sided. + * \sa getSide, getSector, twoSided + * \author Steven McGranahan + */ +static sector_t *getNextSector(line_t *line, sector_t *sec) +{ + if (line->frontsector == sec) + { + if (line->backsector != sec) + return line->backsector; + else + return NULL; + } + return line->frontsector; +} + +/** Finds lowest floor in adjacent sectors. + * + * \param sec Sector to start in. + * \return Lowest floor height in an adjacent sector. + * \sa P_FindHighestFloorSurrounding, P_FindNextLowestFloor, + * P_FindLowestCeilingSurrounding + */ +fixed_t P_FindLowestFloorSurrounding(sector_t *sec) +{ + size_t i; + line_t *check; + sector_t *other; + fixed_t floorh; + + floorh = sec->floorheight; + + for (i = 0; i < sec->linecount; i++) + { + check = sec->lines[i]; + other = getNextSector(check,sec); + + if (!other) + continue; + + if (other->floorheight < floorh) + floorh = other->floorheight; + } + return floorh; +} + +/** Finds highest floor in adjacent sectors. + * + * \param sec Sector to start in. + * \return Highest floor height in an adjacent sector. + * \sa P_FindLowestFloorSurrounding, P_FindNextHighestFloor, + * P_FindHighestCeilingSurrounding + */ +fixed_t P_FindHighestFloorSurrounding(sector_t *sec) +{ + size_t i; + line_t *check; + sector_t *other; + fixed_t floorh = -500*FRACUNIT; + INT32 foundsector = 0; + + for (i = 0; i < sec->linecount; i++) + { + check = sec->lines[i]; + other = getNextSector(check, sec); + + if (!other) + continue; + + if (other->floorheight > floorh || !foundsector) + floorh = other->floorheight; + + if (!foundsector) + foundsector = 1; + } + return floorh; +} + +/** Finds next highest floor in adjacent sectors. + * + * \param sec Sector to start in. + * \param currentheight Height to start at. + * \return Next highest floor height in an adjacent sector, or currentheight + * if there are none higher. + * \sa P_FindHighestFloorSurrounding, P_FindNextLowestFloor, + * P_FindNextHighestCeiling + * \author Lee Killough + */ +fixed_t P_FindNextHighestFloor(sector_t *sec, fixed_t currentheight) +{ + sector_t *other; + size_t i; + fixed_t height; + + for (i = 0; i < sec->linecount; i++) + { + other = getNextSector(sec->lines[i],sec); + if (other && other->floorheight > currentheight) + { + height = other->floorheight; + while (++i < sec->linecount) + { + other = getNextSector(sec->lines[i], sec); + if (other && + other->floorheight < height && + other->floorheight > currentheight) + height = other->floorheight; + } + return height; + } + } + return currentheight; +} + +//////////////////////////////////////////////////// +// SoM: Start new Boom functions +//////////////////////////////////////////////////// + +/** Finds next lowest floor in adjacent sectors. + * + * \param sec Sector to start in. + * \param currentheight Height to start at. + * \return Next lowest floor height in an adjacent sector, or currentheight + * if there are none lower. + * \sa P_FindLowestFloorSurrounding, P_FindNextHighestFloor, + * P_FindNextLowestCeiling + * \author Lee Killough + */ +fixed_t P_FindNextLowestFloor(sector_t *sec, fixed_t currentheight) +{ + sector_t *other; + size_t i; + fixed_t height; + + for (i = 0; i < sec->linecount; i++) + { + other = getNextSector(sec->lines[i], sec); + if (other && other->floorheight < currentheight) + { + height = other->floorheight; + while (++i < sec->linecount) + { + other = getNextSector(sec->lines[i], sec); + if (other && other->floorheight > height + && other->floorheight < currentheight) + height = other->floorheight; + } + return height; + } + } + return currentheight; +} + +#if 0 +/** Finds next lowest ceiling in adjacent sectors. + * + * \param sec Sector to start in. + * \param currentheight Height to start at. + * \return Next lowest ceiling height in an adjacent sector, or currentheight + * if there are none lower. + * \sa P_FindLowestCeilingSurrounding, P_FindNextHighestCeiling, + * P_FindNextLowestFloor + * \author Lee Killough + */ +static fixed_t P_FindNextLowestCeiling(sector_t *sec, fixed_t currentheight) +{ + sector_t *other; + size_t i; + fixed_t height; + + for (i = 0; i < sec->linecount; i++) + { + other = getNextSector(sec->lines[i],sec); + if (other && other->ceilingheight < currentheight) + { + height = other->ceilingheight; + while (++i < sec->linecount) + { + other = getNextSector(sec->lines[i],sec); + if (other && other->ceilingheight > height + && other->ceilingheight < currentheight) + height = other->ceilingheight; + } + return height; + } + } + return currentheight; +} + +/** Finds next highest ceiling in adjacent sectors. + * + * \param sec Sector to start in. + * \param currentheight Height to start at. + * \return Next highest ceiling height in an adjacent sector, or currentheight + * if there are none higher. + * \sa P_FindHighestCeilingSurrounding, P_FindNextLowestCeiling, + * P_FindNextHighestFloor + * \author Lee Killough + */ +static fixed_t P_FindNextHighestCeiling(sector_t *sec, fixed_t currentheight) +{ + sector_t *other; + size_t i; + fixed_t height; + + for (i = 0; i < sec->linecount; i++) + { + other = getNextSector(sec->lines[i], sec); + if (other && other->ceilingheight > currentheight) + { + height = other->ceilingheight; + while (++i < sec->linecount) + { + other = getNextSector(sec->lines[i],sec); + if (other && other->ceilingheight < height + && other->ceilingheight > currentheight) + height = other->ceilingheight; + } + return height; + } + } + return currentheight; +} +#endif + +//////////////////////////// +// End New Boom functions +//////////////////////////// + +/** Finds lowest ceiling in adjacent sectors. + * + * \param sec Sector to start in. + * \return Lowest ceiling height in an adjacent sector. + * \sa P_FindHighestCeilingSurrounding, P_FindNextLowestCeiling, + * P_FindLowestFloorSurrounding + */ +fixed_t P_FindLowestCeilingSurrounding(sector_t *sec) +{ + size_t i; + line_t *check; + sector_t *other; + fixed_t height = 32000*FRACUNIT; //SoM: 3/7/2000: Remove ovf + INT32 foundsector = 0; + + for (i = 0; i < sec->linecount; i++) + { + check = sec->lines[i]; + other = getNextSector(check, sec); + + if (!other) + continue; + + if (other->ceilingheight < height || !foundsector) + height = other->ceilingheight; + + if (!foundsector) + foundsector = 1; + } + return height; +} + +/** Finds Highest ceiling in adjacent sectors. + * + * \param sec Sector to start in. + * \return Highest ceiling height in an adjacent sector. + * \sa P_FindLowestCeilingSurrounding, P_FindNextHighestCeiling, + * P_FindHighestFloorSurrounding + */ +fixed_t P_FindHighestCeilingSurrounding(sector_t *sec) +{ + size_t i; + line_t *check; + sector_t *other; + fixed_t height = 0; + INT32 foundsector = 0; + + for (i = 0; i < sec->linecount; i++) + { + check = sec->lines[i]; + other = getNextSector(check, sec); + + if (!other) + continue; + + if (other->ceilingheight > height || !foundsector) + height = other->ceilingheight; + + if (!foundsector) + foundsector = 1; + } + return height; +} + +#if 0 +//SoM: 3/7/2000: UTILS..... +// +// P_FindShortestTextureAround() +// +// Passed a sector number, returns the shortest lower texture on a +// linedef bounding the sector. +// +// +static fixed_t P_FindShortestTextureAround(INT32 secnum) +{ + fixed_t minsize = 32000<linecount; i++) + { + if (twoSided(secnum, i)) + { + side = getSide(secnum,i,0); + if (side->bottomtexture > 0) + if (textureheight[side->bottomtexture] < minsize) + minsize = textureheight[side->bottomtexture]; + side = getSide(secnum,i,1); + if (side->bottomtexture > 0) + if (textureheight[side->bottomtexture] < minsize) + minsize = textureheight[side->bottomtexture]; + } + } + return minsize; +} + +//SoM: 3/7/2000: Stuff.... (can you tell I'm getting tired? It's 12 : 30!) +// +// P_FindShortestUpperAround() +// +// Passed a sector number, returns the shortest upper texture on a +// linedef bounding the sector. +// +// +static fixed_t P_FindShortestUpperAround(INT32 secnum) +{ + fixed_t minsize = 32000<linecount; i++) + { + if (twoSided(secnum, i)) + { + side = getSide(secnum,i,0); + if (side->toptexture > 0) + if (textureheight[side->toptexture] < minsize) + minsize = textureheight[side->toptexture]; + side = getSide(secnum,i,1); + if (side->toptexture > 0) + if (textureheight[side->toptexture] < minsize) + minsize = textureheight[side->toptexture]; + } + } + return minsize; +} + +//SoM: 3/7/2000 +// +// P_FindModelFloorSector() +// +// Passed a floor height and a sector number, return a pointer to a +// a sector with that floor height across the lowest numbered two sided +// line surrounding the sector. +// +// Note: If no sector at that height bounds the sector passed, return NULL +// +// +static sector_t *P_FindModelFloorSector(fixed_t floordestheight, INT32 secnum) +{ + size_t i; + sector_t *sec = §ors[secnum]; + + for (i = 0; i < sec->linecount; i++) + { + if (twoSided(secnum, i)) + { + if (getSide(secnum,i,0)->sector-sectors == secnum) + sec = getSector(secnum,i,1); + else + sec = getSector(secnum,i,0); + + if (sec->floorheight == floordestheight) + return sec; + } + } + return NULL; +} + +// +// P_FindModelCeilingSector() +// +// Passed a ceiling height and a sector number, return a pointer to a +// a sector with that ceiling height across the lowest numbered two sided +// line surrounding the sector. +// +// Note: If no sector at that height bounds the sector passed, return NULL +// +static sector_t *P_FindModelCeilingSector(fixed_t ceildestheight, INT32 secnum) +{ + size_t i; + sector_t *sec = §ors[secnum]; + + for (i = 0; i < sec->linecount; i++) + { + if (twoSided(secnum, i)) + { + if (getSide(secnum, i, 0)->sector - sectors == secnum) + sec = getSector(secnum, i, 1); + else + sec = getSector(secnum, i, 0); + + if (sec->ceilingheight == ceildestheight) + return sec; + } + } + return NULL; +} +#endif + +// Parses arguments for parameterized polyobject door types +static boolean PolyDoor(line_t *line) +{ + polydoordata_t pdd; + + pdd.polyObjNum = Tag_FGet(&line->tags); // polyobject id + + switch(line->special) + { + case 480: // Polyobj_DoorSlide + pdd.doorType = POLY_DOOR_SLIDE; + pdd.speed = sides[line->sidenum[0]].textureoffset / 8; + pdd.angle = R_PointToAngle2(line->v1->x, line->v1->y, line->v2->x, line->v2->y); // angle of motion + pdd.distance = sides[line->sidenum[0]].rowoffset; + + if (line->sidenum[1] != 0xffff) + pdd.delay = sides[line->sidenum[1]].textureoffset >> FRACBITS; // delay in tics + else + pdd.delay = 0; + break; + case 481: // Polyobj_DoorSwing + pdd.doorType = POLY_DOOR_SWING; + pdd.speed = sides[line->sidenum[0]].textureoffset >> FRACBITS; // angular speed + pdd.distance = sides[line->sidenum[0]].rowoffset >> FRACBITS; // angular distance + + if (line->sidenum[1] != 0xffff) + pdd.delay = sides[line->sidenum[1]].textureoffset >> FRACBITS; // delay in tics + else + pdd.delay = 0; + break; + default: + return 0; // ??? + } + + return EV_DoPolyDoor(&pdd); +} + +// Parses arguments for parameterized polyobject move specials +static boolean PolyMove(line_t *line) +{ + polymovedata_t pmd; + + pmd.polyObjNum = Tag_FGet(&line->tags); + pmd.speed = sides[line->sidenum[0]].textureoffset / 8; + pmd.angle = R_PointToAngle2(line->v1->x, line->v1->y, line->v2->x, line->v2->y); + pmd.distance = sides[line->sidenum[0]].rowoffset; + + pmd.overRide = (line->special == 483); // Polyobj_OR_Move + + return EV_DoPolyObjMove(&pmd); +} + +// Makes a polyobject invisible and intangible +// If NOCLIMB is ticked, the polyobject will still be tangible, just not visible. +static void PolyInvisible(line_t *line) +{ + INT32 polyObjNum = Tag_FGet(&line->tags); + polyobj_t *po; + + if (!(po = Polyobj_GetForNum(polyObjNum))) + { + CONS_Debug(DBG_POLYOBJ, "PolyInvisible: bad polyobj %d\n", polyObjNum); + return; + } + + // don't allow line actions to affect bad polyobjects + if (po->isBad) + return; + + if (!(line->flags & ML_NOCLIMB)) + po->flags &= ~POF_SOLID; + + po->flags |= POF_NOSPECIALS; + po->flags &= ~POF_RENDERALL; +} + +// Makes a polyobject visible and tangible +// If NOCLIMB is ticked, the polyobject will not be tangible, just visible. +static void PolyVisible(line_t *line) +{ + INT32 polyObjNum = Tag_FGet(&line->tags); + polyobj_t *po; + + if (!(po = Polyobj_GetForNum(polyObjNum))) + { + CONS_Debug(DBG_POLYOBJ, "PolyVisible: bad polyobj %d\n", polyObjNum); + return; + } + + // don't allow line actions to affect bad polyobjects + if (po->isBad) + return; + + if (!(line->flags & ML_NOCLIMB)) + po->flags |= POF_SOLID; + + po->flags &= ~POF_NOSPECIALS; + po->flags |= (po->spawnflags & POF_RENDERALL); +} + + +// Sets the translucency of a polyobject +// Frontsector floor / 100 = translevel +static void PolyTranslucency(line_t *line) +{ + INT32 polyObjNum = Tag_FGet(&line->tags); + polyobj_t *po; + INT32 value; + + if (!(po = Polyobj_GetForNum(polyObjNum))) + { + CONS_Debug(DBG_POLYOBJ, "EV_DoPolyObjWaypoint: bad polyobj %d\n", polyObjNum); + return; + } + + // don't allow line actions to affect bad polyobjects + if (po->isBad) + return; + + // If Front X Offset is specified, use that. Else, use floorheight. + value = (sides[line->sidenum[0]].textureoffset ? sides[line->sidenum[0]].textureoffset : line->frontsector->floorheight) >> FRACBITS; + + // If DONTPEGBOTTOM, specify raw translucency value. Else, take it out of 1000. + if (!(line->flags & ML_DONTPEGBOTTOM)) + value /= 100; + + if (line->flags & ML_EFFECT3) // relative calc + po->translucency += value; + else + po->translucency = value; + + po->translucency = max(min(po->translucency, NUMTRANSMAPS), 0); +} + +// Makes a polyobject translucency fade and applies tangibility +static boolean PolyFade(line_t *line) +{ + INT32 polyObjNum = Tag_FGet(&line->tags); + polyobj_t *po; + polyfadedata_t pfd; + INT32 value; + + if (!(po = Polyobj_GetForNum(polyObjNum))) + { + CONS_Debug(DBG_POLYOBJ, "PolyFade: bad polyobj %d\n", polyObjNum); + return 0; + } + + // don't allow line actions to affect bad polyobjects + if (po->isBad) + return 0; + + // Prevent continuous execs from interfering on an existing fade + if (!(line->flags & ML_EFFECT5) + && po->thinker + && po->thinker->function.acp1 == (actionf_p1)T_PolyObjFade) + { + CONS_Debug(DBG_POLYOBJ, "Line type 492 Executor: Fade PolyObject thinker already exists\n"); + return 0; + } + + pfd.polyObjNum = polyObjNum; + + // If Front X Offset is specified, use that. Else, use floorheight. + value = (sides[line->sidenum[0]].textureoffset ? sides[line->sidenum[0]].textureoffset : line->frontsector->floorheight) >> FRACBITS; + + // If DONTPEGBOTTOM, specify raw translucency value. Else, take it out of 1000. + if (!(line->flags & ML_DONTPEGBOTTOM)) + value /= 100; + + if (line->flags & ML_EFFECT3) // relative calc + pfd.destvalue = po->translucency + value; + else + pfd.destvalue = value; + + pfd.destvalue = max(min(pfd.destvalue, NUMTRANSMAPS), 0); + + // already equal, nothing to do + if (po->translucency == pfd.destvalue) + return 1; + + pfd.docollision = !(line->flags & ML_BOUNCY); // do not handle collision flags + pfd.doghostfade = (line->flags & ML_EFFECT1); // do ghost fade (no collision flags during fade) + pfd.ticbased = (line->flags & ML_EFFECT4); // Speed = Tic Duration + + // allow Back Y Offset to be consistent with other fade specials + pfd.speed = (line->sidenum[1] != 0xFFFF && !sides[line->sidenum[0]].rowoffset) ? + abs(sides[line->sidenum[1]].rowoffset>>FRACBITS) + : abs(sides[line->sidenum[0]].rowoffset>>FRACBITS); + + + return EV_DoPolyObjFade(&pfd); +} + +// Parses arguments for parameterized polyobject waypoint movement +static boolean PolyWaypoint(line_t *line) +{ + polywaypointdata_t pwd; + + pwd.polyObjNum = Tag_FGet(&line->tags); + pwd.speed = sides[line->sidenum[0]].textureoffset / 8; + pwd.sequence = sides[line->sidenum[0]].rowoffset >> FRACBITS; // Sequence # + + // Behavior after reaching the last waypoint? + if (line->flags & ML_EFFECT3) + pwd.returnbehavior = PWR_WRAP; // Wrap back to first waypoint + else if (line->flags & ML_EFFECT2) + pwd.returnbehavior = PWR_COMEBACK; // Go through sequence in reverse + else + pwd.returnbehavior = PWR_STOP; // Stop + + // Flags + pwd.flags = 0; + if (line->flags & ML_EFFECT1) + pwd.flags |= PWF_REVERSE; + if (line->flags & ML_EFFECT4) + pwd.flags |= PWF_LOOP; + + return EV_DoPolyObjWaypoint(&pwd); +} + +// Parses arguments for parameterized polyobject rotate specials +static boolean PolyRotate(line_t *line) +{ + polyrotdata_t prd; + + prd.polyObjNum = Tag_FGet(&line->tags); + prd.speed = sides[line->sidenum[0]].textureoffset >> FRACBITS; // angular speed + prd.distance = sides[line->sidenum[0]].rowoffset >> FRACBITS; // angular distance + + // Polyobj_(OR_)RotateRight have dir == -1 + prd.direction = (line->special == 484 || line->special == 485) ? -1 : 1; + + // Polyobj_OR types have override set to true + prd.overRide = (line->special == 485 || line->special == 487); + + if (line->flags & ML_NOCLIMB) + prd.turnobjs = 0; + else if (line->flags & ML_EFFECT4) + prd.turnobjs = 2; + else + prd.turnobjs = 1; + + return EV_DoPolyObjRotate(&prd); +} + +// Parses arguments for polyobject flag waving special +static boolean PolyFlag(line_t *line) +{ + polyflagdata_t pfd; + + pfd.polyObjNum = Tag_FGet(&line->tags); + pfd.speed = P_AproxDistance(line->dx, line->dy) >> FRACBITS; + pfd.angle = R_PointToAngle2(line->v1->x, line->v1->y, line->v2->x, line->v2->y) >> ANGLETOFINESHIFT; + pfd.momx = sides[line->sidenum[0]].textureoffset >> FRACBITS; + + return EV_DoPolyObjFlag(&pfd); +} + +// Parses arguments for parameterized polyobject move-by-sector-heights specials +static boolean PolyDisplace(line_t *line) +{ + polydisplacedata_t pdd; + + pdd.polyObjNum = Tag_FGet(&line->tags); + + pdd.controlSector = line->frontsector; + pdd.dx = line->dx>>8; + pdd.dy = line->dy>>8; + + return EV_DoPolyObjDisplace(&pdd); +} + + +// Parses arguments for parameterized polyobject rotate-by-sector-heights specials +static boolean PolyRotDisplace(line_t *line) +{ + polyrotdisplacedata_t pdd; + fixed_t anginter, distinter; + + pdd.polyObjNum = Tag_FGet(&line->tags); + pdd.controlSector = line->frontsector; + + // Rotate 'anginter' interval for each 'distinter' interval from the control sector. + // Use default values if not provided as fallback. + anginter = sides[line->sidenum[0]].rowoffset ? sides[line->sidenum[0]].rowoffset : 90*FRACUNIT; + distinter = sides[line->sidenum[0]].textureoffset ? sides[line->sidenum[0]].textureoffset : 128*FRACUNIT; + pdd.rotscale = FixedDiv(anginter, distinter); + + // Same behavior as other rotators when carrying things. + if (line->flags & ML_NOCLIMB) + pdd.turnobjs = 0; + else if (line->flags & ML_EFFECT4) + pdd.turnobjs = 2; + else + pdd.turnobjs = 1; + + return EV_DoPolyObjRotDisplace(&pdd); +} + + +// +// P_RunNightserizeExecutors +// +void P_RunNightserizeExecutors(mobj_t *actor) +{ + size_t i; + + for (i = 0; i < numlines; i++) + { + if (lines[i].special == 323 || lines[i].special == 324) + P_RunTriggerLinedef(&lines[i], actor, NULL); + } +} + +// +// P_RunDeNightserizeExecutors +// +void P_RunDeNightserizeExecutors(mobj_t *actor) +{ + size_t i; + + for (i = 0; i < numlines; i++) + { + if (lines[i].special == 325 || lines[i].special == 326) + P_RunTriggerLinedef(&lines[i], actor, NULL); + } +} + +// +// P_RunNightsLapExecutors +// +void P_RunNightsLapExecutors(mobj_t *actor) +{ + size_t i; + + for (i = 0; i < numlines; i++) + { + if (lines[i].special == 327 || lines[i].special == 328) + P_RunTriggerLinedef(&lines[i], actor, NULL); + } +} + +// +// P_RunNightsCapsuleTouchExecutors +// +void P_RunNightsCapsuleTouchExecutors(mobj_t *actor, boolean entering, boolean enoughspheres) +{ + size_t i; + + for (i = 0; i < numlines; i++) + { + if ((lines[i].special == 329 || lines[i].special == 330) + && ((entering && (lines[i].flags & ML_TFERLINE)) + || (!entering && !(lines[i].flags & ML_TFERLINE))) + && ((lines[i].flags & ML_DONTPEGTOP) + || (enoughspheres && !(lines[i].flags & ML_BOUNCY)) + || (!enoughspheres && (lines[i].flags & ML_BOUNCY)))) + P_RunTriggerLinedef(&lines[i], actor, NULL); + } +} + +/** Finds minimum light from an adjacent sector. + * + * \param sector Sector to start in. + * \param max Maximum value to return. + * \return Minimum light value from an adjacent sector, or max if the minimum + * light value is greater than max. + */ +INT32 P_FindMinSurroundingLight(sector_t *sector, INT32 max) +{ + size_t i; + INT32 min = max; + line_t *line; + sector_t *check; + + for (i = 0; i < sector->linecount; i++) + { + line = sector->lines[i]; + check = getNextSector(line,sector); + + if (!check) + continue; + + if (check->lightlevel < min) + min = check->lightlevel; + } + return min; +} + +void T_ExecutorDelay(executor_t *e) +{ + if (--e->timer <= 0) + { + if (e->caller && P_MobjWasRemoved(e->caller)) // If the mobj died while we were delaying + P_SetTarget(&e->caller, NULL); // Call with no mobj! + P_ProcessLineSpecial(e->line, e->caller, e->sector); + P_SetTarget(&e->caller, NULL); // Let the mobj know it can be removed now. + P_RemoveThinker(&e->thinker); + } +} + +static void P_AddExecutorDelay(line_t *line, mobj_t *mobj, sector_t *sector) +{ + executor_t *e; + INT32 delay; + + if (udmf) + delay = line->executordelay; + else + { + if (!line->backsector) + I_Error("P_AddExecutorDelay: Line has no backsector!\n"); + + delay = (line->backsector->ceilingheight >> FRACBITS) + (line->backsector->floorheight >> FRACBITS); + } + + e = Z_Calloc(sizeof (*e), PU_LEVSPEC, NULL); + + e->thinker.function.acp1 = (actionf_p1)T_ExecutorDelay; + e->line = line; + e->sector = sector; + e->timer = delay; + P_SetTarget(&e->caller, mobj); // Use P_SetTarget to make sure the mobj doesn't get freed while we're delaying. + P_AddThinker(THINK_MAIN, &e->thinker); +} + +/** Used by P_RunTriggerLinedef to check a NiGHTS trigger linedef's conditions + * + * \param triggerline Trigger linedef to check conditions for; should NEVER be NULL. + * \param actor Object initiating the action; should not be NULL. + * \sa P_RunTriggerLinedef + */ +static boolean P_CheckNightsTriggerLine(line_t *triggerline, mobj_t *actor) +{ + INT16 specialtype = triggerline->special; + size_t i; + + UINT8 inputmare = max(0, min(255, sides[triggerline->sidenum[0]].textureoffset>>FRACBITS)); + UINT8 inputlap = max(0, min(255, sides[triggerline->sidenum[0]].rowoffset>>FRACBITS)); + + boolean ltemare = triggerline->flags & ML_NOCLIMB; + boolean gtemare = triggerline->flags & ML_BLOCKMONSTERS; + boolean ltelap = triggerline->flags & ML_EFFECT1; + boolean gtelap = triggerline->flags & ML_EFFECT2; + + boolean lapfrombonustime = triggerline->flags & ML_EFFECT3; + boolean perglobalinverse = triggerline->flags & ML_DONTPEGBOTTOM; + boolean perglobal = !(triggerline->flags & ML_EFFECT4) && !perglobalinverse; + + boolean donomares = triggerline->flags & ML_BOUNCY; // nightserize: run at end of level (no mares) + boolean fromnonights = triggerline->flags & ML_TFERLINE; // nightserize: from non-nights // denightserize: all players no nights + boolean fromnights = triggerline->flags & ML_DONTPEGTOP; // nightserize: from nights // denightserize: >0 players are nights + + UINT8 currentmare = UINT8_MAX; + UINT8 currentlap = UINT8_MAX; + + // Do early returns for Nightserize + if (specialtype >= 323 && specialtype <= 324) + { + // run only when no mares are found + if (donomares && P_FindLowestMare() != UINT8_MAX) + return false; + + // run only if there is a mare present + if (!donomares && P_FindLowestMare() == UINT8_MAX) + return false; + + // run only if player is nightserizing from non-nights + if (fromnonights) + { + if (!actor->player) + return false; + else if (actor->player->powers[pw_carry] == CR_NIGHTSMODE) + return false; + } + // run only if player is nightserizing from nights + else if (fromnights) + { + if (!actor->player) + return false; + else if (actor->player->powers[pw_carry] != CR_NIGHTSMODE) + return false; + } + } + + // Get current mare and lap (and check early return for DeNightserize) + if (perglobal || perglobalinverse + || (specialtype >= 325 && specialtype <= 326 && (fromnonights || fromnights))) + { + UINT8 playersarenights = 0; + + for (i = 0; i < MAXPLAYERS; i++) + { + UINT8 lap; + if (!playeringame[i] || players[i].spectator) + continue; + + // denightserize: run only if all players are not nights + if (specialtype >= 325 && specialtype <= 326 && fromnonights + && players[i].powers[pw_carry] == CR_NIGHTSMODE) + return false; + + // count number of nights players for denightserize return + if (specialtype >= 325 && specialtype <= 326 && fromnights + && players[i].powers[pw_carry] == CR_NIGHTSMODE) + playersarenights++; + + lap = lapfrombonustime ? players[i].marebonuslap : players[i].marelap; + + // get highest mare/lap of players + if (perglobal) + { + if (players[i].mare > currentmare || currentmare == UINT8_MAX) + { + currentmare = players[i].mare; + currentlap = UINT8_MAX; + } + if (players[i].mare == currentmare + && (lap > currentlap || currentlap == UINT8_MAX)) + currentlap = lap; + } + // get lowest mare/lap of players + else if (perglobalinverse) + { + if (players[i].mare < currentmare || currentmare == UINT8_MAX) + { + currentmare = players[i].mare; + currentlap = UINT8_MAX; + } + if (players[i].mare == currentmare + && (lap < currentlap || currentlap == UINT8_MAX)) + currentlap = lap; + } + } + + // denightserize: run only if >0 players are nights + if (specialtype >= 325 && specialtype <= 326 && fromnights + && playersarenights < 1) + return false; + } + // get current mare/lap from triggering player + else if (!perglobal && !perglobalinverse) + { + if (!actor->player) + return false; + currentmare = actor->player->mare; + currentlap = lapfrombonustime ? actor->player->marebonuslap : actor->player->marelap; + } + + if (lapfrombonustime && !currentlap) + return false; // special case: player->marebonuslap is 0 until passing through on bonus time. Don't trigger lines looking for inputlap 0. + + // Compare current mare/lap to input mare/lap based on rules + if (!(specialtype >= 323 && specialtype <= 324 && donomares) // don't return false if donomares and we got this far + && ((ltemare && currentmare > inputmare) + || (gtemare && currentmare < inputmare) + || (!ltemare && !gtemare && currentmare != inputmare) + || (ltelap && currentlap > inputlap) + || (gtelap && currentlap < inputlap) + || (!ltelap && !gtelap && currentlap != inputlap)) + ) + return false; + + return true; +} + +/** Used by P_LinedefExecute to check a trigger linedef's conditions + * The linedef executor specials in the trigger linedef's sector are run if all conditions are met. + * Return false cancels P_LinedefExecute, this happens if a condition is not met. + * + * \param triggerline Trigger linedef to check conditions for; should NEVER be NULL. + * \param actor Object initiating the action; should not be NULL. + * \param caller Sector in which the action was started. May be NULL. + * \sa P_ProcessLineSpecial, P_LinedefExecute + */ +boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller) +{ + sector_t *ctlsector; + fixed_t dist = P_AproxDistance(triggerline->dx, triggerline->dy)>>FRACBITS; + size_t i, linecnt, sectori; + INT16 specialtype = triggerline->special; + + ///////////////////////////////////////////////// + // Distance-checking/sector trigger conditions // + ///////////////////////////////////////////////// + + // Linetypes 303 and 304 require a specific + // number, or minimum or maximum, of rings. + if (specialtype == 303 || specialtype == 304) + { + fixed_t rings = 0; + + // With the passuse flag, count all player's + // rings. + if (triggerline->flags & ML_EFFECT4) + { + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i] || players[i].spectator) + continue; + + if (!players[i].mo || ((maptol & TOL_NIGHTS) ? players[i].spheres : players[i].rings) <= 0) + continue; + + rings += (maptol & TOL_NIGHTS) ? players[i].spheres : players[i].rings; + } + } + else + { + if (!(actor && actor->player)) + return false; // no player to count rings from here, sorry + + rings = (maptol & TOL_NIGHTS) ? actor->player->spheres : actor->player->rings; + } + + if (triggerline->flags & ML_NOCLIMB) + { + if (rings > dist) + return false; + } + else if (triggerline->flags & ML_BLOCKMONSTERS) + { + if (rings < dist) + return false; + } + else + { + if (rings != dist) + return false; + } + } + else if (specialtype >= 314 && specialtype <= 315) + { + msecnode_t *node; + mobj_t *mo; + INT32 numpush = 0; + INT32 numneeded = dist; + + if (!caller) + return false; // we need a calling sector to find pushables in, silly! + + // Count the pushables in this sector + node = caller->touching_thinglist; // things touching this sector + while (node) + { + mo = node->m_thing; + if ((mo->flags & MF_PUSHABLE) || ((mo->info->flags & MF_PUSHABLE) && mo->fuse)) + numpush++; + node = node->m_thinglist_next; + } + + if (triggerline->flags & ML_NOCLIMB) // Need at least or more + { + if (numpush < numneeded) + return false; + } + else if (triggerline->flags & ML_EFFECT4) // Need less than + { + if (numpush >= numneeded) + return false; + } + else // Need exact + { + if (numpush != numneeded) + return false; + } + } + else if (caller) + { + if (GETSECSPECIAL(caller->special, 2) == 6) + { + if (!(ALL7EMERALDS(emeralds))) + return false; + } + else if (GETSECSPECIAL(caller->special, 2) == 7) + { + UINT8 mare; + + if (!(maptol & TOL_NIGHTS)) + return false; + + mare = P_FindLowestMare(); + + if (triggerline->flags & ML_NOCLIMB) + { + if (!(mare <= dist)) + return false; + } + else if (triggerline->flags & ML_BLOCKMONSTERS) + { + if (!(mare >= dist)) + return false; + } + else + { + if (!(mare == dist)) + return false; + } + } + // If we were not triggered by a sector type especially for the purpose, + // a Linedef Executor linedef trigger is not handling sector triggers properly, return. + + else if ((!GETSECSPECIAL(caller->special, 2) || GETSECSPECIAL(caller->special, 2) > 7) && (specialtype > 322)) + { + CONS_Alert(CONS_WARNING, + M_GetText("Linedef executor trigger isn't handling sector triggers properly!\nspecialtype = %d, if you are not a dev, report this warning instance\nalong with the wad that caused it!\n"), + specialtype); + return false; + } + } + + ////////////////////////////////////// + // Miscellaneous trigger conditions // + ////////////////////////////////////// + + switch (specialtype) + { + case 305: // continuous + case 306: // each time + case 307: // once + if (!(actor && actor->player && actor->player->charability == dist/10)) + return false; + break; + case 309: // continuous + case 310: // each time + // Only red team members can activate this. + if (!(actor && actor->player && actor->player->ctfteam == 1)) + return false; + break; + case 311: // continuous + case 312: // each time + // Only blue team members can activate this. + if (!(actor && actor->player && actor->player->ctfteam == 2)) + return false; + break; + case 317: // continuous + case 318: // once + { // Unlockable triggers required + INT32 trigid = (INT32)(sides[triggerline->sidenum[0]].textureoffset>>FRACBITS); + + if ((modifiedgame && !savemoddata) || (netgame || multiplayer)) + return false; + else if (trigid < 0 || trigid > 31) // limited by 32 bit variable + { + CONS_Debug(DBG_GAMELOGIC, "Unlockable trigger (sidedef %hu): bad trigger ID %d\n", triggerline->sidenum[0], trigid); + return false; + } + else if (!(unlocktriggers & (1 << trigid))) + return false; + } + break; + case 319: // continuous + case 320: // once + { // An unlockable itself must be unlocked! + INT32 unlockid = (INT32)(sides[triggerline->sidenum[0]].textureoffset>>FRACBITS); + + if ((modifiedgame && !savemoddata) || (netgame || multiplayer)) + return false; + else if (unlockid < 0 || unlockid >= MAXUNLOCKABLES) // limited by unlockable count + { + CONS_Debug(DBG_GAMELOGIC, "Unlockable check (sidedef %hu): bad unlockable ID %d\n", triggerline->sidenum[0], unlockid); + return false; + } + else if (!(unlockables[unlockid-1].unlocked)) + return false; + } + break; + case 321: // continuous + case 322: // each time + // decrement calls left before triggering + if (triggerline->callcount > 0) + { + if (--triggerline->callcount > 0) + return false; + } + break; + case 323: // nightserize - each time + case 324: // nightserize - once + case 325: // denightserize - each time + case 326: // denightserize - once + case 327: // nights lap - each time + case 328: // nights lap - once + case 329: // nights egg capsule touch - each time + case 330: // nights egg capsule touch - once + if (!P_CheckNightsTriggerLine(triggerline, actor)) + return false; + break; + case 331: // continuous + case 332: // each time + case 333: // once + if (!(actor && actor->player && ((stricmp(triggerline->text, skins[actor->player->skin].name) == 0) ^ ((triggerline->flags & ML_NOCLIMB) == ML_NOCLIMB)))) + return false; + break; + case 334: // object dye - continuous + case 335: // object dye - each time + case 336: // object dye - once + { + INT32 triggercolor = (INT32)sides[triggerline->sidenum[0]].toptexture; + UINT16 color = (actor->player ? actor->player->powers[pw_dye] : actor->color); + boolean invert = (triggerline->flags & ML_NOCLIMB ? true : false); + + if (invert ^ (triggercolor != color)) + return false; + } + default: + break; + } + + ///////////////////////////////// + // Processing linedef specials // + ///////////////////////////////// + + ctlsector = triggerline->frontsector; + sectori = (size_t)(ctlsector - sectors); + linecnt = ctlsector->linecount; + + if (triggerline->flags & ML_EFFECT5) // disregard order for efficiency + { + for (i = 0; i < linecnt; i++) + if (ctlsector->lines[i]->special >= 400 + && ctlsector->lines[i]->special < 500) + { + if (ctlsector->lines[i]->executordelay) + P_AddExecutorDelay(ctlsector->lines[i], actor, caller); + else + P_ProcessLineSpecial(ctlsector->lines[i], actor, caller); + } + } + else // walk around the sector in a defined order + { + boolean backwards = false; + size_t j, masterlineindex = (size_t)-1; + + for (i = 0; i < linecnt; i++) + if (ctlsector->lines[i] == triggerline) + { + masterlineindex = i; + break; + } + +#ifdef PARANOIA + if (masterlineindex == (size_t)-1) + { + const size_t li = (size_t)(ctlsector->lines[i] - lines); + I_Error("Line %s isn't linked into its front sector", sizeu1(li)); + } +#endif + + // i == masterlineindex + for (;;) + { + if (backwards) // v2 to v1 + { + for (j = 0; j < linecnt; j++) + { + if (i == j) + continue; + if (ctlsector->lines[i]->v1 == ctlsector->lines[j]->v2) + { + i = j; + break; + } + if (ctlsector->lines[i]->v1 == ctlsector->lines[j]->v1) + { + i = j; + backwards = false; + break; + } + } + if (j == linecnt) + { + const size_t vertexei = (size_t)(ctlsector->lines[i]->v1 - vertexes); + CONS_Debug(DBG_GAMELOGIC, "Warning: Sector %s is not closed at vertex %s (%d, %d)\n", + sizeu1(sectori), sizeu2(vertexei), ctlsector->lines[i]->v1->x, ctlsector->lines[i]->v1->y); + return false; // abort + } + } + else // v1 to v2 + { + for (j = 0; j < linecnt; j++) + { + if (i == j) + continue; + if (ctlsector->lines[i]->v2 == ctlsector->lines[j]->v1) + { + i = j; + break; + } + if (ctlsector->lines[i]->v2 == ctlsector->lines[j]->v2) + { + i = j; + backwards = true; + break; + } + } + if (j == linecnt) + { + const size_t vertexei = (size_t)(ctlsector->lines[i]->v1 - vertexes); + CONS_Debug(DBG_GAMELOGIC, "Warning: Sector %s is not closed at vertex %s (%d, %d)\n", + sizeu1(sectori), sizeu2(vertexei), ctlsector->lines[i]->v2->x, ctlsector->lines[i]->v2->y); + return false; // abort + } + } + + if (i == masterlineindex) + break; + + if (ctlsector->lines[i]->special >= 400 + && ctlsector->lines[i]->special < 500) + { + if (ctlsector->lines[i]->executordelay) + P_AddExecutorDelay(ctlsector->lines[i], actor, caller); + else + P_ProcessLineSpecial(ctlsector->lines[i], actor, caller); + } + } + } + + // "Trigger on X calls" linedefs reset if noclimb is set + if ((specialtype == 321 || specialtype == 322) && triggerline->flags & ML_NOCLIMB) + triggerline->callcount = sides[triggerline->sidenum[0]].textureoffset>>FRACBITS; + else + // These special types work only once + if (specialtype == 302 // Once + || specialtype == 304 // Ring count - Once + || specialtype == 307 // Character ability - Once + || specialtype == 308 // Race only - Once + || specialtype == 313 // No More Enemies - Once + || specialtype == 315 // No of pushables - Once + || specialtype == 318 // Unlockable trigger - Once + || specialtype == 320 // Unlockable - Once + || specialtype == 321 || specialtype == 322 // Trigger on X calls - Continuous + Each Time + || specialtype == 324 // Nightserize - Once + || specialtype == 326 // DeNightserize - Once + || specialtype == 328 // Nights lap - Once + || specialtype == 330 // Nights Bonus Time - Once + || specialtype == 333 // Skin - Once + || specialtype == 336 // Dye - Once + || specialtype == 399) // Level Load + triggerline->special = 0; // Clear it out + + return true; +} + +/** Runs a linedef executor. + * Can be called by: + * - a player moving into a special sector or FOF. + * - a pushable object moving into a special sector or FOF. + * - a ceiling or floor movement from a previous linedef executor finishing. + * - any object in a state with the A_LinedefExecute() action. + * + * \param tag Tag of the linedef executor to run. + * \param actor Object initiating the action; should not be NULL. + * \param caller Sector in which the action was started. May be NULL. + * \sa P_ProcessLineSpecial, P_RunTriggerLinedef + * \author Graue + */ +void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller) +{ + size_t masterline; + + CONS_Debug(DBG_GAMELOGIC, "P_LinedefExecute: Executing trigger linedefs of tag %d\n", tag); + + I_Assert(!actor || !P_MobjWasRemoved(actor)); // If actor is there, it must be valid. + + for (masterline = 0; masterline < numlines; masterline++) + { + if (Tag_FGet(&lines[masterline].tags) != tag) + continue; + + // "No More Enemies" and "Level Load" take care of themselves. + if (lines[masterline].special == 313 + || lines[masterline].special == 399 + // Each-time executors handle themselves, too + || lines[masterline].special == 301 // Each time + || lines[masterline].special == 306 // Character ability - Each time + || lines[masterline].special == 310 // CTF Red team - Each time + || lines[masterline].special == 312 // CTF Blue team - Each time + || lines[masterline].special == 322 // Trigger on X calls - Each Time + || lines[masterline].special == 332 // Skin - Each time + || lines[masterline].special == 335)// Dye - Each time + continue; + + if (lines[masterline].special < 300 + || lines[masterline].special > 399) + continue; + + if (!P_RunTriggerLinedef(&lines[masterline], actor, caller)) + return; // cancel P_LinedefExecute if function returns false + } +} + +// +// P_SwitchWeather +// +// Switches the weather! +// +void P_SwitchWeather(INT32 weathernum) +{ + boolean purge = false; + INT32 swap = 0; + + switch (weathernum) + { + case PRECIP_NONE: // None + if (curWeather == PRECIP_NONE) + return; // Nothing to do. + purge = true; + break; + case PRECIP_STORM: // Storm + case PRECIP_STORM_NOSTRIKES: // Storm w/ no lightning + case PRECIP_RAIN: // Rain + if (curWeather == PRECIP_SNOW || curWeather == PRECIP_BLANK || curWeather == PRECIP_STORM_NORAIN) + swap = PRECIP_RAIN; + break; + case PRECIP_SNOW: // Snow + if (curWeather == PRECIP_SNOW) + return; // Nothing to do. + if (curWeather == PRECIP_RAIN || curWeather == PRECIP_STORM || curWeather == PRECIP_STORM_NOSTRIKES || curWeather == PRECIP_BLANK || curWeather == PRECIP_STORM_NORAIN) + swap = PRECIP_SNOW; // Need to delete the other precips. + break; + case PRECIP_STORM_NORAIN: // Storm w/o rain + if (curWeather == PRECIP_SNOW + || curWeather == PRECIP_STORM + || curWeather == PRECIP_STORM_NOSTRIKES + || curWeather == PRECIP_RAIN + || curWeather == PRECIP_BLANK) + swap = PRECIP_STORM_NORAIN; + else if (curWeather == PRECIP_STORM_NORAIN) + return; + break; + case PRECIP_BLANK: + if (curWeather == PRECIP_SNOW + || curWeather == PRECIP_STORM + || curWeather == PRECIP_STORM_NOSTRIKES + || curWeather == PRECIP_RAIN) + swap = PRECIP_BLANK; + else if (curWeather == PRECIP_STORM_NORAIN) + swap = PRECIP_BLANK; + else if (curWeather == PRECIP_BLANK) + return; + break; + default: + CONS_Debug(DBG_GAMELOGIC, "P_SwitchWeather: Unknown weather type %d.\n", weathernum); + break; + } + + if (purge) + { + thinker_t *think; + precipmobj_t *precipmobj; + + for (think = thlist[THINK_PRECIP].next; think != &thlist[THINK_PRECIP]; think = think->next) + { + if (think->function.acp1 != (actionf_p1)P_NullPrecipThinker) + continue; // not a precipmobj thinker + + precipmobj = (precipmobj_t *)think; + + P_RemovePrecipMobj(precipmobj); + } + } + else if (swap && !((swap == PRECIP_BLANK && curWeather == PRECIP_STORM_NORAIN) || (swap == PRECIP_STORM_NORAIN && curWeather == PRECIP_BLANK))) // Rather than respawn all that crap, reuse it! + { + thinker_t *think; + precipmobj_t *precipmobj; + state_t *st; + + for (think = thlist[THINK_PRECIP].next; think != &thlist[THINK_PRECIP]; think = think->next) + { + if (think->function.acp1 != (actionf_p1)P_NullPrecipThinker) + continue; // not a precipmobj thinker + precipmobj = (precipmobj_t *)think; + + if (swap == PRECIP_RAIN) // Snow To Rain + { + precipmobj->flags = mobjinfo[MT_RAIN].flags; + st = &states[mobjinfo[MT_RAIN].spawnstate]; + precipmobj->state = st; + precipmobj->tics = st->tics; + precipmobj->sprite = st->sprite; + precipmobj->frame = st->frame; + precipmobj->momz = mobjinfo[MT_RAIN].speed; + + precipmobj->precipflags &= ~PCF_INVISIBLE; + + precipmobj->precipflags |= PCF_RAIN; + //think->function.acp1 = (actionf_p1)P_RainThinker; + } + else if (swap == PRECIP_SNOW) // Rain To Snow + { + INT32 z; + + precipmobj->flags = mobjinfo[MT_SNOWFLAKE].flags; + z = M_RandomByte(); + + if (z < 64) + z = 2; + else if (z < 144) + z = 1; + else + z = 0; + + st = &states[mobjinfo[MT_SNOWFLAKE].spawnstate+z]; + precipmobj->state = st; + precipmobj->tics = st->tics; + precipmobj->sprite = st->sprite; + precipmobj->frame = st->frame; + precipmobj->momz = mobjinfo[MT_SNOWFLAKE].speed; + + precipmobj->precipflags &= ~(PCF_INVISIBLE|PCF_RAIN); + + //think->function.acp1 = (actionf_p1)P_SnowThinker; + } + else if (swap == PRECIP_BLANK || swap == PRECIP_STORM_NORAIN) // Remove precip, but keep it around for reuse. + { + //think->function.acp1 = (actionf_p1)P_NullPrecipThinker; + + precipmobj->precipflags |= PCF_INVISIBLE; + } + } + } + + switch (weathernum) + { + case PRECIP_SNOW: // snow + curWeather = PRECIP_SNOW; + + if (!swap) + P_SpawnPrecipitation(); + + break; + case PRECIP_RAIN: // rain + { + boolean dontspawn = false; + + if (curWeather == PRECIP_RAIN || curWeather == PRECIP_STORM || curWeather == PRECIP_STORM_NOSTRIKES) + dontspawn = true; + + curWeather = PRECIP_RAIN; + + if (!dontspawn && !swap) + P_SpawnPrecipitation(); + + break; + } + case PRECIP_STORM: // storm + { + boolean dontspawn = false; + + if (curWeather == PRECIP_RAIN || curWeather == PRECIP_STORM || curWeather == PRECIP_STORM_NOSTRIKES) + dontspawn = true; + + curWeather = PRECIP_STORM; + + if (!dontspawn && !swap) + P_SpawnPrecipitation(); + + break; + } + case PRECIP_STORM_NOSTRIKES: // storm w/o lightning + { + boolean dontspawn = false; + + if (curWeather == PRECIP_RAIN || curWeather == PRECIP_STORM || curWeather == PRECIP_STORM_NOSTRIKES) + dontspawn = true; + + curWeather = PRECIP_STORM_NOSTRIKES; + + if (!dontspawn && !swap) + P_SpawnPrecipitation(); + + break; + } + case PRECIP_STORM_NORAIN: // storm w/o rain + curWeather = PRECIP_STORM_NORAIN; + + if (!swap) + P_SpawnPrecipitation(); + + break; + case PRECIP_BLANK: + curWeather = PRECIP_BLANK; + + if (!swap) + P_SpawnPrecipitation(); + + break; + default: + curWeather = PRECIP_NONE; + break; + } +} + +/** Gets an object. + * + * \param type Object type to look for. + * \param s Sector number to look in. + * \return Pointer to the first ::type found in the sector. + * \sa P_GetPushThing + */ +static mobj_t *P_GetObjectTypeInSectorNum(mobjtype_t type, size_t s) +{ + sector_t *sec = sectors + s; + mobj_t *thing = sec->thinglist; + + while (thing) + { + if (thing->type == type) + return thing; + thing = thing->snext; + } + return NULL; +} + +/** Processes the line special triggered by an object. + * + * \param line Line with the special command on it. + * \param mo mobj that triggered the line. Must be valid and non-NULL. + * \param callsec sector in which action was initiated; this can be NULL. + * Because of the A_LinedefExecute() action, even if non-NULL, + * this sector might not have the same tag as the linedef executor, + * and it might not have the linedef executor sector type. + * \todo Handle mo being NULL gracefully. T_MoveFloor() and T_MoveCeiling() + * don't have an object to pass. + * \todo Split up into multiple functions. + * \sa P_LinedefExecute + * \author Graue + */ +static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) +{ + INT32 secnum = -1; + mobj_t *bot = NULL; + mtag_t tag = Tag_FGet(&line->tags); + + I_Assert(!mo || !P_MobjWasRemoved(mo)); // If mo is there, mo must be valid! + + if (mo && mo->player && botingame) + bot = players[secondarydisplayplayer].mo; + + // note: only commands with linedef types >= 400 && < 500 can be used + switch (line->special) + { + case 400: // Set tagged sector's floor height/pic + EV_DoFloor(line, instantMoveFloorByFrontSector); + break; + + case 401: // Set tagged sector's ceiling height/pic + EV_DoCeiling(line, instantMoveCeilingByFrontSector); + break; + + case 402: // Set tagged sector's light level + { + INT16 newlightlevel; + INT32 newfloorlightsec, newceilinglightsec; + + newlightlevel = line->frontsector->lightlevel; + newfloorlightsec = line->frontsector->floorlightsec; + newceilinglightsec = line->frontsector->ceilinglightsec; + + // act on all sectors with the same tag as the triggering linedef + TAG_ITER_SECTORS(tag, secnum) + { + if (sectors[secnum].lightingdata) + { + // Stop the lighting madness going on in this sector! + P_RemoveThinker(&((elevator_t *)sectors[secnum].lightingdata)->thinker); + sectors[secnum].lightingdata = NULL; + + // No, it's not an elevator_t, but any struct with a thinker_t named + // 'thinker' at the beginning will do here. (We don't know what it + // actually is: could be lightlevel_t, fireflicker_t, glow_t, etc.) + } + + sectors[secnum].lightlevel = newlightlevel; + sectors[secnum].floorlightsec = newfloorlightsec; + sectors[secnum].ceilinglightsec = newceilinglightsec; + } + } + break; + + case 403: // Move floor, linelen = speed, frontsector floor = dest height + EV_DoFloor(line, moveFloorByFrontSector); + break; + + case 404: // Move ceiling, linelen = speed, frontsector ceiling = dest height + EV_DoCeiling(line, moveCeilingByFrontSector); + break; + + case 405: // Move floor by front side texture offsets, offset x = speed, offset y = amount to raise/lower + EV_DoFloor(line, moveFloorByFrontTexture); + break; + + case 407: // Move ceiling by front side texture offsets, offset x = speed, offset y = amount to raise/lower + EV_DoCeiling(line, moveCeilingByFrontTexture); + break; + +/* case 405: // Lower floor by line, dx = speed, dy = amount to lower + EV_DoFloor(line, lowerFloorByLine); + break; + + case 406: // Raise floor by line, dx = speed, dy = amount to raise + EV_DoFloor(line, raiseFloorByLine); + break; + + case 407: // Lower ceiling by line, dx = speed, dy = amount to lower + EV_DoCeiling(line, lowerCeilingByLine); + break; + + case 408: // Raise ceiling by line, dx = speed, dy = amount to raise + EV_DoCeiling(line, raiseCeilingByLine); + break;*/ + + case 409: // Change tagged sectors' tag + // (formerly "Change calling sectors' tag", but behavior was changed) + { + TAG_ITER_SECTORS(tag, secnum) + Tag_SectorFSet(secnum,(INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS)); + break; + } + + case 410: // Change front sector's tag + Tag_SectorFSet((UINT32)(line->frontsector - sectors), (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS)); + break; + + case 411: // Stop floor/ceiling movement in tagged sector(s) + TAG_ITER_SECTORS(tag, secnum) + { + if (sectors[secnum].floordata) + { + if (sectors[secnum].floordata == sectors[secnum].ceilingdata) // elevator + { + P_RemoveThinker(&((elevator_t *)sectors[secnum].floordata)->thinker); + sectors[secnum].floordata = sectors[secnum].ceilingdata = NULL; + sectors[secnum].floorspeed = sectors[secnum].ceilspeed = 0; + } + else // floormove + { + P_RemoveThinker(&((floormove_t *)sectors[secnum].floordata)->thinker); + sectors[secnum].floordata = NULL; + sectors[secnum].floorspeed = 0; + } + } + + if (sectors[secnum].ceilingdata) // ceiling + { + P_RemoveThinker(&((ceiling_t *)sectors[secnum].ceilingdata)->thinker); + sectors[secnum].ceilingdata = NULL; + sectors[secnum].ceilspeed = 0; + } + } + break; + + case 412: // Teleport the player or thing + { + mobj_t *dest; + + if (!mo) // nothing to teleport + return; + + if (line->flags & ML_EFFECT3) // Relative silent teleport + { + fixed_t x, y, z; + + x = sides[line->sidenum[0]].textureoffset; + y = sides[line->sidenum[0]].rowoffset; + z = line->frontsector->ceilingheight; + + P_UnsetThingPosition(mo); + mo->x += x; + mo->y += y; + mo->z += z; + P_SetThingPosition(mo); + + if (mo->player) + { + if (bot) // This might put poor Tails in a wall if he's too far behind! D: But okay, whatever! >:3 + P_TeleportMove(bot, bot->x + x, bot->y + y, bot->z + z); + if (splitscreen && mo->player == &players[secondarydisplayplayer] && camera2.chase) + { + camera2.x += x; + camera2.y += y; + camera2.z += z; + camera2.subsector = R_PointInSubsector(camera2.x, camera2.y); + } + else if (camera.chase && mo->player == &players[displayplayer]) + { + camera.x += x; + camera.y += y; + camera.z += z; + camera.subsector = R_PointInSubsector(camera.x, camera.y); + } + } + } + else + { + if ((secnum = Tag_Iterate_Sectors(tag, 0)) < 0) + return; + + dest = P_GetObjectTypeInSectorNum(MT_TELEPORTMAN, secnum); + if (!dest) + return; + + if (bot) + P_Teleport(bot, dest->x, dest->y, dest->z, (line->flags & ML_NOCLIMB) ? mo->angle : dest->angle, (line->flags & ML_BLOCKMONSTERS) == 0, (line->flags & ML_EFFECT4) == ML_EFFECT4); + if (line->flags & ML_BLOCKMONSTERS) + P_Teleport(mo, dest->x, dest->y, dest->z, (line->flags & ML_NOCLIMB) ? mo->angle : dest->angle, false, (line->flags & ML_EFFECT4) == ML_EFFECT4); + else + { + P_Teleport(mo, dest->x, dest->y, dest->z, (line->flags & ML_NOCLIMB) ? mo->angle : dest->angle, true, (line->flags & ML_EFFECT4) == ML_EFFECT4); + // Play the 'bowrwoosh!' sound + S_StartSound(dest, sfx_mixup); + } + } + } + break; + + case 413: // Change music + // console player only unless NOCLIMB is set + if ((line->flags & ML_NOCLIMB) || (mo && mo->player && P_IsLocalPlayer(mo->player)) || titlemapinaction) + { + boolean musicsame = (!sides[line->sidenum[0]].text[0] || !strnicmp(sides[line->sidenum[0]].text, S_MusicName(), 7)); + UINT16 tracknum = (UINT16)max(sides[line->sidenum[0]].bottomtexture, 0); + INT32 position = (INT32)max(sides[line->sidenum[0]].midtexture, 0); + UINT32 prefadems = (UINT32)max(sides[line->sidenum[0]].textureoffset >> FRACBITS, 0); + UINT32 postfadems = (UINT32)max(sides[line->sidenum[0]].rowoffset >> FRACBITS, 0); + UINT8 fadetarget = (UINT8)max((line->sidenum[1] != 0xffff) ? sides[line->sidenum[1]].textureoffset >> FRACBITS : 0, 0); + INT16 fadesource = (INT16)max((line->sidenum[1] != 0xffff) ? sides[line->sidenum[1]].rowoffset >> FRACBITS : -1, -1); + + // Seek offset from current song position + if (line->flags & ML_EFFECT1) + { + // adjust for loop point if subtracting + if (position < 0 && S_GetMusicLength() && + S_GetMusicPosition() > S_GetMusicLoopPoint() && + S_GetMusicPosition() + position < S_GetMusicLoopPoint()) + position = max(S_GetMusicLength() - (S_GetMusicLoopPoint() - (S_GetMusicPosition() + position)), 0); + else + position = max(S_GetMusicPosition() + position, 0); + } + + // Fade current music to target volume (if music won't be changed) + if ((line->flags & ML_EFFECT2) && fadetarget && musicsame) + { + // 0 fadesource means fade from current volume. + // meaning that we can't specify volume 0 as the source volume -- this starts at 1. + if (!fadesource) + fadesource = -1; + + if (!postfadems) + S_SetInternalMusicVolume(fadetarget); + else + S_FadeMusicFromVolume(fadetarget, fadesource, postfadems); + + if (position) + S_SetMusicPosition(position); + } + // Change the music and apply position/fade operations + else + { + strncpy(mapmusname, sides[line->sidenum[0]].text, 7); + mapmusname[6] = 0; + + mapmusflags = tracknum & MUSIC_TRACKMASK; + if (!(line->flags & ML_BLOCKMONSTERS)) + mapmusflags |= MUSIC_RELOADRESET; + if (line->flags & ML_BOUNCY) + mapmusflags |= MUSIC_FORCERESET; + + mapmusposition = position; + + S_ChangeMusicEx(mapmusname, mapmusflags, !(line->flags & ML_EFFECT4), position, + !(line->flags & ML_EFFECT2) ? prefadems : 0, + !(line->flags & ML_EFFECT2) ? postfadems : 0); + + if ((line->flags & ML_EFFECT2) && fadetarget) + { + if (!postfadems) + S_SetInternalMusicVolume(fadetarget); + else + S_FadeMusicFromVolume(fadetarget, fadesource, postfadems); + } + } + + // Except, you can use the ML_BLOCKMONSTERS flag to change this behavior. + // if (mapmusflags & MUSIC_RELOADRESET) then it will reset the music in G_PlayerReborn. + } + break; + + case 414: // Play SFX + { + INT32 sfxnum; + + sfxnum = sides[line->sidenum[0]].toptexture; + + if (sfxnum == sfx_None) + return; // Do nothing! + if (sfxnum < sfx_None || sfxnum >= NUMSFX) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 414 Executor: sfx number %d is invalid!\n", sfxnum); + return; + } + + if (tag != 0) // Do special stuff only if a non-zero linedef tag is set + { + // Play sounds from tagged sectors' origins. + if (line->flags & ML_EFFECT5) // Repeat Midtexture + { + // Additionally play the sound from tagged sectors' soundorgs + sector_t *sec; + + TAG_ITER_SECTORS(tag, secnum) + { + sec = §ors[secnum]; + S_StartSound(&sec->soundorg, sfxnum); + } + } + + // Play the sound without origin for anyone, as long as they're inside tagged areas. + else + { + UINT8 i = 0; + mobj_t* camobj = players[displayplayer].mo; + ffloor_t *rover; + boolean foundit = false; + + for (i = 0; i < 2; camobj = players[secondarydisplayplayer].mo, i++) + { + if (!camobj) + continue; + + if (foundit || Tag_Find(&camobj->subsector->sector->tags, tag)) + { + foundit = true; + break; + } + + // Only trigger if mobj is touching the tag + for(rover = camobj->subsector->sector->ffloors; rover; rover = rover->next) + { + if (!Tag_Find(&rover->master->frontsector->tags, tag)) + continue; + + if (camobj->z > P_GetSpecialTopZ(camobj, sectors + rover->secnum, camobj->subsector->sector)) + continue; + + if (camobj->z + camobj->height < P_GetSpecialBottomZ(camobj, sectors + rover->secnum, camobj->subsector->sector)) + continue; + + foundit = true; + break; + } + } + + if (foundit) + S_StartSound(NULL, sfxnum); + } + } + else + { + if (line->flags & ML_NOCLIMB) + { + // play the sound from nowhere, but only if display player triggered it + if (mo && mo->player && (mo->player == &players[displayplayer] || mo->player == &players[secondarydisplayplayer])) + S_StartSound(NULL, sfxnum); + } + else if (line->flags & ML_EFFECT4) + { + // play the sound from nowhere + S_StartSound(NULL, sfxnum); + } + else if (line->flags & ML_BLOCKMONSTERS) + { + // play the sound from calling sector's soundorg + if (callsec) + S_StartSound(&callsec->soundorg, sfxnum); + else if (mo) + S_StartSound(&mo->subsector->sector->soundorg, sfxnum); + } + else if (mo) + { + // play the sound from mobj that triggered it + S_StartSound(mo, sfxnum); + } + } + } + break; + + case 415: // Run a script + if (cv_runscripts.value) + { + INT32 scrnum; + lumpnum_t lumpnum; + char newname[9]; + + strcpy(newname, G_BuildMapName(gamemap)); + newname[0] = 'S'; + newname[1] = 'C'; + newname[2] = 'R'; + + scrnum = sides[line->sidenum[0]].textureoffset>>FRACBITS; + if (scrnum < 0 || scrnum > 999) + { + scrnum = 0; + newname[5] = newname[6] = newname[7] = '0'; + } + else + { + newname[5] = (char)('0' + (char)((scrnum/100))); + newname[6] = (char)('0' + (char)((scrnum%100)/10)); + newname[7] = (char)('0' + (char)(scrnum%10)); + } + newname[8] = '\0'; + + lumpnum = W_CheckNumForName(newname); + + if (lumpnum == LUMPERROR || W_LumpLength(lumpnum) == 0) + { + CONS_Debug(DBG_SETUP, "SOC Error: script lump %s not found/not valid.\n", newname); + } + else + COM_BufInsertText(W_CacheLumpNum(lumpnum, PU_CACHE)); + } + break; + + case 416: // Spawn adjustable fire flicker + TAG_ITER_SECTORS(tag, secnum) + { + if (line->flags & ML_NOCLIMB && line->backsector) + { + // Use front sector for min light level, back sector for max. + // This is tricky because P_SpawnAdjustableFireFlicker expects + // the maxsector (second argument) to also be the target + // sector, so we have to do some light level twiddling. + fireflicker_t *flick; + INT16 reallightlevel = sectors[secnum].lightlevel; + sectors[secnum].lightlevel = line->backsector->lightlevel; + + flick = P_SpawnAdjustableFireFlicker(line->frontsector, §ors[secnum], + P_AproxDistance(line->dx, line->dy)>>FRACBITS); + + // Make sure the starting light level is in range. + if (reallightlevel < flick->minlight) + reallightlevel = (INT16)flick->minlight; + else if (reallightlevel > flick->maxlight) + reallightlevel = (INT16)flick->maxlight; + + sectors[secnum].lightlevel = reallightlevel; + } + else + { + // Use front sector for min, target sector for max, + // the same way linetype 61 does it. + P_SpawnAdjustableFireFlicker(line->frontsector, §ors[secnum], + P_AproxDistance(line->dx, line->dy)>>FRACBITS); + } + } + break; + + case 417: // Spawn adjustable glowing light + TAG_ITER_SECTORS(tag, secnum) + { + if (line->flags & ML_NOCLIMB && line->backsector) + { + // Use front sector for min light level, back sector for max. + // This is tricky because P_SpawnAdjustableGlowingLight expects + // the maxsector (second argument) to also be the target + // sector, so we have to do some light level twiddling. + glow_t *glow; + INT16 reallightlevel = sectors[secnum].lightlevel; + sectors[secnum].lightlevel = line->backsector->lightlevel; + + glow = P_SpawnAdjustableGlowingLight(line->frontsector, §ors[secnum], + P_AproxDistance(line->dx, line->dy)>>FRACBITS); + + // Make sure the starting light level is in range. + if (reallightlevel < glow->minlight) + reallightlevel = (INT16)glow->minlight; + else if (reallightlevel > glow->maxlight) + reallightlevel = (INT16)glow->maxlight; + + sectors[secnum].lightlevel = reallightlevel; + } + else + { + // Use front sector for min, target sector for max, + // the same way linetype 602 does it. + P_SpawnAdjustableGlowingLight(line->frontsector, §ors[secnum], + P_AproxDistance(line->dx, line->dy)>>FRACBITS); + } + } + break; + + case 418: // Spawn adjustable strobe flash (unsynchronized) + TAG_ITER_SECTORS(tag, secnum) + { + if (line->flags & ML_NOCLIMB && line->backsector) + { + // Use front sector for min light level, back sector for max. + // This is tricky because P_SpawnAdjustableGlowingLight expects + // the maxsector (second argument) to also be the target + // sector, so we have to do some light level twiddling. + strobe_t *flash; + INT16 reallightlevel = sectors[secnum].lightlevel; + sectors[secnum].lightlevel = line->backsector->lightlevel; + + flash = P_SpawnAdjustableStrobeFlash(line->frontsector, §ors[secnum], + abs(line->dx)>>FRACBITS, abs(line->dy)>>FRACBITS, false); + + // Make sure the starting light level is in range. + if (reallightlevel < flash->minlight) + reallightlevel = (INT16)flash->minlight; + else if (reallightlevel > flash->maxlight) + reallightlevel = (INT16)flash->maxlight; + + sectors[secnum].lightlevel = reallightlevel; + } + else + { + // Use front sector for min, target sector for max, + // the same way linetype 602 does it. + P_SpawnAdjustableStrobeFlash(line->frontsector, §ors[secnum], + abs(line->dx)>>FRACBITS, abs(line->dy)>>FRACBITS, false); + } + } + break; + + case 419: // Spawn adjustable strobe flash (synchronized) + TAG_ITER_SECTORS(tag, secnum) + { + if (line->flags & ML_NOCLIMB && line->backsector) + { + // Use front sector for min light level, back sector for max. + // This is tricky because P_SpawnAdjustableGlowingLight expects + // the maxsector (second argument) to also be the target + // sector, so we have to do some light level twiddling. + strobe_t *flash; + INT16 reallightlevel = sectors[secnum].lightlevel; + sectors[secnum].lightlevel = line->backsector->lightlevel; + + flash = P_SpawnAdjustableStrobeFlash(line->frontsector, §ors[secnum], + abs(line->dx)>>FRACBITS, abs(line->dy)>>FRACBITS, true); + + // Make sure the starting light level is in range. + if (reallightlevel < flash->minlight) + reallightlevel = (INT16)flash->minlight; + else if (reallightlevel > flash->maxlight) + reallightlevel = (INT16)flash->maxlight; + + sectors[secnum].lightlevel = reallightlevel; + } + else + { + // Use front sector for min, target sector for max, + // the same way linetype 602 does it. + P_SpawnAdjustableStrobeFlash(line->frontsector, §ors[secnum], + abs(line->dx)>>FRACBITS, abs(line->dy)>>FRACBITS, true); + } + } + break; + + case 420: // Fade light levels in tagged sectors to new value + P_FadeLight(tag, + (line->flags & ML_DONTPEGBOTTOM) ? max(sides[line->sidenum[0]].textureoffset>>FRACBITS, 0) : line->frontsector->lightlevel, + // failsafe: if user specifies Back Y Offset and NOT Front Y Offset, use the Back Offset + // to be consistent with other light and fade specials + (line->flags & ML_DONTPEGBOTTOM) ? + ((line->sidenum[1] != 0xFFFF && !(sides[line->sidenum[0]].rowoffset>>FRACBITS)) ? + max(min(sides[line->sidenum[1]].rowoffset>>FRACBITS, 255), 0) + : max(min(sides[line->sidenum[0]].rowoffset>>FRACBITS, 255), 0)) + : abs(P_AproxDistance(line->dx, line->dy))>>FRACBITS, + (line->flags & ML_EFFECT4), + (line->flags & ML_EFFECT5)); + break; + + case 421: // Stop lighting effect in tagged sectors + TAG_ITER_SECTORS(tag, secnum) + if (sectors[secnum].lightingdata) + { + P_RemoveThinker(&((elevator_t *)sectors[secnum].lightingdata)->thinker); + sectors[secnum].lightingdata = NULL; + } + break; + + case 422: // Cut away to another view + { + mobj_t *altview; + + if ((!mo || !mo->player) && !titlemapinaction) // only players have views, and title screens + return; + + if ((secnum = Tag_Iterate_Sectors(tag, 0)) < 0) + return; + + altview = P_GetObjectTypeInSectorNum(MT_ALTVIEWMAN, secnum); + if (!altview) + return; + + // If titlemap, set the camera ref for title's thinker + // This is not revoked until overwritten; awayviewtics is ignored + if (titlemapinaction) + titlemapcameraref = altview; + else + { + P_SetTarget(&mo->player->awayviewmobj, altview); + mo->player->awayviewtics = P_AproxDistance(line->dx, line->dy)>>FRACBITS; + } + + + if (line->flags & ML_NOCLIMB) // lets you specify a vertical angle + { + INT32 aim; + + aim = sides[line->sidenum[0]].textureoffset>>FRACBITS; + aim = (aim + 360) % 360; + aim *= (ANGLE_90>>8); + aim /= 90; + aim <<= 8; + if (titlemapinaction) + titlemapcameraref->cusval = (angle_t)aim; + else + mo->player->awayviewaiming = (angle_t)aim; + } + else + { + // straight ahead + if (!titlemapinaction) + mo->player->awayviewaiming = 0; + // don't do cusval cause that's annoying + } + } + break; + + case 423: // Change Sky + if ((mo && mo->player && P_IsLocalPlayer(mo->player)) || (line->flags & ML_NOCLIMB)) + P_SetupLevelSky(sides[line->sidenum[0]].textureoffset>>FRACBITS, (line->flags & ML_NOCLIMB)); + break; + + case 424: // Change Weather + if (line->flags & ML_NOCLIMB) + { + globalweather = (UINT8)(sides[line->sidenum[0]].textureoffset>>FRACBITS); + P_SwitchWeather(globalweather); + } + else if (mo && mo->player && P_IsLocalPlayer(mo->player)) + P_SwitchWeather(sides[line->sidenum[0]].textureoffset>>FRACBITS); + break; + + case 425: // Calls P_SetMobjState on calling mobj + if (mo && !mo->player) + P_SetMobjState(mo, sides[line->sidenum[0]].toptexture); //P_AproxDistance(line->dx, line->dy)>>FRACBITS); + break; + + case 426: // Moves the mobj to its sector's soundorg and on the floor, and stops it + if (!mo) + return; + + if (line->flags & ML_NOCLIMB) + { + P_UnsetThingPosition(mo); + mo->x = mo->subsector->sector->soundorg.x; + mo->y = mo->subsector->sector->soundorg.y; + mo->z = mo->floorz; + P_SetThingPosition(mo); + } + + mo->momx = mo->momy = mo->momz = 1; + mo->pmomz = 0; + + if (mo->player) + { + mo->player->rmomx = mo->player->rmomy = 1; + mo->player->cmomx = mo->player->cmomy = 0; + P_ResetPlayer(mo->player); + P_SetPlayerMobjState(mo, S_PLAY_STND); + + // Reset bot too. + if (bot) { + if (line->flags & ML_NOCLIMB) + P_TeleportMove(bot, mo->x, mo->y, mo->z); + bot->momx = bot->momy = bot->momz = 1; + bot->pmomz = 0; + bot->player->rmomx = bot->player->rmomy = 1; + bot->player->cmomx = bot->player->cmomy = 0; + P_ResetPlayer(bot->player); + P_SetPlayerMobjState(bot, S_PLAY_STND); + } + } + break; + + case 427: // Awards points if the mobj is a player + if (mo && mo->player) + P_AddPlayerScore(mo->player, sides[line->sidenum[0]].textureoffset>>FRACBITS); + break; + + case 428: // Start floating platform movement + EV_DoElevator(line, elevateContinuous, true); + break; + + case 429: // Crush Ceiling Down Once + EV_DoCrush(line, crushCeilOnce); + break; + + case 430: // Crush Floor Up Once + EV_DoFloor(line, crushFloorOnce); + break; + + case 431: // Crush Floor & Ceiling to middle Once + EV_DoCrush(line, crushBothOnce); + break; + + case 432: // Enable 2D Mode (Disable if noclimb) + if (mo && mo->player) + { + if (line->flags & ML_NOCLIMB) + mo->flags2 &= ~MF2_TWOD; + else + mo->flags2 |= MF2_TWOD; + + // Copy effect to bot if necessary + // (Teleport them to you so they don't break it.) + if (bot && (bot->flags2 & MF2_TWOD) != (mo->flags2 & MF2_TWOD)) { + bot->flags2 = (bot->flags2 & ~MF2_TWOD) | (mo->flags2 & MF2_TWOD); + P_TeleportMove(bot, mo->x, mo->y, mo->z); + } + } + break; + + case 433: // Flip gravity (Flop gravity if noclimb) Works on pushables, too! + if (line->flags & ML_NOCLIMB) + mo->flags2 &= ~MF2_OBJECTFLIP; + else + mo->flags2 |= MF2_OBJECTFLIP; + if (bot) + bot->flags2 = (bot->flags2 & ~MF2_OBJECTFLIP) | (mo->flags2 & MF2_OBJECTFLIP); + break; + + case 434: // Custom Power + if (mo && mo->player) + { + mobj_t *dummy = P_SpawnMobj(mo->x, mo->y, mo->z, MT_NULL); + + var1 = sides[line->sidenum[0]].toptexture; //(line->dx>>FRACBITS)-1; + + if (line->sidenum[1] != 0xffff && line->flags & ML_BLOCKMONSTERS) // read power from back sidedef + var2 = sides[line->sidenum[1]].toptexture; + else if (line->flags & ML_NOCLIMB) // 'Infinite' + var2 = UINT16_MAX; + else + var2 = sides[line->sidenum[0]].textureoffset>>FRACBITS; + + P_SetTarget(&dummy->target, mo); + A_CustomPower(dummy); + + if (bot) { + P_SetTarget(&dummy->target, bot); + A_CustomPower(dummy); + } + P_RemoveMobj(dummy); + } + break; + + case 435: // Change scroller direction + { + scroll_t *scroller; + thinker_t *th; + + for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next) + { + if (th->function.acp1 != (actionf_p1)T_Scroll) + continue; + + scroller = (scroll_t *)th; + if (!Tag_Find(§ors[scroller->affectee].tags, tag)) + continue; + + scroller->dx = FixedMul(line->dx>>SCROLL_SHIFT, CARRYFACTOR); + scroller->dy = FixedMul(line->dy>>SCROLL_SHIFT, CARRYFACTOR); + } + } + break; + + case 436: // Shatter block remotely + { + INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); + INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); + sector_t *sec; // Sector that the FOF is visible in + ffloor_t *rover; // FOF that we are going to crumble + boolean foundrover = false; // for debug, "Can't find a FOF" message + + TAG_ITER_SECTORS(sectag, secnum) + { + sec = sectors + secnum; + + if (!sec->ffloors) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 436 Executor: Target sector #%d has no FOFs.\n", secnum); + return; + } + + for (rover = sec->ffloors; rover; rover = rover->next) + { + if (Tag_Find(&rover->master->frontsector->tags, foftag)) + { + foundrover = true; + + EV_CrumbleChain(sec, rover); + } + } + + if (!foundrover) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 436 Executor: Can't find a FOF control sector with tag %d\n", foftag); + return; + } + } + } + break; + + case 437: // Disable Player Controls + if (mo && mo->player) + { + UINT16 fractime = (UINT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); + if (fractime < 1) + fractime = 1; //instantly wears off upon leaving + if (line->flags & ML_NOCLIMB) + fractime |= 1<<15; //more crazy &ing, as if music stuff wasn't enough + mo->player->powers[pw_nocontrol] = fractime; + if (bot) + bot->player->powers[pw_nocontrol] = fractime; + } + break; + + case 438: // Set player scale + if (mo) + { + mo->destscale = FixedDiv(P_AproxDistance(line->dx, line->dy), 100<destscale < FRACUNIT/100) + mo->destscale = FRACUNIT/100; + if (mo->player && bot) + bot->destscale = mo->destscale; + } + break; + + case 439: // Set texture + { + size_t linenum; + side_t *set = &sides[line->sidenum[0]], *this; + boolean always = !(line->flags & ML_NOCLIMB); // If noclimb: Only change mid texture if mid texture already exists on tagged lines, etc. + + for (linenum = 0; linenum < numlines; linenum++) + { + if (lines[linenum].special == 439) + continue; // Don't override other set texture lines! + + if (!Tag_Find(&lines[linenum].tags, tag)) + continue; // Find tagged lines + + // Front side + this = &sides[lines[linenum].sidenum[0]]; + if (always || this->toptexture) this->toptexture = set->toptexture; + if (always || this->midtexture) this->midtexture = set->midtexture; + if (always || this->bottomtexture) this->bottomtexture = set->bottomtexture; + + if (lines[linenum].sidenum[1] == 0xffff) + continue; // One-sided stops here. + + // Back side + this = &sides[lines[linenum].sidenum[1]]; + if (always || this->toptexture) this->toptexture = set->toptexture; + if (always || this->midtexture) this->midtexture = set->midtexture; + if (always || this->bottomtexture) this->bottomtexture = set->bottomtexture; + } + } + break; + + case 440: // Play race countdown and start Metal Sonic + if (!metalrecording && !metalplayback) + G_DoPlayMetal(); + break; + + case 441: // Trigger unlockable + if ((!modifiedgame || savemoddata) && !(netgame || multiplayer)) + { + INT32 trigid = (INT32)(sides[line->sidenum[0]].textureoffset>>FRACBITS); + + if (trigid < 0 || trigid > 31) // limited by 32 bit variable + CONS_Debug(DBG_GAMELOGIC, "Unlockable trigger (sidedef %hu): bad trigger ID %d\n", line->sidenum[0], trigid); + else + { + unlocktriggers |= 1 << trigid; + + // Unlocked something? + if (M_UpdateUnlockablesAndExtraEmblems()) + { + S_StartSound(NULL, sfx_s3k68); + G_SaveGameData(); // only save if unlocked something + } + } + } + + // Execute one time only + line->special = 0; + break; + + case 442: // Calls P_SetMobjState on mobjs of a given type in the tagged sectors + { + const mobjtype_t type = (mobjtype_t)sides[line->sidenum[0]].toptexture; + statenum_t state = NUMSTATES; + sector_t *sec; + mobj_t *thing; + + if (line->sidenum[1] != 0xffff) + state = (statenum_t)sides[line->sidenum[1]].toptexture; + + TAG_ITER_SECTORS(tag, secnum) + { + boolean tryagain; + sec = sectors + secnum; + do { + tryagain = false; + for (thing = sec->thinglist; thing; thing = thing->snext) + if (thing->type == type) + { + if (state != NUMSTATES) + { + if (!P_SetMobjState(thing, state)) // set state to specific state + { // mobj was removed + tryagain = true; // snext is corrupt, we'll have to start over. + break; + } + } + else if (!P_SetMobjState(thing, thing->state->nextstate)) // set state to nextstate + { // mobj was removed + tryagain = true; // snext is corrupt, we'll have to start over. + break; + } + } + } while (tryagain); + } + break; + } + + case 443: // Calls a named Lua function + if (line->stringargs[0]) + LUA_HookLinedefExecute(line, mo, callsec); + else + CONS_Alert(CONS_WARNING, "Linedef %s is missing the hook name of the Lua function to call! (This should be given in arg0str)\n", sizeu1(line-lines)); + break; + + case 444: // Earthquake camera + { + quake.intensity = sides[line->sidenum[0]].textureoffset; + quake.radius = sides[line->sidenum[0]].rowoffset; + quake.time = P_AproxDistance(line->dx, line->dy)>>FRACBITS; + + quake.epicenter = NULL; /// \todo + + // reasonable defaults. + if (!quake.intensity) + quake.intensity = 8<sidenum[0]].textureoffset>>FRACBITS); + INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); + sector_t *sec; // Sector that the FOF is visible (or not visible) in + ffloor_t *rover; // FOF to vanish/un-vanish + boolean foundrover = false; // for debug, "Can't find a FOF" message + ffloortype_e oldflags; // store FOF's old flags + + TAG_ITER_SECTORS(sectag, secnum) + { + sec = sectors + secnum; + + if (!sec->ffloors) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 445 Executor: Target sector #%d has no FOFs.\n", secnum); + return; + } + + for (rover = sec->ffloors; rover; rover = rover->next) + { + if (Tag_Find(&rover->master->frontsector->tags, foftag)) + { + foundrover = true; + + oldflags = rover->flags; + + // Abracadabra! + if (line->flags & ML_NOCLIMB) + rover->flags |= FF_EXISTS; + else + rover->flags &= ~FF_EXISTS; + + // if flags changed, reset sector's light list + if (rover->flags != oldflags) + { + sec->moved = true; + P_RecalcPrecipInSector(sec); + } + } + } + + if (!foundrover) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 445 Executor: Can't find a FOF control sector with tag %d\n", foftag); + return; + } + } + } + break; + + case 446: // Make block fall remotely (acts like FF_CRUMBLE) + { + INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); + INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); + sector_t *sec; // Sector that the FOF is visible in + ffloor_t *rover; // FOF that we are going to make fall down + boolean foundrover = false; // for debug, "Can't find a FOF" message + player_t *player = NULL; // player that caused FOF to fall + boolean respawn = true; // should the fallen FOF respawn? + + if (mo) // NULL check + player = mo->player; + + if (line->flags & ML_NOCLIMB) // don't respawn! + respawn = false; + + TAG_ITER_SECTORS(sectag, secnum) + { + sec = sectors + secnum; + + if (!sec->ffloors) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 446 Executor: Target sector #%d has no FOFs.\n", secnum); + return; + } + + for (rover = sec->ffloors; rover; rover = rover->next) + { + if (Tag_Find(&rover->master->frontsector->tags, foftag)) + { + foundrover = true; + + if (line->flags & ML_BLOCKMONSTERS) // FOF flags determine respawn ability instead? + respawn = !(rover->flags & FF_NORETURN) ^ !!(line->flags & ML_NOCLIMB); // no climb inverts + + EV_StartCrumble(rover->master->frontsector, rover, (rover->flags & FF_FLOATBOB), player, rover->alpha, respawn); + } + } + + if (!foundrover) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 446 Executor: Can't find a FOF control sector with tag %d\n", foftag); + return; + } + } + } + break; + + case 447: // Change colormap of tagged sectors! + // Basically this special applies a colormap to the tagged sectors, just like 606 (the colormap linedef) + // Except it is activated by linedef executor, not level load + // This could even override existing colormaps I believe + // -- Monster Iestyn 14/06/18 + { + extracolormap_t *source; + if (!udmf) + source = sides[line->sidenum[0]].colormap_data; + else + { + if (!line->args[1]) + source = line->frontsector->extra_colormap; + else + { + INT32 sourcesec = Tag_Iterate_Sectors(line->args[1], 0); + if (sourcesec == -1) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 447 Executor: Can't find sector with source colormap (tag %d)!\n", line->args[1]); + return; + } + source = sectors[sourcesec].extra_colormap; + } + } + TAG_ITER_SECTORS(line->args[0], secnum) + { + if (sectors[secnum].colormap_protected) + continue; + + P_ResetColormapFader(§ors[secnum]); + + if (line->args[2] & TMCF_RELATIVE) + { + extracolormap_t *target = (!udmf && (line->flags & ML_TFERLINE) && line->sidenum[1] != 0xFFFF) ? + sides[line->sidenum[1]].colormap_data : sectors[secnum].extra_colormap; // use back colormap instead of target sector + + extracolormap_t *exc = R_AddColormaps( + target, + source, + line->args[2] & TMCF_SUBLIGHTR, + line->args[2] & TMCF_SUBLIGHTG, + line->args[2] & TMCF_SUBLIGHTB, + line->args[2] & TMCF_SUBLIGHTA, + line->args[2] & TMCF_SUBFADER, + line->args[2] & TMCF_SUBFADEG, + line->args[2] & TMCF_SUBFADEB, + line->args[2] & TMCF_SUBFADEA, + line->args[2] & TMCF_SUBFADESTART, + line->args[2] & TMCF_SUBFADEEND, + line->args[2] & TMCF_IGNOREFLAGS, + false); + + if (!(sectors[secnum].extra_colormap = R_GetColormapFromList(exc))) + { + exc->colormap = R_CreateLightTable(exc); + R_AddColormapToList(exc); + sectors[secnum].extra_colormap = exc; + } + else + Z_Free(exc); + } + else + sectors[secnum].extra_colormap = source; + } + break; + } + case 448: // Change skybox viewpoint/centerpoint + if ((mo && mo->player && P_IsLocalPlayer(mo->player)) || (line->flags & ML_NOCLIMB)) + { + INT32 viewid = sides[line->sidenum[0]].textureoffset>>FRACBITS; + INT32 centerid = sides[line->sidenum[0]].rowoffset>>FRACBITS; + + if ((line->flags & (ML_EFFECT4|ML_BLOCKMONSTERS)) == ML_EFFECT4) // Solid Midtexture is on but Block Enemies is off? + { + CONS_Alert(CONS_WARNING, + M_GetText("Skybox switch linedef (tag %d) doesn't have anything to do.\nConsider changing the linedef's flag configuration or removing it entirely.\n"), + tag); + } + else + { + // set viewpoint mobj + if (!(line->flags & ML_EFFECT4)) // Solid Midtexture turns off viewpoint setting + { + if (viewid >= 0 && viewid < 16) + skyboxmo[0] = skyboxviewpnts[viewid]; + else + skyboxmo[0] = NULL; + } + + // set centerpoint mobj + if (line->flags & ML_BLOCKMONSTERS) // Block Enemies turns ON centerpoint setting + { + if (centerid >= 0 && centerid < 16) + skyboxmo[1] = skyboxcenterpnts[centerid]; + else + skyboxmo[1] = NULL; + } + } + + CONS_Debug(DBG_GAMELOGIC, "Line type 448 Executor: viewid = %d, centerid = %d, viewpoint? = %s, centerpoint? = %s\n", + viewid, + centerid, + ((line->flags & ML_EFFECT4) ? "no" : "yes"), + ((line->flags & ML_BLOCKMONSTERS) ? "yes" : "no")); + } + break; + + case 449: // Enable bosses with parameter + { + INT32 bossid = sides[line->sidenum[0]].textureoffset>>FRACBITS; + if (bossid & ~15) // if any bits other than first 16 are set + { + CONS_Alert(CONS_WARNING, + M_GetText("Boss enable linedef (tag %d) has an invalid texture x offset.\nConsider changing it or removing it entirely.\n"), + tag); + break; + } + if (line->flags & ML_NOCLIMB) + { + bossdisabled |= (1<sidenum[0]].textureoffset>>FRACBITS; + INT32 rvalue2 = sides[line->sidenum[0]].rowoffset>>FRACBITS; + INT32 result; + + if (rvalue1 <= rvalue2) + result = P_RandomRange(rvalue1, rvalue2); + else + result = P_RandomRange(rvalue2, rvalue1); + + P_LinedefExecute((INT16)result, mo, NULL); + break; + } + + case 452: // Set FOF alpha + { + INT16 destvalue = line->sidenum[1] != 0xffff ? + (INT16)(sides[line->sidenum[1]].textureoffset>>FRACBITS) : (INT16)(P_AproxDistance(line->dx, line->dy)>>FRACBITS); + INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); + INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); + sector_t *sec; // Sector that the FOF is visible in + ffloor_t *rover; // FOF that we are going to operate + boolean foundrover = false; // for debug, "Can't find a FOF" message + + TAG_ITER_SECTORS(sectag, secnum) + { + sec = sectors + secnum; + + if (!sec->ffloors) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 452 Executor: Target sector #%d has no FOFs.\n", secnum); + return; + } + + for (rover = sec->ffloors; rover; rover = rover->next) + { + if (Tag_Find(&rover->master->frontsector->tags, foftag)) + { + foundrover = true; + + // If fading an invisible FOF whose render flags we did not yet set, + // initialize its alpha to 1 + // for relative alpha calc + if (!(line->flags & ML_NOCLIMB) && // do translucent + (rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE + !(rover->spawnflags & FF_RENDERSIDES) && + !(rover->spawnflags & FF_RENDERPLANES) && + !(rover->flags & FF_RENDERALL)) + rover->alpha = 1; + + P_RemoveFakeFloorFader(rover); + P_FadeFakeFloor(rover, + rover->alpha, + max(1, min(256, (line->flags & ML_EFFECT3) ? rover->alpha + destvalue : destvalue)), + 0, // set alpha immediately + false, NULL, // tic-based logic + false, // do not handle FF_EXISTS + !(line->flags & ML_NOCLIMB), // handle FF_TRANSLUCENT + false, // do not handle lighting + false, // do not handle colormap + false, // do not handle collision + false, // do not do ghost fade (no collision during fade) + true); // use exact alpha values (for opengl) + } + } + + if (!foundrover) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 452 Executor: Can't find a FOF control sector with tag %d\n", foftag); + return; + } + } + break; + } + + case 453: // Fade FOF + { + INT16 destvalue = line->sidenum[1] != 0xffff ? + (INT16)(sides[line->sidenum[1]].textureoffset>>FRACBITS) : (INT16)(line->dx>>FRACBITS); + INT16 speed = line->sidenum[1] != 0xffff ? + (INT16)(abs(sides[line->sidenum[1]].rowoffset>>FRACBITS)) : (INT16)(abs(line->dy)>>FRACBITS); + INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); + INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); + sector_t *sec; // Sector that the FOF is visible in + ffloor_t *rover; // FOF that we are going to operate + boolean foundrover = false; // for debug, "Can't find a FOF" message + size_t j = 0; // sec->ffloors is saved as ffloor #0, ss->ffloors->next is #1, etc + + TAG_ITER_SECTORS(sectag, secnum) + { + sec = sectors + secnum; + + if (!sec->ffloors) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 453 Executor: Target sector #%d has no FOFs.\n", secnum); + return; + } + + for (rover = sec->ffloors; rover; rover = rover->next) + { + if (Tag_Find(&rover->master->frontsector->tags, foftag)) + { + foundrover = true; + + // Prevent continuous execs from interfering on an existing fade + if (!(line->flags & ML_EFFECT5) + && rover->fadingdata) + //&& ((fade_t*)rover->fadingdata)->timer > (ticbased ? 2 : speed*2)) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 453 Executor: Fade FOF thinker already exists, timer: %d\n", ((fade_t*)rover->fadingdata)->timer); + continue; + } + + if (speed > 0) + P_AddFakeFloorFader(rover, secnum, j, + destvalue, + speed, + (line->flags & ML_EFFECT4), // tic-based logic + (line->flags & ML_EFFECT3), // Relative destvalue + !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS + !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT + !(line->flags & ML_EFFECT2), // do not handle lighting + !(line->flags & ML_EFFECT2), // do not handle colormap (ran out of flags) + !(line->flags & ML_BOUNCY), // do not handle collision + (line->flags & ML_EFFECT1), // do ghost fade (no collision during fade) + (line->flags & ML_TFERLINE)); // use exact alpha values (for opengl) + else + { + // If fading an invisible FOF whose render flags we did not yet set, + // initialize its alpha to 1 + // for relative alpha calc + if (!(line->flags & ML_NOCLIMB) && // do translucent + (rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE + !(rover->spawnflags & FF_RENDERSIDES) && + !(rover->spawnflags & FF_RENDERPLANES) && + !(rover->flags & FF_RENDERALL)) + rover->alpha = 1; + + P_RemoveFakeFloorFader(rover); + P_FadeFakeFloor(rover, + rover->alpha, + max(1, min(256, (line->flags & ML_EFFECT3) ? rover->alpha + destvalue : destvalue)), + 0, // set alpha immediately + false, NULL, // tic-based logic + !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS + !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT + !(line->flags & ML_EFFECT2), // do not handle lighting + !(line->flags & ML_EFFECT2), // do not handle colormap (ran out of flags) + !(line->flags & ML_BOUNCY), // do not handle collision + (line->flags & ML_EFFECT1), // do ghost fade (no collision during fade) + (line->flags & ML_TFERLINE)); // use exact alpha values (for opengl) + } + } + j++; + } + + if (!foundrover) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 453 Executor: Can't find a FOF control sector with tag %d\n", foftag); + return; + } + } + break; + } + + case 454: // Stop fading FOF + { + INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); + INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); + sector_t *sec; // Sector that the FOF is visible in + ffloor_t *rover; // FOF that we are going to operate + boolean foundrover = false; // for debug, "Can't find a FOF" message + + TAG_ITER_SECTORS(sectag, secnum) + { + sec = sectors + secnum; + + if (!sec->ffloors) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 454 Executor: Target sector #%d has no FOFs.\n", secnum); + return; + } + + for (rover = sec->ffloors; rover; rover = rover->next) + { + if (Tag_Find(&rover->master->frontsector->tags, foftag)) + { + foundrover = true; + + P_ResetFakeFloorFader(rover, NULL, + !(line->flags & ML_BLOCKMONSTERS)); // do not finalize collision flags + } + } + + if (!foundrover) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 454 Executor: Can't find a FOF control sector with tag %d\n", foftag); + return; + } + } + break; + } + + case 455: // Fade colormap + { + extracolormap_t *dest; + if (!udmf) + dest = sides[line->sidenum[0]].colormap_data; + else + { + if (!line->args[1]) + dest = line->frontsector->extra_colormap; + else + { + INT32 destsec = Tag_Iterate_Sectors(line->args[1], 0); + if (destsec == -1) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 455 Executor: Can't find sector with destination colormap (tag %d)!\n", line->args[1]); + return; + } + dest = sectors[destsec].extra_colormap; + } + } + + TAG_ITER_SECTORS(line->args[0], secnum) + { + extracolormap_t *source_exc, *dest_exc, *exc; + + if (sectors[secnum].colormap_protected) + continue; + + // Don't interrupt ongoing fade + if (!(line->args[3] & TMCF_OVERRIDE) + && sectors[secnum].fadecolormapdata) + //&& ((fadecolormap_t*)sectors[secnum].fadecolormapdata)->timer > (ticbased ? 2 : speed*2)) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 455 Executor: Fade color thinker already exists, timer: %d\n", ((fadecolormap_t*)sectors[secnum].fadecolormapdata)->timer); + continue; + } + + if (!udmf && (line->flags & ML_TFERLINE)) // use back colormap instead of target sector + sectors[secnum].extra_colormap = (line->sidenum[1] != 0xFFFF) ? + sides[line->sidenum[1]].colormap_data : NULL; + + exc = sectors[secnum].extra_colormap; + + if (!(line->args[3] & TMCF_FROMBLACK) // Override fade from default rgba + && !R_CheckDefaultColormap(dest, true, false, false) + && R_CheckDefaultColormap(exc, true, false, false)) + { + exc = R_CopyColormap(exc, false); + exc->rgba = R_GetRgbaRGB(dest->rgba) + R_PutRgbaA(R_GetRgbaA(exc->rgba)); + //exc->fadergba = R_GetRgbaRGB(dest->rgba) + R_PutRgbaA(R_GetRgbaA(exc->fadergba)); + + if (!(source_exc = R_GetColormapFromList(exc))) + { + exc->colormap = R_CreateLightTable(exc); + R_AddColormapToList(exc); + source_exc = exc; + } + else + Z_Free(exc); + + sectors[secnum].extra_colormap = source_exc; + } + else + source_exc = exc ? exc : R_GetDefaultColormap(); + + if (line->args[3] & TMCF_RELATIVE) + { + exc = R_AddColormaps( + source_exc, + dest, + line->args[3] & TMCF_SUBLIGHTR, + line->args[3] & TMCF_SUBLIGHTG, + line->args[3] & TMCF_SUBLIGHTB, + line->args[3] & TMCF_SUBLIGHTA, + line->args[3] & TMCF_SUBFADER, + line->args[3] & TMCF_SUBFADEG, + line->args[3] & TMCF_SUBFADEB, + line->args[3] & TMCF_SUBFADEA, + line->args[3] & TMCF_SUBFADESTART, + line->args[3] & TMCF_SUBFADEEND, + line->args[3] & TMCF_IGNOREFLAGS, + false); + } + else + exc = R_CopyColormap(dest, false); + + if (!(dest_exc = R_GetColormapFromList(exc))) + { + exc->colormap = R_CreateLightTable(exc); + R_AddColormapToList(exc); + dest_exc = exc; + } + else + Z_Free(exc); + + Add_ColormapFader(§ors[secnum], source_exc, dest_exc, true, // tic-based timing + line->args[2]); + } + break; + } + case 456: // Stop fade colormap + TAG_ITER_SECTORS(line->args[0], secnum) + P_ResetColormapFader(§ors[secnum]); + break; + + case 457: // Track mobj angle to point + if (mo) + { + INT32 failureangle = FixedAngle((min(max(abs(sides[line->sidenum[0]].textureoffset>>FRACBITS), 0), 360))*FRACUNIT); + INT32 failuredelay = abs(sides[line->sidenum[0]].rowoffset>>FRACBITS); + INT32 failureexectag = line->sidenum[1] != 0xffff ? + (INT32)(sides[line->sidenum[1]].textureoffset>>FRACBITS) : 0; + boolean persist = (line->flags & ML_EFFECT2); + mobj_t *anchormo; + + if ((secnum = Tag_Iterate_Sectors(tag, 0)) < 0) + return; + + anchormo = P_GetObjectTypeInSectorNum(MT_ANGLEMAN, secnum); + if (!anchormo) + return; + + mo->eflags |= MFE_TRACERANGLE; + P_SetTarget(&mo->tracer, anchormo); + mo->lastlook = persist; // don't disable behavior after first failure + mo->extravalue1 = failureangle; // angle to exceed for failure state + mo->extravalue2 = failureexectag; // exec tag for failure state (angle is not within range) + mo->cusval = mo->cvmem = failuredelay; // cusval = tics to allow failure before line trigger; cvmem = decrement timer + } + break; + + case 458: // Stop tracking mobj angle to point + if (mo && (mo->eflags & MFE_TRACERANGLE)) + { + mo->eflags &= ~MFE_TRACERANGLE; + P_SetTarget(&mo->tracer, NULL); + mo->lastlook = mo->cvmem = mo->cusval = mo->extravalue1 = mo->extravalue2 = 0; + } + break; + + case 459: // Control Text Prompt + // console player only unless NOCLIMB is set + if (mo && mo->player && P_IsLocalPlayer(mo->player) && (!bot || bot != mo)) + { + INT32 promptnum = max(0, (sides[line->sidenum[0]].textureoffset>>FRACBITS)-1); + INT32 pagenum = max(0, (sides[line->sidenum[0]].rowoffset>>FRACBITS)-1); + INT32 postexectag = abs((line->sidenum[1] != 0xFFFF) ? sides[line->sidenum[1]].textureoffset>>FRACBITS : tag); + + boolean closetextprompt = (line->flags & ML_BLOCKMONSTERS); + //boolean allplayers = (line->flags & ML_NOCLIMB); + boolean runpostexec = (line->flags & ML_EFFECT1); + boolean blockcontrols = !(line->flags & ML_EFFECT2); + boolean freezerealtime = !(line->flags & ML_EFFECT3); + //boolean freezethinkers = (line->flags & ML_EFFECT4); + boolean callbynamedtag = (line->flags & ML_TFERLINE); + + if (closetextprompt) + F_EndTextPrompt(false, false); + else + { + if (callbynamedtag && sides[line->sidenum[0]].text && sides[line->sidenum[0]].text[0]) + F_GetPromptPageByNamedTag(sides[line->sidenum[0]].text, &promptnum, &pagenum); + F_StartTextPrompt(promptnum, pagenum, mo, runpostexec ? postexectag : 0, blockcontrols, freezerealtime); + } + } + break; + + case 460: // Award rings + { + INT16 rings = (sides[line->sidenum[0]].textureoffset>>FRACBITS); + INT32 delay = (sides[line->sidenum[0]].rowoffset>>FRACBITS); + if (mo && mo->player) + { + if (delay <= 0 || !(leveltime % delay)) + P_GivePlayerRings(mo->player, rings); + } + } + break; + + case 461: // Spawns an object on the map based on texture offsets + { + const mobjtype_t type = (mobjtype_t)(sides[line->sidenum[0]].toptexture); + mobj_t *mobj; + + fixed_t x, y, z; + x = sides[line->sidenum[0]].textureoffset; + y = sides[line->sidenum[0]].rowoffset; + z = line->frontsector->floorheight; + + if (line->flags & ML_NOCLIMB) // If noclimb is set, spawn randomly within a range + { + if (line->sidenum[1] != 0xffff) // Make sure the linedef has a back side + { + x = P_RandomRange(sides[line->sidenum[0]].textureoffset>>FRACBITS, sides[line->sidenum[1]].textureoffset>>FRACBITS)<sidenum[0]].rowoffset>>FRACBITS, sides[line->sidenum[1]].rowoffset>>FRACBITS)<frontsector->floorheight>>FRACBITS, line->frontsector->ceilingheight>>FRACBITS)<special); + break; + } + } + + mobj = P_SpawnMobj(x, y, z, type); + if (mobj) + { + if (line->flags & ML_EFFECT1) + mobj->angle = R_PointToAngle2(line->v1->x, line->v1->y, line->v2->x, line->v2->y); + CONS_Debug(DBG_GAMELOGIC, "Linedef Type %d - Spawn Object: %d spawned at (%d, %d, %d)\n", line->special, mobj->type, mobj->x>>FRACBITS, mobj->y>>FRACBITS, mobj->z>>FRACBITS); //TODO: Convert mobj->type to a string somehow. + } + else + CONS_Alert(CONS_ERROR,"Linedef Type %d - Spawn Object: Object did not spawn!\n", line->special); + } + break; + + case 462: // Stop clock (and end level in record attack) + if (G_PlatformGametype()) + { + stoppedclock = true; + CONS_Debug(DBG_GAMELOGIC, "Clock stopped!\n"); + if (modeattacking) + { + UINT8 i; + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i]) + continue; + P_DoPlayerExit(&players[i]); + } + } + } + break; + + case 463: // Dye object + { + INT32 color = sides[line->sidenum[0]].toptexture; + + if (mo) + { + if (color < 0 || color >= numskincolors) + return; + + var1 = 0; + var2 = color; + A_Dye(mo); + } + } + break; + + case 464: // Trigger Egg Capsule + { + thinker_t *th; + mobj_t *mo2; + + // Find the center of the Eggtrap and release all the pretty animals! + // The chimps are my friends.. heeheeheheehehee..... - LouisJM + for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) + { + if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) + continue; + + mo2 = (mobj_t *)th; + + if (mo2->type != MT_EGGTRAP) + continue; + + if (!mo2->spawnpoint) + continue; + + if (mo2->spawnpoint->angle != tag) + continue; + + P_KillMobj(mo2, NULL, mo, 0); + } + + if (!(line->flags & ML_NOCLIMB)) + { + INT32 i; + + // Mark all players with the time to exit thingy! + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i]) + continue; + P_DoPlayerExit(&players[i]); + } + } + } + break; + + case 465: // Set linedef executor delay + { + INT32 linenum; + + if (!udmf) + break; + + TAG_ITER_LINES(line->args[0], linenum) + { + if (line->args[2]) + lines[linenum].executordelay += line->args[1]; + else + lines[linenum].executordelay = line->args[1]; + } + } + break; + + case 466: // Set level failure state + { + if (line->flags & ML_NOCLIMB) + { + stagefailed = false; + CONS_Debug(DBG_GAMELOGIC, "Stage can be completed successfully!\n"); + } + else + { + stagefailed = true; + CONS_Debug(DBG_GAMELOGIC, "Stage will end in failure...\n"); + } + } + break; + + case 480: // Polyobj_DoorSlide + case 481: // Polyobj_DoorSwing + PolyDoor(line); + break; + case 482: // Polyobj_Move + case 483: // Polyobj_OR_Move + PolyMove(line); + break; + case 484: // Polyobj_RotateRight + case 485: // Polyobj_OR_RotateRight + case 486: // Polyobj_RotateLeft + case 487: // Polyobj_OR_RotateLeft + PolyRotate(line); + break; + case 488: // Polyobj_Waypoint + PolyWaypoint(line); + break; + case 489: + PolyInvisible(line); + break; + case 490: + PolyVisible(line); + break; + case 491: + PolyTranslucency(line); + break; + case 492: + PolyFade(line); + break; + + default: + break; + } +} + +// +// P_SetupSignExit +// +// Finds the exit sign in the current sector and +// sets its target to the player who passed the map. +// +void P_SetupSignExit(player_t *player) +{ + mobj_t *thing; + msecnode_t *node = player->mo->subsector->sector->touching_thinglist; // things touching this sector + thinker_t *think; + INT32 numfound = 0; + + for (; node; node = node->m_thinglist_next) + { + thing = node->m_thing; + if (thing->type != MT_SIGN) + continue; + + if (!numfound + && !(player->mo->target && player->mo->target->type == MT_SIGN) + && !((gametyperules & GTR_FRIENDLY) && (netgame || multiplayer) && cv_exitmove.value)) + P_SetTarget(&player->mo->target, thing); + + if (thing->state != &states[thing->info->spawnstate]) + continue; + + P_SetTarget(&thing->target, player->mo); + P_SetObjectMomZ(thing, 12*FRACUNIT, false); + P_SetMobjState(thing, S_SIGNSPIN1); + if (thing->info->seesound) + S_StartSound(thing, thing->info->seesound); + + ++numfound; + } + + if (numfound) + return; + + // didn't find any signposts in the exit sector. + // spin all signposts in the level then. + for (think = thlist[THINK_MOBJ].next; think != &thlist[THINK_MOBJ]; think = think->next) + { + if (think->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) + continue; + + thing = (mobj_t *)think; + if (thing->type != MT_SIGN) + continue; + + if (!numfound + && !(player->mo->target && player->mo->target->type == MT_SIGN) + && !((gametyperules & GTR_FRIENDLY) && (netgame || multiplayer) && cv_exitmove.value)) + P_SetTarget(&player->mo->target, thing); + + if (thing->state != &states[thing->info->spawnstate]) + continue; + + P_SetTarget(&thing->target, player->mo); + P_SetObjectMomZ(thing, 12*FRACUNIT, false); + P_SetMobjState(thing, S_SIGNSPIN1); + if (thing->info->seesound) + S_StartSound(thing, thing->info->seesound); + + ++numfound; + } +} + +// +// P_IsFlagAtBase +// +// Checks to see if a flag is at its base. +// +boolean P_IsFlagAtBase(mobjtype_t flag) +{ + thinker_t *think; + mobj_t *mo; + INT32 specialnum = (flag == MT_REDFLAG) ? 3 : 4; + + for (think = thlist[THINK_MOBJ].next; think != &thlist[THINK_MOBJ]; think = think->next) + { + if (think->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) + continue; + + mo = (mobj_t *)think; + + if (mo->type != flag) + continue; + + if (GETSECSPECIAL(mo->subsector->sector->special, 4) == specialnum) + return true; + else if (mo->subsector->sector->ffloors) // Check the 3D floors + { + ffloor_t *rover; + + for (rover = mo->subsector->sector->ffloors; rover; rover = rover->next) + { + if (!(rover->flags & FF_EXISTS)) + continue; + + if (GETSECSPECIAL(rover->master->frontsector->special, 4) != specialnum) + continue; + + if (!(mo->z <= P_GetSpecialTopZ(mo, sectors + rover->secnum, mo->subsector->sector) + && mo->z >= P_GetSpecialBottomZ(mo, sectors + rover->secnum, mo->subsector->sector))) + continue; + + return true; + } + } + } + return false; +} + +// +// P_PlayerTouchingSectorSpecial +// +// Replaces the old player->specialsector. +// This allows a player to touch more than +// one sector at a time, if necessary. +// +// Returns a pointer to the first sector of +// the particular type that it finds. +// Returns NULL if it doesn't find it. +// +sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 number) +{ + msecnode_t *node; + ffloor_t *rover; + + if (!player->mo) + return NULL; + + // Check default case first + if (GETSECSPECIAL(player->mo->subsector->sector->special, section) == number) + return player->mo->subsector->sector; + + // Hmm.. maybe there's a FOF that has it... + for (rover = player->mo->subsector->sector->ffloors; rover; rover = rover->next) + { + fixed_t topheight, bottomheight; + + if (GETSECSPECIAL(rover->master->frontsector->special, section) != number) + continue; + + if (!(rover->flags & FF_EXISTS)) + continue; + + topheight = P_GetSpecialTopZ(player->mo, sectors + rover->secnum, player->mo->subsector->sector); + bottomheight = P_GetSpecialBottomZ(player->mo, sectors + rover->secnum, player->mo->subsector->sector); + + // Check the 3D floor's type... + if (rover->flags & FF_BLOCKPLAYER) + { + boolean floorallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_FLOOR) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z == topheight)); + boolean ceilingallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_CEILING) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z + player->mo->height == bottomheight)); + // Thing must be on top of the floor to be affected... + if (!(floorallowed || ceilingallowed)) + continue; + } + else + { + // Water and DEATH FOG!!! heh + if (player->mo->z > topheight || (player->mo->z + player->mo->height) < bottomheight) + continue; + } + + // This FOF has the special we're looking for! + return rover->master->frontsector; + } + + for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) + { + if (GETSECSPECIAL(node->m_sector->special, section) == number) + { + // This sector has the special we're looking for, but + // are we allowed to touch it? + if (node->m_sector == player->mo->subsector->sector + || (node->m_sector->flags & SF_TRIGGERSPECIAL_TOUCH)) + return node->m_sector; + } + + // Hmm.. maybe there's a FOF that has it... + for (rover = node->m_sector->ffloors; rover; rover = rover->next) + { + fixed_t topheight, bottomheight; + + if (GETSECSPECIAL(rover->master->frontsector->special, section) != number) + continue; + + if (!(rover->flags & FF_EXISTS)) + continue; + + topheight = P_GetSpecialTopZ(player->mo, sectors + rover->secnum, player->mo->subsector->sector); + bottomheight = P_GetSpecialBottomZ(player->mo, sectors + rover->secnum, player->mo->subsector->sector); + + // Check the 3D floor's type... + if (rover->flags & FF_BLOCKPLAYER) + { + boolean floorallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_FLOOR) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z == topheight)); + boolean ceilingallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_CEILING) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z + player->mo->height == bottomheight)); + // Thing must be on top of the floor to be affected... + if (!(floorallowed || ceilingallowed)) + continue; + } + else + { + // Water and DEATH FOG!!! heh + if (player->mo->z > topheight || (player->mo->z + player->mo->height) < bottomheight) + continue; + } + + // This FOF has the special we're looking for, but are we allowed to touch it? + if (node->m_sector == player->mo->subsector->sector + || (rover->master->frontsector->flags & SF_TRIGGERSPECIAL_TOUCH)) + return rover->master->frontsector; + } + } + + return NULL; +} + +// +// P_ThingIsOnThe3DFloor +// +// This checks whether the mobj is on/in the FOF we want it to be at +// Needed for the "All players" trigger sector specials only +// +static boolean P_ThingIsOnThe3DFloor(mobj_t *mo, sector_t *sector, sector_t *targetsec) +{ + ffloor_t *rover; + fixed_t top, bottom; + + if (!mo->player) // should NEVER happen + return false; + + if (!targetsec->ffloors) // also should NEVER happen + return false; + + for (rover = targetsec->ffloors; rover; rover = rover->next) + { + if (rover->master->frontsector != sector) + continue; + + // we're assuming the FOF existed when the first player touched it + //if (!(rover->flags & FF_EXISTS)) + // return false; + + top = P_GetSpecialTopZ(mo, sector, targetsec); + bottom = P_GetSpecialBottomZ(mo, sector, targetsec); + + // Check the 3D floor's type... + if (rover->flags & FF_BLOCKPLAYER) + { + boolean floorallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_FLOOR) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(mo->eflags & MFE_VERTICALFLIP)) && (mo->z == top)); + boolean ceilingallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_CEILING) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (mo->eflags & MFE_VERTICALFLIP)) && (mo->z + mo->height == bottom)); + // Thing must be on top of the floor to be affected... + if (!(floorallowed || ceilingallowed)) + continue; + } + else + { + // Water and intangible FOFs + if (mo->z > top || (mo->z + mo->height) < bottom) + return false; + } + + return true; + } + + return false; +} + +// +// P_MobjReadyToTrigger +// +// Is player standing on the sector's "ground"? +// +static boolean P_MobjReadyToTrigger(mobj_t *mo, sector_t *sec) +{ + boolean floorallowed = ((sec->flags & SF_FLIPSPECIAL_FLOOR) && ((sec->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(mo->eflags & MFE_VERTICALFLIP)) && (mo->z == P_GetSpecialBottomZ(mo, sec, sec))); + boolean ceilingallowed = ((sec->flags & SF_FLIPSPECIAL_CEILING) && ((sec->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (mo->eflags & MFE_VERTICALFLIP)) && (mo->z + mo->height == P_GetSpecialTopZ(mo, sec, sec))); + // Thing must be on top of the floor to be affected... + return (floorallowed || ceilingallowed); +} + +/** Applies a sector special to a player. + * + * \param player Player in the sector. + * \param sector Sector with the special. + * \param roversector If !NULL, sector is actually an FOF; otherwise, sector + * is being physically contacted by the player. + * \todo Split up into multiple functions. + * \sa P_PlayerInSpecialSector, P_PlayerOnSpecial3DFloor + */ +void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *roversector) +{ + INT32 i = 0; + INT32 section1, section2, section3, section4; + INT32 special; + mtag_t sectag = Tag_FGet(§or->tags); + + section1 = GETSECSPECIAL(sector->special, 1); + section2 = GETSECSPECIAL(sector->special, 2); + section3 = GETSECSPECIAL(sector->special, 3); + section4 = GETSECSPECIAL(sector->special, 4); + + // Ignore spectators + if (player->spectator) + return; + + // Ignore dead players. + // If this strange phenomenon could be potentially used in levels, + // TODO: modify this to accommodate for it. + if (player->playerstate != PST_LIVE) + return; + + // Conveyor stuff + if (section3 == 2 || section3 == 4) + player->onconveyor = section3; + + special = section1; + + // Process Section 1 + switch (special) + { + case 1: // Damage (Generic) + if (roversector || P_MobjReadyToTrigger(player->mo, sector)) + P_DamageMobj(player->mo, NULL, NULL, 1, 0); + break; + case 2: // Damage (Water) + if ((roversector || P_MobjReadyToTrigger(player->mo, sector)) && (player->powers[pw_underwater] || player->powers[pw_carry] == CR_NIGHTSMODE)) + P_DamageMobj(player->mo, NULL, NULL, 1, DMG_WATER); + break; + case 3: // Damage (Fire) + if (roversector || P_MobjReadyToTrigger(player->mo, sector)) + P_DamageMobj(player->mo, NULL, NULL, 1, DMG_FIRE); + break; + case 4: // Damage (Electrical) + if (roversector || P_MobjReadyToTrigger(player->mo, sector)) + P_DamageMobj(player->mo, NULL, NULL, 1, DMG_ELECTRIC); + break; + case 5: // Spikes + if (roversector || P_MobjReadyToTrigger(player->mo, sector)) + P_DamageMobj(player->mo, NULL, NULL, 1, DMG_SPIKE); + break; + case 6: // Death Pit (Camera Mod) + case 7: // Death Pit (No Camera Mod) + if (roversector || P_MobjReadyToTrigger(player->mo, sector)) + { + if (player->quittime) + G_MovePlayerToSpawnOrStarpost(player - players); + else + P_DamageMobj(player->mo, NULL, NULL, 1, DMG_DEATHPIT); + } + break; + case 8: // Instant Kill + if (player->quittime) + G_MovePlayerToSpawnOrStarpost(player - players); + else + P_DamageMobj(player->mo, NULL, NULL, 1, DMG_INSTAKILL); + break; + case 9: // Ring Drainer (Floor Touch) + case 10: // Ring Drainer (No Floor Touch) + if (leveltime % (TICRATE/2) == 0 && player->rings > 0) + { + player->rings--; + S_StartSound(player->mo, sfx_antiri); + } + break; + case 11: // Special Stage Damage + if (player->exiting || player->bot) // Don't do anything for bots or players who have just finished + break; + + if (!(player->powers[pw_shield] || player->spheres > 0)) // Don't do anything if no shield or spheres anyway + break; + + P_SpecialStageDamage(player, NULL, NULL); + break; + case 12: // Space Countdown + if (!(player->powers[pw_shield] & SH_PROTECTWATER) && !player->powers[pw_spacetime]) + player->powers[pw_spacetime] = spacetimetics + 1; + break; + case 13: // Ramp Sector (Increase step-up/down) + case 14: // Non-Ramp Sector (Don't step-down) + case 15: // Unused + break; + } + + special = section2; + + // Process Section 2 + switch (special) + { + case 1: // Trigger Linedef Exec (Pushable Objects) + break; + case 2: // Linedef executor requires all players present+doesn't require touching floor + case 3: // Linedef executor requires all players present + /// \todo check continues for proper splitscreen support? + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i]) + continue; + if (!players[i].mo) + continue; + if (players[i].spectator) + continue; + if (players[i].bot) + continue; + if (G_CoopGametype() && players[i].lives <= 0) + continue; + if (roversector) + { + if (sector->flags & SF_TRIGGERSPECIAL_TOUCH) + { + msecnode_t *node; + for (node = players[i].mo->touching_sectorlist; node; node = node->m_sectorlist_next) + { + if (P_ThingIsOnThe3DFloor(players[i].mo, sector, node->m_sector)) + break; + } + if (!node) + goto DoneSection2; + } + else if (players[i].mo->subsector && !P_ThingIsOnThe3DFloor(players[i].mo, sector, players[i].mo->subsector->sector)) // this function handles basically everything for us lmao + goto DoneSection2; + } + else + { + if (players[i].mo->subsector->sector == sector) + ; + else if (sector->flags & SF_TRIGGERSPECIAL_TOUCH) + { + msecnode_t *node; + for (node = players[i].mo->touching_sectorlist; node; node = node->m_sectorlist_next) + { + if (node->m_sector == sector) + break; + } + if (!node) + goto DoneSection2; + } + else + goto DoneSection2; + + if (special == 3 && !P_MobjReadyToTrigger(players[i].mo, sector)) + goto DoneSection2; + } + } + /* FALLTHRU */ + case 4: // Linedef executor that doesn't require touching floor + case 5: // Linedef executor + case 6: // Linedef executor (7 Emeralds) + case 7: // Linedef executor (NiGHTS Mare) + if (!player->bot) + P_LinedefExecute(sectag, player->mo, sector); + break; + case 8: // Tells pushable things to check FOFs + break; + case 9: // Egg trap capsule + { + thinker_t *th; + mobj_t *mo2; + line_t junk; + + if (player->bot || sector->ceilingdata || sector->floordata) + return; + + // Find the center of the Eggtrap and release all the pretty animals! + // The chimps are my friends.. heeheeheheehehee..... - LouisJM + for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) + { + if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) + continue; + mo2 = (mobj_t *)th; + if (mo2->type != MT_EGGTRAP) + continue; + P_KillMobj(mo2, NULL, player->mo, 0); + } + + // clear the special so you can't push the button twice. + sector->special = 0; + + // Initialize my junk + junk.tags.tags = NULL; + junk.tags.count = 0; + + // Move the button down + Tag_FSet(&junk.tags, LE_CAPSULE0); + EV_DoElevator(&junk, elevateDown, false); + + // Open the top FOF + Tag_FSet(&junk.tags, LE_CAPSULE1); + EV_DoFloor(&junk, raiseFloorToNearestFast); + // Open the bottom FOF + Tag_FSet(&junk.tags, LE_CAPSULE2); + EV_DoCeiling(&junk, lowerToLowestFast); + + // Mark all players with the time to exit thingy! + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i]) + continue; + P_DoPlayerExit(&players[i]); + } + break; + } + case 10: // Special Stage Time/Rings + case 11: // Custom Gravity + break; + case 12: // Lua sector special + break; + } +DoneSection2: + + special = section3; + + // Process Section 3 + switch (special) + { + case 1: // Unused + case 2: // Wind/Current + case 3: // Unused + case 4: // Conveyor Belt + break; + + case 5: // Speed pad + if (player->powers[pw_flashing] != 0 && player->powers[pw_flashing] < TICRATE/2) + break; + + i = Tag_FindLineSpecial(4, sectag); + + if (i != -1) + { + angle_t lineangle; + fixed_t linespeed; + fixed_t sfxnum; + + lineangle = R_PointToAngle2(lines[i].v1->x, lines[i].v1->y, lines[i].v2->x, lines[i].v2->y); + linespeed = sides[lines[i].sidenum[0]].textureoffset; + + if (linespeed == 0) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: Speed pad (tag %d) at zero speed.\n", sectag); + break; + } + + player->mo->angle = player->drawangle = lineangle; + + if (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG) + P_SetPlayerAngle(player, player->mo->angle); + + if (!(lines[i].flags & ML_EFFECT4)) + { + P_UnsetThingPosition(player->mo); + if (roversector) // make FOF speed pads work + { + player->mo->x = roversector->soundorg.x; + player->mo->y = roversector->soundorg.y; + } + else + { + player->mo->x = sector->soundorg.x; + player->mo->y = sector->soundorg.y; + } + P_SetThingPosition(player->mo); + } + + P_InstaThrust(player->mo, player->mo->angle, linespeed); + + if (lines[i].flags & ML_EFFECT5) // Roll! + { + if (!(player->pflags & PF_SPINNING)) + player->pflags |= PF_SPINNING; + + P_SetPlayerMobjState(player->mo, S_PLAY_ROLL); + } + + player->powers[pw_flashing] = TICRATE/3; + + sfxnum = sides[lines[i].sidenum[0]].toptexture; + + if (!sfxnum) + sfxnum = sfx_spdpad; + + S_StartSound(player->mo, sfxnum); + } + break; + + case 6: // Unused + case 7: // Unused + case 8: // Unused + case 9: // Unused + case 10: // Unused + case 11: // Unused + case 12: // Unused + case 13: // Unused + case 14: // Unused + case 15: // Unused + break; + } + + special = section4; + + // Process Section 4 + switch (special) + { + case 1: // Starpost Activator + { + mobj_t *post = P_GetObjectTypeInSectorNum(MT_STARPOST, sector - sectors); + + if (!post) + break; + + P_TouchStarPost(post, player, false); + break; + } + + case 2: // Special stage GOAL sector / Exit Sector / CTF Flag Return + if (player->bot || !(gametyperules & GTR_ALLOWEXIT)) + break; + if (!(maptol & TOL_NIGHTS) && G_IsSpecialStage(gamemap) && player->nightstime > 6) + { + player->nightstime = 6; // Just let P_Ticker take care of the rest. + return; + } + + // Exit (for FOF exits; others are handled in P_PlayerThink in p_user.c) + { + INT32 lineindex; + + P_DoPlayerFinish(player); + + P_SetupSignExit(player); + // important: use sector->tag on next line instead of player->mo->subsector->tag + // this part is different from in P_PlayerThink, this is what was causing + // FOF custom exits not to work. + lineindex = Tag_FindLineSpecial(2, sectag); + + if (G_CoopGametype() && lineindex != -1) // Custom exit! + { + // Special goodies with the block monsters flag depending on emeralds collected + if ((lines[lineindex].flags & ML_BLOCKMONSTERS) && ALL7EMERALDS(emeralds)) + nextmapoverride = (INT16)(lines[lineindex].frontsector->ceilingheight>>FRACBITS); + else + nextmapoverride = (INT16)(lines[lineindex].frontsector->floorheight>>FRACBITS); + + if (lines[lineindex].flags & ML_NOCLIMB) + skipstats = 1; + } + } + break; + + case 3: // Red Team's Base + if ((gametyperules & GTR_TEAMFLAGS) && P_IsObjectOnGround(player->mo)) + { + if (player->ctfteam == 1 && (player->gotflag & GF_BLUEFLAG)) + { + mobj_t *mo; + + // Make sure the red team still has their own + // flag at their base so they can score. + if (!P_IsFlagAtBase(MT_REDFLAG)) + break; + + HU_SetCEchoFlags(V_AUTOFADEOUT|V_ALLOWLOWERCASE); + HU_SetCEchoDuration(5); + HU_DoCEcho(va(M_GetText("\205%s\200\\CAPTURED THE \204BLUE FLAG\200.\\\\\\\\"), player_names[player-players])); + + if (splitscreen || players[consoleplayer].ctfteam == 1) + S_StartSound(NULL, sfx_flgcap); + else if (players[consoleplayer].ctfteam == 2) + S_StartSound(NULL, sfx_lose); + + mo = P_SpawnMobj(player->mo->x,player->mo->y,player->mo->z,MT_BLUEFLAG); + player->gotflag &= ~GF_BLUEFLAG; + mo->flags &= ~MF_SPECIAL; + mo->fuse = TICRATE; + mo->spawnpoint = bflagpoint; + mo->flags2 |= MF2_JUSTATTACKED; + redscore += 1; + P_AddPlayerScore(player, 250); + } + } + break; + + case 4: // Blue Team's Base + if ((gametyperules & GTR_TEAMFLAGS) && P_IsObjectOnGround(player->mo)) + { + if (player->ctfteam == 2 && (player->gotflag & GF_REDFLAG)) + { + mobj_t *mo; + + // Make sure the blue team still has their own + // flag at their base so they can score. + if (!P_IsFlagAtBase(MT_BLUEFLAG)) + break; + + HU_SetCEchoFlags(V_AUTOFADEOUT|V_ALLOWLOWERCASE); + HU_SetCEchoDuration(5); + HU_DoCEcho(va(M_GetText("\204%s\200\\CAPTURED THE \205RED FLAG\200.\\\\\\\\"), player_names[player-players])); + + if (splitscreen || players[consoleplayer].ctfteam == 2) + S_StartSound(NULL, sfx_flgcap); + else if (players[consoleplayer].ctfteam == 1) + S_StartSound(NULL, sfx_lose); + + mo = P_SpawnMobj(player->mo->x,player->mo->y,player->mo->z,MT_REDFLAG); + player->gotflag &= ~GF_REDFLAG; + mo->flags &= ~MF_SPECIAL; + mo->fuse = TICRATE; + mo->spawnpoint = rflagpoint; + mo->flags2 |= MF2_JUSTATTACKED; + bluescore += 1; + P_AddPlayerScore(player, 250); + } + } + break; + + case 5: // Fan sector + player->mo->momz += mobjinfo[MT_FAN].mass/4; + + if (player->mo->momz > mobjinfo[MT_FAN].mass) + player->mo->momz = mobjinfo[MT_FAN].mass; + + P_ResetPlayer(player); + if (player->panim != PA_FALL) + P_SetPlayerMobjState(player->mo, S_PLAY_FALL); + break; + + case 6: // Super Sonic transformer + if (player->mo->health > 0 && !player->bot && (player->charflags & SF_SUPER) && !player->powers[pw_super] && ALL7EMERALDS(emeralds)) + P_DoSuperTransformation(player, true); + break; + + case 7: // Make player spin + if (!(player->pflags & PF_SPINNING)) + { + player->pflags |= PF_SPINNING; + P_SetPlayerMobjState(player->mo, S_PLAY_ROLL); + S_StartAttackSound(player->mo, sfx_spin); + + if (abs(player->rmomx) < FixedMul(5*FRACUNIT, player->mo->scale) + && abs(player->rmomy) < FixedMul(5*FRACUNIT, player->mo->scale)) + P_InstaThrust(player->mo, player->mo->angle, FixedMul(10*FRACUNIT, player->mo->scale)); + } + break; + + case 8: // Zoom Tube Start + { + INT32 sequence; + fixed_t speed; + INT32 lineindex; + mobj_t *waypoint = NULL; + angle_t an; + + if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT && player->powers[pw_carry] == CR_ZOOMTUBE) + break; + + if (player->powers[pw_ignorelatch] & (1<<15)) + break; + + // Find line #3 tagged to this sector + lineindex = Tag_FindLineSpecial(3, sectag); + + if (lineindex == -1) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: Sector special %d missing line special #3.\n", sector->special); + break; + } + + // Grab speed and sequence values + speed = abs(sides[lines[lineindex].sidenum[0]].textureoffset)/8; + sequence = abs(sides[lines[lineindex].sidenum[0]].rowoffset)>>FRACBITS; + + if (speed == 0) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: Waypoint sequence %d at zero speed.\n", sequence); + break; + } + + waypoint = P_GetFirstWaypoint(sequence); + + if (!waypoint) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: FIRST WAYPOINT IN SEQUENCE %d NOT FOUND.\n", sequence); + break; + } + else + { + CONS_Debug(DBG_GAMELOGIC, "Waypoint %d found in sequence %d - speed = %d\n", waypoint->health, sequence, speed); + } + + an = R_PointToAngle2(player->mo->x, player->mo->y, waypoint->x, waypoint->y) - player->mo->angle; + + if (an > ANGLE_90 && an < ANGLE_270 && !(lines[lineindex].flags & ML_EFFECT4)) + break; // behind back + + P_SetTarget(&player->mo->tracer, waypoint); + player->powers[pw_carry] = CR_ZOOMTUBE; + player->speed = speed; + player->pflags |= PF_SPINNING; + player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE|PF_GLIDING|PF_BOUNCING|PF_SLIDING|PF_CANCARRY); + player->climbing = 0; + + if (player->mo->state-states != S_PLAY_ROLL) + { + P_SetPlayerMobjState(player->mo, S_PLAY_ROLL); + S_StartSound(player->mo, sfx_spin); + } + } + break; + + case 9: // Zoom Tube End + { + INT32 sequence; + fixed_t speed; + INT32 lineindex; + mobj_t *waypoint = NULL; + angle_t an; + + if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT && player->powers[pw_carry] == CR_ZOOMTUBE) + break; + + if (player->powers[pw_ignorelatch] & (1<<15)) + break; + + // Find line #3 tagged to this sector + lineindex = Tag_FindLineSpecial(3, sectag); + + if (lineindex == -1) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: Sector special %d missing line special #3.\n", sector->special); + break; + } + + // Grab speed and sequence values + speed = -abs(sides[lines[lineindex].sidenum[0]].textureoffset)/8; // Negative means reverse + sequence = abs(sides[lines[lineindex].sidenum[0]].rowoffset)>>FRACBITS; + + if (speed == 0) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: Waypoint sequence %d at zero speed.\n", sequence); + break; + } + + waypoint = P_GetLastWaypoint(sequence); + + if (!waypoint) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: LAST WAYPOINT IN SEQUENCE %d NOT FOUND.\n", sequence); + break; + } + else + { + CONS_Debug(DBG_GAMELOGIC, "Waypoint %d found in sequence %d - speed = %d\n", waypoint->health, sequence, speed); + } + + an = R_PointToAngle2(player->mo->x, player->mo->y, waypoint->x, waypoint->y) - player->mo->angle; + + if (an > ANGLE_90 && an < ANGLE_270 && !(lines[lineindex].flags & ML_EFFECT4)) + break; // behind back + + P_SetTarget(&player->mo->tracer, waypoint); + player->powers[pw_carry] = CR_ZOOMTUBE; + player->speed = speed; + player->pflags |= PF_SPINNING; + player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE|PF_GLIDING|PF_BOUNCING|PF_SLIDING|PF_CANCARRY); + player->climbing = 0; + + if (player->mo->state-states != S_PLAY_ROLL) + { + P_SetPlayerMobjState(player->mo, S_PLAY_ROLL); + S_StartSound(player->mo, sfx_spin); + } + } + break; + + case 10: // Finish Line + if (((gametyperules & (GTR_RACE|GTR_LIVES)) == GTR_RACE) && !player->exiting) + { + if (player->starpostnum == numstarposts) // Must have touched all the starposts + { + player->laps++; + + if (player->powers[pw_carry] == CR_NIGHTSMODE) + player->drillmeter += 48*20; + + if (player->laps >= (UINT8)cv_numlaps.value) + CONS_Printf(M_GetText("%s has finished the race.\n"), player_names[player-players]); + else if (player->laps == (UINT8)cv_numlaps.value-1) + CONS_Printf(M_GetText("%s started the \205final lap\200!\n"), player_names[player-players]); + else + CONS_Printf(M_GetText("%s started lap %u\n"), player_names[player-players], (UINT32)player->laps+1); + + // Reset starposts (checkpoints) info + player->starpostscale = player->starpostangle = player->starposttime = player->starpostnum = 0; + player->starpostx = player->starposty = player->starpostz = 0; + P_ResetStarposts(); + + // Play the starpost sound for 'consistency' + S_StartSound(player->mo, sfx_strpst); + } + else if (player->starpostnum) + { + // blatant reuse of a variable that's normally unused in circuit + if (!player->tossdelay) + S_StartSound(player->mo, sfx_lose); + player->tossdelay = 3; + } + + if (player->laps >= (unsigned)cv_numlaps.value) + { + if (P_IsLocalPlayer(player)) + { + HU_SetCEchoFlags(0); + HU_SetCEchoDuration(5); + HU_DoCEcho("FINISHED!"); + } + + P_DoPlayerExit(player); + } + } + break; + + case 11: // Rope hang + { + INT32 sequence; + fixed_t speed; + INT32 lineindex; + mobj_t *waypointmid = NULL; + mobj_t *waypointhigh = NULL; + mobj_t *waypointlow = NULL; + mobj_t *closest = NULL; + vector3_t p, line[2], resulthigh, resultlow; + + if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT && player->powers[pw_carry] == CR_ROPEHANG) + break; + + if (player->powers[pw_ignorelatch] & (1<<15)) + break; + + if (player->mo->momz > 0) + break; + + if (player->cmd.buttons & BT_SPIN) + break; + + if (!(player->pflags & PF_SLIDING) && player->mo->state == &states[player->mo->info->painstate]) + break; + + if (player->exiting) + break; + + //initialize resulthigh and resultlow with 0 + memset(&resultlow, 0x00, sizeof(resultlow)); + memset(&resulthigh, 0x00, sizeof(resulthigh)); + + // Find line #11 tagged to this sector + lineindex = Tag_FindLineSpecial(11, sectag); + + if (lineindex == -1) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: Sector special %d missing line special #11.\n", sector->special); + break; + } + + // Grab speed and sequence values + speed = abs(sides[lines[lineindex].sidenum[0]].textureoffset)/8; + sequence = abs(sides[lines[lineindex].sidenum[0]].rowoffset)>>FRACBITS; + + if (speed == 0) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: Waypoint sequence %d at zero speed.\n", sequence); + break; + } + + // Find the closest waypoint + // Find the preceding waypoint + // Find the proceeding waypoint + // Determine the closest spot on the line between the three waypoints + // Put player at that location. + + waypointmid = P_GetClosestWaypoint(sequence, player->mo); + + if (!waypointmid) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: WAYPOINT(S) IN SEQUENCE %d NOT FOUND.\n", sequence); + break; + } + + waypointlow = P_GetPreviousWaypoint(waypointmid, true); + waypointhigh = P_GetNextWaypoint(waypointmid, true); + + CONS_Debug(DBG_GAMELOGIC, "WaypointMid: %d; WaypointLow: %d; WaypointHigh: %d\n", + waypointmid->health, waypointlow ? waypointlow->health : -1, waypointhigh ? waypointhigh->health : -1); + + // Now we have three waypoints... the closest one we're near, and the one that comes before, and after. + // Next, we need to find the closest point on the line between each set, and determine which one we're + // closest to. + + p.x = player->mo->x; + p.y = player->mo->y; + p.z = player->mo->z; + + // Waypointmid and Waypointlow: + if (waypointlow) + { + line[0].x = waypointmid->x; + line[0].y = waypointmid->y; + line[0].z = waypointmid->z; + line[1].x = waypointlow->x; + line[1].y = waypointlow->y; + line[1].z = waypointlow->z; + + P_ClosestPointOnLine3D(&p, line, &resultlow); + } + + // Waypointmid and Waypointhigh: + if (waypointhigh) + { + line[0].x = waypointmid->x; + line[0].y = waypointmid->y; + line[0].z = waypointmid->z; + line[1].x = waypointhigh->x; + line[1].y = waypointhigh->y; + line[1].z = waypointhigh->z; + + P_ClosestPointOnLine3D(&p, line, &resulthigh); + } + + // 3D support now available. Disregard the previous notice here. -Red + + P_UnsetThingPosition(player->mo); + P_ResetPlayer(player); + player->mo->momx = player->mo->momy = player->mo->momz = 0; + + if (lines[lineindex].flags & ML_EFFECT1) // Don't wrap + { + mobj_t *highest = P_GetLastWaypoint(sequence); + highest->flags |= MF_SLIDEME; + } + + // Changing the conditions on these ifs to fix issues with snapping to the wrong spot -Red + if ((lines[lineindex].flags & ML_EFFECT1) && waypointmid->health == 0) + { + closest = waypointhigh; + player->mo->x = resulthigh.x; + player->mo->y = resulthigh.y; + player->mo->z = resulthigh.z - P_GetPlayerHeight(player); + } + else if ((lines[lineindex].flags & ML_EFFECT1) && waypointmid->health == numwaypoints[sequence] - 1) + { + closest = waypointmid; + player->mo->x = resultlow.x; + player->mo->y = resultlow.y; + player->mo->z = resultlow.z - P_GetPlayerHeight(player); + } + else + { + if (P_AproxDistance(P_AproxDistance(player->mo->x-resultlow.x, player->mo->y-resultlow.y), + player->mo->z-resultlow.z) < P_AproxDistance(P_AproxDistance(player->mo->x-resulthigh.x, + player->mo->y-resulthigh.y), player->mo->z-resulthigh.z)) + { + // Line between Mid and Low is closer + closest = waypointmid; + player->mo->x = resultlow.x; + player->mo->y = resultlow.y; + player->mo->z = resultlow.z - P_GetPlayerHeight(player); + } + else + { + // Line between Mid and High is closer + closest = waypointhigh; + player->mo->x = resulthigh.x; + player->mo->y = resulthigh.y; + player->mo->z = resulthigh.z - P_GetPlayerHeight(player); + } + } + + P_SetTarget(&player->mo->tracer, closest); + player->powers[pw_carry] = CR_ROPEHANG; + + // Option for static ropes. + if (lines[lineindex].flags & ML_NOCLIMB) + player->speed = 0; + else + player->speed = speed; + + S_StartSound(player->mo, sfx_s3k4a); + + player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE|PF_GLIDING|PF_BOUNCING|PF_SLIDING|PF_CANCARRY); + player->climbing = 0; + P_SetThingPosition(player->mo); + P_SetPlayerMobjState(player->mo, S_PLAY_RIDE); + } + break; + case 12: // Camera noclip + case 13: // Unused + case 14: // Unused + case 15: // Unused + break; + } +} + +/** Checks if an object is standing on or is inside a special 3D floor. + * If so, the sector is returned. + * + * \param mo Object to check. + * \return Pointer to the sector with a special type, or NULL if no special 3D + * floors are being contacted. + * \sa P_PlayerOnSpecial3DFloor + */ +sector_t *P_ThingOnSpecial3DFloor(mobj_t *mo) +{ + sector_t *sector; + ffloor_t *rover; + fixed_t topheight, bottomheight; + + sector = mo->subsector->sector; + if (!sector->ffloors) + return NULL; + + for (rover = sector->ffloors; rover; rover = rover->next) + { + if (!rover->master->frontsector->special) + continue; + + if (!(rover->flags & FF_EXISTS)) + continue; + + topheight = P_GetSpecialTopZ(mo, sectors + rover->secnum, sector); + bottomheight = P_GetSpecialBottomZ(mo, sectors + rover->secnum, sector); + + // Check the 3D floor's type... + if (((rover->flags & FF_BLOCKPLAYER) && mo->player) + || ((rover->flags & FF_BLOCKOTHERS) && !mo->player)) + { + boolean floorallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_FLOOR) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(mo->eflags & MFE_VERTICALFLIP)) && (mo->z == topheight)); + boolean ceilingallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_CEILING) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (mo->eflags & MFE_VERTICALFLIP)) && (mo->z + mo->height == bottomheight)); + // Thing must be on top of the floor to be affected... + if (!(floorallowed || ceilingallowed)) + continue; + } + else + { + // Water and intangible FOFs + if (mo->z > topheight || (mo->z + mo->height) < bottomheight) + continue; + } + + return rover->master->frontsector; + } + + return NULL; +} + +#define TELEPORTED (player->mo->subsector->sector != originalsector) + +/** Checks if a player is standing on or is inside a 3D floor (e.g. water) and + * applies any specials. + * + * \param player Player to check. + * \sa P_ThingOnSpecial3DFloor, P_PlayerInSpecialSector + */ +static void P_PlayerOnSpecial3DFloor(player_t *player, sector_t *sector) +{ + sector_t *originalsector = player->mo->subsector->sector; + ffloor_t *rover; + fixed_t topheight, bottomheight; + + for (rover = sector->ffloors; rover; rover = rover->next) + { + if (!rover->master->frontsector->special) + continue; + + if (!(rover->flags & FF_EXISTS)) + continue; + + topheight = P_GetSpecialTopZ(player->mo, sectors + rover->secnum, sector); + bottomheight = P_GetSpecialBottomZ(player->mo, sectors + rover->secnum, sector); + + // Check the 3D floor's type... + if (rover->flags & FF_BLOCKPLAYER) + { + boolean floorallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_FLOOR) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z == topheight)); + boolean ceilingallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_CEILING) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z + player->mo->height == bottomheight)); + // Thing must be on top of the floor to be affected... + if (!(floorallowed || ceilingallowed)) + continue; + } + else + { + // Water and DEATH FOG!!! heh + if (player->mo->z > topheight || (player->mo->z + player->mo->height) < bottomheight) + continue; + } + + // This FOF has the special we're looking for, but are we allowed to touch it? + if (sector == player->mo->subsector->sector + || (rover->master->frontsector->flags & SF_TRIGGERSPECIAL_TOUCH)) + { + P_ProcessSpecialSector(player, rover->master->frontsector, sector); + if TELEPORTED return; + } + } + + // Allow sector specials to be applied to polyobjects! + if (player->mo->subsector->polyList) + { + polyobj_t *po = player->mo->subsector->polyList; + sector_t *polysec; + boolean touching = false; + boolean inside = false; + + while (po) + { + if (po->flags & POF_NOSPECIALS) + { + po = (polyobj_t *)(po->link.next); + continue; + } + + polysec = po->lines[0]->backsector; + + if ((polysec->flags & SF_TRIGGERSPECIAL_TOUCH)) + touching = P_MobjTouchingPolyobj(po, player->mo); + else + touching = false; + + inside = P_MobjInsidePolyobj(po, player->mo); + + if (!(inside || touching)) + { + po = (polyobj_t *)(po->link.next); + continue; + } + + // We're inside it! Yess... + if (!polysec->special) + { + po = (polyobj_t *)(po->link.next); + continue; + } + + if (!(po->flags & POF_TESTHEIGHT)) // Don't do height checking + ; + else if (po->flags & POF_SOLID) + { + boolean floorallowed = ((polysec->flags & SF_FLIPSPECIAL_FLOOR) && ((polysec->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z == polysec->ceilingheight)); + boolean ceilingallowed = ((polysec->flags & SF_FLIPSPECIAL_CEILING) && ((polysec->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z + player->mo->height == polysec->floorheight)); + // Thing must be on top of the floor to be affected... + if (!(floorallowed || ceilingallowed)) + { + po = (polyobj_t *)(po->link.next); + continue; + } + } + else + { + // Water and DEATH FOG!!! heh + if (player->mo->z > polysec->ceilingheight || (player->mo->z + player->mo->height) < polysec->floorheight) + { + po = (polyobj_t *)(po->link.next); + continue; + } + } + + P_ProcessSpecialSector(player, polysec, sector); + if TELEPORTED return; + + po = (polyobj_t *)(po->link.next); + } + } +} + +#define VDOORSPEED (FRACUNIT*2) + +// +// P_RunSpecialSectorCheck +// +// Helper function to P_PlayerInSpecialSector +// +static void P_RunSpecialSectorCheck(player_t *player, sector_t *sector) +{ + boolean nofloorneeded = false; + fixed_t f_affectpoint, c_affectpoint; + + if (!sector->special) // nothing special, exit + return; + + if (GETSECSPECIAL(sector->special, 2) == 9) // Egg trap capsule -- should only be for 3dFloors! + return; + + // The list of specials that activate without floor touch + // Check Section 1 + switch(GETSECSPECIAL(sector->special, 1)) + { + case 2: // Damage (water) + case 8: // Instant kill + case 10: // Ring drainer that doesn't require floor touch + case 12: // Space countdown + nofloorneeded = true; + break; + } + + // Check Section 2 + switch(GETSECSPECIAL(sector->special, 2)) + { + case 2: // Linedef executor (All players needed) + case 4: // Linedef executor + case 6: // Linedef executor (7 Emeralds) + case 7: // Linedef executor (NiGHTS Mare) + nofloorneeded = true; + break; + } + + // Check Section 3 +/* switch(GETSECSPECIAL(sector->special, 3)) + { + + }*/ + + // Check Section 4 + switch(GETSECSPECIAL(sector->special, 4)) + { + case 2: // Level Exit / GOAL Sector / Flag Return + if (!(maptol & TOL_NIGHTS) && G_IsSpecialStage(gamemap)) + { + // Special stage GOAL sector + // requires touching floor. + break; + } + /* FALLTHRU */ + + case 1: // Starpost activator + case 5: // Fan sector + case 6: // Super Sonic Transform + case 8: // Zoom Tube Start + case 9: // Zoom Tube End + case 10: // Finish line + nofloorneeded = true; + break; + } + + if (nofloorneeded) + { + P_ProcessSpecialSector(player, sector, NULL); + return; + } + + f_affectpoint = P_GetSpecialBottomZ(player->mo, sector, sector); + c_affectpoint = P_GetSpecialTopZ(player->mo, sector, sector); + + { + boolean floorallowed = ((sector->flags & SF_FLIPSPECIAL_FLOOR) && ((sector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z == f_affectpoint)); + boolean ceilingallowed = ((sector->flags & SF_FLIPSPECIAL_CEILING) && ((sector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z + player->mo->height == c_affectpoint)); + // Thing must be on top of the floor to be affected... + if (!(floorallowed || ceilingallowed)) + return; + } + + P_ProcessSpecialSector(player, sector, NULL); +} + +/** Checks if the player is in a special sector or FOF and apply any specials. + * + * \param player Player to check. + * \sa P_PlayerOnSpecial3DFloor, P_ProcessSpecialSector + */ +void P_PlayerInSpecialSector(player_t *player) +{ + sector_t *originalsector; + sector_t *loopsector; + msecnode_t *node; + + if (!player->mo) + return; + + originalsector = player->mo->subsector->sector; + + P_PlayerOnSpecial3DFloor(player, originalsector); // Handle FOFs first. + if TELEPORTED return; + + P_RunSpecialSectorCheck(player, originalsector); + if TELEPORTED return; + + // Iterate through touching_sectorlist for SF_TRIGGERSPECIAL_TOUCH + for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) + { + loopsector = node->m_sector; + + if (loopsector == originalsector) // Don't duplicate + continue; + + // Check 3D floors... + P_PlayerOnSpecial3DFloor(player, loopsector); + if TELEPORTED return; + + if (!(loopsector->flags & SF_TRIGGERSPECIAL_TOUCH)) + continue; + + P_RunSpecialSectorCheck(player, loopsector); + if TELEPORTED return; + } +} + +#undef TELEPORTED + +/** Animate planes, scroll walls, etc. and keeps track of level timelimit and exits if time is up. + * + * \sa P_CheckTimeLimit, P_CheckPointLimit + */ +void P_UpdateSpecials(void) +{ + anim_t *anim; + INT32 i; + INT32 pic; + size_t j; + + levelflat_t *foundflats; // for flat animation + + // LEVEL TIMER + P_CheckTimeLimit(); + + // POINT LIMIT + P_CheckPointLimit(); + + // ANIMATE TEXTURES + for (anim = anims; anim < lastanim; anim++) + { + for (i = 0; i < anim->numpics; i++) + { + pic = anim->basepic + ((leveltime/anim->speed + i) % anim->numpics); + if (anim->istexture) + texturetranslation[anim->basepic+i] = pic; + } + } + + // ANIMATE FLATS + /// \todo do not check the non-animate flat.. link the animated ones? + /// \note its faster than the original anywaysince it animates only + /// flats used in the level, and there's usually very few of them + foundflats = levelflats; + for (j = 0; j < numlevelflats; j++, foundflats++) + { + if (foundflats->speed) // it is an animated flat + { + // update the levelflat texture number + if ((foundflats->type == LEVELFLAT_TEXTURE) && (foundflats->u.texture.basenum != -1)) + foundflats->u.texture.num = foundflats->u.texture.basenum + ((leveltime/foundflats->speed + foundflats->animseq) % foundflats->numpics); + // update the levelflat lump number + else if ((foundflats->type == LEVELFLAT_FLAT) && (foundflats->u.flat.baselumpnum != LUMPERROR)) + foundflats->u.flat.lumpnum = foundflats->u.flat.baselumpnum + ((leveltime/foundflats->speed + foundflats->animseq) % foundflats->numpics); + } + } +} + +// +// Floor over floors (FOFs), 3Dfloors, 3Dblocks, fake floors (ffloors), rovers, or whatever you want to call them +// + +/** Gets the ID number for a 3Dfloor in its target sector. + * + * \param fflr The 3Dfloor we want an ID for. + * \return ID of 3Dfloor in target sector. Note that the first FOF's ID is 0. UINT16_MAX is given if invalid. + * \sa P_GetFFloorByID + */ +UINT16 P_GetFFloorID(ffloor_t *fflr) +{ + ffloor_t *rover; + sector_t *sec; + UINT16 i = 0; + + if (!fflr) + return UINT16_MAX; + + sec = fflr->target; + + if (!sec->ffloors) + return UINT16_MAX; + for (rover = sec->ffloors; rover; rover = rover->next, i++) + if (rover == fflr) + return i; + return UINT16_MAX; +} + +/** Gets a 3Dfloor by control sector. + * + * \param sec Target sector. + * \param sec2 Control sector. + * \return Pointer to found 3Dfloor, or NULL. + * \sa P_GetFFloorByID + */ +static inline ffloor_t *P_GetFFloorBySec(sector_t *sec, sector_t *sec2) +{ + ffloor_t *rover; + + if (!sec->ffloors) + return NULL; + for (rover = sec->ffloors; rover; rover = rover->next) + if (rover->secnum == (size_t)(sec2 - sectors)) + return rover; + return NULL; +} + +/** Gets a 3Dfloor by ID number. + * + * \param sec Target sector. + * \param id ID of 3Dfloor in target sector. Note that the first FOF's ID is 0. + * \return Pointer to found 3Dfloor, or NULL. + * \sa P_GetFFloorBySec, P_GetFFloorID + */ +ffloor_t *P_GetFFloorByID(sector_t *sec, UINT16 id) +{ + ffloor_t *rover; + UINT16 i = 0; + + if (!sec->ffloors) + return NULL; + for (rover = sec->ffloors; rover; rover = rover->next) + if (i++ == id) + return rover; + return NULL; +} + +/** Adds a newly formed 3Dfloor structure to a sector's ffloors list. + * + * \param sec Target sector. + * \param fflr Newly formed 3Dfloor structure. + * \sa P_AddFakeFloor + */ +static inline void P_AddFFloorToList(sector_t *sec, ffloor_t *fflr) +{ + ffloor_t *rover; + + if (!sec->ffloors) + { + sec->ffloors = fflr; + fflr->next = 0; + fflr->prev = 0; + return; + } + + for (rover = sec->ffloors; rover->next; rover = rover->next); + + rover->next = fflr; + fflr->prev = rover; + fflr->next = 0; +} + +/** Adds a 3Dfloor. + * + * \param sec Target sector. + * \param sec2 Control sector. + * \param master Control linedef. + * \param alpha Alpha value (0-255). + * \param flags Options affecting this 3Dfloor. + * \param secthinkers List of relevant thinkers sorted by sector. May be NULL. + * \return Pointer to the new 3Dfloor. + * \sa P_AddFFloor, P_AddFakeFloorsByLine, P_SpawnSpecials + */ +static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, INT32 alpha, ffloortype_e flags, thinkerlist_t *secthinkers) +{ + ffloor_t *fflr; + thinker_t *th; + friction_t *f; + pusher_t *p; + size_t sec2num; + size_t i; + + if (sec == sec2) + return NULL; //Don't need a fake floor on a control sector. + if ((fflr = (P_GetFFloorBySec(sec, sec2)))) + return fflr; // If this ffloor already exists, return it + + if (sec2->ceilingheight < sec2->floorheight) + { + fixed_t tempceiling = sec2->ceilingheight; + //flip the sector around and print an error instead of crashing 12.1.08 -Inuyasha + CONS_Alert(CONS_ERROR, M_GetText("A FOF tagged %d has a top height below its bottom.\n"), master->args[0]); + sec2->ceilingheight = sec2->floorheight; + sec2->floorheight = tempceiling; + } + + if (sec2->numattached == 0) + { + sec2->attached = Z_Malloc(sizeof (*sec2->attached) * sec2->maxattached, PU_STATIC, NULL); + sec2->attachedsolid = Z_Malloc(sizeof (*sec2->attachedsolid) * sec2->maxattached, PU_STATIC, NULL); + sec2->attached[0] = sec - sectors; + sec2->numattached = 1; + sec2->attachedsolid[0] = (flags & FF_SOLID); + } + else + { + for (i = 0; i < sec2->numattached; i++) + if (sec2->attached[i] == (size_t)(sec - sectors)) + return NULL; + + if (sec2->numattached >= sec2->maxattached) + { + sec2->maxattached *= 2; + sec2->attached = Z_Realloc(sec2->attached, sizeof (*sec2->attached) * sec2->maxattached, PU_STATIC, NULL); + sec2->attachedsolid = Z_Realloc(sec2->attachedsolid, sizeof (*sec2->attachedsolid) * sec2->maxattached, PU_STATIC, NULL); + } + sec2->attached[sec2->numattached] = sec - sectors; + sec2->attachedsolid[sec2->numattached] = (flags & FF_SOLID); + sec2->numattached++; + } + + // Add the floor + fflr = Z_Calloc(sizeof (*fflr), PU_LEVEL, NULL); + fflr->secnum = sec2 - sectors; + fflr->target = sec; + fflr->bottomheight = &sec2->floorheight; + fflr->bottompic = &sec2->floorpic; + fflr->bottomxoffs = &sec2->floor_xoffs; + fflr->bottomyoffs = &sec2->floor_yoffs; + fflr->bottomangle = &sec2->floorpic_angle; + + // Add the ceiling + fflr->topheight = &sec2->ceilingheight; + fflr->toppic = &sec2->ceilingpic; + fflr->toplightlevel = &sec2->lightlevel; + fflr->topxoffs = &sec2->ceiling_xoffs; + fflr->topyoffs = &sec2->ceiling_yoffs; + fflr->topangle = &sec2->ceilingpic_angle; + + // Add slopes + fflr->t_slope = &sec2->c_slope; + fflr->b_slope = &sec2->f_slope; + // mark the target sector as having slopes, if the FOF has any of its own + // (this fixes FOF slopes glitching initially at level load in software mode) + if (sec2->hasslope) + sec->hasslope = true; + + fflr->spawnflags = fflr->flags = flags; + fflr->master = master; + fflr->norender = INFTICS; + fflr->fadingdata = NULL; + + // Scan the thinkers to check for special conditions applying to this FOF. + // If we have thinkers sorted by sector, just check the relevant ones; + // otherwise, check them all. Apologies for the ugly loop... + + sec2num = sec2 - sectors; + + // Just initialise both of these to placate the compiler. + i = 0; + th = thlist[THINK_MAIN].next; + + for(;;) + { + if(secthinkers) + { + if(i < secthinkers[sec2num].count) + th = secthinkers[sec2num].thinkers[i]; + else break; + } + else if (th == &thlist[THINK_MAIN]) + break; + + // Should this FOF have friction? + if(th->function.acp1 == (actionf_p1)T_Friction) + { + f = (friction_t *)th; + + if (f->affectee == (INT32)sec2num) + Add_Friction(f->friction, f->movefactor, (INT32)(sec-sectors), f->affectee); + } + // Should this FOF have wind/current/pusher? + else if(th->function.acp1 == (actionf_p1)T_Pusher) + { + p = (pusher_t *)th; + + if (p->affectee == (INT32)sec2num) + Add_Pusher(p->type, p->x_mag<y_mag<source, (INT32)(sec-sectors), p->affectee, p->exclusive, p->slider); + } + + if(secthinkers) i++; + else th = th->next; + } + + fflr->alpha = max(0, min(0xff, alpha)); + if (fflr->alpha < 0xff) + { + fflr->flags |= FF_TRANSLUCENT; + fflr->spawnflags = fflr->flags; + } + fflr->spawnalpha = fflr->alpha; // save for netgames + + if (flags & FF_QUICKSAND) + CheckForQuicksand = true; + + if (flags & FF_BUSTUP) + CheckForBustableBlocks = true; + + if ((flags & FF_MARIO)) + { + if (!(flags & FF_GOOWATER)) // Don't change the textures of a brick block, just a question block + P_AddBlockThinker(sec2, master); + CheckForMarioBlocks = true; + } + + if ((flags & FF_CRUMBLE)) + sec2->crumblestate = CRUMBLE_WAIT; + + if ((flags & FF_FLOATBOB)) + { + P_AddFloatThinker(sec2, Tag_FGet(&master->tags), master); + CheckForFloatBob = true; + } + + P_AddFFloorToList(sec, fflr); + + return fflr; +} + +// +// SPECIAL SPAWNING +// + +/** Adds a float thinker. + * Float thinkers cause solid 3Dfloors to float on water. + * + * \param sec Control sector. + * \param actionsector Target sector. + * \sa P_SpawnSpecials, T_FloatSector + * \author SSNTails + */ +static void P_AddFloatThinker(sector_t *sec, UINT16 tag, line_t *sourceline) +{ + floatthink_t *floater; + + // create and initialize new thinker + floater = Z_Calloc(sizeof (*floater), PU_LEVSPEC, NULL); + P_AddThinker(THINK_MAIN, &floater->thinker); + + floater->thinker.function.acp1 = (actionf_p1)T_FloatSector; + + floater->sector = sec; + floater->tag = (INT16)tag; + floater->sourceline = sourceline; +} + +/** + * Adds a plane displacement thinker. + * Whenever the "control" sector moves, + * the "affectee" sector's floor or ceiling plane moves too! + * + * \param speed Rate of movement relative to control sector + * \param control Control sector. + * \param affectee Target sector. + * \param reverse Reverse direction? + * \sa P_SpawnSpecials, T_PlaneDisplace + * \author Monster Iestyn + */ +static void P_AddPlaneDisplaceThinker(INT32 type, fixed_t speed, INT32 control, INT32 affectee, UINT8 reverse) +{ + planedisplace_t *displace; + + // create and initialize new displacement thinker + displace = Z_Calloc(sizeof (*displace), PU_LEVSPEC, NULL); + P_AddThinker(THINK_MAIN, &displace->thinker); + + displace->thinker.function.acp1 = (actionf_p1)T_PlaneDisplace; + displace->affectee = affectee; + displace->control = control; + displace->last_height = sectors[control].floorheight; + displace->speed = speed; + displace->type = type; + displace->reverse = reverse; +} + +/** Adds a Mario block thinker, which changes the block's texture between blank + * and ? depending on whether it has contents. + * Needed in case objects respawn inside. + * + * \param sec Control sector. + * \param actionsector Target sector. + * \param sourceline Control linedef. + * \sa P_SpawnSpecials, T_MarioBlockChecker + * \author SSNTails + */ +static void P_AddBlockThinker(sector_t *sec, line_t *sourceline) +{ + mariocheck_t *block; + + // create and initialize new elevator thinker + block = Z_Calloc(sizeof (*block), PU_LEVSPEC, NULL); + P_AddThinker(THINK_MAIN, &block->thinker); + + block->thinker.function.acp1 = (actionf_p1)T_MarioBlockChecker; + block->sourceline = sourceline; + + block->sector = sec; +} + +/** Adds a raise thinker. + * A raise thinker checks to see if the + * player is standing on its 3D Floor, + * and if so, raises the platform towards + * it's destination. Otherwise, it lowers + * to the lowest nearby height if not + * there already. + * + * \param sec Control sector. + * \sa P_SpawnSpecials, T_RaiseSector + * \author SSNTails + */ +static void P_AddRaiseThinker(sector_t *sec, INT16 tag, fixed_t speed, fixed_t ceilingtop, fixed_t ceilingbottom, boolean lower, boolean spindash) +{ + raise_t *raise; + + raise = Z_Calloc(sizeof (*raise), PU_LEVSPEC, NULL); + P_AddThinker(THINK_MAIN, &raise->thinker); + + raise->thinker.function.acp1 = (actionf_p1)T_RaiseSector; + + raise->tag = tag; + raise->sector = sec; + + raise->ceilingtop = ceilingtop; + raise->ceilingbottom = ceilingbottom; + + raise->basespeed = speed >> 2; + + if (lower) + raise->flags |= RF_REVERSE; + if (spindash) + raise->flags |= RF_SPINDASH; +} + +static void P_AddAirbob(sector_t *sec, INT16 tag, fixed_t dist, boolean raise, boolean spindash, boolean dynamic) +{ + raise_t *airbob; + + airbob = Z_Calloc(sizeof (*airbob), PU_LEVSPEC, NULL); + P_AddThinker(THINK_MAIN, &airbob->thinker); + + airbob->thinker.function.acp1 = (actionf_p1)T_RaiseSector; + + airbob->tag = tag; + airbob->sector = sec; + + airbob->ceilingtop = sec->ceilingheight; + airbob->ceilingbottom = sec->ceilingheight - dist; + + airbob->basespeed = FRACUNIT; + + if (!raise) + airbob->flags |= RF_REVERSE; + if (spindash) + airbob->flags |= RF_SPINDASH; + if (dynamic) + airbob->flags |= RF_DYNAMIC; +} + +/** Adds a thwomp thinker. + * Even thwomps need to think! + * + * \param sec Control sector. + * \sa P_SpawnSpecials, T_ThwompSector + * \author SSNTails + */ +static inline void P_AddThwompThinker(sector_t *sec, line_t *sourceline, fixed_t crushspeed, fixed_t retractspeed, UINT16 sound) +{ + thwomp_t *thwomp; + + // You *probably* already have a thwomp in this sector. If you've combined it with something + // else that uses the floordata/ceilingdata, you must be weird. + if (sec->floordata || sec->ceilingdata) + return; + + // create and initialize new elevator thinker + thwomp = Z_Calloc(sizeof (*thwomp), PU_LEVSPEC, NULL); + P_AddThinker(THINK_MAIN, &thwomp->thinker); + + thwomp->thinker.function.acp1 = (actionf_p1)T_ThwompSector; + + // set up the fields according to the type of elevator action + thwomp->sourceline = sourceline; + thwomp->sector = sec; + thwomp->crushspeed = crushspeed; + thwomp->retractspeed = retractspeed; + thwomp->direction = 0; + thwomp->floorstartheight = sec->floorheight; + thwomp->ceilingstartheight = sec->ceilingheight; + thwomp->delay = 1; + thwomp->tag = Tag_FGet(&sourceline->tags); + thwomp->sound = sound; + + sec->floordata = thwomp; + sec->ceilingdata = thwomp; + // Start with 'resting' texture + sides[sourceline->sidenum[0]].midtexture = sides[sourceline->sidenum[0]].bottomtexture; +} + +/** Adds a thinker which checks if any MF_ENEMY objects with health are in the defined area. + * If not, a linedef executor is run once. + * + * \param sourceline Control linedef. + * \sa P_SpawnSpecials, T_NoEnemiesSector + * \author SSNTails + */ +static inline void P_AddNoEnemiesThinker(line_t *sourceline) +{ + noenemies_t *nobaddies; + + // create and initialize new thinker + nobaddies = Z_Calloc(sizeof (*nobaddies), PU_LEVSPEC, NULL); + P_AddThinker(THINK_MAIN, &nobaddies->thinker); + + nobaddies->thinker.function.acp1 = (actionf_p1)T_NoEnemiesSector; + + nobaddies->sourceline = sourceline; +} + +/** Adds a thinker for Each-Time linedef executors. A linedef executor is run + * only when a player enters the area and doesn't run again until they re-enter. + * + * \param sourceline Control linedef. + * \sa P_SpawnSpecials, T_EachTimeThinker + * \author SSNTails + */ +static void P_AddEachTimeThinker(line_t *sourceline) +{ + eachtime_t *eachtime; + + // create and initialize new thinker + eachtime = Z_Calloc(sizeof (*eachtime), PU_LEVSPEC, NULL); + P_AddThinker(THINK_MAIN, &eachtime->thinker); + + eachtime->thinker.function.acp1 = (actionf_p1)T_EachTimeThinker; + + eachtime->sourceline = sourceline; + eachtime->triggerOnExit = !!(sourceline->flags & ML_BOUNCY); +} + +/** Adds a camera scanner. + * + * \param sourcesec Control sector. + * \param actionsector Target sector. + * \param angle Angle of the source line. + * \sa P_SpawnSpecials, T_CameraScanner + * \author SSNTails + */ +static inline void P_AddCameraScanner(sector_t *sourcesec, sector_t *actionsector, angle_t angle) +{ + elevator_t *elevator; // Why not? LOL + + CONS_Alert(CONS_WARNING, M_GetText("Detected a camera scanner effect (linedef type 5). This effect is deprecated and will be removed in the future!\n")); + + // create and initialize new elevator thinker + elevator = Z_Calloc(sizeof (*elevator), PU_LEVSPEC, NULL); + P_AddThinker(THINK_MAIN, &elevator->thinker); + + elevator->thinker.function.acp1 = (actionf_p1)T_CameraScanner; + elevator->type = elevateBounce; + + // set up the fields according to the type of elevator action + elevator->sector = sourcesec; + elevator->actionsector = actionsector; + elevator->distance = FixedInt(AngleFixed(angle)); +} + +/** Flashes a laser block. + * + * \param flash Thinker structure for this laser. + * \sa P_AddLaserThinker + * \author SSNTails + */ +void T_LaserFlash(laserthink_t *flash) +{ + msecnode_t *node; + mobj_t *thing; + INT32 s; + ffloor_t *fflr; + sector_t *sector; + sector_t *sourcesec = flash->sourceline->frontsector; + fixed_t top, bottom; + + TAG_ITER_SECTORS(flash->tag, s) + { + sector = §ors[s]; + for (fflr = sector->ffloors; fflr; fflr = fflr->next) + { + if (fflr->master != flash->sourceline) + continue; + + if (!(fflr->flags & FF_EXISTS)) + break; + + if (leveltime & 2) + //fflr->flags |= FF_RENDERALL; + fflr->alpha = 0xB0; + else + //fflr->flags &= ~FF_RENDERALL; + fflr->alpha = 0x90; + + top = P_GetFFloorTopZAt (fflr, sector->soundorg.x, sector->soundorg.y); + bottom = P_GetFFloorBottomZAt(fflr, sector->soundorg.x, sector->soundorg.y); + sector->soundorg.z = (top + bottom)/2; + S_StartSound(§or->soundorg, sfx_laser); + + // Seek out objects to DESTROY! MUAHAHHAHAHAA!!!*cough* + for (node = sector->touching_thinglist; node && node->m_thing; node = node->m_thinglist_next) + { + thing = node->m_thing; + + if (flash->nobosses && thing->flags & MF_BOSS) + continue; // Don't hurt bosses + + // Don't endlessly kill egg guard shields (or anything else for that matter) + if (thing->health <= 0) + continue; + + top = P_GetSpecialTopZ(thing, sourcesec, sector); + bottom = P_GetSpecialBottomZ(thing, sourcesec, sector); + + if (thing->z >= top + || thing->z + thing->height <= bottom) + continue; + + if (thing->flags & MF_SHOOTABLE) + P_DamageMobj(thing, NULL, NULL, 1, 0); + else if (thing->type == MT_EGGSHIELD) + P_KillMobj(thing, NULL, NULL, 0); + } + + break; + } + } +} + +static inline void P_AddLaserThinker(INT16 tag, line_t *line, boolean nobosses) +{ + laserthink_t *flash = Z_Calloc(sizeof (*flash), PU_LEVSPEC, NULL); + + P_AddThinker(THINK_MAIN, &flash->thinker); + + flash->thinker.function.acp1 = (actionf_p1)T_LaserFlash; + flash->tag = tag; + flash->sourceline = line; + flash->nobosses = nobosses; +} + +// +// P_RunLevelLoadExecutors +// +// After loading/spawning all other specials +// and items, execute these. +// +static void P_RunLevelLoadExecutors(void) +{ + size_t i; + + for (i = 0; i < numlines; i++) + { + if (lines[i].special == 399) + P_RunTriggerLinedef(&lines[i], NULL, NULL); + } +} + +/** Before things are loaded, initialises certain stuff in case they're needed + * by P_SpawnSlopes or P_LoadThings. This was split off from + * P_SpawnSpecials, in case you couldn't tell. + * + * \sa P_SpawnSpecials + * \author Monster Iestyn + */ +void P_InitSpecials(void) +{ + // Set the default gravity. Custom gravity overrides this setting. + gravity = mapheaderinfo[gamemap-1]->gravity; + + // Defaults in case levels don't have them set. + sstimer = mapheaderinfo[gamemap-1]->sstimer*TICRATE + 6; + ssspheres = mapheaderinfo[gamemap-1]->ssspheres; + + CheckForBustableBlocks = CheckForBouncySector = CheckForQuicksand = CheckForMarioBlocks = CheckForFloatBob = CheckForReverseGravity = false; + + // Set curWeather + switch (mapheaderinfo[gamemap-1]->weather) + { + case PRECIP_SNOW: // snow + case PRECIP_RAIN: // rain + case PRECIP_STORM: // storm + case PRECIP_STORM_NORAIN: // storm w/o rain + case PRECIP_STORM_NOSTRIKES: // storm w/o lightning + curWeather = mapheaderinfo[gamemap-1]->weather; + break; + default: // blank/none + curWeather = PRECIP_NONE; + break; + } + + // Set globalweather + globalweather = mapheaderinfo[gamemap-1]->weather; +} + +static void P_ApplyFlatAlignment(line_t *master, sector_t *sector, angle_t flatangle, fixed_t xoffs, fixed_t yoffs) +{ + if (!(master->flags & ML_NETONLY)) // Modify floor flat alignment unless ML_NETONLY flag is set + { + sector->floorpic_angle = flatangle; + sector->floor_xoffs += xoffs; + sector->floor_yoffs += yoffs; + } + + if (!(master->flags & ML_NONET)) // Modify ceiling flat alignment unless ML_NONET flag is set + { + sector->ceilingpic_angle = flatangle; + sector->ceiling_xoffs += xoffs; + sector->ceiling_yoffs += yoffs; + } + +} + +static void P_MakeFOFBouncy(line_t *paramline, line_t *masterline) +{ + INT32 s; + TAG_ITER_DECLARECOUNTER(0); + + if (masterline->special < 100 || masterline->special >= 300) + return; + + TAG_ITER_SECTORS(0, masterline->args[0], s) + { + ffloor_t *rover; + + for (rover = sectors[s].ffloors; rover; rover = rover->next) + { + if (rover->master != masterline) + continue; + + rover->flags |= FF_BOUNCY; + rover->spawnflags |= FF_BOUNCY; + rover->bouncestrength = (paramline->args[1]<< FRACBITS)/100; + if (paramline->args[2]) + rover->specialflags |= FS_DAMPEN; + else + rover->specialflags &= ~FS_DAMPEN; + CheckForBouncySector = true; + break; + } + } + +} + +/** After the map has loaded, scans for specials that spawn 3Dfloors and + * thinkers. + * + * \todo Split up into multiple functions. + * \todo Get rid of all the magic numbers. + * \todo Potentially use 'fromnetsave' to stop any new thinkers from being created + * as they'll just be erased by UnArchiveThinkers. + * \sa P_SpawnPrecipitation, P_SpawnFriction, P_SpawnPushers, P_SpawnScrollers + */ +void P_SpawnSpecials(boolean fromnetsave) +{ + sector_t *sector; + size_t i; + INT32 j; + thinkerlist_t *secthinkers; + thinker_t *th; + TAG_ITER_DECLARECOUNTER(0); + // This used to be used, and *should* be used in the future, + // but currently isn't. + (void)fromnetsave; + + // yep, we do this here - "bossdisabled" is considered an apparatus of specials. + bossdisabled = 0; + stoppedclock = false; + + // Init special SECTORs. + sector = sectors; + for (i = 0; i < numsectors; i++, sector++) + { + if (!sector->special) + continue; + + // Process Section 1 + switch(GETSECSPECIAL(sector->special, 1)) + { + case 5: // Spikes + //Terrible hack to replace an even worse hack: + //Spike damage automatically sets SF_TRIGGERSPECIAL_TOUCH. + //Yes, this also affects other specials on the same sector. Sorry. + sector->flags |= SF_TRIGGERSPECIAL_TOUCH; + break; + } + + // Process Section 2 + switch(GETSECSPECIAL(sector->special, 2)) + { + case 10: // Time for special stage + sstimer = (sector->floorheight>>FRACBITS) * TICRATE + 6; // Time to finish + ssspheres = sector->ceilingheight>>FRACBITS; // Ring count for special stage + break; + + case 11: // Custom global gravity! + gravity = sector->floorheight/1000; + break; + } + + // Process Section 3 +/* switch(GETSECSPECIAL(player->specialsector, 3)) + { + + }*/ + + // Process Section 4 + switch(GETSECSPECIAL(sector->special, 4)) + { + case 10: // Circuit finish line + if ((gametyperules & (GTR_RACE|GTR_LIVES)) == GTR_RACE) + circuitmap = true; + break; + } + } + + P_SpawnScrollers(); // Add generalized scrollers + P_SpawnFriction(); // Friction model using linedefs + P_SpawnPushers(); // Pusher model using linedefs + + // Look for thinkers that affect FOFs, and sort them by sector + + secthinkers = Z_Calloc(numsectors * sizeof(thinkerlist_t), PU_STATIC, NULL); + + // Firstly, find out how many there are in each sector + for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next) + { + if (th->function.acp1 == (actionf_p1)T_Friction) + secthinkers[((friction_t *)th)->affectee].count++; + else if (th->function.acp1 == (actionf_p1)T_Pusher) + secthinkers[((pusher_t *)th)->affectee].count++; + } + + // Allocate each list, and then zero the count so we can use it to track + // the end of the list as we add the thinkers + for (i = 0; i < numsectors; i++) + if(secthinkers[i].count > 0) + { + secthinkers[i].thinkers = Z_Malloc(secthinkers[i].count * sizeof(thinker_t *), PU_STATIC, NULL); + secthinkers[i].count = 0; + } + + // Finally, populate the lists. + for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next) + { + size_t secnum = (size_t)-1; + + if (th->function.acp1 == (actionf_p1)T_Friction) + secnum = ((friction_t *)th)->affectee; + else if (th->function.acp1 == (actionf_p1)T_Pusher) + secnum = ((pusher_t *)th)->affectee; + + if (secnum != (size_t)-1) + secthinkers[secnum].thinkers[secthinkers[secnum].count++] = th; + } + + + // Init line EFFECTs + for (i = 0; i < numlines; i++) + { + mtag_t tag = Tag_FGet(&lines[i].tags); + + if (lines[i].special != 7) // This is a hack. I can at least hope nobody wants to prevent flat alignment in netgames... + { + // set line specials to 0 here too, same reason as above + if (netgame || multiplayer) + { + if (lines[i].flags & ML_NONET) + { + lines[i].special = 0; + continue; + } + } + else if (lines[i].flags & ML_NETONLY) + { + lines[i].special = 0; + continue; + } + } + + switch (lines[i].special) + { + INT32 s; + INT32 l; + size_t sec; + ffloortype_e ffloorflags; + + case 1: // Definable gravity per sector + sec = sides[*lines[i].sidenum].sector - sectors; + TAG_ITER_SECTORS(tag, s) + { + sectors[s].gravity = §ors[sec].floorheight; // This allows it to change in realtime! + + if (lines[i].flags & ML_NOCLIMB) + sectors[s].verticalflip = true; + else + sectors[s].verticalflip = false; + + CheckForReverseGravity = sectors[s].verticalflip; + } + break; + + case 2: // Custom exit + break; + + case 3: // Zoom Tube Parameters + break; + + case 4: // Speed pad (combines with sector special Section3:5 or Section3:6) + break; + + case 5: // Change camera info + sec = sides[*lines[i].sidenum].sector - sectors; + TAG_ITER_SECTORS(tag, s) + P_AddCameraScanner(§ors[sec], §ors[s], R_PointToAngle2(lines[i].v2->x, lines[i].v2->y, lines[i].v1->x, lines[i].v1->y)); + break; + + case 7: // Flat alignment - redone by toast + if ((lines[i].flags & (ML_NETONLY|ML_NONET)) != (ML_NETONLY|ML_NONET)) // If you can do something... + { + angle_t flatangle = InvAngle(R_PointToAngle2(lines[i].v1->x, lines[i].v1->y, lines[i].v2->x, lines[i].v2->y)); + fixed_t xoffs; + fixed_t yoffs; + + if (lines[i].flags & ML_EFFECT6) // Set offset through x and y texture offsets if ML_EFFECT6 flag is set + { + xoffs = sides[lines[i].sidenum[0]].textureoffset; + yoffs = sides[lines[i].sidenum[0]].rowoffset; + } + else // Otherwise, set calculated offsets such that line's v1 is the apparent origin + { + xoffs = -lines[i].v1->x; + yoffs = lines[i].v1->y; + } + + //If no tag is given, apply to front sector + if (tag == 0) + P_ApplyFlatAlignment(lines + i, lines[i].frontsector, flatangle, xoffs, yoffs); + else + { + TAG_ITER_SECTORS(tag, s) + P_ApplyFlatAlignment(lines + i, sectors + s, flatangle, xoffs, yoffs); + } + } + else // Otherwise, print a helpful warning. Can I do no less? + CONS_Alert(CONS_WARNING, + M_GetText("Flat alignment linedef (tag %d) doesn't have anything to do.\nConsider changing the linedef's flag configuration or removing it entirely.\n"), + tag); + break; + + case 8: // Sector Parameters + TAG_ITER_SECTORS(tag, s) + { + if (lines[i].flags & ML_NOCLIMB) + { + sectors[s].flags &= ~SF_FLIPSPECIAL_FLOOR; + sectors[s].flags |= SF_FLIPSPECIAL_CEILING; + } + else if (lines[i].flags & ML_EFFECT4) + sectors[s].flags |= SF_FLIPSPECIAL_BOTH; + + if (lines[i].flags & ML_EFFECT3) + sectors[s].flags |= SF_TRIGGERSPECIAL_TOUCH; + if (lines[i].flags & ML_EFFECT2) + sectors[s].flags |= SF_TRIGGERSPECIAL_HEADBUMP; + + if (lines[i].flags & ML_EFFECT1) + sectors[s].flags |= SF_INVERTPRECIP; + + if (lines[i].frontsector && GETSECSPECIAL(lines[i].frontsector->special, 4) == 12) + sectors[s].camsec = sides[*lines[i].sidenum].sector-sectors; + } + break; + + case 9: // Chain Parameters + break; + + case 10: // Vertical culling plane for sprites and FOFs + TAG_ITER_SECTORS(tag, s) + sectors[s].cullheight = &lines[i]; // This allows it to change in realtime! + break; + + case 50: // Insta-Lower Sector + EV_DoFloor(&lines[i], instantLower); + break; + + case 51: // Instant raise for ceilings + EV_DoCeiling(&lines[i], instantRaise); + break; + + case 52: // Continuously Falling sector + EV_DoContinuousFall(lines[i].frontsector, lines[i].backsector, P_AproxDistance(lines[i].dx, lines[i].dy), (lines[i].flags & ML_NOCLIMB)); + break; + + case 53: // New super cool and awesome moving floor and ceiling type + case 54: // New super cool and awesome moving floor type + if (lines[i].backsector) + EV_DoFloor(&lines[i], bounceFloor); + if (lines[i].special == 54) + break; + /* FALLTHRU */ + + case 55: // New super cool and awesome moving ceiling type + if (lines[i].backsector) + EV_DoCeiling(&lines[i], bounceCeiling); + break; + + case 56: // New super cool and awesome moving floor and ceiling crush type + case 57: // New super cool and awesome moving floor crush type + if (lines[i].backsector) + EV_DoFloor(&lines[i], bounceFloorCrush); + + if (lines[i].special == 57) + break; //only move the floor + /* FALLTHRU */ + + case 58: // New super cool and awesome moving ceiling crush type + if (lines[i].backsector) + EV_DoCeiling(&lines[i], bounceCeilingCrush); + break; + + case 59: // Activate floating platform + EV_DoElevator(&lines[i], elevateContinuous, false); + break; + + case 60: // Floating platform with adjustable speed + EV_DoElevator(&lines[i], elevateContinuous, true); + break; + + case 61: // Crusher! + EV_DoCrush(&lines[i], crushAndRaise); + break; + + case 62: // Crusher (up and then down)! + EV_DoCrush(&lines[i], fastCrushAndRaise); + break; + + case 63: // support for drawn heights coming from different sector + sec = sides[*lines[i].sidenum].sector-sectors; + TAG_ITER_SECTORS(tag, s) + sectors[s].heightsec = (INT32)sec; + break; + + case 64: // Appearing/Disappearing FOF option + if (lines[i].flags & ML_BLOCKMONSTERS) { // Find FOFs by control sector tag + TAG_ITER_SECTORS(tag, s) + for (j = 0; (unsigned)j < sectors[s].linecount; j++) + if (sectors[s].lines[j]->special >= 100 && sectors[s].lines[j]->special < 300) + Add_MasterDisappearer(abs(lines[i].dx>>FRACBITS), abs(lines[i].dy>>FRACBITS), abs(sides[lines[i].sidenum[0]].sector->floorheight>>FRACBITS), (INT32)(sectors[s].lines[j]-lines), (INT32)i); + } else // Find FOFs by effect sector tag + { + TAG_ITER_LINES(tag, s) + { + if ((size_t)s == i) + continue; + if (Tag_Find(&sides[lines[s].sidenum[0]].sector->tags, Tag_FGet(&sides[lines[i].sidenum[0]].sector->tags))) + Add_MasterDisappearer(abs(lines[i].dx>>FRACBITS), abs(lines[i].dy>>FRACBITS), abs(sides[lines[i].sidenum[0]].sector->floorheight>>FRACBITS), s, (INT32)i); + } + } + break; + + case 66: // Displace floor by front sector + TAG_ITER_SECTORS(tag, s) + P_AddPlaneDisplaceThinker(pd_floor, P_AproxDistance(lines[i].dx, lines[i].dy)>>8, sides[lines[i].sidenum[0]].sector-sectors, s, !!(lines[i].flags & ML_NOCLIMB)); + break; + case 67: // Displace ceiling by front sector + TAG_ITER_SECTORS(tag, s) + P_AddPlaneDisplaceThinker(pd_ceiling, P_AproxDistance(lines[i].dx, lines[i].dy)>>8, sides[lines[i].sidenum[0]].sector-sectors, s, !!(lines[i].flags & ML_NOCLIMB)); + break; + case 68: // Displace both floor AND ceiling by front sector + TAG_ITER_SECTORS(tag, s) + P_AddPlaneDisplaceThinker(pd_both, P_AproxDistance(lines[i].dx, lines[i].dy)>>8, sides[lines[i].sidenum[0]].sector-sectors, s, !!(lines[i].flags & ML_NOCLIMB)); + break; + + case 70: // Add raise thinker to FOF + if (udmf) + { + fixed_t destheight = lines[i].args[2] << FRACBITS; + fixed_t startheight, topheight, bottomheight; + + TAG_ITER_LINES(0, lines[i].args[0], l) + { + if (lines[l].special < 100 || lines[l].special >= 300) + continue; + + startheight = lines[l].frontsector->ceilingheight; + topheight = max(startheight, destheight); + bottomheight = min(startheight, destheight); + + P_AddRaiseThinker(lines[l].frontsector, lines[l].args[0], lines[i].args[1] << FRACBITS, topheight, bottomheight, (destheight < startheight), !!(lines[i].args[3])); + } + } + break; + + case 71: // Add air bob thinker to FOF + if (udmf) + { + TAG_ITER_LINES(0, lines[i].args[0], l) + { + if (lines[l].special < 100 || lines[l].special >= 300) + continue; + + P_AddAirbob(lines[l].frontsector, lines[l].args[0], lines[i].args[1] << FRACBITS, !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); + } + } + break; + + case 72: // Add thwomp thinker to FOF + if (udmf) + { + UINT16 sound = (lines[i].stringargs[0]) ? get_number(lines[i].stringargs[0]) : sfx_thwomp; + + TAG_ITER_LINES(0, lines[i].args[0], l) + { + if (lines[l].special < 100 || lines[l].special >= 300) + continue; + + P_AddThwompThinker(lines[l].frontsector, &lines[l], lines[i].args[1] << FRACBITS, lines[i].args[2] << FRACBITS, sound); + } + } + break; + + case 73: // Add laser thinker to FOF + if (udmf) + { + TAG_ITER_LINES(0, lines[i].args[0], l) + { + if (lines[l].special < 100 || lines[l].special >= 300) + continue; + + P_AddLaserThinker(lines[l].args[0], lines + l, !!(lines[i].args[1])); + } + } + break; + + case 100: // FOF (solid) + ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; + + //Appearance settings + if (lines[i].args[2] & TMFA_NOPLANES) + ffloorflags &= ~FF_RENDERPLANES; + if (lines[i].args[2] & TMFA_NOSIDES) + ffloorflags &= ~FF_RENDERSIDES; + if (lines[i].args[2] & TMFA_INSIDES) + { + if (ffloorflags & FF_RENDERPLANES) + ffloorflags |= FF_BOTHPLANES; + if (ffloorflags & FF_RENDERSIDES) + ffloorflags |= FF_ALLSIDES; + } + if (lines[i].args[2] & TMFA_ONLYINSIDES) + { + if (ffloorflags & FF_RENDERPLANES) + ffloorflags |= FF_INVERTPLANES; + if (ffloorflags & FF_RENDERSIDES) + ffloorflags |= FF_INVERTSIDES; + } + if (lines[i].args[2] & TMFA_NOSHADE) + ffloorflags |= FF_NOSHADE; + if (lines[i].args[2] & TMFA_SPLAT) + ffloorflags |= FF_SPLAT; + + //Tangibility settings + if (lines[i].args[3] & TMFT_INTANGIBLETOP) + ffloorflags |= FF_REVERSEPLATFORM; + if (lines[i].args[3] & TMFT_INTANGIBLEBOTTOM) + ffloorflags |= FF_PLATFORM; + if (lines[i].args[3] & TMFT_DONTBLOCKPLAYER) + ffloorflags &= ~FF_BLOCKPLAYER; + if (lines[i].args[3] & TMFT_DONTBLOCKOTHERS) + ffloorflags &= ~FF_BLOCKOTHERS; + + //Cutting options + if (ffloorflags & FF_RENDERALL) + { + //If translucent or player can enter it, cut inner walls + if ((lines[i].args[1] < 255) || (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE)) + ffloorflags |= FF_CUTEXTRA|FF_EXTRA; + else + ffloorflags |= FF_CUTLEVEL; + } + + P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); + break; + + case 120: // FOF (water) + ffloorflags = FF_EXISTS|FF_RENDERPLANES|FF_SWIMMABLE|FF_BOTHPLANES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; + if (!(lines[i].args[2] & TMFW_NOSIDES)) + ffloorflags |= FF_RENDERSIDES|FF_ALLSIDES; + if (lines[i].args[2] & TMFW_DOUBLESHADOW) + ffloorflags |= FF_DOUBLESHADOW; + if (lines[i].args[2] & TMFW_COLORMAPONLY) + ffloorflags |= FF_COLORMAPONLY; + if (!(lines[i].args[2] & TMFW_NORIPPLE)) + ffloorflags |= FF_RIPPLE; + if (lines[i].args[2] & TMFW_GOOWATER) + ffloorflags |= FF_GOOWATER; + if (lines[i].args[2] & TMFW_SPLAT) + ffloorflags |= FF_SPLAT; + P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); + break; + + case 150: // FOF (Air bobbing) + P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_SOLID|FF_RENDERALL, secthinkers); + P_AddAirbob(lines[i].frontsector, lines[i].args[0], lines[i].args[1] << FRACBITS, !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); + break; + + case 160: // FOF (Water bobbing) + P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_FLOATBOB, secthinkers); + break; + + case 170: // FOF (Crumbling) + ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CRUMBLE; + + //Tangibility settings + if (lines[i].args[2] & TMFT_INTANGIBLETOP) + ffloorflags |= FF_REVERSEPLATFORM; + if (lines[i].args[2] & TMFT_INTANGIBLEBOTTOM) + ffloorflags |= FF_PLATFORM; + if (lines[i].args[2] & TMFT_DONTBLOCKPLAYER) + ffloorflags &= ~FF_BLOCKPLAYER; + if (lines[i].args[2] & TMFT_DONTBLOCKOTHERS) + ffloorflags &= ~FF_BLOCKOTHERS; + + //Flags + if (lines[i].args[3] & TMFC_NOSHADE) + ffloorflags |= FF_NOSHADE; + if (lines[i].args[3] & TMFC_NORETURN) + ffloorflags |= FF_NORETURN; + if (lines[i].args[3] & TMFC_FLOATBOB) + ffloorflags |= FF_FLOATBOB; + if (lines[i].args[3] & TMFC_SPLAT) + ffloorflags |= FF_SPLAT; + + //If translucent or player can enter it, cut inner walls + if (lines[i].args[1] < 0xff || (lines[i].args[2] & TMFT_VISIBLEFROMINSIDE)) + ffloorflags |= FF_CUTEXTRA|FF_EXTRA; + else + ffloorflags |= FF_CUTLEVEL; + + //If player can enter it, render insides + if (lines[i].args[2] & TMFT_VISIBLEFROMINSIDE) + { + if (ffloorflags & FF_RENDERPLANES) + ffloorflags |= FF_BOTHPLANES; + if (ffloorflags & FF_RENDERSIDES) + ffloorflags |= FF_ALLSIDES; + } + + P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); + if (lines[i].args[3] & TMFC_AIRBOB) + P_AddAirbob(lines[i].frontsector, lines[i].args[0], 16*FRACUNIT, false, false, false); + break; + + case 190: // FOF (Rising) + { + fixed_t ceilingtop = P_FindHighestCeilingSurrounding(lines[i].frontsector); + fixed_t ceilingbottom = P_FindLowestCeilingSurrounding(lines[i].frontsector); + + ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; + + //Appearance settings + if (lines[i].args[2] & TMFA_NOPLANES) + ffloorflags &= ~FF_RENDERPLANES; + if (lines[i].args[2] & TMFA_NOSIDES) + ffloorflags &= ~FF_RENDERSIDES; + if (lines[i].args[2] & TMFA_INSIDES) + { + if (ffloorflags & FF_RENDERPLANES) + ffloorflags |= FF_BOTHPLANES; + if (ffloorflags & FF_RENDERSIDES) + ffloorflags |= FF_ALLSIDES; + } + if (lines[i].args[2] & TMFA_ONLYINSIDES) + { + if (ffloorflags & FF_RENDERPLANES) + ffloorflags |= FF_INVERTPLANES; + if (ffloorflags & FF_RENDERSIDES) + ffloorflags |= FF_INVERTSIDES; + } + if (lines[i].args[2] & TMFA_NOSHADE) + ffloorflags |= FF_NOSHADE; + if (lines[i].args[2] & TMFA_SPLAT) + ffloorflags |= FF_SPLAT; + + //Tangibility settings + if (lines[i].args[3] & TMFT_INTANGIBLETOP) + ffloorflags |= FF_REVERSEPLATFORM; + if (lines[i].args[3] & TMFT_INTANGIBLEBOTTOM) + ffloorflags |= FF_PLATFORM; + if (lines[i].args[3] & TMFT_DONTBLOCKPLAYER) + ffloorflags &= ~FF_BLOCKPLAYER; + if (lines[i].args[3] & TMFT_DONTBLOCKOTHERS) + ffloorflags &= ~FF_BLOCKOTHERS; + + //Cutting options + if (ffloorflags & FF_RENDERALL) + { + //If translucent or player can enter it, cut inner walls + if ((lines[i].args[1] < 255) || (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE)) + ffloorflags |= FF_CUTEXTRA|FF_EXTRA; + else + ffloorflags |= FF_CUTLEVEL; + } + + P_AddFakeFloorsByLine(i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers); + P_AddRaiseThinker(lines[i].frontsector, lines[i].args[0], lines[i].args[4] << FRACBITS, ceilingtop, ceilingbottom, !!(lines[i].args[5] & TMFR_REVERSE), !!(lines[i].args[5] & TMFR_SPINDASH)); + break; + } + case 200: // Light block + ffloorflags = FF_EXISTS|FF_CUTSPRITES; + if (!lines[i].args[1]) + ffloorflags |= FF_DOUBLESHADOW; + P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); + break; + + case 202: // Fog + ffloorflags = FF_EXISTS|FF_RENDERALL|FF_FOG|FF_INVERTPLANES|FF_INVERTSIDES|FF_CUTEXTRA|FF_EXTRA|FF_DOUBLESHADOW|FF_CUTSPRITES; + sec = sides[*lines[i].sidenum].sector - sectors; + // SoM: Because it's fog, check for an extra colormap and set the fog flag... + if (sectors[sec].extra_colormap) + sectors[sec].extra_colormap->flags = CMF_FOG; + P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); + break; + + case 220: //Intangible + ffloorflags = FF_EXISTS|FF_RENDERALL|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; + + //Appearance settings + if (lines[i].args[2] & TMFA_NOPLANES) + ffloorflags &= ~FF_RENDERPLANES; + if (lines[i].args[2] & TMFA_NOSIDES) + ffloorflags &= ~FF_RENDERSIDES; + if (!(lines[i].args[2] & TMFA_INSIDES)) + { + if (ffloorflags & FF_RENDERPLANES) + ffloorflags |= FF_BOTHPLANES; + if (ffloorflags & FF_RENDERSIDES) + ffloorflags |= FF_ALLSIDES; + } + if (lines[i].args[2] & TMFA_ONLYINSIDES) + { + if (ffloorflags & FF_RENDERPLANES) + ffloorflags |= FF_INVERTPLANES; + if (ffloorflags & FF_RENDERSIDES) + ffloorflags |= FF_INVERTSIDES; + } + if (lines[i].args[2] & TMFA_NOSHADE) + ffloorflags |= FF_NOSHADE; + if (lines[i].args[2] & TMFA_SPLAT) + ffloorflags |= FF_SPLAT; + + P_AddFakeFloorsByLine(i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers); + break; + + case 223: // FOF (intangible, invisible) - for combining specials in a sector + P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_NOSHADE, secthinkers); + break; + + case 250: // Mario Block + ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_MARIO; + if (lines[i].args[1] & TMFM_BRICK) + ffloorflags |= FF_GOOWATER; + if (lines[i].args[1] & TMFM_INVISIBLE) + ffloorflags &= ~(FF_SOLID|FF_RENDERALL|FF_CUTLEVEL); + + P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); + break; + + case 251: // A THWOMP! + { + UINT16 sound = (lines[i].stringargs[0]) ? get_number(lines[i].stringargs[0]) : sfx_thwomp; + P_AddThwompThinker(lines[i].frontsector, &lines[i], lines[i].args[1] << FRACBITS, lines[i].args[2] << FRACBITS, sound); + P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); + break; + } + + case 254: // Bustable block + { + UINT8 busttype = BT_REGULAR; + ffloorspecialflags_e bustflags = 0; + + ffloorflags = FF_EXISTS|FF_BLOCKOTHERS|FF_RENDERALL|FF_BUSTUP; + + //Bustable type + switch (lines[i].args[2]) + { + case TMFB_TOUCH: + busttype = BT_TOUCH; + break; + case TMFB_SPIN: + busttype = BT_SPINBUST; + break; + case TMFB_REGULAR: + busttype = BT_REGULAR; + break; + case TMFB_STRONG: + busttype = BT_STRONG; + break; + } + + //Flags + if (lines[i].args[3] & TMFB_PUSHABLES) + bustflags |= FS_PUSHABLES; + if (lines[i].args[3] & TMFB_EXECUTOR) + bustflags |= FS_EXECUTOR; + if (lines[i].args[3] & TMFB_ONLYBOTTOM) + bustflags |= FS_ONLYBOTTOM; + if (lines[i].args[3] & TMFB_SPLAT) + ffloorflags |= FF_SPLAT; + + if (busttype != BT_TOUCH || bustflags & FS_ONLYBOTTOM) + ffloorflags |= FF_BLOCKPLAYER; + + TAG_ITER_SECTORS(0, lines[i].args[0], s) + { + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], ffloorflags, secthinkers); + fflr->busttype = busttype; + fflr->specialflags = bustflags; + fflr->busttag = lines[i].args[4]; + } + break; + } + case 257: // Quicksand + ffloorflags = FF_EXISTS|FF_QUICKSAND|FF_RENDERALL|FF_ALLSIDES|FF_CUTSPRITES; + if (!(lines[i].args[1])) + ffloorflags |= FF_RIPPLE; + + TAG_ITER_SECTORS(0, lines[i].args[0], s) + { + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, 0xff, ffloorflags, secthinkers); + fflr->sinkspeed = abs(lines[i].args[2]) << (FRACBITS - 1); + fflr->friction = abs(lines[i].args[3]) << (FRACBITS - 6); + } + break; + + case 258: // Laser block + ffloorflags = FF_EXISTS|FF_RENDERALL|FF_NOSHADE|FF_EXTRA|FF_CUTEXTRA|FF_TRANSLUCENT; + P_AddLaserThinker(lines[i].args[0], lines + i, !!(lines[i].args[2] & TMFL_NOBOSSES)); + if (lines[i].args[2] & TMFL_SPLAT) + ffloorflags |= FF_SPLAT; + P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); + break; + + case 259: // Custom FOF + TAG_ITER_SECTORS(0, lines[i].args[0], s) + { + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], lines[i].args[2], secthinkers); + if (!udmf) // Ugly backwards compatibility stuff + { + if (lines[i].args[2] & FF_QUICKSAND) + { + fflr->sinkspeed = abs(lines[i].dx) >> 1; + fflr->friction = abs(lines[i].dy) >> 6; + } + if (lines[i].args[2] & FF_BUSTUP) + { + switch (lines[i].args[3] % TMFB_ONLYBOTTOM) + { + case TMFB_TOUCH: + fflr->busttype = BT_TOUCH; + break; + case TMFB_SPIN: + fflr->busttype = BT_SPINBUST; + break; + case TMFB_REGULAR: + fflr->busttype = BT_REGULAR; + break; + case TMFB_STRONG: + fflr->busttype = BT_STRONG; + break; + } + + if (lines[i].args[3] & TMFB_ONLYBOTTOM) + fflr->specialflags |= FS_ONLYBOTTOM; + if (lines[i].flags & ML_EFFECT4) + fflr->specialflags |= FS_PUSHABLES; + if (lines[i].flags & ML_EFFECT5) + { + fflr->specialflags |= FS_EXECUTOR; + fflr->busttag = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + } + } + } + } + break; + + case 260: // GZDoom-like 3D Floor. + { + UINT8 dtype = lines[i].args[1] & 3; + UINT8 dflags1 = lines[i].args[1] - dtype; + UINT8 dflags2 = lines[i].args[2]; + UINT8 dopacity = lines[i].args[3]; + boolean isfog = false; + + if (dtype == 0) + dtype = 1; + + ffloorflags = FF_EXISTS; + + if (dflags2 & 1) ffloorflags |= FF_NOSHADE; // Disable light effects (Means no shadowcast) + if (dflags2 & 2) ffloorflags |= FF_DOUBLESHADOW; // Restrict light inside (Means doubleshadow) + if (dflags2 & 4) isfog = true; // Fog effect (Explicitly render like a fog block) + + if (dflags1 & 4) ffloorflags |= FF_BOTHPLANES|FF_ALLSIDES; // Render-inside + if (dflags1 & 16) ffloorflags |= FF_INVERTSIDES|FF_INVERTPLANES; // Invert visibility rules + + // Fog block + if (isfog) + ffloorflags |= FF_RENDERALL|FF_CUTEXTRA|FF_CUTSPRITES|FF_BOTHPLANES|FF_EXTRA|FF_FOG|FF_INVERTPLANES|FF_ALLSIDES|FF_INVERTSIDES; + else + { + ffloorflags |= FF_RENDERALL; + + // Solid + if (dtype == 1) + ffloorflags |= FF_SOLID|FF_CUTLEVEL; + // Water + else if (dtype == 2) + ffloorflags |= FF_SWIMMABLE|FF_CUTEXTRA|FF_CUTSPRITES|FF_EXTRA|FF_RIPPLE; + // Intangible + else if (dtype == 3) + ffloorflags |= FF_CUTEXTRA|FF_CUTSPRITES|FF_EXTRA; + } + + // Non-opaque + if (dopacity < 255) + { + // Invisible + if (dopacity == 0) + { + // True invisible + if (ffloorflags & FF_NOSHADE) + ffloorflags &= ~(FF_RENDERALL|FF_CUTEXTRA|FF_CUTSPRITES|FF_EXTRA|FF_BOTHPLANES|FF_ALLSIDES|FF_CUTLEVEL); + // Shadow block + else + { + ffloorflags |= FF_CUTSPRITES; + ffloorflags &= ~(FF_RENDERALL|FF_CUTEXTRA|FF_EXTRA|FF_BOTHPLANES|FF_ALLSIDES|FF_CUTLEVEL); + } + } + else + { + ffloorflags |= FF_TRANSLUCENT|FF_CUTEXTRA|FF_EXTRA; + ffloorflags &= ~FF_CUTLEVEL; + } + } + + P_AddFakeFloorsByLine(i, dopacity, ffloorflags, secthinkers); + } + break; + + case 300: // Linedef executor (combines with sector special 974/975) and commands + case 302: + case 303: + case 304: + + // Charability linedef executors + case 305: + case 307: + break; + + case 308: // Race-only linedef executor. Triggers once. + if (!(gametyperules & GTR_RACE)) + lines[i].special = 0; + break; + + // Linedef executor triggers for CTF teams. + case 309: + case 311: + if (!(gametyperules & GTR_TEAMFLAGS)) + lines[i].special = 0; + break; + + // Each time executors + case 306: + case 301: + case 310: + case 312: + case 332: + case 335: + P_AddEachTimeThinker(&lines[i]); + break; + + // No More Enemies Linedef Exec + case 313: + P_AddNoEnemiesThinker(&lines[i]); + break; + + // Pushable linedef executors (count # of pushables) + case 314: + case 315: + break; + + // Unlock trigger executors + case 317: + case 318: + break; + case 319: + case 320: + break; + + // Trigger on X calls + case 321: + case 322: + if (lines[i].flags & ML_NOCLIMB && sides[lines[i].sidenum[0]].rowoffset > 0) // optional "starting" count + lines[i].callcount = sides[lines[i].sidenum[0]].rowoffset>>FRACBITS; + else + lines[i].callcount = sides[lines[i].sidenum[0]].textureoffset>>FRACBITS; + if (lines[i].special == 322) // Each time + P_AddEachTimeThinker(&lines[i]); + break; + + // NiGHTS trigger executors + case 323: + case 324: + case 325: + case 326: + case 327: + case 328: + case 329: + case 330: + break; + + // Skin trigger executors + case 331: + case 333: + break; + + // Object dye executors + case 334: + case 336: + break; + + case 399: // Linedef execute on map load + // This is handled in P_RunLevelLoadExecutors. + break; + + case 400: + case 401: + case 402: + case 403: + case 404: + case 405: + case 406: + case 407: + case 408: + case 409: + case 410: + case 411: + case 412: + case 413: + case 414: + case 415: + case 416: + case 417: + case 418: + case 419: + case 420: + case 421: + case 422: + case 423: + case 424: + case 425: + case 426: + case 427: + case 428: + case 429: + case 430: + case 431: + break; + + case 449: // Enable bosses with parameter + { + INT32 bossid = sides[*lines[i].sidenum].textureoffset>>FRACBITS; + if (bossid & ~15) // if any bits other than first 16 are set + { + CONS_Alert(CONS_WARNING, + M_GetText("Boss enable linedef (tag %d) has an invalid texture x offset.\nConsider changing it or removing it entirely.\n"), + tag); + break; + } + if (!(lines[i].flags & ML_NOCLIMB)) + { + bossdisabled |= (1<>FRACBITS); + break; + + case 603: // Adjustable flickering light + sec = sides[*lines[i].sidenum].sector - sectors; + TAG_ITER_SECTORS(tag, s) + P_SpawnAdjustableFireFlicker(§ors[sec], §ors[s], + P_AproxDistance(lines[i].dx, lines[i].dy)>>FRACBITS); + break; + + case 604: // Adjustable Blinking Light (unsynchronized) + sec = sides[*lines[i].sidenum].sector - sectors; + TAG_ITER_SECTORS(tag, s) + P_SpawnAdjustableStrobeFlash(§ors[sec], §ors[s], + abs(lines[i].dx)>>FRACBITS, abs(lines[i].dy)>>FRACBITS, false); + break; + + case 605: // Adjustable Blinking Light (synchronized) + sec = sides[*lines[i].sidenum].sector - sectors; + TAG_ITER_SECTORS(tag, s) + P_SpawnAdjustableStrobeFlash(§ors[sec], §ors[s], + abs(lines[i].dx)>>FRACBITS, abs(lines[i].dy)>>FRACBITS, true); + break; + + case 606: // HACK! Copy colormaps. Just plain colormaps. + TAG_ITER_SECTORS(lines[i].args[0], s) + { + extracolormap_t *exc; + + if (sectors[s].colormap_protected) + continue; + + if (!udmf) + exc = sides[lines[i].sidenum[0]].colormap_data; + else + { + if (!lines[i].args[1]) + exc = lines[i].frontsector->extra_colormap; + else + { + INT32 sourcesec = Tag_Iterate_Sectors(lines[i].args[1], 0); + if (sourcesec == -1) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 606: Can't find sector with source colormap (tag %d)!\n", lines[i].args[1]); + return; + } + exc = sectors[sourcesec].extra_colormap; + } + } + sectors[s].extra_colormap = sectors[s].spawn_extra_colormap = exc; + } + break; + + default: + break; + } + } + + // And another round, this time with all FOFs already created + for (i = 0; i < numlines; i++) + { + switch (lines[i].special) + { + INT32 s; + INT32 l; + + case 74: // Make FOF bustable + { + UINT8 busttype = BT_REGULAR; + ffloorspecialflags_e bustflags = 0; + + if (!udmf) + break; + + switch (lines[i].args[1]) + { + case TMFB_TOUCH: + busttype = BT_TOUCH; + break; + case TMFB_SPIN: + busttype = BT_SPINBUST; + break; + case TMFB_REGULAR: + busttype = BT_REGULAR; + break; + case TMFB_STRONG: + busttype = BT_STRONG; + break; + } + + if (lines[i].args[2] & TMFB_PUSHABLES) + bustflags |= FS_PUSHABLES; + if (lines[i].args[2] & TMFB_EXECUTOR) + bustflags |= FS_EXECUTOR; + if (lines[i].args[2] & TMFB_ONLYBOTTOM) + bustflags |= FS_ONLYBOTTOM; + + TAG_ITER_LINES(0, lines[i].args[0], l) + { + TAG_ITER_DECLARECOUNTER(1); + if (lines[l].special < 100 || lines[l].special >= 300) + continue; + + TAG_ITER_SECTORS(1, lines[l].args[0], s) + { + ffloor_t *rover; + + for (rover = sectors[s].ffloors; rover; rover = rover->next) + { + if (rover->master != lines + l) + continue; + + rover->flags |= FF_BUSTUP; + rover->spawnflags |= FF_BUSTUP; + rover->busttype = busttype; + rover->specialflags &= ~FS_BUSTMASK; + rover->specialflags |= bustflags; + rover->busttag = lines[i].args[3]; + CheckForBustableBlocks = true; + break; + } + } + } + break; + } + + case 75: // Make FOF quicksand + { + if (!udmf) + break; + TAG_ITER_LINES(0, lines[i].args[0], l) + { + TAG_ITER_DECLARECOUNTER(1); + if (lines[l].special < 100 || lines[l].special >= 300) + continue; + + TAG_ITER_SECTORS(1, lines[l].args[0], s) + { + ffloor_t *rover; + + for (rover = sectors[s].ffloors; rover; rover = rover->next) + { + if (rover->master != lines + l) + continue; + + rover->flags |= FF_QUICKSAND; + rover->spawnflags |= FF_QUICKSAND; + rover->sinkspeed = abs(lines[i].args[1]) << (FRACBITS - 1); + rover->friction = abs(lines[i].args[2]) << (FRACBITS - 6); + CheckForQuicksand = true; + break; + } + } + } + break; + } + + case 76: // Make FOF bouncy + { + if (udmf) + { + TAG_ITER_LINES(0, lines[i].args[0], l) + P_MakeFOFBouncy(lines + i, lines + l); + } + else + { + TAG_ITER_SECTORS(0, lines[i].args[0], s) + for (j = 0; (unsigned)j < sectors[s].linecount; j++) + P_MakeFOFBouncy(lines + i, sectors[s].lines[j]); + } + break; + } + } + } + + + + + + // Allocate each list + for (i = 0; i < numsectors; i++) + if(secthinkers[i].thinkers) + Z_Free(secthinkers[i].thinkers); + + Z_Free(secthinkers); + + // haleyjd 02/20/06: spawn polyobjects + Polyobj_InitLevel(); + + for (i = 0; i < numlines; i++) + { + switch (lines[i].special) + { + case 30: // Polyobj_Flag + PolyFlag(&lines[i]); + break; + + case 31: // Polyobj_Displace + PolyDisplace(&lines[i]); + break; + + case 32: // Polyobj_RotDisplace + PolyRotDisplace(&lines[i]); + break; + } + } + + P_RunLevelLoadExecutors(); +} + +/** Adds 3Dfloors as appropriate based on a common control linedef. + * + * \param line Control linedef to use. + * \param alpha Alpha value (0-255). + * \param ffloorflags 3Dfloor flags to use. + * \param secthkiners Lists of thinkers sorted by sector. May be NULL. + * \sa P_SpawnSpecials, P_AddFakeFloor + * \author Graue + */ +static void P_AddFakeFloorsByLine(size_t line, INT32 alpha, ffloortype_e ffloorflags, thinkerlist_t *secthinkers) +{ + INT32 s; + mtag_t tag = lines[line].args[0]; + size_t sec = sides[*lines[line].sidenum].sector-sectors; + +<<<<<<< HEAD + TAG_ITER_SECTORS(0, tag, s) + P_AddFakeFloor(§ors[s], §ors[sec], lines+line, alpha, ffloorflags, secthinkers); +======= + line_t* li = lines + line; + TAG_ITER_SECTORS(tag, s) + P_AddFakeFloor(§ors[s], §ors[sec], li, ffloorflags, secthinkers); +>>>>>>> next +} + +/* + SoM: 3/8/2000: General scrolling functions. + T_Scroll, + Add_Scroller, + Add_WallScroller, + P_SpawnScrollers +*/ + +// helper function for T_Scroll +static void P_DoScrollMove(mobj_t *thing, fixed_t dx, fixed_t dy, INT32 exclusive) +{ + fixed_t fuckaj = 0; // Nov 05 14:12:08 <+MonsterIestyn> I've heard of explicitly defined variables but this is ridiculous + if (thing->player) + { + if (!(dx | dy)) + { + thing->player->cmomx = 0; + thing->player->cmomy = 0; + } + else + { + thing->player->cmomx += dx; + thing->player->cmomy += dy; + thing->player->cmomx = FixedMul(thing->player->cmomx, 0xe800); + thing->player->cmomy = FixedMul(thing->player->cmomy, 0xe800); + } + } + + if (thing->player && (thing->player->pflags & PF_SPINNING) && (thing->player->rmomx || thing->player->rmomy) && !(thing->player->pflags & PF_STARTDASH)) + fuckaj = FixedDiv(549*ORIG_FRICTION,500*FRACUNIT); + else if (thing->friction != ORIG_FRICTION) + fuckaj = thing->friction; + + if (fuckaj) { + // refactor thrust for new friction + dx = FixedDiv(dx, CARRYFACTOR); + dy = FixedDiv(dy, CARRYFACTOR); + + dx = FixedMul(dx, FRACUNIT-fuckaj); + dy = FixedMul(dy, FRACUNIT-fuckaj); + } + + thing->momx += dx; + thing->momy += dy; + + if (exclusive) + thing->eflags |= MFE_PUSHED; +} + +/** Processes an active scroller. + * This function, with the help of r_plane.c and r_bsp.c, supports generalized + * scrolling floors and walls, with optional mobj-carrying properties, e.g. + * conveyor belts, rivers, etc. A linedef with a special type affects all + * tagged sectors the same way, by creating scrolling and/or object-carrying + * properties. Multiple linedefs may be used on the same sector and are + * cumulative, although the special case of scrolling a floor and carrying + * things on it requires only one linedef. + * + * The linedef's direction determines the scrolling direction, and the + * linedef's length determines the scrolling speed. This was designed so an + * edge around a sector can be used to control the direction of the sector's + * scrolling, which is usually what is desired. + * + * \param s Thinker for the scroller to process. + * \todo Split up into multiple functions. + * \todo Use attached lists to make ::sc_carry_ceiling case faster and + * cleaner. + * \sa Add_Scroller, Add_WallScroller, P_SpawnScrollers + * \author Steven McGranahan + * \author Graue + */ +void T_Scroll(scroll_t *s) +{ + fixed_t dx = s->dx, dy = s->dy; + boolean is3dblock = false; + + if (s->control != -1) + { // compute scroll amounts based on a sector's height changes + fixed_t height = sectors[s->control].floorheight + + sectors[s->control].ceilingheight; + fixed_t delta = height - s->last_height; + s->last_height = height; + dx = FixedMul(dx, delta); + dy = FixedMul(dy, delta); + } + + if (s->accel) + { + s->vdx = dx += s->vdx; + s->vdy = dy += s->vdy; + } + +// if (!(dx | dy)) // no-op if both (x,y) offsets 0 +// return; + + switch (s->type) + { + side_t *side; + sector_t *sec; + fixed_t height; + msecnode_t *node; + mobj_t *thing; + line_t *line; + size_t i; + INT32 sect; + ffloor_t *rover; + + case sc_side: // scroll wall texture + side = sides + s->affectee; + side->textureoffset += dx; + side->rowoffset += dy; + break; + + case sc_floor: // scroll floor texture + sec = sectors + s->affectee; + sec->floor_xoffs += dx; + sec->floor_yoffs += dy; + break; + + case sc_ceiling: // scroll ceiling texture + sec = sectors + s->affectee; + sec->ceiling_xoffs += dx; + sec->ceiling_yoffs += dy; + break; + + case sc_carry: + sec = sectors + s->affectee; + height = sec->floorheight; + + // sec is the control sector, find the real sector(s) to use + for (i = 0; i < sec->linecount; i++) + { + line = sec->lines[i]; + + if (line->special < 100 || line->special >= 300) + is3dblock = false; + else + is3dblock = true; + + if (!is3dblock) + continue; + + TAG_ITER_SECTORS(Tag_FGet(&line->tags), sect) + { + sector_t *psec; + psec = sectors + sect; + + // Find the FOF corresponding to the control linedef + for (rover = psec->ffloors; rover; rover = rover->next) + { + if (rover->master == sec->lines[i]) + break; + } + + if (!rover) // This should be impossible, but don't complain if it is the case somehow + continue; + + if (!(rover->flags & FF_EXISTS)) // If the FOF does not "exist", we pretend that nobody's there + continue; + + for (node = psec->touching_thinglist; node; node = node->m_thinglist_next) + { + thing = node->m_thing; + + if (thing->eflags & MFE_PUSHED) // Already pushed this tic by an exclusive pusher. + continue; + + height = P_GetSpecialBottomZ(thing, sec, psec); + + if (!(thing->flags & MF_NOCLIP)) // Thing must be clipped + if (!(thing->flags & MF_NOGRAVITY || thing->z+thing->height != height)) // Thing must a) be non-floating and have z+height == height + { + // Move objects only if on floor + // non-floating, and clipped. + P_DoScrollMove(thing, dx, dy, s->exclusive); + } + } // end of for loop through touching_thinglist + } // end of loop through sectors + } + + if (!is3dblock) + { + for (node = sec->touching_thinglist; node; node = node->m_thinglist_next) + { + thing = node->m_thing; + + if (thing->eflags & MFE_PUSHED) + continue; + + height = P_GetSpecialBottomZ(thing, sec, sec); + + if (!(thing->flags & MF_NOCLIP) && + (!(thing->flags & MF_NOGRAVITY || thing->z > height))) + { + // Move objects only if on floor or underwater, + // non-floating, and clipped. + P_DoScrollMove(thing, dx, dy, s->exclusive); + } + } + } + break; + + case sc_carry_ceiling: // carry on ceiling (FOF scrolling) + sec = sectors + s->affectee; + height = sec->ceilingheight; + + // sec is the control sector, find the real sector(s) to use + for (i = 0; i < sec->linecount; i++) + { + line = sec->lines[i]; + if (line->special < 100 || line->special >= 300) + is3dblock = false; + else + is3dblock = true; + + if (!is3dblock) + continue; + TAG_ITER_SECTORS(Tag_FGet(&line->tags), sect) + { + sector_t *psec; + psec = sectors + sect; + + // Find the FOF corresponding to the control linedef + for (rover = psec->ffloors; rover; rover = rover->next) + { + if (rover->master == sec->lines[i]) + break; + } + + if (!rover) // This should be impossible, but don't complain if it is the case somehow + continue; + + if (!(rover->flags & FF_EXISTS)) // If the FOF does not "exist", we pretend that nobody's there + continue; + + for (node = psec->touching_thinglist; node; node = node->m_thinglist_next) + { + thing = node->m_thing; + + if (thing->eflags & MFE_PUSHED) + continue; + + height = P_GetSpecialTopZ(thing, sec, psec); + + if (!(thing->flags & MF_NOCLIP)) // Thing must be clipped + if (!(thing->flags & MF_NOGRAVITY || thing->z != height))// Thing must a) be non-floating and have z == height + { + // Move objects only if on floor or underwater, + // non-floating, and clipped. + P_DoScrollMove(thing, dx, dy, s->exclusive); + } + } // end of for loop through touching_thinglist + } // end of loop through sectors + } + + if (!is3dblock) + { + for (node = sec->touching_thinglist; node; node = node->m_thinglist_next) + { + thing = node->m_thing; + + if (thing->eflags & MFE_PUSHED) + continue; + + height = P_GetSpecialTopZ(thing, sec, sec); + + if (!(thing->flags & MF_NOCLIP) && + (!(thing->flags & MF_NOGRAVITY || thing->z+thing->height < height))) + { + // Move objects only if on floor or underwater, + // non-floating, and clipped. + P_DoScrollMove(thing, dx, dy, s->exclusive); + } + } + } + break; // end of sc_carry_ceiling + } // end of switch +} + +/** Adds a generalized scroller to the thinker list. + * + * \param type The enumerated type of scrolling. + * \param dx x speed of scrolling or its acceleration. + * \param dy y speed of scrolling or its acceleration. + * \param control Sector whose heights control this scroller's effect + * remotely, or -1 if there is no control sector. + * \param affectee Index of the affected object, sector or sidedef. + * \param accel Nonzero for an accelerative effect. + * \sa Add_WallScroller, P_SpawnScrollers, T_Scroll + */ +static void Add_Scroller(INT32 type, fixed_t dx, fixed_t dy, INT32 control, INT32 affectee, INT32 accel, INT32 exclusive) +{ + scroll_t *s = Z_Calloc(sizeof *s, PU_LEVSPEC, NULL); + s->thinker.function.acp1 = (actionf_p1)T_Scroll; + s->type = type; + s->dx = dx; + s->dy = dy; + s->accel = accel; + s->exclusive = exclusive; + s->vdx = s->vdy = 0; + if ((s->control = control) != -1) + s->last_height = sectors[control].floorheight + sectors[control].ceilingheight; + s->affectee = affectee; + P_AddThinker(THINK_MAIN, &s->thinker); +} + +/** Initializes the scrollers. + * + * \todo Get rid of all the magic numbers. + * \sa P_SpawnSpecials, Add_Scroller, Add_WallScroller + */ +static void P_SpawnScrollers(void) +{ + size_t i; + line_t *l = lines; + mtag_t tag; + + for (i = 0; i < numlines; i++, l++) + { + fixed_t dx = l->dx >> SCROLL_SHIFT; // direction and speed of scrolling + fixed_t dy = l->dy >> SCROLL_SHIFT; + INT32 control = -1, accel = 0; // no control sector or acceleration + INT32 special = l->special; + + tag = Tag_FGet(&l->tags); + + // These types are same as the ones they get set to except that the + // first side's sector's heights cause scrolling when they change, and + // this linedef controls the direction and speed of the scrolling. The + // most complicated linedef since donuts, but powerful :) + + if (special == 515 || special == 512 || special == 522 || special == 532 || special == 504) // displacement scrollers + { + special -= 2; + control = (INT32)(sides[*l->sidenum].sector - sectors); + } + else if (special == 514 || special == 511 || special == 521 || special == 531 || special == 503) // accelerative scrollers + { + special--; + accel = 1; + control = (INT32)(sides[*l->sidenum].sector - sectors); + } + else if (special == 535 || special == 525) // displacement scrollers + { + special -= 2; + control = (INT32)(sides[*l->sidenum].sector - sectors); + } + else if (special == 534 || special == 524) // accelerative scrollers + { + accel = 1; + special--; + control = (INT32)(sides[*l->sidenum].sector - sectors); + } + + switch (special) + { + register INT32 s; + + case 513: // scroll effect ceiling + case 533: // scroll and carry objects on ceiling + TAG_ITER_SECTORS(tag, s) + Add_Scroller(sc_ceiling, -dx, dy, control, s, accel, l->flags & ML_NOCLIMB); + if (special != 533) + break; + /* FALLTHRU */ + + case 523: // carry objects on ceiling + dx = FixedMul(dx, CARRYFACTOR); + dy = FixedMul(dy, CARRYFACTOR); + TAG_ITER_SECTORS(tag, s) + Add_Scroller(sc_carry_ceiling, dx, dy, control, s, accel, l->flags & ML_NOCLIMB); + break; + + case 510: // scroll effect floor + case 530: // scroll and carry objects on floor + TAG_ITER_SECTORS(tag, s) + Add_Scroller(sc_floor, -dx, dy, control, s, accel, l->flags & ML_NOCLIMB); + if (special != 530) + break; + /* FALLTHRU */ + + case 520: // carry objects on floor + dx = FixedMul(dx, CARRYFACTOR); + dy = FixedMul(dy, CARRYFACTOR); + TAG_ITER_SECTORS(tag, s) + Add_Scroller(sc_carry, dx, dy, control, s, accel, l->flags & ML_NOCLIMB); + break; + + // scroll wall according to linedef + // (same direction and speed as scrolling floors) + case 502: + { + TAG_ITER_LINES(tag, s) + if (s != (INT32)i) + { + if (l->flags & ML_EFFECT2) // use texture offsets instead + { + dx = sides[l->sidenum[0]].textureoffset; + dy = sides[l->sidenum[0]].rowoffset; + } + if (l->flags & ML_EFFECT3) + { + if (lines[s].sidenum[1] != 0xffff) + Add_Scroller(sc_side, dx, dy, control, lines[s].sidenum[1], accel, 0); + } + else + Add_Scroller(sc_side, dx, dy, control, lines[s].sidenum[0], accel, 0); + } + break; + } + + case 505: + s = lines[i].sidenum[0]; + Add_Scroller(sc_side, -sides[s].textureoffset, sides[s].rowoffset, -1, s, accel, 0); + break; + + case 506: + s = lines[i].sidenum[1]; + + if (s != 0xffff) + Add_Scroller(sc_side, -sides[s].textureoffset, sides[s].rowoffset, -1, lines[i].sidenum[0], accel, 0); + else + CONS_Debug(DBG_GAMELOGIC, "Line special 506 (line #%s) missing back side!\n", sizeu1(i)); + break; + + case 507: + s = lines[i].sidenum[0]; + + if (lines[i].sidenum[1] != 0xffff) + Add_Scroller(sc_side, -sides[s].textureoffset, sides[s].rowoffset, -1, lines[i].sidenum[1], accel, 0); + else + CONS_Debug(DBG_GAMELOGIC, "Line special 507 (line #%s) missing back side!\n", sizeu1(i)); + break; + + case 508: + s = lines[i].sidenum[1]; + + if (s != 0xffff) + Add_Scroller(sc_side, -sides[s].textureoffset, sides[s].rowoffset, -1, s, accel, 0); + else + CONS_Debug(DBG_GAMELOGIC, "Line special 508 (line #%s) missing back side!\n", sizeu1(i)); + break; + + case 500: // scroll first side + Add_Scroller(sc_side, FRACUNIT, 0, -1, lines[i].sidenum[0], accel, 0); + break; + + case 501: // jff 1/30/98 2-way scroll + Add_Scroller(sc_side, -FRACUNIT, 0, -1, lines[i].sidenum[0], accel, 0); + break; + } + } +} + +/** Adds master appear/disappear thinker. + * + * \param appeartime tics to be existent + * \param disappeartime tics to be nonexistent + * \param sector pointer to control sector + */ +static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline) +{ + disappear_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); + + d->thinker.function.acp1 = (actionf_p1)T_Disappear; + d->appeartime = appeartime; + d->disappeartime = disappeartime; + d->offset = offset; + d->affectee = line; + d->sourceline = sourceline; + d->exists = true; + d->timer = 1; + + P_AddThinker(THINK_MAIN, &d->thinker); +} + +/** Makes a FOF appear/disappear + * + * \param d Disappear thinker. + * \sa Add_MasterDisappearer + */ +void T_Disappear(disappear_t *d) +{ + if (d->offset && !d->exists) + { + d->offset--; + return; + } + + if (--d->timer <= 0) + { + ffloor_t *rover; + register INT32 s; + mtag_t afftag = Tag_FGet(&lines[d->affectee].tags); + + TAG_ITER_SECTORS(afftag, s) + { + for (rover = sectors[s].ffloors; rover; rover = rover->next) + { + if (rover->master != &lines[d->affectee]) + continue; + + if (d->exists) + rover->flags &= ~FF_EXISTS; + else + { + rover->flags |= FF_EXISTS; + + if (!(lines[d->sourceline].flags & ML_NOCLIMB)) + { + sectors[s].soundorg.z = P_GetFFloorTopZAt(rover, sectors[s].soundorg.x, sectors[s].soundorg.y); + S_StartSound(§ors[s].soundorg, sfx_appear); + } + } + } + sectors[s].moved = true; + P_RecalcPrecipInSector(§ors[s]); + } + + if (d->exists) + { + d->timer = d->disappeartime; + d->exists = false; + } + else + { + d->timer = d->appeartime; + d->exists = true; + } + } +} + +/** Removes fadingdata from FOF control sector + * + * \param line line to search for target faders + * \param data pointer to set new fadingdata to. Can be NULL to erase. + */ +static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finalize) +{ + fade_t *fadingdata = (fade_t *)rover->fadingdata; + // find any existing thinkers and remove them, then replace with new data + if (fadingdata != data) + { + if (fadingdata) + { + if (finalize) + P_FadeFakeFloor(rover, + fadingdata->sourcevalue, + fadingdata->alpha >= fadingdata->destvalue ? + fadingdata->alpha - 1 : // trigger fade-out finish + fadingdata->alpha + 1, // trigger fade-in finish + 0, + fadingdata->ticbased, + &fadingdata->timer, + fadingdata->doexists, + fadingdata->dotranslucent, + fadingdata->dolighting, + fadingdata->docolormap, + fadingdata->docollision, + fadingdata->doghostfade, + fadingdata->exactalpha); + rover->alpha = fadingdata->alpha; + + if (fadingdata->dolighting) + P_RemoveLighting(§ors[rover->secnum]); + + if (fadingdata->docolormap) + P_ResetColormapFader(§ors[rover->secnum]); + + P_RemoveThinker(&fadingdata->thinker); + } + + rover->fadingdata = data; + } +} + +static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 sourcevalue, INT16 destvalue, INT16 speed, boolean ticbased, INT32 *timer, + boolean doexists, boolean dotranslucent, boolean dolighting, boolean docolormap, + boolean docollision, boolean doghostfade, boolean exactalpha) +{ + boolean stillfading = false; + INT32 alpha; + fade_t *fadingdata = (fade_t *)rover->fadingdata; + (void)docolormap; // *shrug* maybe we can use this in the future. For now, let's be consistent with our other function params + + if (rover->master->special == 258) // Laser block + return false; + + // If fading an invisible FOF whose render flags we did not yet set, + // initialize its alpha to 1 + if (dotranslucent && + (rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE + !(rover->flags & FF_FOG) && // do not include fog + !(rover->spawnflags & FF_RENDERSIDES) && + !(rover->spawnflags & FF_RENDERPLANES) && + !(rover->flags & FF_RENDERALL)) + rover->alpha = 1; + + if (fadingdata) + alpha = fadingdata->alpha; + else + alpha = rover->alpha; + + // routines specific to fade in and fade out + if (!ticbased && alpha == destvalue) + return stillfading; + else if (alpha > destvalue) // fade out + { + // finish fading out + if (speed < 1 || (!ticbased && alpha - speed <= destvalue + speed) || + (ticbased && (--(*timer) <= 0 || alpha <= destvalue))) + { + alpha = destvalue; + + if (docollision) + { + if (rover->spawnflags & FF_SOLID) + rover->flags &= ~FF_SOLID; + if (rover->spawnflags & FF_SWIMMABLE) + rover->flags &= ~FF_SWIMMABLE; + if (rover->spawnflags & FF_QUICKSAND) + rover->flags &= ~FF_QUICKSAND; + if (rover->spawnflags & FF_BUSTUP) + rover->flags &= ~FF_BUSTUP; + if (rover->spawnflags & FF_MARIO) + rover->flags &= ~FF_MARIO; + } + } + else // continue fading out + { + if (!ticbased) + alpha -= speed; + else + { + INT16 delta = abs(destvalue - sourcevalue); + fixed_t factor = min(FixedDiv(speed - (*timer), speed), 1*FRACUNIT); + alpha = max(min(alpha, sourcevalue - (INT16)FixedMul(delta, factor)), destvalue); + } + stillfading = true; + } + } + else // fade in + { + // finish fading in + if (speed < 1 || (!ticbased && alpha + speed >= destvalue - speed) || + (ticbased && (--(*timer) <= 0 || alpha >= destvalue))) + { + alpha = destvalue; + + if (docollision) + { + if (rover->spawnflags & FF_SOLID) + rover->flags |= FF_SOLID; + if (rover->spawnflags & FF_SWIMMABLE) + rover->flags |= FF_SWIMMABLE; + if (rover->spawnflags & FF_QUICKSAND) + rover->flags |= FF_QUICKSAND; + if (rover->spawnflags & FF_BUSTUP) + rover->flags |= FF_BUSTUP; + if (rover->spawnflags & FF_MARIO) + rover->flags |= FF_MARIO; + } + } + else // continue fading in + { + if (!ticbased) + alpha += speed; + else + { + INT16 delta = abs(destvalue - sourcevalue); + fixed_t factor = min(FixedDiv(speed - (*timer), speed), 1*FRACUNIT); + alpha = min(max(alpha, sourcevalue + (INT16)FixedMul(delta, factor)), destvalue); + } + stillfading = true; + } + } + + // routines common to both fade in and fade out + if (!stillfading) + { + if (doexists && !(rover->spawnflags & FF_BUSTUP)) + { + if (alpha <= 1) + rover->flags &= ~FF_EXISTS; + else + rover->flags |= FF_EXISTS; + + // Re-render lighting at end of fade + if (dolighting && !(rover->spawnflags & FF_NOSHADE) && !(rover->flags & FF_EXISTS)) + rover->target->moved = true; + } + + if (dotranslucent && !(rover->flags & FF_FOG)) + { + if (alpha >= 256) + { + if (!(rover->flags & FF_CUTSOLIDS) && + (rover->spawnflags & FF_CUTSOLIDS)) + { + rover->flags |= FF_CUTSOLIDS; + rover->target->moved = true; + } + + rover->flags &= ~FF_TRANSLUCENT; + } + else + { + rover->flags |= FF_TRANSLUCENT; + + if ((rover->flags & FF_CUTSOLIDS) && + (rover->spawnflags & FF_CUTSOLIDS)) + { + rover->flags &= ~FF_CUTSOLIDS; + rover->target->moved = true; + } + } + + if ((rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE + !(rover->spawnflags & FF_RENDERSIDES) && + !(rover->spawnflags & FF_RENDERPLANES)) + { + if (rover->alpha > 1) + rover->flags |= FF_RENDERALL; + else + rover->flags &= ~FF_RENDERALL; + } + } + } + else + { + if (doexists && !(rover->spawnflags & FF_BUSTUP)) + { + // Re-render lighting if we haven't yet set FF_EXISTS (beginning of fade) + if (dolighting && !(rover->spawnflags & FF_NOSHADE) && !(rover->flags & FF_EXISTS)) + rover->target->moved = true; + + rover->flags |= FF_EXISTS; + } + + if (dotranslucent && !(rover->flags & FF_FOG)) + { + rover->flags |= FF_TRANSLUCENT; + + if ((rover->flags & FF_CUTSOLIDS) && + (rover->spawnflags & FF_CUTSOLIDS)) + { + rover->flags &= ~FF_CUTSOLIDS; + rover->target->moved = true; + } + + if ((rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE + !(rover->spawnflags & FF_RENDERSIDES) && + !(rover->spawnflags & FF_RENDERPLANES)) + rover->flags |= FF_RENDERALL; + } + + if (docollision) + { + if (doghostfade) // remove collision flags during fade + { + if (rover->spawnflags & FF_SOLID) + rover->flags &= ~FF_SOLID; + if (rover->spawnflags & FF_SWIMMABLE) + rover->flags &= ~FF_SWIMMABLE; + if (rover->spawnflags & FF_QUICKSAND) + rover->flags &= ~FF_QUICKSAND; + if (rover->spawnflags & FF_BUSTUP) + rover->flags &= ~FF_BUSTUP; + if (rover->spawnflags & FF_MARIO) + rover->flags &= ~FF_MARIO; + } + else // keep collision during fade + { + if (rover->spawnflags & FF_SOLID) + rover->flags |= FF_SOLID; + if (rover->spawnflags & FF_SWIMMABLE) + rover->flags |= FF_SWIMMABLE; + if (rover->spawnflags & FF_QUICKSAND) + rover->flags |= FF_QUICKSAND; + if (rover->spawnflags & FF_BUSTUP) + rover->flags |= FF_BUSTUP; + if (rover->spawnflags & FF_MARIO) + rover->flags |= FF_MARIO; + } + } + } + + if (!(rover->flags & FF_FOG)) // don't set FOG alpha + { + if (!stillfading || exactalpha) + rover->alpha = alpha; + else // clamp fadingdata->alpha to software's alpha levels + { + if (alpha < 12) + rover->alpha = destvalue < 12 ? destvalue : 1; // Don't even draw it + else if (alpha < 38) + rover->alpha = destvalue >= 12 && destvalue < 38 ? destvalue : 25; + else if (alpha < 64) + rover->alpha = destvalue >=38 && destvalue < 64 ? destvalue : 51; + else if (alpha < 89) + rover->alpha = destvalue >= 64 && destvalue < 89 ? destvalue : 76; + else if (alpha < 115) + rover->alpha = destvalue >= 89 && destvalue < 115 ? destvalue : 102; + else if (alpha < 140) + rover->alpha = destvalue >= 115 && destvalue < 140 ? destvalue : 128; + else if (alpha < 166) + rover->alpha = destvalue >= 140 && destvalue < 166 ? destvalue : 154; + else if (alpha < 192) + rover->alpha = destvalue >= 166 && destvalue < 192 ? destvalue : 179; + else if (alpha < 217) + rover->alpha = destvalue >= 192 && destvalue < 217 ? destvalue : 204; + else if (alpha < 243) + rover->alpha = destvalue >= 217 && destvalue < 243 ? destvalue : 230; + else // Opaque + rover->alpha = destvalue >= 243 ? destvalue : 256; + } + } + + if (fadingdata) + fadingdata->alpha = alpha; + + return stillfading; +} + +/** Adds fake floor fader thinker. + * + * \param destvalue transparency value to fade to + * \param speed speed to fade by + * \param ticbased tic-based logic, speed = duration + * \param relative Destvalue is relative to rover->alpha + * \param doexists handle FF_EXISTS + * \param dotranslucent handle FF_TRANSLUCENT + * \param dolighting fade FOF light + * \param docollision handle interactive flags + * \param doghostfade no interactive flags during fading + * \param exactalpha use exact alpha values (opengl) + */ +static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, + INT16 destvalue, INT16 speed, boolean ticbased, boolean relative, + boolean doexists, boolean dotranslucent, boolean dolighting, boolean docolormap, + boolean docollision, boolean doghostfade, boolean exactalpha) +{ + fade_t *d; + + // If fading an invisible FOF whose render flags we did not yet set, + // initialize its alpha to 1 + if (dotranslucent && + (rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE + !(rover->spawnflags & FF_RENDERSIDES) && + !(rover->spawnflags & FF_RENDERPLANES) && + !(rover->flags & FF_RENDERALL)) + rover->alpha = 1; + + // already equal, nothing to do + if (rover->alpha == max(1, min(256, relative ? rover->alpha + destvalue : destvalue))) + return; + + d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); + + d->thinker.function.acp1 = (actionf_p1)T_Fade; + d->rover = rover; + d->sectornum = (UINT32)sectornum; + d->ffloornum = (UINT32)ffloornum; + + d->alpha = d->sourcevalue = rover->alpha; + d->destvalue = max(1, min(256, relative ? rover->alpha + destvalue : destvalue)); // rover->alpha is 1-256 + + if (ticbased) + { + d->ticbased = true; + d->timer = d->speed = abs(speed); // use d->speed as total duration + } + else + { + d->ticbased = false; + d->speed = max(1, speed); // minimum speed 1/tic // if speed < 1, alpha is set immediately in thinker + d->timer = -1; + } + + d->doexists = doexists; + d->dotranslucent = dotranslucent; + d->dolighting = dolighting; + d->docolormap = docolormap; + d->docollision = docollision; + d->doghostfade = doghostfade; + d->exactalpha = exactalpha; + + // find any existing thinkers and remove them, then replace with new data + P_ResetFakeFloorFader(rover, d, false); + + // Set a separate thinker for shadow fading + if (dolighting && !(rover->flags & FF_NOSHADE)) + { + UINT16 lightdelta = abs(sectors[rover->secnum].spawn_lightlevel - rover->target->lightlevel); + fixed_t alphapercent = min(FixedDiv(d->destvalue, rover->spawnalpha), 1*FRACUNIT); // don't make darker than spawn_lightlevel + fixed_t adjustedlightdelta = FixedMul(lightdelta, alphapercent); + + if (rover->target->lightlevel >= sectors[rover->secnum].spawn_lightlevel) // fading out, get lighter + d->destlightlevel = rover->target->lightlevel - adjustedlightdelta; + else // fading in, get darker + d->destlightlevel = rover->target->lightlevel + adjustedlightdelta; + + P_FadeLightBySector(§ors[rover->secnum], + d->destlightlevel, + ticbased ? d->timer : + FixedFloor(FixedDiv(abs(d->destvalue - d->alpha), d->speed))/FRACUNIT, + true); + } + else + d->destlightlevel = -1; + + // Set a separate thinker for colormap fading + if (docolormap && !(rover->flags & FF_NOSHADE) && sectors[rover->secnum].spawn_extra_colormap && !sectors[rover->secnum].colormap_protected) + { + extracolormap_t *dest_exc, + *source_exc = sectors[rover->secnum].extra_colormap ? sectors[rover->secnum].extra_colormap : R_GetDefaultColormap(); + + INT32 colordelta = R_GetRgbaA(sectors[rover->secnum].spawn_extra_colormap->rgba); // alpha is from 0 + fixed_t alphapercent = min(FixedDiv(d->destvalue, rover->spawnalpha), 1*FRACUNIT); // don't make darker than spawn_lightlevel + fixed_t adjustedcolordelta = FixedMul(colordelta, alphapercent); + INT32 coloralpha; + + coloralpha = adjustedcolordelta; + + dest_exc = R_CopyColormap(sectors[rover->secnum].spawn_extra_colormap, false); + dest_exc->rgba = R_GetRgbaRGB(dest_exc->rgba) + R_PutRgbaA(coloralpha); + + if (!(d->dest_exc = R_GetColormapFromList(dest_exc))) + { + dest_exc->colormap = R_CreateLightTable(dest_exc); + R_AddColormapToList(dest_exc); + d->dest_exc = dest_exc; + } + else + Z_Free(dest_exc); + + // If fading from 0, set source_exc rgb same to dest_exc + if (!R_CheckDefaultColormap(d->dest_exc, true, false, false) + && R_CheckDefaultColormap(source_exc, true, false, false)) + { + extracolormap_t *exc = R_CopyColormap(source_exc, false); + exc->rgba = R_GetRgbaRGB(d->dest_exc->rgba) + R_PutRgbaA(R_GetRgbaA(source_exc->rgba)); + exc->fadergba = R_GetRgbaRGB(d->dest_exc->rgba) + R_PutRgbaA(R_GetRgbaA(source_exc->fadergba)); + + if (!(source_exc = R_GetColormapFromList(exc))) + { + exc->colormap = R_CreateLightTable(exc); + R_AddColormapToList(exc); + source_exc = exc; + } + else + Z_Free(exc); + } + + Add_ColormapFader(§ors[rover->secnum], source_exc, d->dest_exc, true, + ticbased ? d->timer : + FixedFloor(FixedDiv(abs(d->destvalue - d->alpha), d->speed))/FRACUNIT); + } + + P_AddThinker(THINK_MAIN, &d->thinker); +} + +/** Makes a FOF fade + * + * \param d Fade thinker. + * \sa P_AddFakeFloorFader + */ +void T_Fade(fade_t *d) +{ + if (d->rover && !P_FadeFakeFloor(d->rover, d->sourcevalue, d->destvalue, d->speed, d->ticbased, &d->timer, + d->doexists, d->dotranslucent, d->dolighting, d->docolormap, d->docollision, d->doghostfade, d->exactalpha)) + { + // Finalize lighting, copypasta from P_AddFakeFloorFader + if (d->dolighting && !(d->rover->flags & FF_NOSHADE) && d->destlightlevel > -1) + sectors[d->rover->secnum].lightlevel = d->destlightlevel; + + // Finalize colormap + if (d->docolormap && !(d->rover->flags & FF_NOSHADE) && sectors[d->rover->secnum].spawn_extra_colormap) + sectors[d->rover->secnum].extra_colormap = d->dest_exc; + + P_RemoveFakeFloorFader(d->rover); + } +} + +static void P_ResetColormapFader(sector_t *sector) +{ + if (sector->fadecolormapdata) + { + // The thinker is the first member in all the action structs, + // so just let the thinker get freed, and that will free the whole + // structure. + P_RemoveThinker(&((elevator_t *)sector->fadecolormapdata)->thinker); + sector->fadecolormapdata = NULL; + } +} + +static void Add_ColormapFader(sector_t *sector, extracolormap_t *source_exc, extracolormap_t *dest_exc, + boolean ticbased, INT32 duration) +{ + fadecolormap_t *d; + + P_ResetColormapFader(sector); + + // nothing to do, set immediately + if (!duration || R_CheckEqualColormaps(source_exc, dest_exc, true, true, true)) + { + sector->extra_colormap = dest_exc; + return; + } + + d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); + d->thinker.function.acp1 = (actionf_p1)T_FadeColormap; + d->sector = sector; + d->source_exc = source_exc; + d->dest_exc = dest_exc; + + if (ticbased) + { + d->ticbased = true; + d->duration = d->timer = duration; + } + else + { + d->ticbased = false; + d->timer = 256; + d->duration = duration; // use as speed + } + + sector->fadecolormapdata = d; + P_AddThinker(THINK_MAIN, &d->thinker); +} + +void T_FadeColormap(fadecolormap_t *d) +{ + if ((d->ticbased && --d->timer <= 0) + || (!d->ticbased && (d->timer -= d->duration) <= 0)) // d->duration used as speed decrement + { + d->sector->extra_colormap = d->dest_exc; + P_ResetColormapFader(d->sector); + } + else + { + extracolormap_t *exc; + INT32 duration = d->ticbased ? d->duration : 256; + fixed_t factor = min(FixedDiv(duration - d->timer, duration), 1*FRACUNIT); + INT16 cr, cg, cb, ca, fadestart, fadeend, flags; + INT32 rgba, fadergba; + + // NULL failsafes (or intentionally set to signify default) + if (!d->sector->extra_colormap) + d->sector->extra_colormap = R_GetDefaultColormap(); + + if (!d->source_exc) + d->source_exc = R_GetDefaultColormap(); + + if (!d->dest_exc) + d->dest_exc = R_GetDefaultColormap(); + + // For each var (rgba + fadergba + params = 11 vars), we apply + // percentage fading: currentval = sourceval + (delta * percent of duration elapsed) + // delta is negative when fading out (destval is lower) + // max/min are used to ensure progressive calcs don't go backwards and to cap values to dest. + +#define APPLYFADE(dest, src, cur) (\ +(dest-src < 0) ? \ + max(\ + min(cur,\ + src + (INT16)FixedMul(dest-src, factor)),\ + dest)\ +: (dest-src > 0) ? \ + min(\ + max(cur,\ + src + (INT16)FixedMul(dest-src, factor)),\ + dest)\ +: \ + dest\ +) + + cr = APPLYFADE(R_GetRgbaR(d->dest_exc->rgba), R_GetRgbaR(d->source_exc->rgba), R_GetRgbaR(d->sector->extra_colormap->rgba)); + cg = APPLYFADE(R_GetRgbaG(d->dest_exc->rgba), R_GetRgbaG(d->source_exc->rgba), R_GetRgbaG(d->sector->extra_colormap->rgba)); + cb = APPLYFADE(R_GetRgbaB(d->dest_exc->rgba), R_GetRgbaB(d->source_exc->rgba), R_GetRgbaB(d->sector->extra_colormap->rgba)); + ca = APPLYFADE(R_GetRgbaA(d->dest_exc->rgba), R_GetRgbaA(d->source_exc->rgba), R_GetRgbaA(d->sector->extra_colormap->rgba)); + + rgba = R_PutRgbaRGBA(cr, cg, cb, ca); + + cr = APPLYFADE(R_GetRgbaR(d->dest_exc->fadergba), R_GetRgbaR(d->source_exc->fadergba), R_GetRgbaR(d->sector->extra_colormap->fadergba)); + cg = APPLYFADE(R_GetRgbaG(d->dest_exc->fadergba), R_GetRgbaG(d->source_exc->fadergba), R_GetRgbaG(d->sector->extra_colormap->fadergba)); + cb = APPLYFADE(R_GetRgbaB(d->dest_exc->fadergba), R_GetRgbaB(d->source_exc->fadergba), R_GetRgbaB(d->sector->extra_colormap->fadergba)); + ca = APPLYFADE(R_GetRgbaA(d->dest_exc->fadergba), R_GetRgbaA(d->source_exc->fadergba), R_GetRgbaA(d->sector->extra_colormap->fadergba)); + + fadergba = R_PutRgbaRGBA(cr, cg, cb, ca); + + fadestart = APPLYFADE(d->dest_exc->fadestart, d->source_exc->fadestart, d->sector->extra_colormap->fadestart); + fadeend = APPLYFADE(d->dest_exc->fadeend, d->source_exc->fadeend, d->sector->extra_colormap->fadeend); + flags = abs(factor) > FRACUNIT/2 ? d->dest_exc->flags : d->source_exc->flags; // set new flags halfway through fade + +#undef APPLYFADE + + ////////////////// + // setup new colormap + ////////////////// + + if (!(d->sector->extra_colormap = R_GetColormapFromListByValues(rgba, fadergba, fadestart, fadeend, flags))) + { + exc = R_CreateDefaultColormap(false); + exc->fadestart = fadestart; + exc->fadeend = fadeend; + exc->flags = flags; + exc->rgba = rgba; + exc->fadergba = fadergba; + exc->colormap = R_CreateLightTable(exc); + R_AddColormapToList(exc); + d->sector->extra_colormap = exc; + } + } +} + +/* + SoM: 3/8/2000: Friction functions start. + Add_Friction, + T_Friction, + P_SpawnFriction +*/ + +/** Adds friction thinker. + * + * \param friction Friction value, 0xe800 is normal. + * \param affectee Target sector. + * \param roverfriction FOF or not + * \sa T_Friction, P_SpawnFriction + */ +static void Add_Friction(INT32 friction, INT32 movefactor, INT32 affectee, INT32 referrer) +{ + friction_t *f = Z_Calloc(sizeof *f, PU_LEVSPEC, NULL); + + f->thinker.function.acp1 = (actionf_p1)T_Friction; + f->friction = friction; + f->movefactor = movefactor; + f->affectee = affectee; + + if (referrer != -1) + { + f->roverfriction = true; + f->referrer = referrer; + } + else + f->roverfriction = false; + + P_AddThinker(THINK_MAIN, &f->thinker); +} + +/** Applies friction to all things in a sector. + * + * \param f Friction thinker. + * \sa Add_Friction + */ +void T_Friction(friction_t *f) +{ + sector_t *sec, *referrer = NULL; + mobj_t *thing; + msecnode_t *node; + + sec = sectors + f->affectee; + + // Get FOF control sector + if (f->roverfriction) + referrer = sectors + f->referrer; + + // Assign the friction value to players on the floor, non-floating, + // and clipped. Normally the object's friction value is kept at + // ORIG_FRICTION and this thinker changes it for icy or muddy floors. + + // When the object is straddling sectors with the same + // floorheight that have different frictions, use the lowest + // friction value (muddy has precedence over icy). + + node = sec->touching_thinglist; // things touching this sector + while (node) + { + thing = node->m_thing; + // apparently, all I had to do was comment out part of the next line and + // friction works for all mobj's + // (or at least MF_PUSHABLEs, which is all I care about anyway) + if (!(thing->flags & (MF_NOGRAVITY | MF_NOCLIP)) && thing->z == thing->floorz) + { + if (f->roverfriction) + { + if (thing->floorz != P_GetSpecialTopZ(thing, referrer, sec)) + { + node = node->m_thinglist_next; + continue; + } + + if ((thing->friction == ORIG_FRICTION) // normal friction? + || (f->friction < thing->friction)) + { + thing->friction = f->friction; + if (thing->player) + thing->movefactor = f->movefactor; + } + } + else if (P_GetSpecialBottomZ(thing, sec, sec) == thing->floorz && (thing->friction == ORIG_FRICTION // normal friction? + || f->friction < thing->friction)) + { + thing->friction = f->friction; + if (thing->player) + thing->movefactor = f->movefactor; + } + } + node = node->m_thinglist_next; + } +} + +/** Spawns all friction effects. + * + * \sa P_SpawnSpecials, Add_Friction + */ +static void P_SpawnFriction(void) +{ + size_t i; + line_t *l = lines; + mtag_t tag; + register INT32 s; + fixed_t strength; // frontside texture offset controls magnitude + fixed_t friction; // friction value to be applied during movement + INT32 movefactor; // applied to each player move to simulate inertia + + for (i = 0; i < numlines; i++, l++) + if (l->special == 540) + { + tag = Tag_FGet(&l->tags); + strength = sides[l->sidenum[0]].textureoffset>>FRACBITS; + if (strength > 0) // sludge + strength = strength*2; // otherwise, the maximum sludginess value is +967... + + // The following might seem odd. At the time of movement, + // the move distance is multiplied by 'friction/0x10000', so a + // higher friction value actually means 'less friction'. + friction = ORIG_FRICTION - (0x1EB8*strength)/0x80; // ORIG_FRICTION is 0xE800 + + if (friction > FRACUNIT) + friction = FRACUNIT; + if (friction < 0) + friction = 0; + + movefactor = FixedDiv(ORIG_FRICTION, friction); + if (movefactor < FRACUNIT) + movefactor = 8*movefactor - 7*FRACUNIT; + else + movefactor = FRACUNIT; + + TAG_ITER_SECTORS(tag, s) + Add_Friction(friction, movefactor, s, -1); + } +} + +/* + SoM: 3/8/2000: Push/Pull/Wind/Current functions. + Add_Pusher, + PIT_PushThing, + T_Pusher, + P_GetPushThing, + P_SpawnPushers +*/ + +#define PUSH_FACTOR 7 + +/** Adds a pusher. + * + * \param type Type of push/pull effect. + * \param x_mag X magnitude. + * \param y_mag Y magnitude. + * \param source For a point pusher/puller, the source object. + * \param affectee Target sector. + * \param referrer What sector set it + * \sa T_Pusher, P_GetPushThing, P_SpawnPushers + */ +static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t *source, INT32 affectee, INT32 referrer, INT32 exclusive, INT32 slider) +{ + pusher_t *p = Z_Calloc(sizeof *p, PU_LEVSPEC, NULL); + + p->thinker.function.acp1 = (actionf_p1)T_Pusher; + p->source = source; + p->type = type; + p->x_mag = x_mag>>FRACBITS; + p->y_mag = y_mag>>FRACBITS; + p->exclusive = exclusive; + p->slider = slider; + + if (referrer != -1) + { + p->roverpusher = true; + p->referrer = referrer; + } + else + p->roverpusher = false; + + // "The right triangle of the square of the length of the hypotenuse is equal to the sum of the squares of the lengths of the other two sides." + // "Bah! Stupid brains! Don't you know anything besides the Pythagorean Theorem?" - Earthworm Jim + if (type == p_downcurrent || type == p_upcurrent || type == p_upwind || type == p_downwind) + p->magnitude = P_AproxDistance(p->x_mag,p->y_mag)<<(FRACBITS-PUSH_FACTOR); + else + p->magnitude = P_AproxDistance(p->x_mag,p->y_mag); + if (source) // point source exist? + { + // where force goes to zero + if (type == p_push) + p->radius = AngleFixed(source->angle); + else + p->radius = (p->magnitude)<<(FRACBITS+1); + + p->x = p->source->x; + p->y = p->source->y; + p->z = p->source->z; + } + p->affectee = affectee; + P_AddThinker(THINK_MAIN, &p->thinker); +} + + +// PIT_PushThing determines the angle and magnitude of the effect. +// The object's x and y momentum values are changed. +static pusher_t *tmpusher; // pusher structure for blockmap searches + +/** Applies a point pusher/puller to a thing. + * + * \param thing Thing to be pushed. + * \return True if the thing was pushed. + * \todo Make a more robust P_BlockThingsIterator() so the hidden parameter + * ::tmpusher won't need to be used. + * \sa T_Pusher + */ +static inline boolean PIT_PushThing(mobj_t *thing) +{ + if (thing->eflags & MFE_PUSHED) + return false; + + if (thing->player && thing->player->powers[pw_carry] == CR_ROPEHANG) + return false; + + if (!tmpusher->source) + return false; + + // Allow this to affect pushable objects at some point? + if (thing->player && (!(thing->flags & (MF_NOGRAVITY | MF_NOCLIP)) || thing->player->powers[pw_carry] == CR_NIGHTSMODE)) + { + INT32 dist; + INT32 speed; + INT32 sx, sy, sz; + + sx = tmpusher->x; + sy = tmpusher->y; + sz = tmpusher->z; + + // don't fade wrt Z if health & 2 (mapthing has multi flag) + if (tmpusher->source->health & 2) + dist = P_AproxDistance(thing->x - sx,thing->y - sy); + else + { + // Make sure the Z is in range + if (thing->z < sz - tmpusher->radius || thing->z > sz + tmpusher->radius) + return false; + + dist = P_AproxDistance(P_AproxDistance(thing->x - sx, thing->y - sy), + thing->z - sz); + } + + speed = (tmpusher->magnitude - ((dist>>FRACBITS)>>1))<<(FRACBITS - PUSH_FACTOR - 1); + + // If speed <= 0, you're outside the effective radius. You also have + // to be able to see the push/pull source point. + + // Written with bits and pieces of P_HomingAttack + if ((speed > 0) && (P_CheckSight(thing, tmpusher->source))) + { + if (thing->player->powers[pw_carry] != CR_NIGHTSMODE) + { + // only push wrt Z if health & 1 (mapthing has ambush flag) + if (tmpusher->source->health & 1) + { + fixed_t tmpmomx, tmpmomy, tmpmomz; + + tmpmomx = FixedMul(FixedDiv(sx - thing->x, dist), speed); + tmpmomy = FixedMul(FixedDiv(sy - thing->y, dist), speed); + tmpmomz = FixedMul(FixedDiv(sz - thing->z, dist), speed); + if (tmpusher->source->type == MT_PUSH) // away! + { + tmpmomx *= -1; + tmpmomy *= -1; + tmpmomz *= -1; + } + + thing->momx += tmpmomx; + thing->momy += tmpmomy; + thing->momz += tmpmomz; + + if (thing->player) + { + thing->player->cmomx += tmpmomx; + thing->player->cmomy += tmpmomy; + thing->player->cmomx = FixedMul(thing->player->cmomx, 0xe800); + thing->player->cmomy = FixedMul(thing->player->cmomy, 0xe800); + } + } + else + { + angle_t pushangle; + + pushangle = R_PointToAngle2(thing->x, thing->y, sx, sy); + if (tmpusher->source->type == MT_PUSH) + pushangle += ANGLE_180; // away + pushangle >>= ANGLETOFINESHIFT; + thing->momx += FixedMul(speed, FINECOSINE(pushangle)); + thing->momy += FixedMul(speed, FINESINE(pushangle)); + + if (thing->player) + { + thing->player->cmomx += FixedMul(speed, FINECOSINE(pushangle)); + thing->player->cmomy += FixedMul(speed, FINESINE(pushangle)); + thing->player->cmomx = FixedMul(thing->player->cmomx, 0xe800); + thing->player->cmomy = FixedMul(thing->player->cmomy, 0xe800); + } + } + } + else + { + //NiGHTS-specific handling. + //By default, pushes and pulls only affect the Z-axis. + //By having the ambush flag, it affects the X-axis. + //By having the object special flag, it affects the Y-axis. + fixed_t tmpmomx, tmpmomy, tmpmomz; + + if (tmpusher->source->health & 1) + tmpmomx = FixedMul(FixedDiv(sx - thing->x, dist), speed); + else + tmpmomx = 0; + + if (tmpusher->source->health & 2) + tmpmomy = FixedMul(FixedDiv(sy - thing->y, dist), speed); + else + tmpmomy = 0; + + tmpmomz = FixedMul(FixedDiv(sz - thing->z, dist), speed); + + if (tmpusher->source->type == MT_PUSH) // away! + { + tmpmomx *= -1; + tmpmomy *= -1; + tmpmomz *= -1; + } + + thing->momx += tmpmomx; + thing->momy += tmpmomy; + thing->momz += tmpmomz; + + if (thing->player) + { + thing->player->cmomx += tmpmomx; + thing->player->cmomy += tmpmomy; + thing->player->cmomx = FixedMul(thing->player->cmomx, 0xe800); + thing->player->cmomy = FixedMul(thing->player->cmomy, 0xe800); + } + } + } + } + + if (tmpusher->exclusive) + thing->eflags |= MFE_PUSHED; + + return true; +} + +/** Applies a pusher to all affected objects. + * + * \param p Thinker for the pusher effect. + * \todo Split up into multiple functions. + * \sa Add_Pusher, PIT_PushThing + */ +void T_Pusher(pusher_t *p) +{ + sector_t *sec, *referrer = NULL; + mobj_t *thing; + msecnode_t *node; + INT32 xspeed = 0,yspeed = 0; + INT32 xl, xh, yl, yh, bx, by; + INT32 radius; + //INT32 ht = 0; + boolean inFOF; + boolean touching; + boolean moved; + + xspeed = yspeed = 0; + + sec = sectors + p->affectee; + + // Be sure the special sector type is still turned on. If so, proceed. + // Else, bail out; the sector type has been changed on us. + + if (p->roverpusher) + { + referrer = §ors[p->referrer]; + + if (GETSECSPECIAL(referrer->special, 3) != 2) + return; + } + else if (GETSECSPECIAL(sec->special, 3) != 2) + return; + + // For constant pushers (wind/current) there are 3 situations: + // + // 1) Affected Thing is above the floor. + // + // Apply the full force if wind, no force if current. + // + // 2) Affected Thing is on the ground. + // + // Apply half force if wind, full force if current. + // + // 3) Affected Thing is below the ground (underwater effect). + // + // Apply no force if wind, full force if current. + // + // Apply the effect to clipped players only for now. + // + // In Phase II, you can apply these effects to Things other than players. + + if (p->type == p_push) + { + + // Seek out all pushable things within the force radius of this + // point pusher. Crosses sectors, so use blockmap. + + tmpusher = p; // MT_PUSH/MT_PULL point source + radius = p->radius; // where force goes to zero + tmbbox[BOXTOP] = p->y + radius; + tmbbox[BOXBOTTOM] = p->y - radius; + tmbbox[BOXRIGHT] = p->x + radius; + tmbbox[BOXLEFT] = p->x - radius; + + xl = (unsigned)(tmbbox[BOXLEFT] - bmaporgx - MAXRADIUS)>>MAPBLOCKSHIFT; + xh = (unsigned)(tmbbox[BOXRIGHT] - bmaporgx + MAXRADIUS)>>MAPBLOCKSHIFT; + yl = (unsigned)(tmbbox[BOXBOTTOM] - bmaporgy - MAXRADIUS)>>MAPBLOCKSHIFT; + yh = (unsigned)(tmbbox[BOXTOP] - bmaporgy + MAXRADIUS)>>MAPBLOCKSHIFT; + for (bx = xl; bx <= xh; bx++) + for (by = yl; by <= yh; by++) + P_BlockThingsIterator(bx,by, PIT_PushThing); + return; + } + + // constant pushers p_wind and p_current + node = sec->touching_thinglist; // things touching this sector + for (; node; node = node->m_thinglist_next) + { + thing = node->m_thing; + if (thing->flags & (MF_NOGRAVITY | MF_NOCLIP) + && !(thing->type == MT_SMALLBUBBLE + || thing->type == MT_MEDIUMBUBBLE + || thing->type == MT_EXTRALARGEBUBBLE)) + continue; + + if (!((thing->flags & MF_PUSHABLE) || ((thing->info->flags & MF_PUSHABLE) && thing->fuse)) + && !(thing->type == MT_PLAYER + || thing->type == MT_SMALLBUBBLE + || thing->type == MT_MEDIUMBUBBLE + || thing->type == MT_EXTRALARGEBUBBLE + || thing->type == MT_LITTLETUMBLEWEED + || thing->type == MT_BIGTUMBLEWEED)) + continue; + + if (thing->eflags & MFE_PUSHED) + continue; + + if (thing->player && thing->player->powers[pw_carry] == CR_ROPEHANG) + continue; + + if (thing->player && (thing->state == &states[thing->info->painstate]) && (thing->player->powers[pw_flashing] > (flashingtics/4)*3 && thing->player->powers[pw_flashing] <= flashingtics)) + continue; + + inFOF = touching = moved = false; + + // Find the area that the 'thing' is in + if (p->roverpusher) + { + fixed_t top, bottom; + + top = P_GetSpecialTopZ(thing, referrer, sec); + bottom = P_GetSpecialBottomZ(thing, referrer, sec); + + if (thing->eflags & MFE_VERTICALFLIP) + { + if (bottom > thing->z + thing->height + || top < (thing->z + (thing->height >> 1))) + continue; + + if (thing->z < bottom) + touching = true; + + if (thing->z + (thing->height >> 1) > bottom) + inFOF = true; + + } + else + { + if (top < thing->z || bottom > (thing->z + (thing->height >> 1))) + continue; + if (thing->z + thing->height > top) + touching = true; + + if (thing->z + (thing->height >> 1) < top) + inFOF = true; + } + } + else // Treat the entire sector as one big FOF + { + if (thing->z == P_GetSpecialBottomZ(thing, sec, sec)) + touching = true; + else if (p->type != p_current) + inFOF = true; + } + + if (!touching && !inFOF) // Object is out of range of effect + continue; + + if (p->type == p_wind) + { + if (touching) // on ground + { + xspeed = (p->x_mag)>>1; // half force + yspeed = (p->y_mag)>>1; + moved = true; + } + else if (inFOF) + { + xspeed = (p->x_mag); // full force + yspeed = (p->y_mag); + moved = true; + } + } + else if (p->type == p_upwind) + { + if (touching) // on ground + { + thing->momz += (p->magnitude)>>1; + moved = true; + } + else if (inFOF) + { + thing->momz += p->magnitude; + moved = true; + } + } + else if (p->type == p_downwind) + { + if (touching) // on ground + { + thing->momz -= (p->magnitude)>>1; + moved = true; + } + else if (inFOF) + { + thing->momz -= p->magnitude; + moved = true; + } + } + else // p_current + { + if (!touching && !inFOF) // Not in water at all + xspeed = yspeed = 0; // no force + else // underwater / touching water + { + if (p->type == p_upcurrent) + thing->momz += p->magnitude; + else if (p->type == p_downcurrent) + thing->momz -= p->magnitude; + else + { + xspeed = p->x_mag; // full force + yspeed = p->y_mag; + } + moved = true; + } + } + + if (p->type != p_downcurrent && p->type != p_upcurrent + && p->type != p_upwind && p->type != p_downwind) + { + thing->momx += xspeed<<(FRACBITS-PUSH_FACTOR); + thing->momy += yspeed<<(FRACBITS-PUSH_FACTOR); + if (thing->player) + { + thing->player->cmomx += xspeed<<(FRACBITS-PUSH_FACTOR); + thing->player->cmomy += yspeed<<(FRACBITS-PUSH_FACTOR); + thing->player->cmomx = FixedMul(thing->player->cmomx, ORIG_FRICTION); + thing->player->cmomy = FixedMul(thing->player->cmomy, ORIG_FRICTION); + } + + // Tumbleweeds bounce a bit... + if (thing->type == MT_LITTLETUMBLEWEED || thing->type == MT_BIGTUMBLEWEED) + thing->momz += P_AproxDistance(xspeed<<(FRACBITS-PUSH_FACTOR), yspeed<<(FRACBITS-PUSH_FACTOR)) >> 2; + } + + if (moved) + { + if (p->slider && thing->player) + { + pflags_t jumped = (thing->player->pflags & (PF_JUMPED|PF_NOJUMPDAMAGE)); + P_ResetPlayer (thing->player); + + if (jumped) + thing->player->pflags |= jumped; + + thing->player->pflags |= PF_SLIDING; + thing->angle = R_PointToAngle2 (0, 0, xspeed<<(FRACBITS-PUSH_FACTOR), yspeed<<(FRACBITS-PUSH_FACTOR)); + + if (!demoplayback || P_ControlStyle(thing->player) == CS_LMAOGALOG) + { + angle_t angle = thing->player->angleturn << 16; + if (thing->angle - angle > ANGLE_180) + P_SetPlayerAngle(thing->player, angle - (angle - thing->angle) / 8); + else + P_SetPlayerAngle(thing->player, angle + (thing->angle - angle) / 8); + //P_SetPlayerAngle(thing->player, thing->angle); + } + } + + if (p->exclusive) + thing->eflags |= MFE_PUSHED; + } + } +} + + +/** Gets a push/pull object. + * + * \param s Sector number to look in. + * \return Pointer to the first ::MT_PUSH or ::MT_PULL object found in the + * sector. + * \sa P_GetTeleportDestThing, P_GetStarpostThing, P_GetAltViewThing + */ +mobj_t *P_GetPushThing(UINT32 s) +{ + mobj_t *thing; + sector_t *sec; + + sec = sectors + s; + thing = sec->thinglist; + while (thing) + { + switch (thing->type) + { + case MT_PUSH: + case MT_PULL: + return thing; + default: + break; + } + thing = thing->snext; + } + return NULL; +} + +/** Spawns pushers. + * + * \todo Remove magic numbers. + * \sa P_SpawnSpecials, Add_Pusher + */ +static void P_SpawnPushers(void) +{ + size_t i; + line_t *l = lines; + mtag_t tag; + register INT32 s; + mobj_t *thing; + + for (i = 0; i < numlines; i++, l++) + { + tag = Tag_FGet(&l->tags); + switch (l->special) + { + case 541: // wind + TAG_ITER_SECTORS(tag, s) + Add_Pusher(p_wind, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); + break; + case 544: // current + TAG_ITER_SECTORS(tag, s) + Add_Pusher(p_current, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); + break; + case 547: // push/pull + TAG_ITER_SECTORS(tag, s) + { + thing = P_GetPushThing(s); + if (thing) // No MT_P* means no effect + Add_Pusher(p_push, l->dx, l->dy, thing, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); + } + break; + case 545: // current up + TAG_ITER_SECTORS(tag, s) + Add_Pusher(p_upcurrent, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); + break; + case 546: // current down + TAG_ITER_SECTORS(tag, s) + Add_Pusher(p_downcurrent, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); + break; + case 542: // wind up + TAG_ITER_SECTORS(tag, s) + Add_Pusher(p_upwind, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); + break; + case 543: // wind down + TAG_ITER_SECTORS(tag, s) + Add_Pusher(p_downwind, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); + break; + } + } +} From 7e88db938d715a6f83d8681dd198a9185430ef26 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 4 Jul 2021 19:28:14 +0200 Subject: [PATCH 111/377] Adapt polyobject translucency fade linedef to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 40 +++++++++++++++++--- src/p_polyobj.h | 9 +++++ src/p_setup.c | 22 +++++++++++ src/p_spec.c | 30 +++++---------- 4 files changed, 74 insertions(+), 27 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index f73d36044..3751d781c 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2800,13 +2800,9 @@ udmf } arg2 { - title = "Set/add?"; + title = "Set/Add?"; type = 11; - enum - { - 0 = "Set"; - 1 = "Add"; - } + enum = "setadd"; } } } @@ -3012,6 +3008,38 @@ udmf enum = "setadd"; } } + + 492 + { + title = "Fade Translucency"; + prefix = "(492)"; + arg0 + { + title = "PolyObject ID"; + type = 14; + } + arg1 + { + title = "Translucency level"; + } + arg2 + { + title = "Fading speed"; + } + arg3 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Add to current translucency"; + 2 = "Interrupt ongoing fades"; + 4 = "Speed is duration"; + 8 = "Don't change collision"; + 16 = "No collision during fade"; + } + } + } } scrollpush diff --git a/src/p_polyobj.h b/src/p_polyobj.h index b37ffa6ef..411695775 100644 --- a/src/p_polyobj.h +++ b/src/p_polyobj.h @@ -349,6 +349,15 @@ typedef struct polyflagdata_s fixed_t momx; } polyflagdata_t; +typedef enum +{ + TMPF_RELATIVE = 1, + TMPF_OVERRIDE = 1<<1, + TMPF_TICBASED = 1<<2, + TMPF_IGNORECOLLISION = 1<<3, + TMPF_GHOSTFADE = 1<<4, +} textmappolyfade_t; + typedef struct polyfadedata_s { INT32 polyObjNum; diff --git a/src/p_setup.c b/src/p_setup.c index 4bcb5c8e1..11e5a385d 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3750,6 +3750,28 @@ static void P_ConvertBinaryMap(void) lines[i].args[1] /= 100; lines[i].args[2] = !!(lines[i].flags & ML_EFFECT3); break; + case 492: //Polyobject - fade translucency + lines[i].args[0] = tag; + // If Front X Offset is specified, use that. Else, use floorheight. + lines[i].args[1] = (sides[lines[i].sidenum[0]].textureoffset ? sides[lines[i].sidenum[0]].textureoffset : lines[i].frontsector->floorheight) >> FRACBITS; + // If DONTPEGBOTTOM, specify raw translucency value. Else, take it out of 1000. + if (!(lines[i].flags & ML_DONTPEGBOTTOM)) + lines[i].args[1] /= 100; + // allow Back Y Offset to be consistent with other fade specials + lines[i].args[2] = (lines[i].sidenum[1] != 0xffff && !sides[lines[i].sidenum[0]].rowoffset) ? + abs(sides[lines[i].sidenum[1]].rowoffset >> FRACBITS) + : abs(sides[lines[i].sidenum[0]].rowoffset >> FRACBITS); + if (lines[i].flags & ML_EFFECT3) + lines[i].args[3] |= TMPF_RELATIVE; + if (lines[i].flags & ML_EFFECT5) + lines[i].args[3] |= TMPF_OVERRIDE; + if (lines[i].flags & ML_EFFECT4) + lines[i].args[3] |= TMPF_TICBASED; + if (lines[i].flags & ML_BOUNCY) + lines[i].args[3] |= TMPF_IGNORECOLLISION; + if (lines[i].flags & ML_EFFECT1) + lines[i].args[3] |= TMPF_GHOSTFADE; + break; case 500: //Scroll front wall left case 501: //Scroll front wall right lines[i].args[0] = 0; diff --git a/src/p_spec.c b/src/p_spec.c index 9862ffa2f..0beac3c78 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1090,10 +1090,9 @@ static void PolyTranslucency(line_t *line) // Makes a polyobject translucency fade and applies tangibility static boolean PolyFade(line_t *line) { - INT32 polyObjNum = Tag_FGet(&line->tags); + INT32 polyObjNum = line->args[0]; polyobj_t *po; polyfadedata_t pfd; - INT32 value; if (!(po = Polyobj_GetForNum(polyObjNum))) { @@ -1106,7 +1105,7 @@ static boolean PolyFade(line_t *line) return 0; // Prevent continuous execs from interfering on an existing fade - if (!(line->flags & ML_EFFECT5) + if (!(line->args[3] & TMPF_OVERRIDE) && po->thinker && po->thinker->function.acp1 == (actionf_p1)T_PolyObjFade) { @@ -1116,17 +1115,10 @@ static boolean PolyFade(line_t *line) pfd.polyObjNum = polyObjNum; - // If Front X Offset is specified, use that. Else, use floorheight. - value = (sides[line->sidenum[0]].textureoffset ? sides[line->sidenum[0]].textureoffset : line->frontsector->floorheight) >> FRACBITS; - - // If DONTPEGBOTTOM, specify raw translucency value. Else, take it out of 1000. - if (!(line->flags & ML_DONTPEGBOTTOM)) - value /= 100; - - if (line->flags & ML_EFFECT3) // relative calc - pfd.destvalue = po->translucency + value; + if (line->args[3] & TMPF_RELATIVE) // relative calc + pfd.destvalue = po->translucency + line->args[1]; else - pfd.destvalue = value; + pfd.destvalue = line->args[1]; pfd.destvalue = max(min(pfd.destvalue, NUMTRANSMAPS), 0); @@ -1134,15 +1126,11 @@ static boolean PolyFade(line_t *line) if (po->translucency == pfd.destvalue) return 1; - pfd.docollision = !(line->flags & ML_BOUNCY); // do not handle collision flags - pfd.doghostfade = (line->flags & ML_EFFECT1); // do ghost fade (no collision flags during fade) - pfd.ticbased = (line->flags & ML_EFFECT4); // Speed = Tic Duration - - // allow Back Y Offset to be consistent with other fade specials - pfd.speed = (line->sidenum[1] != 0xFFFF && !sides[line->sidenum[0]].rowoffset) ? - abs(sides[line->sidenum[1]].rowoffset>>FRACBITS) - : abs(sides[line->sidenum[0]].rowoffset>>FRACBITS); + pfd.docollision = !(line->args[3] & TMPF_IGNORECOLLISION); // do not handle collision flags + pfd.doghostfade = (line->args[3] & TMPF_GHOSTFADE); // do ghost fade (no collision flags during fade) + pfd.ticbased = (line->args[3] & TMPF_TICBASED); // Speed = Tic Duration + pfd.speed = line->args[2]; return EV_DoPolyObjFade(&pfd); } From 72bf2a9897dece88f523995917c0080129467a7f Mon Sep 17 00:00:00 2001 From: GoldenTails Date: Tue, 24 Aug 2021 03:13:18 -0500 Subject: [PATCH 112/377] Add angle field to linedef_t --- src/lua_maplib.c | 5 +++++ src/p_map.c | 6 +++--- src/p_polyobj.c | 4 +++- src/p_setup.c | 2 ++ src/p_spec.c | 2 +- src/r_defs.h | 1 + 6 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 9031c99f1..84caec591 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -88,6 +88,7 @@ enum line_e { line_v2, line_dx, line_dy, + line_angle, line_flags, line_special, line_tag, @@ -113,6 +114,7 @@ static const char *const line_opt[] = { "v2", "dx", "dy", + "angle", "flags", "special", "tag", @@ -821,6 +823,9 @@ static int line_get(lua_State *L) case line_dy: lua_pushfixed(L, line->dy); return 1; + case line_angle: + lua_pushangle(L, line->angle); + return 1; case line_flags: lua_pushinteger(L, line->flags); return 1; diff --git a/src/p_map.c b/src/p_map.c index e55bebb9a..b852cb393 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3060,7 +3060,7 @@ static void P_HitCameraSlideLine(line_t *ld, camera_t *thiscam) } side = P_PointOnLineSide(thiscam->x, thiscam->y, ld); - lineangle = R_PointToAngle2(0, 0, ld->dx, ld->dy); + lineangle = ld->angle; if (side == 1) lineangle += ANGLE_180; @@ -3106,7 +3106,7 @@ static void P_HitSlideLine(line_t *ld) side = P_PointOnLineSide(slidemo->x, slidemo->y, ld); - lineangle = R_PointToAngle2(0, 0, ld->dx, ld->dy); + lineangle = ld->angle; if (side == 1) lineangle += ANGLE_180; @@ -3149,7 +3149,7 @@ static void P_HitBounceLine(line_t *ld) return; } - lineangle = R_PointToAngle2(0, 0, ld->dx, ld->dy); + lineangle = ld->angle; if (lineangle >= ANGLE_180) lineangle -= ANGLE_180; diff --git a/src/p_polyobj.c b/src/p_polyobj.c index 6431e4624..5e3cf9d8e 100644 --- a/src/p_polyobj.c +++ b/src/p_polyobj.c @@ -785,7 +785,7 @@ static void Polyobj_pushThing(polyobj_t *po, line_t *line, mobj_t *mo) vertex_t closest; // calculate angle of line and subtract 90 degrees to get normal - lineangle = R_PointToAngle2(0, 0, line->dx, line->dy) - ANGLE_90; + lineangle = line->angle - ANGLE_90; lineangle >>= ANGLETOFINESHIFT; momx = FixedMul(po->thrust, FINECOSINE(lineangle)); momy = FixedMul(po->thrust, FINESINE(lineangle)); @@ -1060,6 +1060,8 @@ static void Polyobj_rotateLine(line_t *ld) ld->dx = v2->x - v1->x; ld->dy = v2->y - v1->y; + ld->angle = R_PointToAngle2(0, 0, ld->dx, ld->dy); + // determine slopetype ld->slopetype = !ld->dx ? ST_VERTICAL : !ld->dy ? ST_HORIZONTAL : ((ld->dy > 0) == (ld->dx > 0)) ? ST_POSITIVE : ST_NEGATIVE; diff --git a/src/p_setup.c b/src/p_setup.c index 498759b73..53fc281a9 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1058,6 +1058,8 @@ static void P_InitializeLinedef(line_t *ld) ld->dx = v2->x - v1->x; ld->dy = v2->y - v1->y; + ld->angle = R_PointToAngle2(0, 0, ld->dx, ld->dy); + ld->bbox[BOXLEFT] = min(v1->x, v2->x); ld->bbox[BOXRIGHT] = max(v1->x, v2->x); ld->bbox[BOXBOTTOM] = min(v1->y, v2->y); diff --git a/src/p_spec.c b/src/p_spec.c index 4b566acfb..f955ffbf4 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1241,7 +1241,7 @@ static boolean PolyFlag(line_t *line) pfd.polyObjNum = Tag_FGet(&line->tags); pfd.speed = P_AproxDistance(line->dx, line->dy) >> FRACBITS; - pfd.angle = R_PointToAngle2(line->v1->x, line->v1->y, line->v2->x, line->v2->y) >> ANGLETOFINESHIFT; + pfd.angle = line->angle >> ANGLETOFINESHIFT; pfd.momx = sides[line->sidenum[0]].textureoffset >> FRACBITS; return EV_DoPolyObjFlag(&pfd); diff --git a/src/r_defs.h b/src/r_defs.h index 1be3a1b8c..6567921b4 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -386,6 +386,7 @@ typedef struct line_s vertex_t *v2; fixed_t dx, dy; // Precalculated v2 - v1 for side checking. + angle_t angle; // Precalculated angle between dx and dy // Animation related. INT16 flags; From 9d3dc98939ab37abe416cea89a4577617fd491ee Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 17 Sep 2021 09:57:53 +0200 Subject: [PATCH 113/377] Fix "render insides" condition being inverted for intangible FOFs --- src/p_setup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_setup.c b/src/p_setup.c index c88aa02f5..17d71a8bf 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3385,7 +3385,7 @@ static void P_ConvertBinaryMap(void) //Appearance if (lines[i].special == 222) lines[i].args[2] |= TMFA_NOPLANES; - if (lines[i].special != 221) + if (lines[i].special == 221) lines[i].args[2] |= TMFA_INSIDES; if (lines[i].special != 220 && !(lines[i].flags & ML_NOCLIMB)) lines[i].args[2] |= TMFA_NOSHADE; From e15c160773daa65ac943ad447ce6eea4391152de Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 19 Sep 2021 08:58:21 +0200 Subject: [PATCH 114/377] Implement per-sector floor/ceiling lighting --- src/hardware/hw_main.c | 8 +++---- src/p_setup.c | 14 ++++++++++++ src/p_spec.c | 10 ++++++++ src/r_bsp.c | 28 +++++++++++++---------- src/r_defs.h | 6 ++++- src/r_segs.c | 52 +++++++++++++++++++++++------------------- 6 files changed, 77 insertions(+), 41 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index e0851af85..f496de2ce 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3046,13 +3046,13 @@ static void HWR_Subsector(size_t num) } light = R_GetPlaneLight(gl_frontsector, locFloorHeight, false); - if (gl_frontsector->floorlightsec == -1) - floorlightlevel = *gl_frontsector->lightlist[light].lightlevel; + if (gl_frontsector->floorlightsec == -1 && !gl_frontsector->floorlightabsolute) + floorlightlevel = max(0, min(255, *gl_frontsector->lightlist[light].lightlevel + gl_frontsector->floorlightlevel)); floorcolormap = *gl_frontsector->lightlist[light].extra_colormap; light = R_GetPlaneLight(gl_frontsector, locCeilingHeight, false); - if (gl_frontsector->ceilinglightsec == -1) - ceilinglightlevel = *gl_frontsector->lightlist[light].lightlevel; + if (gl_frontsector->ceilinglightsec == -1 && !gl_frontsector->ceilinglightabsolute) + ceilinglightlevel = max(0, min(255, *gl_frontsector->lightlist[light].lightlevel + gl_frontsector->ceilinglightlevel)); ceilingcolormap = *gl_frontsector->lightlist[light].extra_colormap; } diff --git a/src/p_setup.c b/src/p_setup.c index e6f46e0c0..7225da985 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1043,6 +1043,9 @@ static void P_LoadSectors(UINT8 *data) ss->floorpic_angle = ss->ceilingpic_angle = 0; + ss->floorlightlevel = ss->ceilinglightlevel = 0; + ss->floorlightabsolute = ss->ceilinglightabsolute = false; + ss->colormap_protected = false; P_InitializeSector(ss); @@ -1529,6 +1532,14 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) sectors[i].ceilingpic = P_AddLevelFlat(val, foundflats); else if (fastcmp(param, "lightlevel")) sectors[i].lightlevel = atol(val); + else if (fastcmp(param, "lightfloor")) + sectors[i].floorlightlevel = atol(val); + else if (fastcmp(param, "lightfloorabsolute") && fastcmp("true", val)) + sectors[i].floorlightabsolute = true; + else if (fastcmp(param, "lightceiling")) + sectors[i].ceilinglightlevel = atol(val); + else if (fastcmp(param, "lightceilingabsolute") && fastcmp("true", val)) + sectors[i].ceilinglightabsolute = true; else if (fastcmp(param, "special")) sectors[i].special = atol(val); else if (fastcmp(param, "id")) @@ -1914,6 +1925,9 @@ static void P_LoadTextmap(void) sc->floorpic_angle = sc->ceilingpic_angle = 0; + sc->floorlightlevel = sc->ceilinglightlevel = 0; + sc->floorlightabsolute = sc->ceilinglightabsolute = false; + sc->colormap_protected = false; textmap_colormap.used = false; diff --git a/src/p_spec.c b/src/p_spec.c index be2141a67..f69b49568 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2126,9 +2126,15 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 402: // Set tagged sector's light level { INT16 newlightlevel; + INT16 newfloorlightlevel, newceilinglightlevel; + boolean newfloorlightabsolute, newceilinglightabsolute; INT32 newfloorlightsec, newceilinglightsec; newlightlevel = line->frontsector->lightlevel; + newfloorlightlevel = line->frontsector->floorlightlevel; + newfloorlightabsolute = line->frontsector->floorlightabsolute; + newceilinglightlevel = line->frontsector->ceilinglightlevel; + newceilinglightabsolute = line->frontsector->ceilinglightabsolute; newfloorlightsec = line->frontsector->floorlightsec; newceilinglightsec = line->frontsector->ceilinglightsec; @@ -2147,6 +2153,10 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) } sectors[secnum].lightlevel = newlightlevel; + sectors[secnum].floorlightlevel = newfloorlightlevel; + sectors[secnum].floorlightabsolute = newfloorlightabsolute; + sectors[secnum].ceilinglightlevel = newceilinglightlevel; + sectors[secnum].ceilinglightabsolute = newceilinglightabsolute; sectors[secnum].floorlightsec = newfloorlightsec; sectors[secnum].ceilinglightsec = newceilinglightsec; } diff --git a/src/r_bsp.c b/src/r_bsp.c index 5acd4e70c..360c17be3 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -238,11 +238,11 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, INT32 *floorlightlevel, { if (floorlightlevel) *floorlightlevel = sec->floorlightsec == -1 ? - sec->lightlevel : sectors[sec->floorlightsec].lightlevel; + (sec->floorlightabsolute ? sec->floorlightlevel : max(0, min(255, sec->lightlevel + sec->floorlightlevel))) : sectors[sec->floorlightsec].lightlevel; if (ceilinglightlevel) *ceilinglightlevel = sec->ceilinglightsec == -1 ? - sec->lightlevel : sectors[sec->ceilinglightsec].lightlevel; + (sec->ceilinglightabsolute ? sec->ceilinglightlevel : max(0, min(255, sec->lightlevel + sec->ceilinglightlevel))) : sectors[sec->ceilinglightsec].lightlevel; // if (sec->midmap != -1) // mapnum = sec->midmap; @@ -301,11 +301,11 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, INT32 *floorlightlevel, tempsec->lightlevel = s->lightlevel; if (floorlightlevel) - *floorlightlevel = s->floorlightsec == -1 ? s->lightlevel + *floorlightlevel = s->floorlightsec == -1 ? (s->floorlightabsolute ? s->floorlightlevel : max(0, min(255, s->lightlevel + s->floorlightlevel))) : sectors[s->floorlightsec].lightlevel; if (ceilinglightlevel) - *ceilinglightlevel = s->ceilinglightsec == -1 ? s->lightlevel + *ceilinglightlevel = s->ceilinglightsec == -1 ? (s->ceilinglightabsolute ? s->ceilinglightlevel : max(0, min(255, s->lightlevel + s->ceilinglightlevel))) : sectors[s->ceilinglightsec].lightlevel; } else if (heightsec != -1 && viewz >= sectors[heightsec].ceilingheight @@ -339,12 +339,12 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, INT32 *floorlightlevel, tempsec->lightlevel = s->lightlevel; if (floorlightlevel) - *floorlightlevel = s->floorlightsec == -1 ? s->lightlevel : - sectors[s->floorlightsec].lightlevel; + *floorlightlevel = s->floorlightsec == -1 ? (s->floorlightabsolute ? s->floorlightlevel : max(0, min(255, s->lightlevel + s->floorlightlevel))) + : sectors[s->floorlightsec].lightlevel; if (ceilinglightlevel) - *ceilinglightlevel = s->ceilinglightsec == -1 ? s->lightlevel : - sectors[s->ceilinglightsec].lightlevel; + *ceilinglightlevel = s->ceilinglightsec == -1 ? (s->ceilinglightabsolute ? s->ceilinglightlevel : max(0, min(255, s->lightlevel + s->ceilinglightlevel))) + : sectors[s->ceilinglightsec].lightlevel; } sec = tempsec; } @@ -370,6 +370,10 @@ boolean R_IsEmptyLine(seg_t *line, sector_t *front, sector_t *back) && back->ceiling_yoffs == front->ceiling_yoffs && back->ceilingpic_angle == front->ceilingpic_angle // Consider altered lighting. + && back->floorlightlevel == front->floorlightlevel + && back->floorlightabsolute == front->floorlightabsolute + && back->ceilinglightlevel == front->ceilinglightlevel + && back->ceilinglightabsolute == front->ceilinglightabsolute && back->floorlightsec == front->floorlightsec && back->ceilinglightsec == front->ceilinglightsec // Consider colormaps @@ -872,12 +876,12 @@ static void R_Subsector(size_t num) } light = R_GetPlaneLight(frontsector, floorcenterz, false); - if (frontsector->floorlightsec == -1) - floorlightlevel = *frontsector->lightlist[light].lightlevel; + if (frontsector->floorlightsec == -1 && !frontsector->floorlightabsolute) + floorlightlevel = max(0, min(255, *frontsector->lightlist[light].lightlevel + frontsector->floorlightlevel)); floorcolormap = *frontsector->lightlist[light].extra_colormap; light = R_GetPlaneLight(frontsector, ceilingcenterz, false); - if (frontsector->ceilinglightsec == -1) - ceilinglightlevel = *frontsector->lightlist[light].lightlevel; + if (frontsector->ceilinglightsec == -1 && !frontsector->ceilinglightabsolute) + ceilinglightlevel = max(0, min(255, *frontsector->lightlist[light].lightlevel + frontsector->ceilinglightlevel)); ceilingcolormap = *frontsector->lightlist[light].extra_colormap; } diff --git a/src/r_defs.h b/src/r_defs.h index cb21d5043..ab2b9fb2f 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -341,7 +341,11 @@ typedef struct sector_s INT32 heightsec; // other sector, or -1 if no other sector INT32 camsec; // used for camera clipping - INT32 floorlightsec, ceilinglightsec; + // floor and ceiling lighting + INT16 floorlightlevel, ceilinglightlevel; + boolean floorlightabsolute, ceilinglightabsolute; // absolute or relative to sector's light level? + INT32 floorlightsec, ceilinglightsec; // take floor/ceiling light level from another sector + INT32 crumblestate; // used for crumbling and bobbing // list of mobjs that are at least partially in the sector diff --git a/src/r_segs.c b/src/r_segs.c index a8c85ec33..68fb24195 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -1908,18 +1908,20 @@ void R_StoreWallRange(INT32 start, INT32 stop) else if (worldlow != worldbottom || worldlowslope != worldbottomslope || backsector->f_slope != frontsector->f_slope - || backsector->floorpic != frontsector->floorpic - || backsector->lightlevel != frontsector->lightlevel - //SoM: 3/22/2000: Check floor x and y offsets. - || backsector->floor_xoffs != frontsector->floor_xoffs - || backsector->floor_yoffs != frontsector->floor_yoffs - || backsector->floorpic_angle != frontsector->floorpic_angle - //SoM: 3/22/2000: Prevents bleeding. - || (frontsector->heightsec != -1 && frontsector->floorpic != skyflatnum) - || backsector->floorlightsec != frontsector->floorlightsec - //SoM: 4/3/2000: Check for colormaps - || frontsector->extra_colormap != backsector->extra_colormap - || (frontsector->ffloors != backsector->ffloors && !Tag_Compare(&frontsector->tags, &backsector->tags))) + || backsector->floorpic != frontsector->floorpic + || backsector->lightlevel != frontsector->lightlevel + //SoM: 3/22/2000: Check floor x and y offsets. + || backsector->floor_xoffs != frontsector->floor_xoffs + || backsector->floor_yoffs != frontsector->floor_yoffs + || backsector->floorpic_angle != frontsector->floorpic_angle + //SoM: 3/22/2000: Prevents bleeding. + || (frontsector->heightsec != -1 && frontsector->floorpic != skyflatnum) + || backsector->floorlightlevel != frontsector->floorlightlevel + || backsector->floorlightabsolute != frontsector->floorlightabsolute + || backsector->floorlightsec != frontsector->floorlightsec + //SoM: 4/3/2000: Check for colormaps + || frontsector->extra_colormap != backsector->extra_colormap + || (frontsector->ffloors != backsector->ffloors && !Tag_Compare(&frontsector->tags, &backsector->tags))) { markfloor = true; } @@ -1939,18 +1941,20 @@ void R_StoreWallRange(INT32 start, INT32 stop) else if (worldhigh != worldtop || worldhighslope != worldtopslope || backsector->c_slope != frontsector->c_slope - || backsector->ceilingpic != frontsector->ceilingpic - || backsector->lightlevel != frontsector->lightlevel - //SoM: 3/22/2000: Check floor x and y offsets. - || backsector->ceiling_xoffs != frontsector->ceiling_xoffs - || backsector->ceiling_yoffs != frontsector->ceiling_yoffs - || backsector->ceilingpic_angle != frontsector->ceilingpic_angle - //SoM: 3/22/2000: Prevents bleeding. - || (frontsector->heightsec != -1 && frontsector->ceilingpic != skyflatnum) - || backsector->ceilinglightsec != frontsector->ceilinglightsec - //SoM: 4/3/2000: Check for colormaps - || frontsector->extra_colormap != backsector->extra_colormap - || (frontsector->ffloors != backsector->ffloors && !Tag_Compare(&frontsector->tags, &backsector->tags))) + || backsector->ceilingpic != frontsector->ceilingpic + || backsector->lightlevel != frontsector->lightlevel + //SoM: 3/22/2000: Check floor x and y offsets. + || backsector->ceiling_xoffs != frontsector->ceiling_xoffs + || backsector->ceiling_yoffs != frontsector->ceiling_yoffs + || backsector->ceilingpic_angle != frontsector->ceilingpic_angle + //SoM: 3/22/2000: Prevents bleeding. + || (frontsector->heightsec != -1 && frontsector->ceilingpic != skyflatnum) + || backsector->ceilinglightlevel != frontsector->ceilinglightlevel + || backsector->ceilinglightabsolute != frontsector->ceilinglightabsolute + || backsector->ceilinglightsec != frontsector->ceilinglightsec + //SoM: 4/3/2000: Check for colormaps + || frontsector->extra_colormap != backsector->extra_colormap + || (frontsector->ffloors != backsector->ffloors && !Tag_Compare(&frontsector->tags, &backsector->tags))) { markceiling = true; } From e43831bedb403ee21e2cefd6401db66c5e55316f Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 19 Sep 2021 09:06:39 +0200 Subject: [PATCH 115/377] Expose floor/ceiling lighting to Lua --- src/lua_maplib.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 534ef9a07..52800535c 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -35,6 +35,10 @@ enum sector_e { sector_floorpic, sector_ceilingpic, sector_lightlevel, + sector_floorlightlevel, + sector_floorlightabsolute, + sector_ceilinglightlevel, + sector_ceilinglightabsolute, sector_special, sector_tag, sector_taglist, @@ -54,6 +58,10 @@ static const char *const sector_opt[] = { "floorpic", "ceilingpic", "lightlevel", + "floorlightlevel", + "floorlightabsolute", + "ceilinglightlevel", + "ceilinglightabsolute", "special", "tag", "taglist", @@ -591,6 +599,18 @@ static int sector_get(lua_State *L) case sector_lightlevel: lua_pushinteger(L, sector->lightlevel); return 1; + case sector_floorlightlevel: + lua_pushinteger(L, sector->floorlightlevel); + return 1; + case sector_floorlightabsolute: + lua_pushboolean(L, sector->floorlightabsolute); + return 1; + case sector_ceilinglightlevel: + lua_pushinteger(L, sector->ceilinglightlevel); + return 1; + case sector_ceilinglightabsolute: + lua_pushboolean(L, sector->ceilinglightabsolute); + return 1; case sector_special: lua_pushinteger(L, sector->special); return 1; @@ -695,6 +715,18 @@ static int sector_set(lua_State *L) case sector_lightlevel: sector->lightlevel = (INT16)luaL_checkinteger(L, 3); break; + case sector_floorlightlevel: + sector->floorlightlevel = (INT16)luaL_checkinteger(L, 3); + break; + case sector_floorlightabsolute: + sector->floorlightabsolute = luaL_checkboolean(L, 3); + break; + case sector_ceilinglightlevel: + sector->ceilinglightlevel = (INT16)luaL_checkinteger(L, 3); + break; + case sector_ceilinglightabsolute: + sector->ceilinglightabsolute = luaL_checkboolean(L, 3); + break; case sector_special: sector->special = (INT16)luaL_checkinteger(L, 3); break; From 68aa14f7d08f31414c91ea90f3397ed2261910d8 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 19 Sep 2021 09:20:00 +0200 Subject: [PATCH 116/377] Netsync floor/ceiling lighting --- src/p_saveg.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/p_saveg.c b/src/p_saveg.c index 044f6bab0..ed849418a 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -850,6 +850,8 @@ static void P_NetUnArchiveWaypoints(void) #define SD_TAGLIST 0x01 #define SD_COLORMAP 0x02 #define SD_CRUMBLESTATE 0x04 +#define SD_FLOORLIGHT 0x08 +#define SD_CEILLIGHT 0x10 #define LD_FLAG 0x01 #define LD_SPECIAL 0x02 @@ -1031,6 +1033,11 @@ static void ArchiveSectors(void) if (ss->crumblestate) diff3 |= SD_CRUMBLESTATE; + if (ss->floorlightlevel != spawnss->floorlightlevel || ss->floorlightabsolute != spawnss->floorlightabsolute) + diff3 |= SD_FLOORLIGHT; + if (ss->ceilinglightlevel != spawnss->ceilinglightlevel || ss->ceilinglightabsolute != spawnss->ceilinglightabsolute) + diff3 |= SD_CEILLIGHT; + if (ss->ffloors && CheckFFloorDiff(ss)) diff |= SD_FFLOORS; @@ -1084,6 +1091,16 @@ static void ArchiveSectors(void) // returns existing index if already added, or appends to net_colormaps and returns new index if (diff3 & SD_CRUMBLESTATE) WRITEINT32(save_p, ss->crumblestate); + if (diff3 & SD_FLOORLIGHT) + { + WRITEINT16(save_p, ss->floorlightlevel); + WRITEUINT8(save_p, ss->floorlightabsolute); + } + if (diff3 & SD_CEILLIGHT) + { + WRITEINT16(save_p, ss->ceilinglightlevel); + WRITEUINT8(save_p, ss->ceilinglightabsolute); + } if (diff & SD_FFLOORS) ArchiveFFloors(ss); } @@ -1175,6 +1192,16 @@ static void UnArchiveSectors(void) sectors[i].extra_colormap = GetNetColormapFromList(READUINT32(save_p)); if (diff3 & SD_CRUMBLESTATE) sectors[i].crumblestate = READINT32(save_p); + if (diff3 & SD_FLOORLIGHT) + { + sectors[i].floorlightlevel = READINT16(save_p); + sectors[i].floorlightabsolute = READUINT8(save_p); + } + if (diff3 & SD_CEILLIGHT) + { + sectors[i].ceilinglightlevel = READINT16(save_p); + sectors[i].ceilinglightabsolute = READUINT8(save_p); + } if (diff & SD_FFLOORS) UnArchiveFFloors(§ors[i]); From fe708db398e3f4de06987a8fc5225de42e520634 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 19 Sep 2021 14:23:04 +0200 Subject: [PATCH 117/377] Adapt setup of some lighting linedef executors to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 62 ++++++++++++++++++++ src/p_setup.c | 28 +++++++++ src/p_spec.c | 40 ++++++------- src/p_spec.h | 13 ++++ 4 files changed, 121 insertions(+), 22 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 3751d781c..76d65e663 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2511,6 +2511,28 @@ udmf } } + 402 + { + title = "Copy Light Level"; + prefix = "(402)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Don't copy main light level"; + 2 = "Don't copy floor light level"; + 4 = "Don't copy ceiling light level"; + } + } + } + 408 { title = "Set Tagged Sector's Flats"; @@ -2528,6 +2550,46 @@ udmf } } + 420 + { + title = "Fade Light Level"; + prefix = "(420)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Destination light level"; + } + arg2 + { + title = "Speed"; + } + arg3 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Speed is tic duration"; + 2 = "Override existing fade"; + } + } + } + + 421 + { + title = "Stop Lighting Effect"; + prefix = "(421)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + } + 435 { title = "Change Plane Scroller Direction"; diff --git a/src/p_setup.c b/src/p_setup.c index 7225da985..ffa81f3fb 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3657,6 +3657,10 @@ static void P_ConvertBinaryMap(void) lines[i].args[2] = !!(lines[i].flags & ML_NOCLIMB); lines[i].special = 400; break; + case 402: //Copy light level + lines[i].args[0] = tag; + lines[i].args[1] = 0; + break; case 403: //Move tagged sector's floor case 404: //Move tagged sector's ceiling lines[i].args[0] = tag; @@ -3692,6 +3696,30 @@ static void P_ConvertBinaryMap(void) case 411: //Stop plane movement lines[i].args[0] = tag; break; + case 420: //Fade light level + lines[i].args[0] = tag; + if (lines[i].flags & ML_DONTPEGBOTTOM) + { + lines[i].args[1] = max(sides[lines[i].sidenum[0]].textureoffset >> FRACBITS, 0); + // failsafe: if user specifies Back Y Offset and NOT Front Y Offset, use the Back Offset + // to be consistent with other light and fade specials + lines[i].args[2] = ((lines[i].sidenum[1] != 0xFFFF && !(sides[lines[i].sidenum[0]].rowoffset >> FRACBITS)) ? + max(min(sides[lines[i].sidenum[1]].rowoffset >> FRACBITS, 255), 0) + : max(min(sides[lines[i].sidenum[0]].rowoffset >> FRACBITS, 255), 0)); + } + else + { + lines[i].args[1] = lines[i].frontsector->lightlevel; + lines[i].args[2] = abs(P_AproxDistance(lines[i].dx, lines[i].dy)) >> FRACBITS; + } + if (lines[i].flags & ML_EFFECT4) + lines[i].args[3] |= TMF_TICBASED; + if (lines[i].flags & ML_EFFECT5) + lines[i].args[3] |= TMF_FORCE; + break; + case 421: //Stop lighting effect + lines[i].args[0] = tag; + break; case 428: //Start platform movement lines[i].args[0] = tag; lines[i].args[1] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; diff --git a/src/p_spec.c b/src/p_spec.c index f69b49568..d682b4242 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2123,7 +2123,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) EV_DoCeiling(line->args[0], line, instantMoveCeilingByFrontSector); break; - case 402: // Set tagged sector's light level + case 402: // Copy light level to tagged sectors { INT16 newlightlevel; INT16 newfloorlightlevel, newceilinglightlevel; @@ -2138,8 +2138,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) newfloorlightsec = line->frontsector->floorlightsec; newceilinglightsec = line->frontsector->ceilinglightsec; - // act on all sectors with the same tag as the triggering linedef - TAG_ITER_SECTORS(tag, secnum) + TAG_ITER_SECTORS(line->args[0], secnum) { if (sectors[secnum].lightingdata) { @@ -2152,13 +2151,20 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) // actually is: could be lightlevel_t, fireflicker_t, glow_t, etc.) } - sectors[secnum].lightlevel = newlightlevel; - sectors[secnum].floorlightlevel = newfloorlightlevel; - sectors[secnum].floorlightabsolute = newfloorlightabsolute; - sectors[secnum].ceilinglightlevel = newceilinglightlevel; - sectors[secnum].ceilinglightabsolute = newceilinglightabsolute; - sectors[secnum].floorlightsec = newfloorlightsec; - sectors[secnum].ceilinglightsec = newceilinglightsec; + if (!(line->args[1] & TMLC_NOSECTOR)) + sectors[secnum].lightlevel = newlightlevel; + if (!(line->args[1] & TMLC_NOFLOOR)) + { + sectors[secnum].floorlightlevel = newfloorlightlevel; + sectors[secnum].floorlightabsolute = newfloorlightabsolute; + sectors[secnum].floorlightsec = newfloorlightsec; + } + if (!(line->args[1] & TMLC_NOCEILING)) + { + sectors[secnum].ceilinglightlevel = newceilinglightlevel; + sectors[secnum].ceilinglightabsolute = newceilinglightabsolute; + sectors[secnum].ceilinglightsec = newceilinglightsec; + } } } break; @@ -2638,21 +2644,11 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; case 420: // Fade light levels in tagged sectors to new value - P_FadeLight(tag, - (line->flags & ML_DONTPEGBOTTOM) ? max(sides[line->sidenum[0]].textureoffset>>FRACBITS, 0) : line->frontsector->lightlevel, - // failsafe: if user specifies Back Y Offset and NOT Front Y Offset, use the Back Offset - // to be consistent with other light and fade specials - (line->flags & ML_DONTPEGBOTTOM) ? - ((line->sidenum[1] != 0xFFFF && !(sides[line->sidenum[0]].rowoffset>>FRACBITS)) ? - max(min(sides[line->sidenum[1]].rowoffset>>FRACBITS, 255), 0) - : max(min(sides[line->sidenum[0]].rowoffset>>FRACBITS, 255), 0)) - : abs(P_AproxDistance(line->dx, line->dy))>>FRACBITS, - (line->flags & ML_EFFECT4), - (line->flags & ML_EFFECT5)); + P_FadeLight(line->args[0], line->args[1], line->args[2], line->args[3] & TMF_TICBASED, line->args[3] & TMF_FORCE); break; case 421: // Stop lighting effect in tagged sectors - TAG_ITER_SECTORS(tag, secnum) + TAG_ITER_SECTORS(line->args[0], secnum) if (sectors[secnum].lightingdata) { P_RemoveThinker(&((elevator_t *)sectors[secnum].lightingdata)->thinker); diff --git a/src/p_spec.h b/src/p_spec.h index f08ee2f1f..19f8a847c 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -112,6 +112,19 @@ typedef enum TMP_BOTH = 2, } textmapplanes_t; +typedef enum +{ + TMLC_NOSECTOR = 1, + TMLC_NOFLOOR = 1<<1, + TMLC_NOCEILING = 1<<2, +} textmaplightcopyflags_t; + +typedef enum +{ + TMF_TICBASED = 1, + TMF_FORCE = 1<<1, +} textmapfadeflags_t; + typedef enum { TMSD_FRONT = 0, From 18c2cfcacec0a09e2bbdf73c4389daf87f00c4f8 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 19 Sep 2021 15:52:54 +0200 Subject: [PATCH 118/377] Clean up arguments for the lighting effect functions --- src/p_lights.c | 76 ++++++++++++++++++-------------------------------- src/p_spec.c | 24 ++++++++-------- src/p_spec.h | 6 ++-- 3 files changed, 42 insertions(+), 64 deletions(-) diff --git a/src/p_lights.c b/src/p_lights.c index 1e41146da..4775597df 100644 --- a/src/p_lights.c +++ b/src/p_lights.c @@ -63,34 +63,27 @@ void T_FireFlicker(fireflicker_t *flick) /** Spawns an adjustable fire flicker effect in a sector. * - * \param minsector Sector whose light level is used as the darkest. - * \param maxsector Sector whose light level is used as the brightest, - * and also the target sector for the effect. + * \param sector Target sector for the effect. + * \param lighta One of the two light levels to move between. + * \param lightb The other light level. * \param length Four times the number of tics between flickers. * \sa T_FireFlicker */ -fireflicker_t *P_SpawnAdjustableFireFlicker(sector_t *minsector, sector_t *maxsector, INT32 length) +fireflicker_t *P_SpawnAdjustableFireFlicker(sector_t *sector, INT16 lighta, INT16 lightb, INT32 length) { fireflicker_t *flick; - P_RemoveLighting(maxsector); // out with the old, in with the new + P_RemoveLighting(sector); // out with the old, in with the new flick = Z_Calloc(sizeof (*flick), PU_LEVSPEC, NULL); P_AddThinker(THINK_MAIN, &flick->thinker); flick->thinker.function.acp1 = (actionf_p1)T_FireFlicker; - flick->sector = maxsector; - flick->maxlight = maxsector->lightlevel; - flick->minlight = minsector->lightlevel; - if (flick->minlight > flick->maxlight) - { - // You mixed them up, you dummy. - INT32 oops = flick->minlight; - flick->minlight = flick->maxlight; - flick->maxlight = oops; - } + flick->sector = sector; + flick->maxlight = max(lighta, lightb); + flick->minlight = min(lighta, lightb); flick->count = flick->resetcount = length/4; - maxsector->lightingdata = flick; + sector->lightingdata = flick; // input bounds checking and stuff if (!flick->resetcount) @@ -194,9 +187,9 @@ void T_StrobeFlash(strobe_t *flash) /** Spawns an adjustable strobe light effect in a sector. * - * \param minsector Sector whose light level is used as the darkest. - * \param maxsector Sector whose light level is used as the brightest, - * and also the target sector for the effect. + * \param sector Target sector for the effect. + * \param lighta One of the two light levels to move between. + * \param lightb The other light level. * \param darktime Time in tics for the light to be dark. * \param brighttime Time in tics for the light to be bright. * \param inSync If true, the effect will be kept in sync @@ -207,29 +200,21 @@ void T_StrobeFlash(strobe_t *flash) * the strobe flash is random. * \sa T_StrobeFlash */ -strobe_t *P_SpawnAdjustableStrobeFlash(sector_t *minsector, sector_t *maxsector, INT32 darktime, INT32 brighttime, boolean inSync) +strobe_t *P_SpawnAdjustableStrobeFlash(sector_t *sector, INT16 lighta, INT16 lightb, INT32 darktime, INT32 brighttime, boolean inSync) { strobe_t *flash; - P_RemoveLighting(maxsector); // out with the old, in with the new + P_RemoveLighting(sector); // out with the old, in with the new flash = Z_Calloc(sizeof (*flash), PU_LEVSPEC, NULL); P_AddThinker(THINK_MAIN, &flash->thinker); - flash->sector = maxsector; + flash->sector = sector; flash->darktime = darktime; flash->brighttime = brighttime; flash->thinker.function.acp1 = (actionf_p1)T_StrobeFlash; - flash->maxlight = maxsector->lightlevel; - flash->minlight = minsector->lightlevel; - - if (flash->minlight > flash->maxlight) - { - // You mixed them up, you dummy. - INT32 oops = flash->minlight; - flash->minlight = flash->maxlight; - flash->maxlight = oops; - } + flash->maxlight = max(lighta, lightb); + flash->minlight = min(lighta, lightb); if (flash->minlight == flash->maxlight) flash->minlight = 0; @@ -239,7 +224,7 @@ strobe_t *P_SpawnAdjustableStrobeFlash(sector_t *minsector, sector_t *maxsector, else flash->count = 1; - maxsector->lightingdata = flash; + sector->lightingdata = flash; return flash; } @@ -276,31 +261,24 @@ void T_Glow(glow_t *g) /** Spawns an adjustable glowing light effect in a sector. * - * \param minsector Sector whose light level is used as the darkest. - * \param maxsector Sector whose light level is used as the brightest, - * and also the target sector for the effect. + * \param sector Target sector for the effect. + * \param lighta One of the two light levels to move between. + * \param lightb The other light level. * \param length The speed of the effect. * \sa T_Glow */ -glow_t *P_SpawnAdjustableGlowingLight(sector_t *minsector, sector_t *maxsector, INT32 length) +glow_t *P_SpawnAdjustableGlowingLight(sector_t *sector, INT16 lighta, INT16 lightb, INT32 length) { glow_t *g; - P_RemoveLighting(maxsector); // out with the old, in with the new + P_RemoveLighting(sector); // out with the old, in with the new g = Z_Calloc(sizeof (*g), PU_LEVSPEC, NULL); P_AddThinker(THINK_MAIN, &g->thinker); - g->sector = maxsector; - g->minlight = minsector->lightlevel; - g->maxlight = maxsector->lightlevel; - if (g->minlight > g->maxlight) - { - // You mixed them up, you dummy. - INT32 oops = g->minlight; - g->minlight = g->maxlight; - g->maxlight = oops; - } + g->sector = sector; + g->minlight = min(lighta, lightb); + g->maxlight = max(lighta, lightb); g->thinker.function.acp1 = (actionf_p1)T_Glow; g->direction = 1; g->speed = length/4; @@ -317,7 +295,7 @@ glow_t *P_SpawnAdjustableGlowingLight(sector_t *minsector, sector_t *maxsector, g->speed = (g->maxlight - g->minlight)/2; } - maxsector->lightingdata = g; + sector->lightingdata = g; return g; } diff --git a/src/p_spec.c b/src/p_spec.c index d682b4242..833a67290 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2520,7 +2520,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) INT16 reallightlevel = sectors[secnum].lightlevel; sectors[secnum].lightlevel = line->backsector->lightlevel; - flick = P_SpawnAdjustableFireFlicker(line->frontsector, §ors[secnum], + flick = P_SpawnAdjustableFireFlicker(§ors[secnum], line->frontsector->lightlevel, sectors[secnum].lightlevel, P_AproxDistance(line->dx, line->dy)>>FRACBITS); // Make sure the starting light level is in range. @@ -2535,7 +2535,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) { // Use front sector for min, target sector for max, // the same way linetype 61 does it. - P_SpawnAdjustableFireFlicker(line->frontsector, §ors[secnum], + P_SpawnAdjustableFireFlicker(§ors[secnum], line->frontsector->lightlevel, sectors[secnum].lightlevel, P_AproxDistance(line->dx, line->dy)>>FRACBITS); } } @@ -2554,7 +2554,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) INT16 reallightlevel = sectors[secnum].lightlevel; sectors[secnum].lightlevel = line->backsector->lightlevel; - glow = P_SpawnAdjustableGlowingLight(line->frontsector, §ors[secnum], + glow = P_SpawnAdjustableGlowingLight(§ors[secnum], line->frontsector->lightlevel, sectors[secnum].lightlevel, P_AproxDistance(line->dx, line->dy)>>FRACBITS); // Make sure the starting light level is in range. @@ -2569,7 +2569,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) { // Use front sector for min, target sector for max, // the same way linetype 602 does it. - P_SpawnAdjustableGlowingLight(line->frontsector, §ors[secnum], + P_SpawnAdjustableGlowingLight(§ors[secnum], line->frontsector->lightlevel, sectors[secnum].lightlevel, P_AproxDistance(line->dx, line->dy)>>FRACBITS); } } @@ -2588,7 +2588,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) INT16 reallightlevel = sectors[secnum].lightlevel; sectors[secnum].lightlevel = line->backsector->lightlevel; - flash = P_SpawnAdjustableStrobeFlash(line->frontsector, §ors[secnum], + flash = P_SpawnAdjustableStrobeFlash(§ors[secnum], line->frontsector->lightlevel, sectors[secnum].lightlevel, abs(line->dx)>>FRACBITS, abs(line->dy)>>FRACBITS, false); // Make sure the starting light level is in range. @@ -2603,7 +2603,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) { // Use front sector for min, target sector for max, // the same way linetype 602 does it. - P_SpawnAdjustableStrobeFlash(line->frontsector, §ors[secnum], + P_SpawnAdjustableStrobeFlash(§ors[secnum], line->frontsector->lightlevel, sectors[secnum].lightlevel, abs(line->dx)>>FRACBITS, abs(line->dy)>>FRACBITS, false); } } @@ -2622,7 +2622,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) INT16 reallightlevel = sectors[secnum].lightlevel; sectors[secnum].lightlevel = line->backsector->lightlevel; - flash = P_SpawnAdjustableStrobeFlash(line->frontsector, §ors[secnum], + flash = P_SpawnAdjustableStrobeFlash(§ors[secnum], line->frontsector->lightlevel, sectors[secnum].lightlevel, abs(line->dx)>>FRACBITS, abs(line->dy)>>FRACBITS, true); // Make sure the starting light level is in range. @@ -2637,7 +2637,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) { // Use front sector for min, target sector for max, // the same way linetype 602 does it. - P_SpawnAdjustableStrobeFlash(line->frontsector, §ors[secnum], + P_SpawnAdjustableStrobeFlash(§ors[secnum], line->frontsector->lightlevel, sectors[secnum].lightlevel, abs(line->dx)>>FRACBITS, abs(line->dy)>>FRACBITS, true); } } @@ -6960,28 +6960,28 @@ void P_SpawnSpecials(boolean fromnetsave) case 602: // Adjustable pulsating light sec = sides[*lines[i].sidenum].sector - sectors; TAG_ITER_SECTORS(tag, s) - P_SpawnAdjustableGlowingLight(§ors[sec], §ors[s], + P_SpawnAdjustableGlowingLight(§ors[s], sectors[sec].lightlevel, sectors[s].lightlevel, P_AproxDistance(lines[i].dx, lines[i].dy)>>FRACBITS); break; case 603: // Adjustable flickering light sec = sides[*lines[i].sidenum].sector - sectors; TAG_ITER_SECTORS(tag, s) - P_SpawnAdjustableFireFlicker(§ors[sec], §ors[s], + P_SpawnAdjustableFireFlicker(§ors[s], sectors[sec].lightlevel, sectors[s].lightlevel, P_AproxDistance(lines[i].dx, lines[i].dy)>>FRACBITS); break; case 604: // Adjustable Blinking Light (unsynchronized) sec = sides[*lines[i].sidenum].sector - sectors; TAG_ITER_SECTORS(tag, s) - P_SpawnAdjustableStrobeFlash(§ors[sec], §ors[s], + P_SpawnAdjustableStrobeFlash(§ors[s], sectors[sec].lightlevel, sectors[s].lightlevel, abs(lines[i].dx)>>FRACBITS, abs(lines[i].dy)>>FRACBITS, false); break; case 605: // Adjustable Blinking Light (synchronized) sec = sides[*lines[i].sidenum].sector - sectors; TAG_ITER_SECTORS(tag, s) - P_SpawnAdjustableStrobeFlash(§ors[sec], §ors[s], + P_SpawnAdjustableStrobeFlash(§ors[s], sectors[sec].lightlevel, sectors[s].lightlevel, abs(lines[i].dx)>>FRACBITS, abs(lines[i].dy)>>FRACBITS, true); break; diff --git a/src/p_spec.h b/src/p_spec.h index 19f8a847c..95005882b 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -284,15 +284,15 @@ typedef struct void P_RemoveLighting(sector_t *sector); void T_FireFlicker(fireflicker_t *flick); -fireflicker_t *P_SpawnAdjustableFireFlicker(sector_t *minsector, sector_t *maxsector, INT32 length); +fireflicker_t *P_SpawnAdjustableFireFlicker(sector_t *sector, INT16 lighta, INT16 lightb, INT32 length); void T_LightningFlash(lightflash_t *flash); void T_StrobeFlash(strobe_t *flash); void P_SpawnLightningFlash(sector_t *sector); -strobe_t * P_SpawnAdjustableStrobeFlash(sector_t *minsector, sector_t *maxsector, INT32 darktime, INT32 brighttime, boolean inSync); +strobe_t * P_SpawnAdjustableStrobeFlash(sector_t *sector, INT16 lighta, INT16 lightb, INT32 darktime, INT32 brighttime, boolean inSync); void T_Glow(glow_t *g); -glow_t *P_SpawnAdjustableGlowingLight(sector_t *minsector, sector_t *maxsector, INT32 length); +glow_t *P_SpawnAdjustableGlowingLight(sector_t *sector, INT16 lighta, INT16 lightb, INT32 length); void P_FadeLightBySector(sector_t *sector, INT32 destvalue, INT32 speed, boolean ticbased); void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased, boolean force); From 9180b86e9e1300bb64a35fd9c366fc47ff7ad4a3 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 19 Sep 2021 16:12:06 +0200 Subject: [PATCH 119/377] No more unnecessary light level twiddling --- src/p_lights.c | 9 +++++++ src/p_spec.c | 68 +++----------------------------------------------- 2 files changed, 13 insertions(+), 64 deletions(-) diff --git a/src/p_lights.c b/src/p_lights.c index 4775597df..aae26ecc4 100644 --- a/src/p_lights.c +++ b/src/p_lights.c @@ -96,6 +96,9 @@ fireflicker_t *P_SpawnAdjustableFireFlicker(sector_t *sector, INT16 lighta, INT1 flick->maxlight++; } + // Make sure the starting light level is in range. + sector->lightlevel = max((INT16)flick->minlight, min((INT16)flick->maxlight, sector->lightlevel)); + return flick; } @@ -224,6 +227,9 @@ strobe_t *P_SpawnAdjustableStrobeFlash(sector_t *sector, INT16 lighta, INT16 lig else flash->count = 1; + // Make sure the starting light level is in range. + sector->lightlevel = max((INT16)flash->minlight, min((INT16)flash->maxlight, sector->lightlevel)); + sector->lightingdata = flash; return flash; } @@ -295,6 +301,9 @@ glow_t *P_SpawnAdjustableGlowingLight(sector_t *sector, INT16 lighta, INT16 ligh g->speed = (g->maxlight - g->minlight)/2; } + // Make sure the starting light level is in range. + sector->lightlevel = max((INT16)g->minlight, min((INT16)g->maxlight, sector->lightlevel)); + sector->lightingdata = g; return g; diff --git a/src/p_spec.c b/src/p_spec.c index 833a67290..17aa767eb 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2513,23 +2513,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (line->flags & ML_NOCLIMB && line->backsector) { // Use front sector for min light level, back sector for max. - // This is tricky because P_SpawnAdjustableFireFlicker expects - // the maxsector (second argument) to also be the target - // sector, so we have to do some light level twiddling. - fireflicker_t *flick; - INT16 reallightlevel = sectors[secnum].lightlevel; - sectors[secnum].lightlevel = line->backsector->lightlevel; - - flick = P_SpawnAdjustableFireFlicker(§ors[secnum], line->frontsector->lightlevel, sectors[secnum].lightlevel, + P_SpawnAdjustableFireFlicker(§ors[secnum], line->frontsector->lightlevel, line->backsector->lightlevel, P_AproxDistance(line->dx, line->dy)>>FRACBITS); - - // Make sure the starting light level is in range. - if (reallightlevel < flick->minlight) - reallightlevel = (INT16)flick->minlight; - else if (reallightlevel > flick->maxlight) - reallightlevel = (INT16)flick->maxlight; - - sectors[secnum].lightlevel = reallightlevel; } else { @@ -2547,23 +2532,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (line->flags & ML_NOCLIMB && line->backsector) { // Use front sector for min light level, back sector for max. - // This is tricky because P_SpawnAdjustableGlowingLight expects - // the maxsector (second argument) to also be the target - // sector, so we have to do some light level twiddling. - glow_t *glow; - INT16 reallightlevel = sectors[secnum].lightlevel; - sectors[secnum].lightlevel = line->backsector->lightlevel; - - glow = P_SpawnAdjustableGlowingLight(§ors[secnum], line->frontsector->lightlevel, sectors[secnum].lightlevel, + P_SpawnAdjustableGlowingLight(§ors[secnum], line->frontsector->lightlevel, line->backsector->lightlevel, P_AproxDistance(line->dx, line->dy)>>FRACBITS); - - // Make sure the starting light level is in range. - if (reallightlevel < glow->minlight) - reallightlevel = (INT16)glow->minlight; - else if (reallightlevel > glow->maxlight) - reallightlevel = (INT16)glow->maxlight; - - sectors[secnum].lightlevel = reallightlevel; } else { @@ -2581,23 +2551,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (line->flags & ML_NOCLIMB && line->backsector) { // Use front sector for min light level, back sector for max. - // This is tricky because P_SpawnAdjustableGlowingLight expects - // the maxsector (second argument) to also be the target - // sector, so we have to do some light level twiddling. - strobe_t *flash; - INT16 reallightlevel = sectors[secnum].lightlevel; - sectors[secnum].lightlevel = line->backsector->lightlevel; - - flash = P_SpawnAdjustableStrobeFlash(§ors[secnum], line->frontsector->lightlevel, sectors[secnum].lightlevel, + P_SpawnAdjustableStrobeFlash(§ors[secnum], line->frontsector->lightlevel, line->backsector->lightlevel, abs(line->dx)>>FRACBITS, abs(line->dy)>>FRACBITS, false); - - // Make sure the starting light level is in range. - if (reallightlevel < flash->minlight) - reallightlevel = (INT16)flash->minlight; - else if (reallightlevel > flash->maxlight) - reallightlevel = (INT16)flash->maxlight; - - sectors[secnum].lightlevel = reallightlevel; } else { @@ -2615,23 +2570,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (line->flags & ML_NOCLIMB && line->backsector) { // Use front sector for min light level, back sector for max. - // This is tricky because P_SpawnAdjustableGlowingLight expects - // the maxsector (second argument) to also be the target - // sector, so we have to do some light level twiddling. - strobe_t *flash; - INT16 reallightlevel = sectors[secnum].lightlevel; - sectors[secnum].lightlevel = line->backsector->lightlevel; - - flash = P_SpawnAdjustableStrobeFlash(§ors[secnum], line->frontsector->lightlevel, sectors[secnum].lightlevel, + P_SpawnAdjustableStrobeFlash(§ors[secnum], line->frontsector->lightlevel, line->backsector->lightlevel, abs(line->dx)>>FRACBITS, abs(line->dy)>>FRACBITS, true); - - // Make sure the starting light level is in range. - if (reallightlevel < flash->minlight) - reallightlevel = (INT16)flash->minlight; - else if (reallightlevel > flash->maxlight) - reallightlevel = (INT16)flash->maxlight; - - sectors[secnum].lightlevel = reallightlevel; } else { From 44faed6285e166fe55aff2399c0c0f9f38e48f50 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 19 Sep 2021 16:25:27 +0200 Subject: [PATCH 120/377] Make light levels in thinkers INT16 --- src/p_lights.c | 24 ++++++++++++------------ src/p_saveg.c | 32 ++++++++++++++++---------------- src/p_spec.h | 16 ++++++++-------- 3 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/p_lights.c b/src/p_lights.c index aae26ecc4..e8da48e9a 100644 --- a/src/p_lights.c +++ b/src/p_lights.c @@ -54,9 +54,9 @@ void T_FireFlicker(fireflicker_t *flick) amount = (INT16)((UINT8)(P_RandomByte() & 3) * 16); if (flick->sector->lightlevel - amount < flick->minlight) - flick->sector->lightlevel = (INT16)flick->minlight; + flick->sector->lightlevel = flick->minlight; else - flick->sector->lightlevel = (INT16)((INT16)flick->maxlight - amount); + flick->sector->lightlevel = flick->maxlight - amount; flick->count = flick->resetcount; } @@ -97,7 +97,7 @@ fireflicker_t *P_SpawnAdjustableFireFlicker(sector_t *sector, INT16 lighta, INT1 } // Make sure the starting light level is in range. - sector->lightlevel = max((INT16)flick->minlight, min((INT16)flick->maxlight, sector->lightlevel)); + sector->lightlevel = max(flick->minlight, min(flick->maxlight, sector->lightlevel)); return flick; } @@ -178,12 +178,12 @@ void T_StrobeFlash(strobe_t *flash) if (flash->sector->lightlevel == flash->minlight) { - flash->sector->lightlevel = (INT16)flash->maxlight; + flash->sector->lightlevel = flash->maxlight; flash->count = flash->brighttime; } else { - flash->sector->lightlevel = (INT16)flash->minlight; + flash->sector->lightlevel = flash->minlight; flash->count = flash->darktime; } } @@ -228,7 +228,7 @@ strobe_t *P_SpawnAdjustableStrobeFlash(sector_t *sector, INT16 lighta, INT16 lig flash->count = 1; // Make sure the starting light level is in range. - sector->lightlevel = max((INT16)flash->minlight, min((INT16)flash->maxlight, sector->lightlevel)); + sector->lightlevel = max(flash->minlight, min(flash->maxlight, sector->lightlevel)); sector->lightingdata = flash; return flash; @@ -245,20 +245,20 @@ void T_Glow(glow_t *g) { case -1: // DOWN - g->sector->lightlevel = (INT16)(g->sector->lightlevel - (INT16)g->speed); + g->sector->lightlevel -= g->speed; if (g->sector->lightlevel <= g->minlight) { - g->sector->lightlevel = (INT16)(g->sector->lightlevel + (INT16)g->speed); + g->sector->lightlevel += g->speed; g->direction = 1; } break; case 1: // UP - g->sector->lightlevel = (INT16)(g->sector->lightlevel + (INT16)g->speed); + g->sector->lightlevel += g->speed; if (g->sector->lightlevel >= g->maxlight) { - g->sector->lightlevel = (INT16)(g->sector->lightlevel - (INT16)g->speed); + g->sector->lightlevel -= g->speed; g->direction = -1; } break; @@ -287,7 +287,7 @@ glow_t *P_SpawnAdjustableGlowingLight(sector_t *sector, INT16 lighta, INT16 ligh g->maxlight = max(lighta, lightb); g->thinker.function.acp1 = (actionf_p1)T_Glow; g->direction = 1; - g->speed = length/4; + g->speed = (INT16)(length/4); if (g->speed > (g->maxlight - g->minlight)/2) // don't make it ridiculous speed g->speed = (g->maxlight - g->minlight)/2; @@ -302,7 +302,7 @@ glow_t *P_SpawnAdjustableGlowingLight(sector_t *sector, INT16 lighta, INT16 ligh } // Make sure the starting light level is in range. - sector->lightlevel = max((INT16)g->minlight, min((INT16)g->maxlight, sector->lightlevel)); + sector->lightlevel = max(g->minlight, min(g->maxlight, sector->lightlevel)); sector->lightingdata = g; diff --git a/src/p_saveg.c b/src/p_saveg.c index ed849418a..b17011837 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2083,8 +2083,8 @@ static void SaveStrobeThinker(const thinker_t *th, const UINT8 type) WRITEUINT8(save_p, type); WRITEUINT32(save_p, SaveSector(ht->sector)); WRITEINT32(save_p, ht->count); - WRITEINT32(save_p, ht->minlight); - WRITEINT32(save_p, ht->maxlight); + WRITEINT16(save_p, ht->minlight); + WRITEINT16(save_p, ht->maxlight); WRITEINT32(save_p, ht->darktime); WRITEINT32(save_p, ht->brighttime); } @@ -2094,10 +2094,10 @@ static void SaveGlowThinker(const thinker_t *th, const UINT8 type) const glow_t *ht = (const void *)th; WRITEUINT8(save_p, type); WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEINT32(save_p, ht->minlight); - WRITEINT32(save_p, ht->maxlight); - WRITEINT32(save_p, ht->direction); - WRITEINT32(save_p, ht->speed); + WRITEINT16(save_p, ht->minlight); + WRITEINT16(save_p, ht->maxlight); + WRITEINT16(save_p, ht->direction); + WRITEINT16(save_p, ht->speed); } static inline void SaveFireflickerThinker(const thinker_t *th, const UINT8 type) @@ -2107,8 +2107,8 @@ static inline void SaveFireflickerThinker(const thinker_t *th, const UINT8 type) WRITEUINT32(save_p, SaveSector(ht->sector)); WRITEINT32(save_p, ht->count); WRITEINT32(save_p, ht->resetcount); - WRITEINT32(save_p, ht->maxlight); - WRITEINT32(save_p, ht->minlight); + WRITEINT16(save_p, ht->maxlight); + WRITEINT16(save_p, ht->minlight); } static void SaveElevatorThinker(const thinker_t *th, const UINT8 type) @@ -3212,8 +3212,8 @@ static thinker_t* LoadStrobeThinker(actionf_p1 thinker) ht->thinker.function.acp1 = thinker; ht->sector = LoadSector(READUINT32(save_p)); ht->count = READINT32(save_p); - ht->minlight = READINT32(save_p); - ht->maxlight = READINT32(save_p); + ht->minlight = READINT16(save_p); + ht->maxlight = READINT16(save_p); ht->darktime = READINT32(save_p); ht->brighttime = READINT32(save_p); if (ht->sector) @@ -3226,10 +3226,10 @@ static thinker_t* LoadGlowThinker(actionf_p1 thinker) glow_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; ht->sector = LoadSector(READUINT32(save_p)); - ht->minlight = READINT32(save_p); - ht->maxlight = READINT32(save_p); - ht->direction = READINT32(save_p); - ht->speed = READINT32(save_p); + ht->minlight = READINT16(save_p); + ht->maxlight = READINT16(save_p); + ht->direction = READINT16(save_p); + ht->speed = READINT16(save_p); if (ht->sector) ht->sector->lightingdata = ht; return &ht->thinker; @@ -3242,8 +3242,8 @@ static thinker_t* LoadFireflickerThinker(actionf_p1 thinker) ht->sector = LoadSector(READUINT32(save_p)); ht->count = READINT32(save_p); ht->resetcount = READINT32(save_p); - ht->maxlight = READINT32(save_p); - ht->minlight = READINT32(save_p); + ht->maxlight = READINT16(save_p); + ht->minlight = READINT16(save_p); if (ht->sector) ht->sector->lightingdata = ht; return &ht->thinker; diff --git a/src/p_spec.h b/src/p_spec.h index 95005882b..17e10d75b 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -216,8 +216,8 @@ typedef struct sector_t *sector; ///< The sector where action is taking place. INT32 count; INT32 resetcount; - INT32 maxlight; ///< The brightest light level to use. - INT32 minlight; ///< The darkest light level to use. + INT16 maxlight; ///< The brightest light level to use. + INT16 minlight; ///< The darkest light level to use. } fireflicker_t; typedef struct @@ -245,8 +245,8 @@ typedef struct thinker_t thinker; ///< The thinker in use for the effect. sector_t *sector; ///< The sector where the action is taking place. INT32 count; - INT32 minlight; ///< The minimum light level to use. - INT32 maxlight; ///< The maximum light level to use. + INT16 minlight; ///< The minimum light level to use. + INT16 maxlight; ///< The maximum light level to use. INT32 darktime; ///< How INT32 to use minlight. INT32 brighttime; ///< How INT32 to use maxlight. } strobe_t; @@ -255,10 +255,10 @@ typedef struct { thinker_t thinker; sector_t *sector; - INT32 minlight; - INT32 maxlight; - INT32 direction; - INT32 speed; + INT16 minlight; + INT16 maxlight; + INT16 direction; + INT16 speed; } glow_t; /** Thinker struct for fading lights. From 318c1b477d8ae9c7413c43b248a019c5ee233b33 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 19 Sep 2021 17:07:08 +0200 Subject: [PATCH 121/377] Adapt lighting effects to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 190 +++++++++++++++++++ src/p_setup.c | 30 +++ src/p_spec.c | 105 ++-------- src/p_spec.h | 6 + 4 files changed, 247 insertions(+), 84 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 76d65e663..2ec7691ab 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2550,6 +2550,101 @@ udmf } } + 416 + { + title = "Start Adjustable Flickering Light"; + prefix = "(416)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Speed"; + } + arg2 + { + title = "Brightness 1"; + } + arg3 + { + title = "Use target brightness?"; + type = 11; + enum = "noyes"; + } + arg4 + { + title = "Brightness 2"; + } + } + + 417 + { + title = "Start Adjustable Pulsating Light"; + prefix = "(417)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Speed"; + } + arg2 + { + title = "Brightness 1"; + } + arg3 + { + title = "Use target brightness?"; + type = 11; + enum = "noyes"; + } + arg4 + { + title = "Brightness 2"; + } + } + + 418 + { + title = "Start Adjustable Blinking Light"; + prefix = "(418)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Brightness 1 tics"; + } + arg2 + { + title = "Brightness 2 tics"; + } + arg3 + { + title = "Brightness 1"; + } + arg4 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Use target brightness"; + 2 = "Synchronized"; + } + } + arg5 + { + title = "Brightness 2"; + } + } + 420 { title = "Fade Light Level"; @@ -3238,6 +3333,101 @@ udmf light { + 602 + { + title = "Start Adjustable Pulsating Light"; + prefix = "(602)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Speed"; + } + arg2 + { + title = "Brightness 1"; + } + arg3 + { + title = "Use target brightness?"; + type = 11; + enum = "noyes"; + } + arg4 + { + title = "Brightness 2"; + } + } + + 603 + { + title = "Adjustable Flickering Light"; + prefix = "(603)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Speed"; + } + arg2 + { + title = "Brightness 1"; + } + arg3 + { + title = "Use target brightness?"; + type = 11; + enum = "noyes"; + } + arg4 + { + title = "Brightness 2"; + } + } + + 604 + { + title = "Start Adjustable Blinking Light"; + prefix = "(604)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Brightness 1 tics"; + } + arg2 + { + title = "Brightness 2 tics"; + } + arg3 + { + title = "Brightness 1"; + } + arg4 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Use target brightness"; + 2 = "Synchronized"; + } + } + arg5 + { + title = "Brightness 2"; + } + } + 606 { title = "Copy Colormap"; diff --git a/src/p_setup.c b/src/p_setup.c index ffa81f3fb..b87df4090 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3696,6 +3696,36 @@ static void P_ConvertBinaryMap(void) case 411: //Stop plane movement lines[i].args[0] = tag; break; + case 416: //Start adjustable flickering light + case 417: //Start adjustable pulsating light + case 602: //Adjustable pulsating light + case 603: //Adjustable flickering light + lines[i].args[0] = tag; + lines[i].args[1] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + lines[i].args[2] = lines[i].frontsector->lightlevel; + if ((lines[i].flags & ML_NOCLIMB) && lines[i].backsector) + lines[i].args[4] = lines[i].backsector->lightlevel; + else + lines[i].args[3] = 1; + break; + case 418: //Start adjustable blinking light (unsynchronized) + case 419: //Start adjustable blinking light (synchronized) + case 604: //Adjustable blinking light (unsynchronized) + case 605: //Adjustable blinking light (synchronized) + lines[i].args[0] = tag; + lines[i].args[1] = abs(lines[i].dx) >> FRACBITS; + lines[i].args[2] = abs(lines[i].dy) >> FRACBITS; + lines[i].args[3] = lines[i].frontsector->lightlevel; + if ((lines[i].flags & ML_NOCLIMB) && lines[i].backsector) + lines[i].args[5] = lines[i].backsector->lightlevel; + else + lines[i].args[4] |= TMB_USETARGET; + if (lines[i].special % 2 == 1) + { + lines[i].args[4] |= TMB_SYNC; + lines[i].special--; + } + break; case 420: //Fade light level lines[i].args[0] = tag; if (lines[i].flags & ML_DONTPEGBOTTOM) diff --git a/src/p_spec.c b/src/p_spec.c index 17aa767eb..2737c4d24 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2508,79 +2508,22 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; case 416: // Spawn adjustable fire flicker - TAG_ITER_SECTORS(tag, secnum) - { - if (line->flags & ML_NOCLIMB && line->backsector) - { - // Use front sector for min light level, back sector for max. - P_SpawnAdjustableFireFlicker(§ors[secnum], line->frontsector->lightlevel, line->backsector->lightlevel, - P_AproxDistance(line->dx, line->dy)>>FRACBITS); - } - else - { - // Use front sector for min, target sector for max, - // the same way linetype 61 does it. - P_SpawnAdjustableFireFlicker(§ors[secnum], line->frontsector->lightlevel, sectors[secnum].lightlevel, - P_AproxDistance(line->dx, line->dy)>>FRACBITS); - } - } + TAG_ITER_SECTORS(line->args[0], secnum) + P_SpawnAdjustableFireFlicker(§ors[secnum], line->args[2], + line->args[3] ? sectors[secnum].lightlevel : line->args[4], line->args[1]); break; case 417: // Spawn adjustable glowing light - TAG_ITER_SECTORS(tag, secnum) - { - if (line->flags & ML_NOCLIMB && line->backsector) - { - // Use front sector for min light level, back sector for max. - P_SpawnAdjustableGlowingLight(§ors[secnum], line->frontsector->lightlevel, line->backsector->lightlevel, - P_AproxDistance(line->dx, line->dy)>>FRACBITS); - } - else - { - // Use front sector for min, target sector for max, - // the same way linetype 602 does it. - P_SpawnAdjustableGlowingLight(§ors[secnum], line->frontsector->lightlevel, sectors[secnum].lightlevel, - P_AproxDistance(line->dx, line->dy)>>FRACBITS); - } - } + TAG_ITER_SECTORS(line->args[0], secnum) + P_SpawnAdjustableGlowingLight(§ors[secnum], line->args[2], + line->args[3] ? sectors[secnum].lightlevel : line->args[4], line->args[1]); break; - case 418: // Spawn adjustable strobe flash (unsynchronized) - TAG_ITER_SECTORS(tag, secnum) - { - if (line->flags & ML_NOCLIMB && line->backsector) - { - // Use front sector for min light level, back sector for max. - P_SpawnAdjustableStrobeFlash(§ors[secnum], line->frontsector->lightlevel, line->backsector->lightlevel, - abs(line->dx)>>FRACBITS, abs(line->dy)>>FRACBITS, false); - } - else - { - // Use front sector for min, target sector for max, - // the same way linetype 602 does it. - P_SpawnAdjustableStrobeFlash(§ors[secnum], line->frontsector->lightlevel, sectors[secnum].lightlevel, - abs(line->dx)>>FRACBITS, abs(line->dy)>>FRACBITS, false); - } - } - break; - - case 419: // Spawn adjustable strobe flash (synchronized) - TAG_ITER_SECTORS(tag, secnum) - { - if (line->flags & ML_NOCLIMB && line->backsector) - { - // Use front sector for min light level, back sector for max. - P_SpawnAdjustableStrobeFlash(§ors[secnum], line->frontsector->lightlevel, line->backsector->lightlevel, - abs(line->dx)>>FRACBITS, abs(line->dy)>>FRACBITS, true); - } - else - { - // Use front sector for min, target sector for max, - // the same way linetype 602 does it. - P_SpawnAdjustableStrobeFlash(§ors[secnum], line->frontsector->lightlevel, sectors[secnum].lightlevel, - abs(line->dx)>>FRACBITS, abs(line->dy)>>FRACBITS, true); - } - } + case 418: // Spawn adjustable strobe flash + TAG_ITER_SECTORS(line->args[0], secnum) + P_SpawnAdjustableStrobeFlash(§ors[secnum], line->args[3], + (line->args[4] & TMB_USETARGET) ? sectors[secnum].lightlevel : line->args[5], + line->args[1], line->args[2], line->args[4] & TMB_SYNC); break; case 420: // Fade light levels in tagged sectors to new value @@ -6899,30 +6842,24 @@ void P_SpawnSpecials(boolean fromnetsave) case 602: // Adjustable pulsating light sec = sides[*lines[i].sidenum].sector - sectors; - TAG_ITER_SECTORS(tag, s) - P_SpawnAdjustableGlowingLight(§ors[s], sectors[sec].lightlevel, sectors[s].lightlevel, - P_AproxDistance(lines[i].dx, lines[i].dy)>>FRACBITS); + TAG_ITER_SECTORS(lines[i].args[0], s) + P_SpawnAdjustableGlowingLight(§ors[s], lines[i].args[2], + lines[i].args[3] ? sectors[s].lightlevel : lines[i].args[4], lines[i].args[1]); break; case 603: // Adjustable flickering light sec = sides[*lines[i].sidenum].sector - sectors; - TAG_ITER_SECTORS(tag, s) - P_SpawnAdjustableFireFlicker(§ors[s], sectors[sec].lightlevel, sectors[s].lightlevel, - P_AproxDistance(lines[i].dx, lines[i].dy)>>FRACBITS); + TAG_ITER_SECTORS(lines[i].args[0], s) + P_SpawnAdjustableFireFlicker(§ors[s], lines[i].args[2], + lines[i].args[3] ? sectors[s].lightlevel : lines[i].args[4], lines[i].args[1]); break; - case 604: // Adjustable Blinking Light (unsynchronized) + case 604: // Adjustable Blinking Light sec = sides[*lines[i].sidenum].sector - sectors; TAG_ITER_SECTORS(tag, s) - P_SpawnAdjustableStrobeFlash(§ors[s], sectors[sec].lightlevel, sectors[s].lightlevel, - abs(lines[i].dx)>>FRACBITS, abs(lines[i].dy)>>FRACBITS, false); - break; - - case 605: // Adjustable Blinking Light (synchronized) - sec = sides[*lines[i].sidenum].sector - sectors; - TAG_ITER_SECTORS(tag, s) - P_SpawnAdjustableStrobeFlash(§ors[s], sectors[sec].lightlevel, sectors[s].lightlevel, - abs(lines[i].dx)>>FRACBITS, abs(lines[i].dy)>>FRACBITS, true); + P_SpawnAdjustableStrobeFlash(§ors[s], lines[i].args[3], + (lines[i].args[4] & TMB_USETARGET) ? sectors[s].lightlevel : lines[i].args[5], + lines[i].args[1], lines[i].args[2], lines[i].args[4] & TMB_SYNC); break; case 606: // HACK! Copy colormaps. Just plain colormaps. diff --git a/src/p_spec.h b/src/p_spec.h index 17e10d75b..d759b701b 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -125,6 +125,12 @@ typedef enum TMF_FORCE = 1<<1, } textmapfadeflags_t; +typedef enum +{ + TMB_USETARGET = 1, + TMB_SYNC = 1<<1, +} textmapblinkinglightflags_t; + typedef enum { TMSD_FRONT = 0, From 68712629092c96544576b14685c0ec792bb734a2 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 19 Sep 2021 23:12:30 +0200 Subject: [PATCH 122/377] Allow "fade light level" linedef executor to fade relative to current value --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 7 ++++--- src/lua_baselib.c | 3 ++- src/p_lights.c | 7 +++++-- src/p_setup.c | 2 +- src/p_spec.c | 2 +- src/p_spec.h | 7 ++++--- 6 files changed, 17 insertions(+), 11 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 2ec7691ab..a75c98b4d 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2660,7 +2660,7 @@ udmf } arg2 { - title = "Speed"; + title = "Fading speed"; } arg3 { @@ -2668,8 +2668,9 @@ udmf type = 12; enum { - 1 = "Speed is tic duration"; - 2 = "Override existing fade"; + 1 = "Add to current translucency"; + 2 = "Interrupt ongoing fades"; + 4 = "Speed is duration"; } } } diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 350c1585f..7c1d61a9c 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -2342,9 +2342,10 @@ static int lib_pFadeLight(lua_State *L) INT32 speed = (INT32)luaL_checkinteger(L, 3); boolean ticbased = lua_optboolean(L, 4); boolean force = lua_optboolean(L, 5); + boolean relative = lua_optboolean(L, 6); NOHUD INLEVEL - P_FadeLight(tag, destvalue, speed, ticbased, force); + P_FadeLight(tag, destvalue, speed, ticbased, force, relative); return 0; } diff --git a/src/p_lights.c b/src/p_lights.c index e8da48e9a..58ab2e799 100644 --- a/src/p_lights.c +++ b/src/p_lights.c @@ -358,9 +358,10 @@ void P_FadeLightBySector(sector_t *sector, INT32 destvalue, INT32 speed, boolean } } -void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased, boolean force) +void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased, boolean force, boolean relative) { INT32 i; + INT32 realdestvalue; // search all sectors for ones with tag TAG_ITER_SECTORS(tag, i) @@ -373,7 +374,9 @@ void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased, bool CONS_Debug(DBG_GAMELOGIC, "Line type 420 Executor: Fade light thinker already exists, timer: %d\n", ((lightlevel_t*)sectors[i].lightingdata)->timer); continue; } - P_FadeLightBySector(§ors[i], destvalue, speed, ticbased); + + realdestvalue = relative ? max(0, min(255, sectors[i].lightlevel + destvalue)) : destvalue; + P_FadeLightBySector(§ors[i], realdestvalue, speed, ticbased); } } diff --git a/src/p_setup.c b/src/p_setup.c index b87df4090..251e0fbb3 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3745,7 +3745,7 @@ static void P_ConvertBinaryMap(void) if (lines[i].flags & ML_EFFECT4) lines[i].args[3] |= TMF_TICBASED; if (lines[i].flags & ML_EFFECT5) - lines[i].args[3] |= TMF_FORCE; + lines[i].args[3] |= TMF_OVERRIDE; break; case 421: //Stop lighting effect lines[i].args[0] = tag; diff --git a/src/p_spec.c b/src/p_spec.c index 2737c4d24..aeb657988 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2527,7 +2527,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; case 420: // Fade light levels in tagged sectors to new value - P_FadeLight(line->args[0], line->args[1], line->args[2], line->args[3] & TMF_TICBASED, line->args[3] & TMF_FORCE); + P_FadeLight(line->args[0], line->args[1], line->args[2], line->args[3] & TMF_TICBASED, line->args[3] & TMF_OVERRIDE, line->args[3] & TMF_RELATIVE); break; case 421: // Stop lighting effect in tagged sectors diff --git a/src/p_spec.h b/src/p_spec.h index d759b701b..ca0bf0cb3 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -121,8 +121,9 @@ typedef enum typedef enum { - TMF_TICBASED = 1, - TMF_FORCE = 1<<1, + TMF_RELATIVE = 1, + TMF_OVERRIDE = 1<<1, + TMF_TICBASED = 1<<2, } textmapfadeflags_t; typedef enum @@ -301,7 +302,7 @@ void T_Glow(glow_t *g); glow_t *P_SpawnAdjustableGlowingLight(sector_t *sector, INT16 lighta, INT16 lightb, INT32 length); void P_FadeLightBySector(sector_t *sector, INT32 destvalue, INT32 speed, boolean ticbased); -void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased, boolean force); +void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased, boolean force, boolean relative); void T_LightFade(lightlevel_t *ll); typedef enum From 1784c7b0ef232a0f2e9d376744ed4c3551a18d4a Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 20 Sep 2021 07:54:10 +0200 Subject: [PATCH 123/377] Add linedef executor for modifying (as opposed to copying) a sector's light level --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 41 +++++++++++++++++++- src/p_setup.c | 6 +++ src/p_spec.c | 39 +++++++++++++++++++ src/p_spec.h | 7 ++++ 4 files changed, 91 insertions(+), 2 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index a75c98b4d..430645dec 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -762,7 +762,7 @@ doom } 402 { - title = "Set Tagged Sector's Light Level"; + title = "Copy Light Level to Tagged Sectors"; prefix = "(402)"; } 408 @@ -815,6 +815,11 @@ doom title = "Change Plane Scroller Direction"; prefix = "(435)"; } + 467 + { + title = "Set Tagged Sector's Light Level"; + prefix = "(467)"; + } } linedefexecplane @@ -2513,7 +2518,7 @@ udmf 402 { - title = "Copy Light Level"; + title = "Copy Light Level to Tagged Sectors"; prefix = "(402)"; arg0 { @@ -2700,6 +2705,38 @@ udmf title = "Speed"; } } + + 467 + { + title = "Set Tagged Sector's Light Level"; + prefix = "(467)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Light level"; + } + arg2 + { + title = "Affected area"; + type = 11; + enum + { + 0 = "Sector"; + 1 = "Floor"; + 2 = "Ceiling"; + } + } + arg3 + { + title = "Set/Add?"; + type = 11; + enum = "setadd"; + } + } } linedefexecplane diff --git a/src/p_setup.c b/src/p_setup.c index 251e0fbb3..c93a7ac2f 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3826,6 +3826,12 @@ static void P_ConvertBinaryMap(void) case 456: //Stop fading colormap lines[i].args[0] = Tag_FGet(&lines[i].tags); break; + case 467: //Set light level + lines[i].args[0] = tag; + lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[2] = TML_SECTOR; + lines[i].args[3] = !!(lines[i].flags & ML_EFFECT3); + break; case 480: //Polyobject - door slide case 481: //Polyobject - door move lines[i].args[0] = tag; diff --git a/src/p_spec.c b/src/p_spec.c index aeb657988..c460c5a98 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3683,6 +3683,45 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) } break; + case 467: // Set light level + TAG_ITER_SECTORS(line->args[0], secnum) + { + if (sectors[secnum].lightingdata) + { + // Stop any lighting effects going on in the sector + P_RemoveThinker(&((elevator_t *)sectors[secnum].lightingdata)->thinker); + sectors[secnum].lightingdata = NULL; + + // No, it's not an elevator_t, but any struct with a thinker_t named + // 'thinker' at the beginning will do here. (We don't know what it + // actually is: could be lightlevel_t, fireflicker_t, glow_t, etc.) + } + + if (line->args[2] == TML_FLOOR) + { + if (line->args[3]) + sectors[secnum].floorlightlevel += line->args[1]; + else + sectors[secnum].floorlightlevel = line->args[1]; + } + else if (line->args[2] == TML_CEILING) + { + if (line->args[3]) + sectors[secnum].ceilinglightlevel += line->args[1]; + else + sectors[secnum].ceilinglightlevel = line->args[1]; + } + else + { + if (line->args[3]) + sectors[secnum].lightlevel += line->args[1]; + else + sectors[secnum].lightlevel = line->args[1]; + sectors[secnum].lightlevel = max(0, min(255, sectors[secnum].lightlevel)); + } + } + break; + case 480: // Polyobj_DoorSlide case 481: // Polyobj_DoorSwing PolyDoor(line); diff --git a/src/p_spec.h b/src/p_spec.h index ca0bf0cb3..adebf99d2 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -112,6 +112,13 @@ typedef enum TMP_BOTH = 2, } textmapplanes_t; +typedef enum +{ + TML_SECTOR = 0, + TML_FLOOR = 1, + TML_CEILING = 2, +} textmaplightareas_t; + typedef enum { TMLC_NOSECTOR = 1, From 609fb91e4bed9ccde4d12665b5e695a99a3f5219 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 20 Sep 2021 08:18:59 +0200 Subject: [PATCH 124/377] Stop elevator abuse --- src/p_lights.c | 4 ++-- src/p_spec.c | 16 ++++------------ src/p_spec.h | 6 ++++++ 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/p_lights.c b/src/p_lights.c index 58ab2e799..ba39bc72e 100644 --- a/src/p_lights.c +++ b/src/p_lights.c @@ -30,7 +30,7 @@ void P_RemoveLighting(sector_t *sector) // The thinker is the first member in all the lighting action structs, // so just let the thinker get freed, and that will free the whole // structure. - P_RemoveThinker(&((elevator_t *)sector->lightingdata)->thinker); + P_RemoveThinker(&((thinkerdata_t *)sector->lightingdata)->thinker); sector->lightingdata = NULL; } } @@ -144,7 +144,7 @@ void P_SpawnLightningFlash(sector_t *sector) minlight = ((lightflash_t *)sector->lightingdata)->minlight; } - P_RemoveThinker(&((elevator_t *)sector->lightingdata)->thinker); + P_RemoveThinker(&((thinkerdata_t *)sector->lightingdata)->thinker); } sector->lightingdata = NULL; diff --git a/src/p_spec.c b/src/p_spec.c index c460c5a98..250aa4eef 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2143,12 +2143,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (sectors[secnum].lightingdata) { // Stop the lighting madness going on in this sector! - P_RemoveThinker(&((elevator_t *)sectors[secnum].lightingdata)->thinker); + P_RemoveThinker(&((thinkerdata_t *)sectors[secnum].lightingdata)->thinker); sectors[secnum].lightingdata = NULL; - - // No, it's not an elevator_t, but any struct with a thinker_t named - // 'thinker' at the beginning will do here. (We don't know what it - // actually is: could be lightlevel_t, fireflicker_t, glow_t, etc.) } if (!(line->args[1] & TMLC_NOSECTOR)) @@ -2534,7 +2530,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) TAG_ITER_SECTORS(line->args[0], secnum) if (sectors[secnum].lightingdata) { - P_RemoveThinker(&((elevator_t *)sectors[secnum].lightingdata)->thinker); + P_RemoveThinker(&((thinkerdata_t *)sectors[secnum].lightingdata)->thinker); sectors[secnum].lightingdata = NULL; } break; @@ -3689,12 +3685,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (sectors[secnum].lightingdata) { // Stop any lighting effects going on in the sector - P_RemoveThinker(&((elevator_t *)sectors[secnum].lightingdata)->thinker); + P_RemoveThinker(&((thinkerdata_t *)sectors[secnum].lightingdata)->thinker); sectors[secnum].lightingdata = NULL; - - // No, it's not an elevator_t, but any struct with a thinker_t named - // 'thinker' at the beginning will do here. (We don't know what it - // actually is: could be lightlevel_t, fireflicker_t, glow_t, etc.) } if (line->args[2] == TML_FLOOR) @@ -8040,7 +8032,7 @@ static void P_ResetColormapFader(sector_t *sector) // The thinker is the first member in all the action structs, // so just let the thinker get freed, and that will free the whole // structure. - P_RemoveThinker(&((elevator_t *)sector->fadecolormapdata)->thinker); + P_RemoveThinker(&((thinkerdata_t *)sector->fadecolormapdata)->thinker); sector->fadecolormapdata = NULL; } } diff --git a/src/p_spec.h b/src/p_spec.h index adebf99d2..c81839f22 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -219,6 +219,12 @@ void P_RunNightsCapsuleTouchExecutors(mobj_t *actor, boolean entering, boolean e UINT16 P_GetFFloorID(ffloor_t *fflr); ffloor_t *P_GetFFloorByID(sector_t *sec, UINT16 id); +// Use this when you don't know the type of your thinker data struct but need to access its thinker. +typedef struct +{ + thinker_t thinker; +} thinkerdata_t; + // // P_LIGHTS // From 1b339a9e00f807b1f7271965850b315cb01cf550 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 20 Sep 2021 08:36:55 +0200 Subject: [PATCH 125/377] Adapt linedef types 600-601 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 17 +++++++++++++++++ src/p_setup.c | 6 ++++++ src/p_spec.c | 17 ++++++++--------- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 430645dec..324660d59 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -3371,6 +3371,23 @@ udmf light { + 600 + { + title = "Copy Light Level to Tagged Sector's Planes"; + prefix = "(600)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Affected planes"; + type = 11; + enum = "floorceiling"; + } + } + 602 { title = "Start Adjustable Pulsating Light"; diff --git a/src/p_setup.c b/src/p_setup.c index c93a7ac2f..306847028 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4035,6 +4035,12 @@ static void P_ConvertBinaryMap(void) lines[i].args[4] |= TMPF_NONEXCLUSIVE; lines[i].special = 541; break; + case 600: //Floor lighting + case 601: //Ceiling lighting + lines[i].args[0] = tag; + lines[i].args[1] = (lines[i].special == 601) ? TMP_CEILING : TMP_FLOOR; + lines[i].special = 600; + break; case 606: //Colormap lines[i].args[0] = Tag_FGet(&lines[i].tags); break; diff --git a/src/p_spec.c b/src/p_spec.c index 250aa4eef..7ec7ca38c 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6859,16 +6859,15 @@ void P_SpawnSpecials(boolean fromnetsave) // 546 is used for downwards current // 547 is used for push/pull - case 600: // floor lighting independently (e.g. lava) + case 600: // Copy light level to tagged sector's planes sec = sides[*lines[i].sidenum].sector-sectors; - TAG_ITER_SECTORS(tag, s) - sectors[s].floorlightsec = (INT32)sec; - break; - - case 601: // ceiling lighting independently - sec = sides[*lines[i].sidenum].sector-sectors; - TAG_ITER_SECTORS(tag, s) - sectors[s].ceilinglightsec = (INT32)sec; + TAG_ITER_SECTORS(lines[i].args[0], s) + { + if (lines[i].args[1] != TMP_CEILING) + sectors[s].floorlightsec = (INT32)sec; + if (lines[i].args[1] != TMP_FLOOR) + sectors[s].ceilinglightsec = (INT32)sec; + } break; case 602: // Adjustable pulsating light From d2eb4587c28886f82a7147925f13d87ea7226492 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 20 Sep 2021 12:32:01 +0200 Subject: [PATCH 126/377] Adapt linedef type 415 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 11 ++++++++ src/p_setup.c | 25 +++++++++++++++++ src/p_spec.c | 29 ++------------------ 3 files changed, 38 insertions(+), 27 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 324660d59..60d5ecbda 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2880,6 +2880,17 @@ udmf { title = "Linedef Executor (misc.)"; + 415 + { + title = "Run Script"; + prefix = "(415)"; + stringarg0 + { + title = "Lump name"; + type = 2; + } + } + 443 { title = "Call Lua Function"; diff --git a/src/p_setup.c b/src/p_setup.c index 306847028..03f9554bb 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3696,6 +3696,31 @@ static void P_ConvertBinaryMap(void) case 411: //Stop plane movement lines[i].args[0] = tag; break; + case 415: //Run script + { + INT32 scrnum; + + lines[i].stringargs[0] = Z_Malloc(9, PU_LEVEL, NULL); + strcpy(lines[i].stringargs[0], G_BuildMapName(gamemap)); + lines[i].stringargs[0][0] = 'S'; + lines[i].stringargs[0][1] = 'C'; + lines[i].stringargs[0][2] = 'R'; + + scrnum = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + if (scrnum < 0 || scrnum > 999) + { + scrnum = 0; + lines[i].stringargs[0][5] = lines[i].stringargs[0][6] = lines[i].stringargs[0][7] = '0'; + } + else + { + lines[i].stringargs[0][5] = (char)('0' + (char)((scrnum / 100))); + lines[i].stringargs[0][6] = (char)('0' + (char)((scrnum % 100) / 10)); + lines[i].stringargs[0][7] = (char)('0' + (char)(scrnum % 10)); + } + lines[i].stringargs[0][8] = '\0'; + break; + } case 416: //Start adjustable flickering light case 417: //Start adjustable pulsating light case 602: //Adjustable pulsating light diff --git a/src/p_spec.c b/src/p_spec.c index 7ec7ca38c..0ff69f417 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2469,35 +2469,10 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 415: // Run a script if (cv_runscripts.value) { - INT32 scrnum; - lumpnum_t lumpnum; - char newname[9]; - - strcpy(newname, G_BuildMapName(gamemap)); - newname[0] = 'S'; - newname[1] = 'C'; - newname[2] = 'R'; - - scrnum = sides[line->sidenum[0]].textureoffset>>FRACBITS; - if (scrnum < 0 || scrnum > 999) - { - scrnum = 0; - newname[5] = newname[6] = newname[7] = '0'; - } - else - { - newname[5] = (char)('0' + (char)((scrnum/100))); - newname[6] = (char)('0' + (char)((scrnum%100)/10)); - newname[7] = (char)('0' + (char)(scrnum%10)); - } - newname[8] = '\0'; - - lumpnum = W_CheckNumForName(newname); + lumpnum_t lumpnum = W_CheckNumForName(line->stringargs[0]); if (lumpnum == LUMPERROR || W_LumpLength(lumpnum) == 0) - { - CONS_Debug(DBG_SETUP, "SOC Error: script lump %s not found/not valid.\n", newname); - } + CONS_Debug(DBG_SETUP, "Line type 415 Executor: script lump %s not found/not valid.\n", line->stringargs[0]); else COM_BufInsertText(W_CacheLumpNum(lumpnum, PU_CACHE)); } From 4028d392b080b135e8afdbd59dd7ba4de446eea7 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 20 Sep 2021 12:42:31 +0200 Subject: [PATCH 127/377] Adapt linedef types 423 and 424 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 43 ++++++++++++++++++++ src/p_setup.c | 5 +++ src/p_spec.c | 10 ++--- 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 60d5ecbda..f74210732 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2891,6 +2891,49 @@ udmf } } + 423 + { + title = "Change Sky"; + prefix = "(423)"; + arg0 + { + title = "Sky number"; + } + arg1 + { + title = "For all players?"; + type = 11; + enum = "noyes"; + } + } + + 424 + { + title = "Change Weather"; + prefix = "(424)"; + arg0 + { + title = "Weather"; + type = 11; + enum + { + 0 = "None"; + 1 = "Storm (thunder, lightning and rain)"; + 2 = "Snow"; + 3 = "Rain"; + 4 = "Preloaded"; + 5 = "Storm (no rain)"; + 6 = "Storm (no lightning)"; + } + } + arg1 + { + title = "For all players?"; + type = 11; + enum = "noyes"; + } + } + 443 { title = "Call Lua Function"; diff --git a/src/p_setup.c b/src/p_setup.c index 03f9554bb..370fdb2fa 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3775,6 +3775,11 @@ static void P_ConvertBinaryMap(void) case 421: //Stop lighting effect lines[i].args[0] = tag; break; + case 423: //Change sky + case 424: //Change weather + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[1] = !!(lines[i].flags & ML_NOCLIMB); + break; case 428: //Start platform movement lines[i].args[0] = tag; lines[i].args[1] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; diff --git a/src/p_spec.c b/src/p_spec.c index 0ff69f417..3cd046e10 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2560,18 +2560,18 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; case 423: // Change Sky - if ((mo && mo->player && P_IsLocalPlayer(mo->player)) || (line->flags & ML_NOCLIMB)) - P_SetupLevelSky(sides[line->sidenum[0]].textureoffset>>FRACBITS, (line->flags & ML_NOCLIMB)); + if ((mo && mo->player && P_IsLocalPlayer(mo->player)) || line->args[1]) + P_SetupLevelSky(line->args[0], line->args[1]); break; case 424: // Change Weather - if (line->flags & ML_NOCLIMB) + if (line->args[1]) { - globalweather = (UINT8)(sides[line->sidenum[0]].textureoffset>>FRACBITS); + globalweather = (UINT8)(line->args[0]); P_SwitchWeather(globalweather); } else if (mo && mo->player && P_IsLocalPlayer(mo->player)) - P_SwitchWeather(sides[line->sidenum[0]].textureoffset>>FRACBITS); + P_SwitchWeather(line->args[0]); break; case 425: // Calls P_SetMobjState on calling mobj From 00b04f6d9e37e25c64f57122fe01d3145a7da0e3 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 20 Sep 2021 13:31:32 +0200 Subject: [PATCH 128/377] Adapt some player-related linedef executors to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 75 ++++++++++++++++++++ src/p_setup.c | 16 +++++ src/p_spec.c | 16 ++--- 3 files changed, 99 insertions(+), 8 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index f74210732..bc80549e4 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2876,6 +2876,81 @@ udmf } } + linedefexecplayer + { + title = "Linedef Executor (player/object)"; + + 426 + { + title = "Stop Object"; + prefix = "(426)"; + arg0 + { + title = "Move to center?"; + type = 11; + enum = "noyes"; + } + } + + 427 + { + title = "Award Score"; + prefix = "(427)"; + arg0 + { + title = "Score"; + } + } + + 432 + { + title = "Enable/Disable 2D Mode"; + prefix = "(432)"; + arg0 + { + title = "Mode"; + type = 11; + enum + { + 0 = "2D"; + 1 = "3D"; + } + } + } + + 433 + { + title = "Enable/Disable Gravity Flip"; + prefix = "(433)"; + arg0 + { + title = "Gravity"; + type = 11; + enum + { + 0 = "Reverse"; + 1 = "Normal"; + } + } + } + + 437 + { + title = "Disable Player Control"; + prefix = "(437)"; + arg0 + { + title = "Time"; + } + arg1 + { + title = "Allow jumping?"; + type = 11; + enum = "noyes"; + } + } + } + linedefexecmisc { title = "Linedef Executor (misc.)"; diff --git a/src/p_setup.c b/src/p_setup.c index 370fdb2fa..f5f3a22cc 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3780,6 +3780,12 @@ static void P_ConvertBinaryMap(void) lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = !!(lines[i].flags & ML_NOCLIMB); break; + case 426: //Stop object + lines[i].args[0] = !!(lines[i].flags & ML_NOCLIMB); + break; + case 427: //Award score + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + break; case 428: //Start platform movement lines[i].args[0] = tag; lines[i].args[1] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; @@ -3804,10 +3810,20 @@ static void P_ConvertBinaryMap(void) } lines[i].special = 429; break; + case 432: //Enable/disable 2D mode + lines[i].args[0] = !!(lines[i].flags & ML_NOCLIMB); + break; + case 433: //Enable/disable gravity flip + lines[i].args[0] = !!(lines[i].flags & ML_NOCLIMB); + break; case 435: //Change plane scroller direction lines[i].args[0] = tag; lines[i].args[1] = R_PointToDist2(lines[i].v2->x, lines[i].v2->y, lines[i].v1->x, lines[i].v1->y) >> FRACBITS; break; + case 437: //Disable player control + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[1] = !!(lines[i].flags & ML_NOCLIMB); + break; case 443: //Call Lua function if (lines[i].text) { diff --git a/src/p_spec.c b/src/p_spec.c index 3cd046e10..e6dcf118a 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2583,7 +2583,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (!mo) return; - if (line->flags & ML_NOCLIMB) + if (line->args[0]) { P_UnsetThingPosition(mo); mo->x = mo->subsector->sector->soundorg.x; @@ -2618,7 +2618,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 427: // Awards points if the mobj is a player if (mo && mo->player) - P_AddPlayerScore(mo->player, sides[line->sidenum[0]].textureoffset>>FRACBITS); + P_AddPlayerScore(mo->player, line->args[0]); break; case 428: // Start floating platform movement @@ -2634,10 +2634,10 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) EV_DoCrush(line->args[0], line, crushBothOnce); break; - case 432: // Enable 2D Mode (Disable if noclimb) + case 432: // Enable/Disable 2D Mode if (mo && mo->player) { - if (line->flags & ML_NOCLIMB) + if (line->args[0]) mo->flags2 &= ~MF2_TWOD; else mo->flags2 |= MF2_TWOD; @@ -2651,8 +2651,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) } break; - case 433: // Flip gravity (Flop gravity if noclimb) Works on pushables, too! - if (line->flags & ML_NOCLIMB) + case 433: // Flip/flop gravity. Works on pushables, too! + if (line->args[0]) mo->flags2 &= ~MF2_OBJECTFLIP; else mo->flags2 |= MF2_OBJECTFLIP; @@ -2750,10 +2750,10 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 437: // Disable Player Controls if (mo && mo->player) { - UINT16 fractime = (UINT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); + UINT16 fractime = (UINT16)(line->args[0]); if (fractime < 1) fractime = 1; //instantly wears off upon leaving - if (line->flags & ML_NOCLIMB) + if (line->args[1]) fractime |= 1<<15; //more crazy &ing, as if music stuff wasn't enough mo->player->powers[pw_nocontrol] = fractime; if (bot) From 6010faf10ccc2e429520b09ece489daf84cde5e7 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 20 Sep 2021 13:37:04 +0200 Subject: [PATCH 129/377] Add linedef executors without parameters to UDMF config --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index bc80549e4..83e8165fd 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2949,6 +2949,12 @@ udmf enum = "noyes"; } } + + 462 + { + title = "Stop Timer/Exit Stage in Record Attack"; + prefix = "(462)"; + } } linedefexecmisc @@ -3009,6 +3015,12 @@ udmf } } + 440 + { + title = "Start Metal Sonic Race"; + prefix = "(440)"; + } + 443 { title = "Call Lua Function"; From 877ec96eeca105cecb07509e50322244048780dd Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 20 Sep 2021 14:25:07 +0200 Subject: [PATCH 130/377] Adapt a whole bunch of linedef executors to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 137 +++++++++++++++++++ src/p_setup.c | 45 ++++++ src/p_spec.c | 73 +++++----- src/p_spec.h | 7 + 4 files changed, 221 insertions(+), 41 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 83e8165fd..9447a53ad 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -952,6 +952,11 @@ doom title = "Stop Timer/Exit Stage in Record Attack"; prefix = "(462)"; } + 466 + { + title = "Set Level Failure State"; + prefix = "(466)"; + } } linedefexecmisc @@ -2950,11 +2955,41 @@ udmf } } + 460 + { + title = "Award Rings"; + prefix = "(460)"; + arg0 + { + title = "Rings"; + } + arg1 + { + title = "Periodicity"; + } + } + 462 { title = "Stop Timer/Exit Stage in Record Attack"; prefix = "(462)"; } + + 466 + { + title = "Set Level Failure State"; + prefix = "(466)"; + arg0 + { + title = "State"; + type = 11; + enum + { + 0 = "Failure"; + 1 = "Success"; + } + } + } } linedefexecmisc @@ -3021,6 +3056,16 @@ udmf prefix = "(440)"; } + 441 + { + title = "Condition Set Trigger"; + prefix = "(441)"; + arg0 + { + title = "Trigger number"; + } + } + 443 { title = "Call Lua Function"; @@ -3032,6 +3077,20 @@ udmf } } + 444 + { + title = "Earthquake"; + prefix = "(444)"; + arg0 + { + title = "Duration"; + } + arg1 + { + title = "Intensity"; + } + } + 447 { title = "Change Tagged Sector's Colormap"; @@ -3068,6 +3127,84 @@ udmf } } + 448 + { + title = "Change Skybox"; + prefix = "(448)"; + arg0 + { + title = "Viewpoint ID"; + } + arg1 + { + title = "Centerpoint ID"; + } + arg2 + { + title = "Change?"; + type = 11; + enum + { + 0 = "Viewpoint"; + 1 = "Centerpoint"; + 2 = "Both"; + } + } + arg3 + { + title = "For all players?"; + type = 11; + enum = "noyes"; + } + } + + 449 + { + title = "Enable Bosses with Parameter"; + prefix = "(449)"; + arg0 + { + title = "Boss ID"; + } + arg1 + { + title = Effect"; + type = 11; + enum + { + 0 = "Enable"; + 1 = "Disable"; + } + } + } + + 450 + { + title = "Execute Linedef Executor (specific tag)"; + prefix = "(450)"; + arg0 + { + title = "Trigger linedef tag"; + type = 15; + } + } + + 451 + { + title = "Execute Linedef Executor (random tag in range)"; + prefix = "(451)"; + arg0 + { + title = "Start of tag range"; + type = 15; + } + arg1 + { + title = "End of tag range"; + type = 15; + } + } + 455 { title = "Fade Tagged Sector's Colormap"; diff --git a/src/p_setup.c b/src/p_setup.c index f5f3a22cc..782253cbd 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3824,6 +3824,9 @@ static void P_ConvertBinaryMap(void) lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = !!(lines[i].flags & ML_NOCLIMB); break; + case 441: //Condition set trigger + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + break; case 443: //Call Lua function if (lines[i].text) { @@ -3833,6 +3836,11 @@ static void P_ConvertBinaryMap(void) else CONS_Alert(CONS_WARNING, "Linedef %s is missing the hook name of the Lua function to call! (This should be given in the front texture fields)\n", sizeu1(i)); break; + case 444: //Earthquake + lines[i].args[0] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[2] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + break; case 447: //Change colormap lines[i].args[0] = Tag_FGet(&lines[i].tags); if (lines[i].flags & ML_EFFECT3) @@ -3844,6 +3852,36 @@ static void P_ConvertBinaryMap(void) if (lines[i].flags & ML_EFFECT2) lines[i].args[2] |= TMCF_SUBLIGHTB|TMCF_SUBFADEB; break; + case 448: //Change skybox + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + if ((lines[i].flags & (ML_EFFECT4|ML_BLOCKMONSTERS)) == ML_EFFECT4) // Solid Midtexture is on but Block Enemies is off? + { + CONS_Alert(CONS_WARNING, + M_GetText("Skybox switch linedef (tag %d) doesn't have anything to do.\nConsider changing the linedef's flag configuration or removing it entirely.\n"), + tag); + lines[i].special = 0; + break; + } + else if ((lines[i].flags & (ML_EFFECT4|ML_BLOCKMONSTERS)) == (ML_EFFECT4|ML_BLOCKMONSTERS)) + lines[i].args[2] = TMS_CENTERPOINT; + else if (lines[i].flags & ML_BLOCKMONSTERS) + lines[i].args[2] = TMS_BOTH; + else + lines[i].args[2] = TMS_VIEWPOINT; + lines[i].args[3] = !!(lines[i].flags & ML_NOCLIMB); + break; + case 449: //Enable bosses with parameters + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[1] = !!(lines[i].flags & ML_NOCLIMB); + break; + case 450: //Execute linedef executor (specific tag) + lines[i].args[0] = tag; + break; + case 451: //Execute linedef executor (random tag in range) + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + break; case 455: //Fade colormap { INT32 speed = (INT32)((((lines[i].flags & ML_DONTPEGBOTTOM) || !sides[lines[i].sidenum[0]].rowoffset) && lines[i].sidenum[1] != 0xFFFF) ? @@ -3872,6 +3910,13 @@ static void P_ConvertBinaryMap(void) case 456: //Stop fading colormap lines[i].args[0] = Tag_FGet(&lines[i].tags); break; + case 460: //Award rings + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + break; + case 466: //Set level failure state + lines[i].args[0] = !!(lines[i].flags & ML_NOCLIMB); + break; case 467: //Set light level lines[i].args[0] = tag; lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; diff --git a/src/p_spec.c b/src/p_spec.c index e6dcf118a..a4d358361 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2812,7 +2812,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 441: // Trigger unlockable if ((!modifiedgame || savemoddata) && !(netgame || multiplayer)) { - INT32 trigid = (INT32)(sides[line->sidenum[0]].textureoffset>>FRACBITS); + INT32 trigid = line->args[0]; if (trigid < 0 || trigid > 31) // limited by 32 bit variable CONS_Debug(DBG_GAMELOGIC, "Unlockable trigger (sidedef %hu): bad trigger ID %d\n", line->sidenum[0], trigid); @@ -2880,9 +2880,9 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 444: // Earthquake camera { - quake.intensity = sides[line->sidenum[0]].textureoffset; - quake.radius = sides[line->sidenum[0]].rowoffset; - quake.time = P_AproxDistance(line->dx, line->dy)>>FRACBITS; + quake.intensity = line->args[1] << FRACBITS; + quake.radius = line->args[2] << FRACBITS; + quake.time = line->args[0]; quake.epicenter = NULL; /// \todo @@ -3060,57 +3060,48 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; } case 448: // Change skybox viewpoint/centerpoint - if ((mo && mo->player && P_IsLocalPlayer(mo->player)) || (line->flags & ML_NOCLIMB)) + if ((mo && mo->player && P_IsLocalPlayer(mo->player)) || line->args[3]) { - INT32 viewid = sides[line->sidenum[0]].textureoffset>>FRACBITS; - INT32 centerid = sides[line->sidenum[0]].rowoffset>>FRACBITS; + INT32 viewid = line->args[0]; + INT32 centerid = line->args[1]; - if ((line->flags & (ML_EFFECT4|ML_BLOCKMONSTERS)) == ML_EFFECT4) // Solid Midtexture is on but Block Enemies is off? + // set viewpoint mobj + if (line->args[2] != TMS_CENTERPOINT) { - CONS_Alert(CONS_WARNING, - M_GetText("Skybox switch linedef (tag %d) doesn't have anything to do.\nConsider changing the linedef's flag configuration or removing it entirely.\n"), - tag); + if (viewid >= 0 && viewid < 16) + skyboxmo[0] = skyboxviewpnts[viewid]; + else + skyboxmo[0] = NULL; } - else - { - // set viewpoint mobj - if (!(line->flags & ML_EFFECT4)) // Solid Midtexture turns off viewpoint setting - { - if (viewid >= 0 && viewid < 16) - skyboxmo[0] = skyboxviewpnts[viewid]; - else - skyboxmo[0] = NULL; - } - // set centerpoint mobj - if (line->flags & ML_BLOCKMONSTERS) // Block Enemies turns ON centerpoint setting - { - if (centerid >= 0 && centerid < 16) - skyboxmo[1] = skyboxcenterpnts[centerid]; - else - skyboxmo[1] = NULL; - } + // set centerpoint mobj + if (line->args[2] != TMS_VIEWPOINT) + { + if (centerid >= 0 && centerid < 16) + skyboxmo[1] = skyboxcenterpnts[centerid]; + else + skyboxmo[1] = NULL; } CONS_Debug(DBG_GAMELOGIC, "Line type 448 Executor: viewid = %d, centerid = %d, viewpoint? = %s, centerpoint? = %s\n", viewid, centerid, - ((line->flags & ML_EFFECT4) ? "no" : "yes"), - ((line->flags & ML_BLOCKMONSTERS) ? "yes" : "no")); + ((line->args[2] == TMS_CENTERPOINT) ? "no" : "yes"), + ((line->args[2] == TMS_VIEWPOINT) ? "no" : "yes")); } break; case 449: // Enable bosses with parameter { - INT32 bossid = sides[line->sidenum[0]].textureoffset>>FRACBITS; + INT32 bossid = line->args[0]; if (bossid & ~15) // if any bits other than first 16 are set { CONS_Alert(CONS_WARNING, - M_GetText("Boss enable linedef (tag %d) has an invalid texture x offset.\nConsider changing it or removing it entirely.\n"), - tag); + M_GetText("Boss enable linedef has an invalid boss ID (%d).\nConsider changing it or removing it entirely.\n"), + bossid); break; } - if (line->flags & ML_NOCLIMB) + if (line->args[1]) { bossdisabled |= (1<args[0], mo, NULL); break; case 451: // Execute Random Linedef Executor { - INT32 rvalue1 = sides[line->sidenum[0]].textureoffset>>FRACBITS; - INT32 rvalue2 = sides[line->sidenum[0]].rowoffset>>FRACBITS; + INT32 rvalue1 = line->args[0]; + INT32 rvalue2 = line->args[1]; INT32 result; if (rvalue1 <= rvalue2) @@ -3500,8 +3491,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 460: // Award rings { - INT16 rings = (sides[line->sidenum[0]].textureoffset>>FRACBITS); - INT32 delay = (sides[line->sidenum[0]].rowoffset>>FRACBITS); + INT16 rings = line->args[0]; + INT32 delay = line->args[1]; if (mo && mo->player) { if (delay <= 0 || !(leveltime % delay)) @@ -3641,7 +3632,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 466: // Set level failure state { - if (line->flags & ML_NOCLIMB) + if (line->args[1]) { stagefailed = false; CONS_Debug(DBG_GAMELOGIC, "Stage can be completed successfully!\n"); diff --git a/src/p_spec.h b/src/p_spec.h index c81839f22..caaf259db 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -139,6 +139,13 @@ typedef enum TMB_SYNC = 1<<1, } textmapblinkinglightflags_t; +typedef enum +{ + TMS_VIEWPOINT = 0, + TMS_CENTERPOINT = 1, + TMS_BOTH = 2, +} textmapskybox_t; + typedef enum { TMSD_FRONT = 0, From 3a73c6167ccbbe1c9286c99043552253d91d936a Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 20 Sep 2021 14:42:21 +0200 Subject: [PATCH 131/377] Adapt linedef type 439 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 23 ++++++++++++++++ src/p_setup.c | 5 ++++ src/p_spec.c | 29 +++++++++++--------- 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 9447a53ad..27d8454dd 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -3050,6 +3050,29 @@ udmf } } + 439 + { + title = "Change Tagged Linedef's Textures"; + prefix = "(439)"; + arg0 + { + title = "Target linedef tag"; + type = 15; + } + arg1 + { + title = "Affected sides"; + type = 11; + enum = "frontbackboth"; + } + arg2 + { + title = "Change unset textures?"; + type = 11; + enum = "yesno"; + } + } + 440 { title = "Start Metal Sonic Race"; diff --git a/src/p_setup.c b/src/p_setup.c index 782253cbd..1476e1d43 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3824,6 +3824,11 @@ static void P_ConvertBinaryMap(void) lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = !!(lines[i].flags & ML_NOCLIMB); break; + case 439: //Change tagged linedef's textures + lines[i].args[0] = tag; + lines[i].args[1] = TMSD_FRONTBACK; + lines[i].args[2] = !!(lines[i].flags & ML_NOCLIMB); + break; case 441: //Condition set trigger lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; break; diff --git a/src/p_spec.c b/src/p_spec.c index a4d358361..11a03056f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2776,30 +2776,33 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) { size_t linenum; side_t *set = &sides[line->sidenum[0]], *this; - boolean always = !(line->flags & ML_NOCLIMB); // If noclimb: Only change mid texture if mid texture already exists on tagged lines, etc. + boolean always = !(line->args[2]); // If args[2] is set: Only change mid texture if mid texture already exists on tagged lines, etc. for (linenum = 0; linenum < numlines; linenum++) { if (lines[linenum].special == 439) continue; // Don't override other set texture lines! - if (!Tag_Find(&lines[linenum].tags, tag)) + if (!Tag_Find(&lines[linenum].tags, line->args[0])) continue; // Find tagged lines // Front side - this = &sides[lines[linenum].sidenum[0]]; - if (always || this->toptexture) this->toptexture = set->toptexture; - if (always || this->midtexture) this->midtexture = set->midtexture; - if (always || this->bottomtexture) this->bottomtexture = set->bottomtexture; - - if (lines[linenum].sidenum[1] == 0xffff) - continue; // One-sided stops here. + if (line->args[1] != TMSD_BACK) + { + this = &sides[lines[linenum].sidenum[0]]; + if (always || this->toptexture) this->toptexture = set->toptexture; + if (always || this->midtexture) this->midtexture = set->midtexture; + if (always || this->bottomtexture) this->bottomtexture = set->bottomtexture; + } // Back side - this = &sides[lines[linenum].sidenum[1]]; - if (always || this->toptexture) this->toptexture = set->toptexture; - if (always || this->midtexture) this->midtexture = set->midtexture; - if (always || this->bottomtexture) this->bottomtexture = set->bottomtexture; + if (line->args[1] != TMSD_FRONT && lines[linenum].sidenum[1] != 0xffff) + { + this = &sides[lines[linenum].sidenum[1]]; + if (always || this->toptexture) this->toptexture = set->toptexture; + if (always || this->midtexture) this->midtexture = set->midtexture; + if (always || this->bottomtexture) this->bottomtexture = set->bottomtexture; + } } } break; From 1bbf1b2887893405eea1bddb11dbf9a393a87111 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 20 Sep 2021 14:50:18 +0200 Subject: [PATCH 132/377] Adapt linedef type 438 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 13 ++++++++++++- src/p_setup.c | 3 +++ src/p_spec.c | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 27d8454dd..e6e26b579 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2955,6 +2955,17 @@ udmf } } + 438 + { + title = "Change Object Size"; + prefix = "(438)"; + arg0 + { + title = "Size (%)"; + default = 100; + } + } + 460 { title = "Award Rings"; @@ -3191,7 +3202,7 @@ udmf } arg1 { - title = Effect"; + title = "Effect"; type = 11; enum { diff --git a/src/p_setup.c b/src/p_setup.c index 1476e1d43..0ea997eda 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3824,6 +3824,9 @@ static void P_ConvertBinaryMap(void) lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = !!(lines[i].flags & ML_NOCLIMB); break; + case 438: //Change object size + lines[i].args[0] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + break; case 439: //Change tagged linedef's textures lines[i].args[0] = tag; lines[i].args[1] = TMSD_FRONTBACK; diff --git a/src/p_spec.c b/src/p_spec.c index 11a03056f..135670720 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2764,7 +2764,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 438: // Set player scale if (mo) { - mo->destscale = FixedDiv(P_AproxDistance(line->dx, line->dy), 100<destscale = FixedDiv(line->args[0]<destscale < FRACUNIT/100) mo->destscale = FRACUNIT/100; if (mo->player && bot) From 76c6b6f24f171a9f68a5a146d9741961edd531be Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 20 Sep 2021 15:07:08 +0200 Subject: [PATCH 133/377] Forgot to adapt half of linedef type 449 --- src/p_spec.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 135670720..efc5bc868 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6776,15 +6776,15 @@ void P_SpawnSpecials(boolean fromnetsave) case 449: // Enable bosses with parameter { - INT32 bossid = sides[*lines[i].sidenum].textureoffset>>FRACBITS; + INT32 bossid = lines[i].args[0]; if (bossid & ~15) // if any bits other than first 16 are set { CONS_Alert(CONS_WARNING, - M_GetText("Boss enable linedef (tag %d) has an invalid texture x offset.\nConsider changing it or removing it entirely.\n"), - tag); + M_GetText("Boss enable linedef has an invalid boss ID (%d).\nConsider changing it or removing it entirely.\n"), + bossid); break; } - if (!(lines[i].flags & ML_NOCLIMB)) + if (!(lines[i].args[1])) { bossdisabled |= (1< Date: Tue, 21 Sep 2021 07:36:54 +0200 Subject: [PATCH 134/377] Adapt linedef types 425 and 442 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 42 ++++++++++++++++ src/p_setup.c | 30 +++++++++++- src/p_spec.c | 50 +++++++++++--------- 3 files changed, 97 insertions(+), 25 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index e6e26b579..ad7109769 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2885,6 +2885,17 @@ udmf { title = "Linedef Executor (player/object)"; + 425 + { + title = "Change Object State"; + prefix = "(425)"; + stringarg0 + { + title = "State"; + type = 2; + } + } + 426 { title = "Stop Object"; @@ -2966,6 +2977,37 @@ udmf } } + 442 + { + title = "Change Object Type State"; + prefix = "(442)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Change to"; + type = 11; + enum + { + 0 = "Specified state"; + 1 = "Next state"; + } + } + stringarg0 + { + title = "Object type"; + type = 2; + } + stringarg1 + { + title = "State"; + type = 2; + } + } + 460 { title = "Award Rings"; diff --git a/src/p_setup.c b/src/p_setup.c index 0ea997eda..c05fa5aae 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1292,9 +1292,7 @@ static void P_LoadSidedefs(UINT8 *data) case 334: // Trigger linedef executor: Object dye - Continuous case 335: // Trigger linedef executor: Object dye - Each time case 336: // Trigger linedef executor: Object dye - Once - case 425: // Calls P_SetMobjState on calling mobj case 434: // Custom Power - case 442: // Calls P_SetMobjState on mobjs of a given type in the tagged sectors case 461: // Spawns an object on the map based on texture offsets case 463: // Colorizes an object { @@ -1316,6 +1314,8 @@ static void P_LoadSidedefs(UINT8 *data) case 331: // Trigger linedef executor: Skin - Continuous case 332: // Trigger linedef executor: Skin - Each time case 333: // Trigger linedef executor: Skin - Once + case 425: // Calls P_SetMobjState on calling mobj + case 442: // Calls P_SetMobjState on mobjs of a given type in the tagged sectors case 443: // Calls a named Lua function case 459: // Control text prompt (named tag) { @@ -3780,6 +3780,13 @@ static void P_ConvertBinaryMap(void) lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = !!(lines[i].flags & ML_NOCLIMB); break; + case 425: //Change object state + if (sides[lines[i].sidenum[0]].text) + { + lines[i].stringargs[0] = Z_Malloc(strlen(sides[lines[i].sidenum[0]].text) + 1, PU_LEVEL, NULL); + M_Memcpy(lines[i].stringargs[0], sides[lines[i].sidenum[0]].text, strlen(sides[lines[i].sidenum[0]].text) + 1); + } + break; case 426: //Stop object lines[i].args[0] = !!(lines[i].flags & ML_NOCLIMB); break; @@ -3835,6 +3842,25 @@ static void P_ConvertBinaryMap(void) case 441: //Condition set trigger lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; break; + case 442: //Change object type state + lines[i].args[0] = tag; + if (sides[lines[i].sidenum[0]].text) + { + lines[i].stringargs[0] = Z_Malloc(strlen(sides[lines[i].sidenum[0]].text) + 1, PU_LEVEL, NULL); + M_Memcpy(lines[i].stringargs[0], sides[lines[i].sidenum[0]].text, strlen(sides[lines[i].sidenum[0]].text) + 1); + } + if (lines[i].sidenum[1] == 0xffff) + lines[i].args[1] = 1; + else + { + lines[i].args[1] = 0; + if (sides[lines[i].sidenum[1]].text) + { + lines[i].stringargs[1] = Z_Malloc(strlen(sides[lines[i].sidenum[1]].text) + 1, PU_LEVEL, NULL); + M_Memcpy(lines[i].stringargs[1], sides[lines[i].sidenum[1]].text, strlen(sides[lines[i].sidenum[1]].text) + 1); + } + } + break; case 443: //Call Lua function if (lines[i].text) { diff --git a/src/p_spec.c b/src/p_spec.c index efc5bc868..14363bb1d 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2576,7 +2576,11 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 425: // Calls P_SetMobjState on calling mobj if (mo && !mo->player) - P_SetMobjState(mo, sides[line->sidenum[0]].toptexture); //P_AproxDistance(line->dx, line->dy)>>FRACBITS); + { + statenum_t state = line->stringargs[0] ? get_number(line->stringargs[0]) : S_NULL; + if (state >= 0 && state < NUMSTATES) + P_SetMobjState(mo, state); + } break; case 426: // Moves the mobj to its sector's soundorg and on the floor, and stops it @@ -2838,37 +2842,37 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 442: // Calls P_SetMobjState on mobjs of a given type in the tagged sectors { - const mobjtype_t type = (mobjtype_t)sides[line->sidenum[0]].toptexture; + const mobjtype_t type = line->stringargs[0] ? get_number(line->stringargs[0]) : MT_NULL; statenum_t state = NUMSTATES; - sector_t *sec; mobj_t *thing; - if (line->sidenum[1] != 0xffff) - state = (statenum_t)sides[line->sidenum[1]].toptexture; + if (type < 0 || type >= NUMMOBJTYPES) + break; - TAG_ITER_SECTORS(tag, secnum) + if (!line->args[1]) + { + state = line->stringargs[1] ? get_number(line->stringargs[1]) : S_NULL; + + if (state < 0 || state >= NUMSTATES) + break; + } + + TAG_ITER_SECTORS(line->args[0], secnum) { boolean tryagain; - sec = sectors + secnum; do { tryagain = false; - for (thing = sec->thinglist; thing; thing = thing->snext) - if (thing->type == type) - { - if (state != NUMSTATES) - { - if (!P_SetMobjState(thing, state)) // set state to specific state - { // mobj was removed - tryagain = true; // snext is corrupt, we'll have to start over. - break; - } - } - else if (!P_SetMobjState(thing, thing->state->nextstate)) // set state to nextstate - { // mobj was removed - tryagain = true; // snext is corrupt, we'll have to start over. - break; - } + for (thing = sectors[secnum].thinglist; thing; thing = thing->snext) + { + if (thing->type != type) + continue; + + if (!P_SetMobjState(thing, line->args[1] ? thing->state->nextstate : state)) + { // mobj was removed + tryagain = true; // snext is corrupt, we'll have to start over. + break; } + } } while (tryagain); } break; From 17bd20a15ec565e1aec078975970e02d460c984a Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Sep 2021 07:44:55 +0200 Subject: [PATCH 135/377] Adapt linedef type 463 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 16 ++++++++++++++++ src/p_setup.c | 9 ++++++++- src/p_spec.c | 4 ++-- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index ad7109769..d00321707 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -952,6 +952,11 @@ doom title = "Stop Timer/Exit Stage in Record Attack"; prefix = "(462)"; } + 463 + { + title = "Dye Object"; + prefix = "(463)"; + } 466 { title = "Set Level Failure State"; @@ -3028,6 +3033,17 @@ udmf prefix = "(462)"; } + 463 + { + title = "Dye Object"; + prefix = "(463)"; + stringarg0 + { + title = "Skin color"; + type = 2; + } + } + 466 { title = "Set Level Failure State"; diff --git a/src/p_setup.c b/src/p_setup.c index c05fa5aae..92b425665 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1294,7 +1294,6 @@ static void P_LoadSidedefs(UINT8 *data) case 336: // Trigger linedef executor: Object dye - Once case 434: // Custom Power case 461: // Spawns an object on the map based on texture offsets - case 463: // Colorizes an object { char process[8*3+1]; memset(process,0,8*3+1); @@ -1318,6 +1317,7 @@ static void P_LoadSidedefs(UINT8 *data) case 442: // Calls P_SetMobjState on mobjs of a given type in the tagged sectors case 443: // Calls a named Lua function case 459: // Control text prompt (named tag) + case 463: // Colorizes an object { char process[8*3+1]; memset(process,0,8*3+1); @@ -3948,6 +3948,13 @@ static void P_ConvertBinaryMap(void) lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; break; + case 463: //Dye object + if (sides[lines[i].sidenum[0]].text) + { + lines[i].stringargs[0] = Z_Malloc(strlen(sides[lines[i].sidenum[0]].text) + 1, PU_LEVEL, NULL); + M_Memcpy(lines[i].stringargs[0], sides[lines[i].sidenum[0]].text, strlen(sides[lines[i].sidenum[0]].text) + 1); + } + break; case 466: //Set level failure state lines[i].args[0] = !!(lines[i].flags & ML_NOCLIMB); break; diff --git a/src/p_spec.c b/src/p_spec.c index 14363bb1d..2527c57c3 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3565,10 +3565,10 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 463: // Dye object { - INT32 color = sides[line->sidenum[0]].toptexture; - if (mo) { + INT32 color = line->stringargs[0] ? get_number(line->stringargs[0]) : SKINCOLOR_NONE; + if (color < 0 || color >= numskincolors) return; From ea1d442f31b2be3c6e6d091d2ac6bd47bf3efd87 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Sep 2021 08:34:55 +0200 Subject: [PATCH 136/377] Adapt linedef type 434 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 16 +++++++++++++ src/p_setup.c | 24 +++++++++++++++++++- src/p_spec.c | 10 +++----- 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index d00321707..14f19b905 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2955,6 +2955,22 @@ udmf } } + 434 + { + title = "Award Power-Up"; + prefix = "(434)"; + stringarg0 + { + title = "Power"; + type = 2; + } + stringarg1 + { + title = "Duration/Amount"; + type = 2; + } + } + 437 { title = "Disable Player Control"; diff --git a/src/p_setup.c b/src/p_setup.c index 92b425665..0a0976cc8 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1292,7 +1292,6 @@ static void P_LoadSidedefs(UINT8 *data) case 334: // Trigger linedef executor: Object dye - Continuous case 335: // Trigger linedef executor: Object dye - Each time case 336: // Trigger linedef executor: Object dye - Once - case 434: // Custom Power case 461: // Spawns an object on the map based on texture offsets { char process[8*3+1]; @@ -1314,6 +1313,7 @@ static void P_LoadSidedefs(UINT8 *data) case 332: // Trigger linedef executor: Skin - Each time case 333: // Trigger linedef executor: Skin - Once case 425: // Calls P_SetMobjState on calling mobj + case 434: // Custom Power case 442: // Calls P_SetMobjState on mobjs of a given type in the tagged sectors case 443: // Calls a named Lua function case 459: // Control text prompt (named tag) @@ -3823,6 +3823,28 @@ static void P_ConvertBinaryMap(void) case 433: //Enable/disable gravity flip lines[i].args[0] = !!(lines[i].flags & ML_NOCLIMB); break; + case 434: //Award power-up + if (sides[lines[i].sidenum[0]].text) + { + lines[i].stringargs[0] = Z_Malloc(strlen(sides[lines[i].sidenum[0]].text) + 1, PU_LEVEL, NULL); + M_Memcpy(lines[i].stringargs[0], sides[lines[i].sidenum[0]].text, strlen(sides[lines[i].sidenum[0]].text) + 1); + } + if (lines[i].sidenum[1] != 0xffff && lines[i].flags & ML_BLOCKMONSTERS) // read power from back sidedef + { + lines[i].stringargs[1] = Z_Malloc(strlen(sides[lines[i].sidenum[1]].text) + 1, PU_LEVEL, NULL); + M_Memcpy(lines[i].stringargs[1], sides[lines[i].sidenum[1]].text, strlen(sides[lines[i].sidenum[1]].text) + 1); + } + else if (lines[i].flags & ML_NOCLIMB) // 'Infinite' + { + lines[i].stringargs[1] = Z_Malloc(3, PU_LEVEL, NULL); + M_Memcpy(lines[i].stringargs[1], "-1", 3); + } + else + { + lines[i].stringargs[1] = Z_Malloc(7, PU_LEVEL, NULL); + snprintf(lines[i].stringargs[1], 7, "%d", sides[lines[i].sidenum[0]].textureoffset >> FRACBITS); + } + break; case 435: //Change plane scroller direction lines[i].args[0] = tag; lines[i].args[1] = R_PointToDist2(lines[i].v2->x, lines[i].v2->y, lines[i].v1->x, lines[i].v1->y) >> FRACBITS; diff --git a/src/p_spec.c b/src/p_spec.c index 2527c57c3..4f2a091d1 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2669,14 +2669,10 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) { mobj_t *dummy = P_SpawnMobj(mo->x, mo->y, mo->z, MT_NULL); - var1 = sides[line->sidenum[0]].toptexture; //(line->dx>>FRACBITS)-1; - - if (line->sidenum[1] != 0xffff && line->flags & ML_BLOCKMONSTERS) // read power from back sidedef - var2 = sides[line->sidenum[1]].toptexture; - else if (line->flags & ML_NOCLIMB) // 'Infinite' + var1 = line->stringargs[0] ? get_number(line->stringargs[0]) : 0; + var2 = line->stringargs[1] ? get_number(line->stringargs[1]) : 0; + if (var2 == -1) // 'Infinite' var2 = UINT16_MAX; - else - var2 = sides[line->sidenum[0]].textureoffset>>FRACBITS; P_SetTarget(&dummy->target, mo); A_CustomPower(dummy); From 69e0c636a0236170e806ed3fd17d3cfd4d0bdcbd Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Sep 2021 09:05:40 +0200 Subject: [PATCH 137/377] Adapt linedef type 459 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 35 ++++++++++++++++++++ src/p_setup.c | 24 ++++++++++++++ src/p_spec.c | 26 +++++++-------- src/p_spec.h | 11 ++++++ 4 files changed, 83 insertions(+), 13 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 14f19b905..a33e54d68 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -3366,6 +3366,41 @@ udmf } } + 459 + { + title = "Control Text Prompt"; + prefix = "(459)"; + arg0 + { + title = "Prompt number"; + } + arg1 + { + title = "Page number"; + } + arg2 + { + title = "Flags"; + type = 11; + enum + { + 1 = "Close current text prompt"; + 2 = "Trigger linedef executor on close"; + 4 = "Find prompt by name"; + 8 = "Don't disable controls"; + } + } + arg3 + { + title = "Trigger linedef tag"; + type = 15; + } + stringarg0 + { + title = "Prompt name"; + } + } + 465 { title = "Set Linedef Executor Delay"; diff --git a/src/p_setup.c b/src/p_setup.c index 0a0976cc8..181c4eada 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3966,6 +3966,30 @@ static void P_ConvertBinaryMap(void) case 456: //Stop fading colormap lines[i].args[0] = Tag_FGet(&lines[i].tags); break; + case 459: //Control text prompt + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + if (lines[i].flags & ML_BLOCKMONSTERS) + lines[i].args[2] |= TMP_CLOSE; + if (lines[i].flags & ML_EFFECT1) + lines[i].args[2] |= TMP_RUNPOSTEXEC; + if (lines[i].flags & ML_TFERLINE) + lines[i].args[2] |= TMP_CALLBYNAME; + if (lines[i].flags & ML_EFFECT2) + lines[i].args[2] |= TMP_KEEPCONTROLS; + if (lines[i].flags & ML_EFFECT3) + lines[i].args[2] |= TMP_KEEPREALTIME; + /*if (lines[i].flags & ML_NOCLIMB) + lines[i].args[2] |= TMP_ALLPLAYERS; + if (lines[i].flags & ML_EFFECT4) + lines[i].args[2] |= ML_EFFECT4;*/ + lines[i].args[3] = (lines[i].sidenum[1] != 0xFFFF) ? sides[lines[i].sidenum[1]].textureoffset >> FRACBITS : tag; + if (sides[lines[i].sidenum[0]].text) + { + lines[i].stringargs[0] = Z_Malloc(strlen(sides[lines[i].sidenum[0]].text) + 1, PU_LEVEL, NULL); + M_Memcpy(lines[i].stringargs[0], sides[lines[i].sidenum[0]].text, strlen(sides[lines[i].sidenum[0]].text) + 1); + } + break; case 460: //Award rings lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; diff --git a/src/p_spec.c b/src/p_spec.c index 4f2a091d1..8e469e8e9 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3466,27 +3466,27 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; case 459: // Control Text Prompt - // console player only unless NOCLIMB is set + // console player only if (mo && mo->player && P_IsLocalPlayer(mo->player) && (!bot || bot != mo)) { - INT32 promptnum = max(0, (sides[line->sidenum[0]].textureoffset>>FRACBITS)-1); - INT32 pagenum = max(0, (sides[line->sidenum[0]].rowoffset>>FRACBITS)-1); - INT32 postexectag = abs((line->sidenum[1] != 0xFFFF) ? sides[line->sidenum[1]].textureoffset>>FRACBITS : tag); + INT32 promptnum = max(0, line->args[0] - 1); + INT32 pagenum = max(0, line->args[1] - 1); + INT32 postexectag = abs(line->args[3]); - boolean closetextprompt = (line->flags & ML_BLOCKMONSTERS); - //boolean allplayers = (line->flags & ML_NOCLIMB); - boolean runpostexec = (line->flags & ML_EFFECT1); - boolean blockcontrols = !(line->flags & ML_EFFECT2); - boolean freezerealtime = !(line->flags & ML_EFFECT3); - //boolean freezethinkers = (line->flags & ML_EFFECT4); - boolean callbynamedtag = (line->flags & ML_TFERLINE); + boolean closetextprompt = (line->args[2] & TMP_CLOSE); + //boolean allplayers = (line->args[2] & TMP_ALLPLAYERS); + boolean runpostexec = (line->args[2] & TMP_RUNPOSTEXEC); + boolean blockcontrols = !(line->args[2] & TMP_KEEPCONTROLS); + boolean freezerealtime = !(line->args[2] & TMP_KEEPREALTIME); + //boolean freezethinkers = (line->args[2] & TMP_FREEZETHINKERS); + boolean callbynamedtag = (line->args[2] & TMP_CALLBYNAME); if (closetextprompt) F_EndTextPrompt(false, false); else { - if (callbynamedtag && sides[line->sidenum[0]].text && sides[line->sidenum[0]].text[0]) - F_GetPromptPageByNamedTag(sides[line->sidenum[0]].text, &promptnum, &pagenum); + if (callbynamedtag && line->stringargs[0] && line->stringargs[0][0]) + F_GetPromptPageByNamedTag(line->stringargs[0], &promptnum, &pagenum); F_StartTextPrompt(promptnum, pagenum, mo, runpostexec ? postexectag : 0, blockcontrols, freezerealtime); } } diff --git a/src/p_spec.h b/src/p_spec.h index caaf259db..07f566e2a 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -146,6 +146,17 @@ typedef enum TMS_BOTH = 2, } textmapskybox_t; +typedef enum +{ + TMP_CLOSE = 1, + TMP_RUNPOSTEXEC = 1<<1, + TMP_CALLBYNAME = 1<<2, + TMP_KEEPCONTROLS = 1<<3, + TMP_KEEPREALTIME = 1<<4, + //TMP_ALLPLAYERS = 1<<5, + //TMP_FREEZETHINKERS = 1<<6, +} textmappromptflags_t; + typedef enum { TMSD_FRONT = 0, From 890934264b577b123f70cd8042442980fcaa79af Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Sep 2021 10:14:55 +0200 Subject: [PATCH 138/377] Adapt linedef type 414 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 39 ++++ src/p_setup.c | 59 +++++- src/p_spec.c | 196 ++++++++++--------- src/p_spec.h | 15 ++ 4 files changed, 212 insertions(+), 97 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index a33e54d68..10a2f768f 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -3081,6 +3081,45 @@ udmf { title = "Linedef Executor (misc.)"; + 414 + { + title = "Play Sound Effect"; + prefix = "(414)"; + arg0 + { + title = "Source"; + type = 11; + enum + { + 0 = "Triggering object"; + 1 = "Trigger sector"; + 2 = "Nowhere"; + 3 = "Tagged sectors"; + } + } + arg1 + { + title = "Listener"; + type = 11; + enum + { + 0 = "Triggering player"; + 1 = "Everyone"; + 2 = "Everyone touching tagged sectors"; + } + } + arg2 + { + title = "Target sector tag"; + type = 13; + } + stringarg0 + { + title = "Sound name"; + type = 2; + } + } + 415 { title = "Run Script"; diff --git a/src/p_setup.c b/src/p_setup.c index 181c4eada..f834cd3fa 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1273,7 +1273,6 @@ static void P_LoadSidedefs(UINT8 *data) } case 4: // Speed pad parameters - case 414: // Play SFX { sd->toptexture = sd->midtexture = sd->bottomtexture = 0; if (msd->toptexture[0] != '-' || msd->toptexture[1] != '\0') @@ -1286,6 +1285,20 @@ static void P_LoadSidedefs(UINT8 *data) break; } + case 414: // Play SFX + { + sd->toptexture = sd->midtexture = sd->bottomtexture = 0; + if (msd->toptexture[0] != '-' || msd->toptexture[1] != '\0') + { + char process[8 + 1]; + M_Memcpy(process, msd->toptexture, 8); + process[8] = '\0'; + sd->text = Z_Malloc(strlen(process) + 1, PU_LEVEL, NULL); + M_Memcpy(sd->text, process, strlen(process) + 1); + } + break; + } + case 9: // Mace parameters case 14: // Bustable block parameters case 15: // Fan particle spawner parameters @@ -3696,6 +3709,50 @@ static void P_ConvertBinaryMap(void) case 411: //Stop plane movement lines[i].args[0] = tag; break; + case 414: //Play sound effect + lines[i].args[2] = tag; + if (tag != 0) + { + if (lines[i].flags & ML_EFFECT5) + { + lines[i].args[0] = TMSS_TAGGEDSECTOR; + lines[i].args[1] = TMSL_EVERYONE; + } + else + { + lines[i].args[0] = TMSS_NOWHERE; + lines[i].args[1] = TMSL_TAGGEDSECTOR; + } + } + else + { + if (lines[i].flags & ML_NOCLIMB) + { + lines[i].args[0] = TMSS_NOWHERE; + lines[i].args[1] = TMSL_TRIGGERER; + } + else if (lines[i].flags & ML_EFFECT4) + { + lines[i].args[0] = TMSS_NOWHERE; + lines[i].args[1] = TMSL_EVERYONE; + } + else if (lines[i].flags & ML_BLOCKMONSTERS) + { + lines[i].args[0] = TMSS_TRIGGERSECTOR; + lines[i].args[1] = TMSL_EVERYONE; + } + else + { + lines[i].args[0] = TMSS_TRIGGERMOBJ; + lines[i].args[1] = TMSL_EVERYONE; + } + } + if (sides[lines[i].sidenum[0]].text) + { + lines[i].stringargs[0] = Z_Malloc(strlen(sides[lines[i].sidenum[0]].text) + 1, PU_LEVEL, NULL); + M_Memcpy(lines[i].stringargs[0], sides[lines[i].sidenum[0]].text, strlen(sides[lines[i].sidenum[0]].text) + 1); + } + break; case 415: //Run script { INT32 scrnum; diff --git a/src/p_spec.c b/src/p_spec.c index 8e469e8e9..b828d97cd 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1906,6 +1906,105 @@ void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller) } } +static void P_PlaySFX(INT32 sfxnum, mobj_t *mo, sector_t *callsec, INT16 tag, textmapsoundsource_t source, textmapsoundlistener_t listener) +{ + if (sfxnum == sfx_None) + return; // Do nothing! + + if (sfxnum < sfx_None || sfxnum >= NUMSFX) + { + CONS_Debug(DBG_GAMELOGIC, "Line type 414 Executor: sfx number %d is invalid!\n", sfxnum); + return; + } + + // Check if you can hear the sound + switch (listener) + { + case TMSL_TRIGGERER: // only play sound if displayplayer + if (!mo) + return; + + if (!mo->player) + return; + + if (mo->player != &players[displayplayer] && mo->player != &players[secondarydisplayplayer]) + return; + + break; + case TMSL_TAGGEDSECTOR: // only play if touching tagged sectors + { + UINT8 i = 0; + mobj_t *camobj = players[displayplayer].mo; + ffloor_t *rover; + boolean foundit = false; + + for (i = 0; i < 2; camobj = players[secondarydisplayplayer].mo, i++) + { + if (!camobj) + continue; + + if (foundit || Tag_Find(&camobj->subsector->sector->tags, tag)) + { + foundit = true; + break; + } + + // Only trigger if mobj is touching the tag + for (rover = camobj->subsector->sector->ffloors; rover; rover = rover->next) + { + if (!Tag_Find(&rover->master->frontsector->tags, tag)) + continue; + + if (camobj->z > P_GetSpecialTopZ(camobj, sectors + rover->secnum, camobj->subsector->sector)) + continue; + + if (camobj->z + camobj->height < P_GetSpecialBottomZ(camobj, sectors + rover->secnum, camobj->subsector->sector)) + continue; + + foundit = true; + break; + } + } + + if (!foundit) + return; + + break; + } + case TMSL_EVERYONE: // no additional check + default: + break; + } + + // Play the sound from the specified source + switch (source) + { + case TMSS_TRIGGERMOBJ: // play the sound from mobj that triggered it + if (mo) + S_StartSound(mo, sfxnum); + break; + case TMSS_TRIGGERSECTOR: // play the sound from calling sector's soundorg + if (callsec) + S_StartSound(&callsec->soundorg, sfxnum); + else if (mo) + S_StartSound(&mo->subsector->sector->soundorg, sfxnum); + break; + case TMSS_NOWHERE: // play the sound from nowhere + S_StartSound(NULL, sfxnum); + break; + case TMSS_TAGGEDSECTOR: // play the sound from tagged sectors' soundorgs + { + INT32 secnum; + + TAG_ITER_SECTORS(tag, secnum) + S_StartSound(§ors[secnum].soundorg, sfxnum); + break; + } + default: + break; + } +} + static boolean is_rain_type (INT32 weathernum) { switch (weathernum) @@ -2368,102 +2467,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; case 414: // Play SFX - { - INT32 sfxnum; - - sfxnum = sides[line->sidenum[0]].toptexture; - - if (sfxnum == sfx_None) - return; // Do nothing! - if (sfxnum < sfx_None || sfxnum >= NUMSFX) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 414 Executor: sfx number %d is invalid!\n", sfxnum); - return; - } - - if (tag != 0) // Do special stuff only if a non-zero linedef tag is set - { - // Play sounds from tagged sectors' origins. - if (line->flags & ML_EFFECT5) // Repeat Midtexture - { - // Additionally play the sound from tagged sectors' soundorgs - sector_t *sec; - - TAG_ITER_SECTORS(tag, secnum) - { - sec = §ors[secnum]; - S_StartSound(&sec->soundorg, sfxnum); - } - } - - // Play the sound without origin for anyone, as long as they're inside tagged areas. - else - { - UINT8 i = 0; - mobj_t* camobj = players[displayplayer].mo; - ffloor_t *rover; - boolean foundit = false; - - for (i = 0; i < 2; camobj = players[secondarydisplayplayer].mo, i++) - { - if (!camobj) - continue; - - if (foundit || Tag_Find(&camobj->subsector->sector->tags, tag)) - { - foundit = true; - break; - } - - // Only trigger if mobj is touching the tag - for(rover = camobj->subsector->sector->ffloors; rover; rover = rover->next) - { - if (!Tag_Find(&rover->master->frontsector->tags, tag)) - continue; - - if (camobj->z > P_GetSpecialTopZ(camobj, sectors + rover->secnum, camobj->subsector->sector)) - continue; - - if (camobj->z + camobj->height < P_GetSpecialBottomZ(camobj, sectors + rover->secnum, camobj->subsector->sector)) - continue; - - foundit = true; - break; - } - } - - if (foundit) - S_StartSound(NULL, sfxnum); - } - } - else - { - if (line->flags & ML_NOCLIMB) - { - // play the sound from nowhere, but only if display player triggered it - if (mo && mo->player && (mo->player == &players[displayplayer] || mo->player == &players[secondarydisplayplayer])) - S_StartSound(NULL, sfxnum); - } - else if (line->flags & ML_EFFECT4) - { - // play the sound from nowhere - S_StartSound(NULL, sfxnum); - } - else if (line->flags & ML_BLOCKMONSTERS) - { - // play the sound from calling sector's soundorg - if (callsec) - S_StartSound(&callsec->soundorg, sfxnum); - else if (mo) - S_StartSound(&mo->subsector->sector->soundorg, sfxnum); - } - else if (mo) - { - // play the sound from mobj that triggered it - S_StartSound(mo, sfxnum); - } - } - } + P_PlaySFX(line->stringargs[0] ? get_number(line->stringargs[0]) : sfx_None, mo, callsec, line->args[2], line->args[0], line->args[1]); break; case 415: // Run a script diff --git a/src/p_spec.h b/src/p_spec.h index 07f566e2a..aeb557bf6 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -112,6 +112,21 @@ typedef enum TMP_BOTH = 2, } textmapplanes_t; +typedef enum +{ + TMSS_TRIGGERMOBJ = 0, + TMSS_TRIGGERSECTOR = 1, + TMSS_NOWHERE = 2, + TMSS_TAGGEDSECTOR = 3, +} textmapsoundsource_t; + +typedef enum +{ + TMSL_EVERYONE = 0, + TMSL_TRIGGERER = 1, + TMSL_TAGGEDSECTOR = 2, +} textmapsoundlistener_t; + typedef enum { TML_SECTOR = 0, From cabafeef1c5edb9a8ff863ae83fcff18bb0a611e Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Sep 2021 10:35:01 +0200 Subject: [PATCH 139/377] Adapt linedef type 464 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 22 ++++++++++++++++++++ src/p_setup.c | 7 +++++++ src/p_spec.c | 4 ++-- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 10a2f768f..45e22b8d6 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -957,6 +957,11 @@ doom title = "Dye Object"; prefix = "(463)"; } + 464 + { + title = "Trigger Egg Capsule"; + prefix = "(464)"; + } 466 { title = "Set Level Failure State"; @@ -3060,6 +3065,23 @@ udmf } } + 464 + { + title = "Trigger Egg Capsule"; + prefix = "(464)"; + arg0 + { + title = "Egg Capsule tag"; + type = 14; + } + arg1 + { + title = "End level?"; + type = 11; + enum = "yesno"; + } + } + 466 { title = "Set Level Failure State"; diff --git a/src/p_setup.c b/src/p_setup.c index f834cd3fa..71575abaf 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4058,6 +4058,10 @@ static void P_ConvertBinaryMap(void) M_Memcpy(lines[i].stringargs[0], sides[lines[i].sidenum[0]].text, strlen(sides[lines[i].sidenum[0]].text) + 1); } break; + case 464: //Trigger egg capsule + lines[i].args[0] = tag; + lines[i].args[1] = !!(lines[i].flags & ML_NOCLIMB); + break; case 466: //Set level failure state lines[i].args[0] = !!(lines[i].flags & ML_NOCLIMB); break; @@ -4416,6 +4420,9 @@ static void P_ConvertBinaryMap(void) { switch (mapthings[i].type) { + case 291: + Tag_FSet(&mapthings[i].tags, mapthings[i].angle); + break; case 750: Tag_FSet(&mapthings[i].tags, mapthings[i].angle); break; diff --git a/src/p_spec.c b/src/p_spec.c index b828d97cd..256d6997e 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3599,13 +3599,13 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (!mo2->spawnpoint) continue; - if (mo2->spawnpoint->angle != tag) + if (!Tag_Find(&mo2->spawnpoint->tags, line->args[0])) continue; P_KillMobj(mo2, NULL, mo, 0); } - if (!(line->flags & ML_NOCLIMB)) + if (!(line->args[1])) { INT32 i; From d47069fbb6586eca742b49f984b116e87b4e5d09 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Sep 2021 11:30:34 +0200 Subject: [PATCH 140/377] Adapt linedef types 409 and 410 to UDMF --- extras/conf/SRB2-22.cfg | 4 ++ extras/conf/udb/Includes/SRB222_linedefs.cfg | 49 ++++++++++++++++++++ src/p_setup.c | 19 ++++++++ src/p_spec.c | 39 ++++++++++++++-- src/p_spec.h | 7 +++ src/taglist.c | 35 ++++++++++++++ src/taglist.h | 3 ++ 7 files changed, 153 insertions(+), 3 deletions(-) diff --git a/extras/conf/SRB2-22.cfg b/extras/conf/SRB2-22.cfg index 608fe508f..58f082201 100644 --- a/extras/conf/SRB2-22.cfg +++ b/extras/conf/SRB2-22.cfg @@ -2021,14 +2021,18 @@ linedeftypes { title = "Change Tagged Sector's Tag"; prefix = "(409)"; + flags2text = "[1] Remove tag"; flags8text = "[3] Set delay by backside sector"; + flags64text = "[6] Add tag"; } 410 { title = "Change Front Sector's Tag"; prefix = "(410)"; + flags2text = "[1] Remove tag"; flags8text = "[3] Set delay by backside sector"; + flags64text = "[6] Add tag"; } 416 diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 45e22b8d6..70c416f70 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2570,6 +2570,55 @@ udmf } } + 409 + { + title = "Change Tagged Sector's Tag"; + prefix = "(409)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Tag"; + type = 13; + } + arg2 + { + title = "Behavior"; + type = 11; + enum + { + 0 = "Add tag"; + 1 = "Remove tag"; + 2 = "Replace first tag"; + } + } + } + + 410 + { + title = "Change Front Sector's Tag"; + prefix = "(410)"; + arg0 + { + title = "Tag"; + type = 13; + } + arg1 + { + title = "Behavior"; + type = 11; + enum + { + 0 = "Add tag"; + 1 = "Remove tag"; + 2 = "Replace first tag"; + } + } + } + 416 { title = "Start Adjustable Flickering Light"; diff --git a/src/p_setup.c b/src/p_setup.c index 71575abaf..d64aff1bf 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3706,6 +3706,25 @@ static void P_ConvertBinaryMap(void) else lines[i].args[1] = TMP_BOTH; break; + case 409: //Change tagged sector's tag + lines[i].args[0] = tag; + lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[2] = TMT_ADD; + else if (lines[i].flags & ML_BLOCKMONSTERS) + lines[i].args[2] = TMT_REMOVE; + else + lines[i].args[2] = TMT_REPLACEFIRST; + break; + case 410: //Change front sector's tag + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[1] = TMT_ADD; + else if (lines[i].flags & ML_BLOCKMONSTERS) + lines[i].args[1] = TMT_REMOVE; + else + lines[i].args[1] = TMT_REPLACEFIRST; + break; case 411: //Stop plane movement lines[i].args[0] = tag; break; diff --git a/src/p_spec.c b/src/p_spec.c index 256d6997e..589b31145 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2293,14 +2293,47 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 409: // Change tagged sectors' tag // (formerly "Change calling sectors' tag", but behavior was changed) { - TAG_ITER_SECTORS(tag, secnum) - Tag_SectorFSet(secnum,(INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS)); + mtag_t newtag = line->args[1]; + + TAG_ITER_SECTORS(line->args[0], secnum) + { + switch (line->args[2]) + { + case TMT_ADD: + Tag_SectorAdd(secnum, newtag); + break; + case TMT_REMOVE: + Tag_SectorRemove(secnum, newtag); + break; + case TMT_REPLACEFIRST: + default: + Tag_SectorFSet(secnum, newtag); + break; + } + } break; } case 410: // Change front sector's tag - Tag_SectorFSet((UINT32)(line->frontsector - sectors), (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS)); + { + mtag_t newtag = line->args[1]; + secnum = (UINT32)(line->frontsector - sectors); + + switch (line->args[2]) + { + case TMT_ADD: + Tag_SectorAdd(secnum, newtag); + break; + case TMT_REMOVE: + Tag_SectorRemove(secnum, newtag); + break; + case TMT_REPLACEFIRST: + default: + Tag_SectorFSet(secnum, newtag); + break; + } break; + } case 411: // Stop floor/ceiling movement in tagged sector(s) TAG_ITER_SECTORS(line->args[0], secnum) diff --git a/src/p_spec.h b/src/p_spec.h index aeb557bf6..09a14d9a1 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -112,6 +112,13 @@ typedef enum TMP_BOTH = 2, } textmapplanes_t; +typedef enum +{ + TMT_ADD = 0, + TMT_REMOVE = 1, + TMT_REPLACEFIRST = 2, +} textmaptagoptions_t; + typedef enum { TMSS_TRIGGERMOBJ = 0, diff --git a/src/taglist.c b/src/taglist.c index ad1b9dc4b..f78f0c82b 100644 --- a/src/taglist.c +++ b/src/taglist.c @@ -37,6 +37,25 @@ void Tag_Add (taglist_t* list, const mtag_t tag) list->tags[list->count++] = tag; } +/// Removes a tag from a given element's taglist. +/// \warning This does not rebuild the global taggroups, which are used for iteration. +void Tag_Remove(taglist_t* list, const mtag_t tag) +{ + UINT16 i; + + for (i = 0; i < list->count; i++) + { + if (list->tags[i] != tag) + continue; + + for (; i+1 < list->count; i++) + list->tags[i] = list->tags[i+1]; + + list->tags = Z_Realloc(list->tags, (list->count - 1) * sizeof(mtag_t), PU_LEVEL, NULL); + return; + } +} + /// Sets the first tag entry in a taglist. /// Replicates the old way of accessing element->tag. void Tag_FSet (taglist_t* list, const mtag_t tag) @@ -376,6 +395,22 @@ INT32 P_FindSpecialLineFromTag(INT16 special, INT16 tag, INT32 start) // Ingame list manipulation. +/// Adds the tag to the given sector, and updates the global taggroups. +void Tag_SectorAdd (const size_t id, const mtag_t tag) +{ + sector_t* sec = §ors[id]; + Tag_Add(&sec->tags, tag); + Taggroup_Add(tags_sectors, tag, id); +} + +/// Removes the tag from the given sector, and updates the global taggroups. +void Tag_SectorRemove (const size_t id, const mtag_t tag) +{ + sector_t* sec = §ors[id]; + Tag_Remove(&sec->tags, tag); + Taggroup_Remove(tags_sectors, tag, id); +} + /// Changes the first tag for a given sector, and updates the global taggroups. void Tag_SectorFSet (const size_t id, const mtag_t tag) { diff --git a/src/taglist.h b/src/taglist.h index d045eb827..f15423d7a 100644 --- a/src/taglist.h +++ b/src/taglist.h @@ -28,12 +28,15 @@ typedef struct } taglist_t; void Tag_Add (taglist_t* list, const mtag_t tag); +void Tag_Remove (taglist_t* list, const mtag_t tag); void Tag_FSet (taglist_t* list, const mtag_t tag); mtag_t Tag_FGet (const taglist_t* list); boolean Tag_Find (const taglist_t* list, const mtag_t tag); boolean Tag_Share (const taglist_t* list1, const taglist_t* list2); boolean Tag_Compare (const taglist_t* list1, const taglist_t* list2); +void Tag_SectorAdd (const size_t id, const mtag_t tag); +void Tag_SectorRemove (const size_t id, const mtag_t tag); void Tag_SectorFSet (const size_t id, const mtag_t tag); /// Taggroup list. It is essentially just an element id list. From 2e120953ec2b06ffa376e009336228f1b106dd84 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Sep 2021 11:35:04 +0200 Subject: [PATCH 141/377] Fix typo in linedef type 400 conversion --- extras/conf/SRB2-22.cfg | 1 + src/p_setup.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/extras/conf/SRB2-22.cfg b/extras/conf/SRB2-22.cfg index 608fe508f..bcb823aa3 100644 --- a/extras/conf/SRB2-22.cfg +++ b/extras/conf/SRB2-22.cfg @@ -2000,6 +2000,7 @@ linedeftypes title = "Set Tagged Sector's Ceiling Height/Texture"; prefix = "(401)"; flags8text = "[3] Set delay by backside sector"; + flags64text = "[6] Keep floor flat"; } 402 diff --git a/src/p_setup.c b/src/p_setup.c index 27bfdc4c9..1e65a2dfd 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3622,7 +3622,7 @@ static void P_ConvertBinaryMap(void) case 401: //Set tagged sector's ceiling height/texture lines[i].args[0] = tag; lines[i].args[1] = lines[i].special - 400; - lines[i].args[2] = !!(lines[i].flags & ML_NOCLIMB); + lines[i].args[2] = !(lines[i].flags & ML_NOCLIMB); lines[i].special = 400; break; case 403: //Move tagged sector's floor From f1ad91ab34f750569b0d88099f8bc56e23c9d075 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Sep 2021 11:47:59 +0200 Subject: [PATCH 142/377] Add linedef type 467 to ZB config --- extras/conf/SRB2-22.cfg | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/extras/conf/SRB2-22.cfg b/extras/conf/SRB2-22.cfg index 608fe508f..dae5cc700 100644 --- a/extras/conf/SRB2-22.cfg +++ b/extras/conf/SRB2-22.cfg @@ -2004,7 +2004,7 @@ linedeftypes 402 { - title = "Set Tagged Sector's Light Level"; + title = "Copy Light Level to Tagged Sectors"; prefix = "(402)"; flags8text = "[3] Set delay by backside sector"; } @@ -2086,6 +2086,14 @@ linedeftypes prefix = "(435)"; flags8text = "[3] Set delay by backside sector"; } + + 467 + { + title = "Set Tagged Sector's Light Level"; + prefix = "(467)"; + flags8text = "[3] Set delay by backside sector"; + flags256text = "[8] Set relative to current"; + } } linedefexecplane From dbf6cd8b420170c6c557f7d00547e6834922c40e Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Sep 2021 11:52:29 +0200 Subject: [PATCH 143/377] Add linedef type 76 to ZB config --- extras/conf/SRB2-22.cfg | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/extras/conf/SRB2-22.cfg b/extras/conf/SRB2-22.cfg index f457fe972..b26dc6a28 100644 --- a/extras/conf/SRB2-22.cfg +++ b/extras/conf/SRB2-22.cfg @@ -771,6 +771,13 @@ linedeftypes flags2text = "[1] Use control sector tag"; flags64text = "[6] No sound effect"; } + + 76 + { + title = "Make FOF Bouncy"; + prefix = "(76)"; + flags16384text = "[14] Dampen"; + } } polyobject @@ -1273,7 +1280,7 @@ linedeftypes 160 { - title = "Floating, Bobbing"; + title = "Water Bobbing"; prefix = "(160)"; flags8text = "[3] Slope skew sides"; flags32text = "[5] Only block player"; From 19823fadbcf208a121a3d964e2bf825219c8f2e1 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Sep 2021 11:55:15 +0200 Subject: [PATCH 144/377] Mark bouncy FOF sector type as deprecated in ZB config --- extras/conf/SRB2-22.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/conf/SRB2-22.cfg b/extras/conf/SRB2-22.cfg index b26dc6a28..fd12b5c81 100644 --- a/extras/conf/SRB2-22.cfg +++ b/extras/conf/SRB2-22.cfg @@ -425,7 +425,7 @@ sectortypes 12 = "Space Countdown"; 13 = "Ramp Sector (double step-up/down)"; 14 = "Non-Ramp Sector (no step-down)"; - 15 = "Bouncy FOF"; + 15 = "Bouncy FOF "; 16 = "Trigger Line Ex. (Pushable Objects)"; 32 = "Trigger Line Ex. (Anywhere, All Players)"; 48 = "Trigger Line Ex. (Floor Touch, All Players)"; @@ -475,7 +475,7 @@ gen_sectortypes 12 = "Space Countdown"; 13 = "Ramp Sector (double step-up/down)"; 14 = "Non-Ramp Sector (no step-down)"; - 15 = "Bouncy FOF"; + 15 = "Bouncy FOF "; } second From 41d18bc591081690898b46dc44697e7aa67b8f80 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Sep 2021 12:55:22 +0200 Subject: [PATCH 145/377] Binary-to-UDMF conversion: Set up mapthing tags before global taglists are built --- src/p_setup.c | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index d64aff1bf..85e558b25 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3117,6 +3117,25 @@ static void P_AddBinaryMapTags(void) P_AddBinaryMapTagsFromLine(lines[i].backsector, &lines[i]); } } + + for (i = 0; i < nummapthings; i++) + { + switch (mapthings[i].type) + { + case 291: + case 750: + case 760: + case 761: + case 762: + Tag_FSet(&mapthings[i].tags, mapthings[i].angle); + break; + case 780: + Tag_FSet(&mapthings[i].tags, mapthings[i].extrainfo); + break; + default: + break; + } + } } //For maps in binary format, converts setup of specials to UDMF format. @@ -4439,23 +4458,11 @@ static void P_ConvertBinaryMap(void) { switch (mapthings[i].type) { - case 291: - Tag_FSet(&mapthings[i].tags, mapthings[i].angle); - break; - case 750: - Tag_FSet(&mapthings[i].tags, mapthings[i].angle); - break; - case 760: - case 761: - Tag_FSet(&mapthings[i].tags, mapthings[i].angle); - break; case 762: { INT32 check = -1; INT32 firstline = -1; - mtag_t tag = mapthings[i].angle; - - Tag_FSet(&mapthings[i].tags, tag); + mtag_t tag = Tag_FGet(&mapthings[i].tags); TAG_ITER_LINES(tag, check) { @@ -4472,9 +4479,6 @@ static void P_ConvertBinaryMap(void) mapthings[i].type = 761; break; } - case 780: - Tag_FSet(&mapthings[i].tags, mapthings[i].extrainfo); - break; default: break; } From 8b6140ddb232360dd48f90cd8f25a7d5fba6ee1c Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Sep 2021 12:55:56 +0200 Subject: [PATCH 146/377] Linedef type 464: Use taglist search to find egg capsule center --- src/p_spec.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 589b31145..8a8997697 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3614,25 +3614,19 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 464: // Trigger Egg Capsule { - thinker_t *th; + INT32 mtnum; mobj_t *mo2; // Find the center of the Eggtrap and release all the pretty animals! // The chimps are my friends.. heeheeheheehehee..... - LouisJM - for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) + TAG_ITER_THINGS(line->args[0], mtnum) { - if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) + mo2 = mapthings[mtnum].mobj; + + if (!mo2) continue; - mo2 = (mobj_t *)th; - - if (mo2->type != MT_EGGTRAP) - continue; - - if (!mo2->spawnpoint) - continue; - - if (!Tag_Find(&mo2->spawnpoint->tags, line->args[0])) + if (mo2->thinker.function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) continue; P_KillMobj(mo2, NULL, mo, 0); From be480eead042dacf5c814b9269cef19ec90d093c Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Sep 2021 12:59:20 +0200 Subject: [PATCH 147/377] Linedef type 464: Re-add mobjtype check that I accidentally removed --- src/p_spec.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/p_spec.c b/src/p_spec.c index 8a8997697..50b0a9125 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3626,6 +3626,9 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (!mo2) continue; + if (mo2->type != MT_EGGTRAP) + continue; + if (mo2->thinker.function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) continue; From d8b5cb6c909319230352c5204c0c9f2e008e2661 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Sep 2021 14:59:58 +0200 Subject: [PATCH 148/377] Adapt linedef type 422 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 15 ++++ src/p_setup.c | 5 ++ src/p_spec.c | 72 ++++++++++++-------- 3 files changed, 65 insertions(+), 27 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 70c416f70..ffda8082a 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -3202,6 +3202,21 @@ udmf } } + 422 + { + title = "Switch to Cut-Away View"; + prefix = "(422)"; + arg0 + { + title = "Viewpoint tag"; + type = 14; + } + arg1 + { + title = "Time"; + } + } + 423 { title = "Change Sky"; diff --git a/src/p_setup.c b/src/p_setup.c index 85e558b25..1e3581ce7 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3870,6 +3870,11 @@ static void P_ConvertBinaryMap(void) case 421: //Stop lighting effect lines[i].args[0] = tag; break; + case 422: //Switch to cut-away view + lines[i].args[0] = tag; + lines[i].args[1] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + lines[i].args[2] = (lines[i].flags & ML_NOCLIMB) ? sides[lines[i].sidenum[0]].textureoffset >> FRACBITS : 0; + break; case 423: //Change sky case 424: //Change weather lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; diff --git a/src/p_spec.c b/src/p_spec.c index 50b0a9125..a00f2c094 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2187,6 +2187,39 @@ static mobj_t *P_GetObjectTypeInSectorNum(mobjtype_t type, size_t s) return NULL; } +static mobj_t* P_FindObjectTypeFromTag(mobjtype_t type, mtag_t tag) +{ + if (udmf) + { + INT32 mtnum; + mobj_t *mo; + + TAG_ITER_THINGS(tag, mtnum) + { + mo = mapthings[mtnum].mobj; + + if (!mo) + continue; + + if (mo->type != type) + continue; + + return mo; + } + + return NULL; + } + else + { + INT32 secnum; + + if ((secnum = Tag_Iterate_Sectors(tag, 0)) < 0) + return NULL; + + return P_GetObjectTypeInSectorNum(type, secnum); + } +} + /** Processes the line special triggered by an object. * * \param line Line with the special command on it. @@ -2550,15 +2583,13 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 422: // Cut away to another view { mobj_t *altview; + INT32 aim; if ((!mo || !mo->player) && !titlemapinaction) // only players have views, and title screens return; - if ((secnum = Tag_Iterate_Sectors(tag, 0)) < 0) - return; - - altview = P_GetObjectTypeInSectorNum(MT_ALTVIEWMAN, secnum); - if (!altview) + altview = P_FindObjectTypeFromTag(MT_ALTVIEWMAN, line->args[0]); + if (!altview || !altview->spawnpoint) return; // If titlemap, set the camera ref for title's thinker @@ -2568,31 +2599,18 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) else { P_SetTarget(&mo->player->awayviewmobj, altview); - mo->player->awayviewtics = P_AproxDistance(line->dx, line->dy)>>FRACBITS; + mo->player->awayviewtics = line->args[1]; } - - if (line->flags & ML_NOCLIMB) // lets you specify a vertical angle - { - INT32 aim; - - aim = sides[line->sidenum[0]].textureoffset>>FRACBITS; - aim = (aim + 360) % 360; - aim *= (ANGLE_90>>8); - aim /= 90; - aim <<= 8; - if (titlemapinaction) - titlemapcameraref->cusval = (angle_t)aim; - else - mo->player->awayviewaiming = (angle_t)aim; - } + aim = udmf ? altview->spawnpoint->pitch : line->args[2]; + aim = (aim + 360) % 360; + aim *= (ANGLE_90>>8); + aim /= 90; + aim <<= 8; + if (titlemapinaction) + titlemapcameraref->cusval = (angle_t)aim; else - { - // straight ahead - if (!titlemapinaction) - mo->player->awayviewaiming = 0; - // don't do cusval cause that's annoying - } + mo->player->awayviewaiming = (angle_t)aim; } break; From 132f3f21f1006de7855c3c75577266ec835369bd Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Sep 2021 15:10:50 +0200 Subject: [PATCH 149/377] Adapt linedef type 457 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 37 ++++++++++++++++++++ src/p_setup.c | 7 ++++ src/p_spec.c | 14 +++----- 3 files changed, 49 insertions(+), 9 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index ffda8082a..cf81b56dd 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -3083,6 +3083,43 @@ udmf } } + 457 + { + title = "Track Object's Angle"; + prefix = "(457)"; + arg0 + { + title = "Anchor tag"; + type = 14; + } + arg1 + { + title = "Angle tolerance"; + type = 8; + } + arg2 + { + title = "Time tolerance"; + } + arg3 + { + title = "Trigger linedef tag"; + type = 15; + } + arg4 + { + title = "Track after failure?"; + type = 11; + enum = "noyes"; + } + } + + 458 + { + title = "Stop Tracking Object's Angle"; + prefix = "(458)"; + } + 460 { title = "Award Rings"; diff --git a/src/p_setup.c b/src/p_setup.c index 1e3581ce7..8e9d73e4b 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4066,6 +4066,13 @@ static void P_ConvertBinaryMap(void) case 456: //Stop fading colormap lines[i].args[0] = Tag_FGet(&lines[i].tags); break; + case 457: //Track object's angle + lines[i].args[0] = tag; + lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[2] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[3] = (lines[i].sidenum[1] != 0xffff) ? sides[lines[i].sidenum[1]].rowoffset >> FRACBITS : 0; + lines[i].args[4] = !!(lines[i].flags & ML_EFFECT2); + break; case 459: //Control text prompt lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; diff --git a/src/p_spec.c b/src/p_spec.c index a00f2c094..57f9237dc 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3488,17 +3488,13 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 457: // Track mobj angle to point if (mo) { - INT32 failureangle = FixedAngle((min(max(abs(sides[line->sidenum[0]].textureoffset>>FRACBITS), 0), 360))*FRACUNIT); - INT32 failuredelay = abs(sides[line->sidenum[0]].rowoffset>>FRACBITS); - INT32 failureexectag = line->sidenum[1] != 0xffff ? - (INT32)(sides[line->sidenum[1]].textureoffset>>FRACBITS) : 0; - boolean persist = (line->flags & ML_EFFECT2); + INT32 failureangle = FixedAngle((min(max(abs(line->args[1]), 0), 360))*FRACUNIT); + INT32 failuredelay = abs(line->args[2]); + INT32 failureexectag = line->args[3]; + boolean persist = !!(line->args[4]); mobj_t *anchormo; - if ((secnum = Tag_Iterate_Sectors(tag, 0)) < 0) - return; - - anchormo = P_GetObjectTypeInSectorNum(MT_ANGLEMAN, secnum); + anchormo = P_FindObjectTypeFromTag(MT_ANGLEMAN, line->args[0]); if (!anchormo) return; From 61e9adf30bb0f8142f7bab0b721ee2f955e62cf0 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Sep 2021 15:31:53 +0200 Subject: [PATCH 150/377] Adapt linedef type 412 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 35 ++++++++++++++++++++ src/p_setup.c | 14 ++++++++ src/p_spec.c | 32 +++++++++--------- src/p_spec.h | 8 +++++ 4 files changed, 72 insertions(+), 17 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index cf81b56dd..a08c61463 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2944,6 +2944,41 @@ udmf { title = "Linedef Executor (player/object)"; + 412 + { + title = "Teleporter"; + prefix = "(412)"; + arg0 + { + title = "Destination tag"; + type = 14; + } + arg1 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Silent"; + 2 = "Keep angle"; + 4 = "Keep momentum"; + 8 = "Relative silent"; + } + } + arg2 + { + title = "X offset"; + } + arg3 + { + title = "Y offset"; + } + arg4 + { + title = "Z offset"; + } + } + 425 { title = "Change Object State"; diff --git a/src/p_setup.c b/src/p_setup.c index 8e9d73e4b..879f2fb17 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3747,6 +3747,20 @@ static void P_ConvertBinaryMap(void) case 411: //Stop plane movement lines[i].args[0] = tag; break; + case 412: //Teleporter + lines[i].args[0] = tag; + if (lines[i].flags & ML_BLOCKMONSTERS) + lines[i].args[1] |= TMT_SILENT; + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[1] |= TMT_KEEPANGLE; + if (lines[i].flags & ML_EFFECT4) + lines[i].args[1] |= TMT_KEEPMOMENTUM; + if (lines[i].flags & ML_EFFECT3) + lines[i].args[1] |= TMT_RELATIVE; + lines[i].args[2] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[3] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[4] = lines[i].frontsector->ceilingheight >> FRACBITS; + break; case 414: //Play sound effect lines[i].args[2] = tag; if (tag != 0) diff --git a/src/p_spec.c b/src/p_spec.c index 57f9237dc..bf6e05b7f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2238,7 +2238,6 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) { INT32 secnum = -1; mobj_t *bot = NULL; - mtag_t tag = Tag_FGet(&line->tags); I_Assert(!mo || !P_MobjWasRemoved(mo)); // If mo is there, mo must be valid! @@ -2403,13 +2402,13 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (!mo) // nothing to teleport return; - if (line->flags & ML_EFFECT3) // Relative silent teleport + if (line->args[1] & TMT_RELATIVE) // Relative silent teleport { fixed_t x, y, z; - x = sides[line->sidenum[0]].textureoffset; - y = sides[line->sidenum[0]].rowoffset; - z = line->frontsector->ceilingheight; + x = line->args[2] << FRACBITS; + y = line->args[3] << FRACBITS; + z = line->args[4] << FRACBITS; P_UnsetThingPosition(mo); mo->x += x; @@ -2439,23 +2438,22 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) } else { - if ((secnum = Tag_Iterate_Sectors(tag, 0)) < 0) - return; + angle_t angle; + boolean silent, keepmomentum; - dest = P_GetObjectTypeInSectorNum(MT_TELEPORTMAN, secnum); + dest = P_FindObjectTypeFromTag(MT_TELEPORTMAN, line->args[0]); if (!dest) return; + angle = (line->args[1] & TMT_KEEPANGLE) ? mo->angle : dest->angle; + silent = !!(line->args[1] & TMT_SILENT); + keepmomentum = !!(line->args[1] & TMT_KEEPMOMENTUM); + if (bot) - P_Teleport(bot, dest->x, dest->y, dest->z, (line->flags & ML_NOCLIMB) ? mo->angle : dest->angle, (line->flags & ML_BLOCKMONSTERS) == 0, (line->flags & ML_EFFECT4) == ML_EFFECT4); - if (line->flags & ML_BLOCKMONSTERS) - P_Teleport(mo, dest->x, dest->y, dest->z, (line->flags & ML_NOCLIMB) ? mo->angle : dest->angle, false, (line->flags & ML_EFFECT4) == ML_EFFECT4); - else - { - P_Teleport(mo, dest->x, dest->y, dest->z, (line->flags & ML_NOCLIMB) ? mo->angle : dest->angle, true, (line->flags & ML_EFFECT4) == ML_EFFECT4); - // Play the 'bowrwoosh!' sound - S_StartSound(dest, sfx_mixup); - } + P_Teleport(bot, dest->x, dest->y, dest->z, angle, !silent, keepmomentum); + P_Teleport(mo, dest->x, dest->y, dest->z, angle, !silent, keepmomentum); + if (!silent) + S_StartSound(dest, sfx_mixup); // Play the 'bowrwoosh!' sound } } break; diff --git a/src/p_spec.h b/src/p_spec.h index 09a14d9a1..c5c1c6162 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -119,6 +119,14 @@ typedef enum TMT_REPLACEFIRST = 2, } textmaptagoptions_t; +typedef enum +{ + TMT_SILENT = 1, + TMT_KEEPANGLE = 1<<1, + TMT_KEEPMOMENTUM = 1<<2, + TMT_RELATIVE = 1<<3, +} textmapteleportflags_t; + typedef enum { TMSS_TRIGGERMOBJ = 0, From df7b22ac8ab37aa78dadb0ea13fde54c70a8603a Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Sep 2021 15:34:47 +0200 Subject: [PATCH 151/377] Minor cleanup in P_ConvertBinaryMap --- src/p_setup.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 879f2fb17..155985a41 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4012,7 +4012,7 @@ static void P_ConvertBinaryMap(void) lines[i].args[2] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; break; case 447: //Change colormap - lines[i].args[0] = Tag_FGet(&lines[i].tags); + lines[i].args[0] = tag; if (lines[i].flags & ML_EFFECT3) lines[i].args[2] |= TMCF_RELATIVE; if (lines[i].flags & ML_EFFECT1) @@ -4058,7 +4058,7 @@ static void P_ConvertBinaryMap(void) abs(sides[lines[i].sidenum[1]].rowoffset >> FRACBITS) : abs(sides[lines[i].sidenum[0]].rowoffset >> FRACBITS)); - lines[i].args[0] = Tag_FGet(&lines[i].tags); + lines[i].args[0] = tag; if (lines[i].flags & ML_EFFECT4) lines[i].args[2] = speed; else @@ -4078,7 +4078,7 @@ static void P_ConvertBinaryMap(void) break; } case 456: //Stop fading colormap - lines[i].args[0] = Tag_FGet(&lines[i].tags); + lines[i].args[0] = tag; break; case 457: //Track object's angle lines[i].args[0] = tag; @@ -4345,7 +4345,7 @@ static void P_ConvertBinaryMap(void) lines[i].special = 600; break; case 606: //Colormap - lines[i].args[0] = Tag_FGet(&lines[i].tags); + lines[i].args[0] = tag; break; case 700: //Slope front sector floor case 701: //Slope front sector ceiling From 8ef8279764812a385fd1a4d18a69aa17f3ca71aa Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 22 Sep 2021 07:32:39 +0200 Subject: [PATCH 152/377] Adapt FOF-related linedef executors to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 164 +++++++++++++++++++ src/p_setup.c | 55 +++++++ src/p_spec.c | 109 ++++++------ src/p_spec.h | 26 +++ 4 files changed, 298 insertions(+), 56 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index a08c61463..9fbcc0a22 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -3332,6 +3332,22 @@ udmf } } + 436 + { + title = "Shatter FOF"; + prefix = "(436)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Control sector tag"; + type = 13; + } + } + 439 { title = "Change Tagged Linedef's Textures"; @@ -3396,6 +3412,60 @@ udmf } } + 445 + { + title = "Make FOF Disappear/Reappear"; + prefix = "(445)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Control sector tag"; + type = 13; + } + arg2 + { + title = "Effect"; + type = 11; + enum + { + 0 = "Disappear"; + 1 = "Reappear"; + } + } + } + + 446 + { + title = "Make FOF Crumble"; + prefix = "(446)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Control sector tag"; + type = 13; + } + arg2 + { + title = "Respawn?"; + type = 11; + enum + { + 0 = "Yes"; + 1 = "No"; + 2 = "Unless FF_NORETURN"; + 3 = "Only if FF_NORETURN"; + } + } + } + 447 { title = "Change Tagged Sector's Colormap"; @@ -3510,6 +3580,100 @@ udmf } } + 452 + { + title = "Set FOF Translucency"; + prefix = "(452)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Control sector tag"; + type = 13; + } + arg2 + { + title = "Alpha"; + } + arg3 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Add to current translucency"; + 2 = "Don't handle FF_TRANSLUCENT"; + } + } + } + + 453 + { + title = "Fade FOF"; + prefix = "(453)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Control sector tag"; + type = 13; + } + arg2 + { + title = "Alpha"; + } + arg3 + { + title = "Fading speed"; + } + arg4 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Add to current translucency"; + 2 = "Interrupt ongoing fades"; + 4 = "Speed is duration"; + 8 = "Don't change collision"; + 16 = "No collision during fade"; + 32 = "Don't handle FF_TRANSLUCENT"; + 64 = "Don't handle FF_EXISTS"; + 128 = "Don't fade lighting"; + 256 = "Don't fade colormap"; + 512 = "Use exact alpha in OpenGL"; + } + } + } + + 454 + { + title = "Stop Fading FOF"; + prefix = "(454)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Control sector tag"; + type = 13; + } + arg2 + { + title = "Finalize collision?"; + type = 11; + enum = "yesno"; + } + } + 455 { title = "Fade Tagged Sector's Colormap"; diff --git a/src/p_setup.c b/src/p_setup.c index 155985a41..0e393d267 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3963,6 +3963,10 @@ static void P_ConvertBinaryMap(void) lines[i].args[0] = tag; lines[i].args[1] = R_PointToDist2(lines[i].v2->x, lines[i].v2->y, lines[i].v1->x, lines[i].v1->y) >> FRACBITS; break; + case 436: //Shatter FOF + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + break; case 437: //Disable player control lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = !!(lines[i].flags & ML_NOCLIMB); @@ -4011,6 +4015,19 @@ static void P_ConvertBinaryMap(void) lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[2] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; break; + case 445: //Make FOF disappear/reappear + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[2] = !!(lines[i].flags & ML_NOCLIMB); + break; + case 446: //Make FOF crumble + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[2] |= TMFR_NORETURN; + if (lines[i].flags & ML_BLOCKMONSTERS) + lines[i].args[2] |= TMFR_CHECKFLAG; + break; case 447: //Change colormap lines[i].args[0] = tag; if (lines[i].flags & ML_EFFECT3) @@ -4052,6 +4069,44 @@ static void P_ConvertBinaryMap(void) lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; break; + case 452: //Set FOF translucency + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[2] = lines[i].sidenum[1] != 0xffff ? (sides[lines[i].sidenum[1]].textureoffset >> FRACBITS) : (P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS); + if (lines[i].flags & ML_EFFECT3) + lines[i].args[3] |= TMST_RELATIVE; + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[3] |= TMST_DONTDOTRANSLUCENT; + break; + case 453: //Fade FOF + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[2] = lines[i].sidenum[1] != 0xffff ? (sides[lines[i].sidenum[1]].textureoffset >> FRACBITS) : (lines[i].dx >> FRACBITS); + lines[i].args[3] = lines[i].sidenum[1] != 0xffff ? (sides[lines[i].sidenum[1]].rowoffset >> FRACBITS) : (abs(lines[i].dy) >> FRACBITS); + if (lines[i].flags & ML_EFFECT3) + lines[i].args[4] |= TMFT_RELATIVE; + if (lines[i].flags & ML_EFFECT5) + lines[i].args[4] |= TMFT_OVERRIDE; + if (lines[i].flags & ML_EFFECT4) + lines[i].args[4] |= TMFT_TICBASED; + if (lines[i].flags & ML_BOUNCY) + lines[i].args[4] |= TMFT_IGNORECOLLISION; + if (lines[i].flags & ML_EFFECT1) + lines[i].args[4] |= TMFT_GHOSTFADE; + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[4] |= TMFT_DONTDOTRANSLUCENT; + if (lines[i].flags & ML_BLOCKMONSTERS) + lines[i].args[4] |= TMFT_DONTDOEXISTS; + if (lines[i].flags & ML_EFFECT2) + lines[i].args[4] |= (TMFT_DONTDOLIGHTING|TMFT_DONTDOCOLORMAP); + if (lines[i].flags & ML_TFERLINE) + lines[i].args[4] |= TMFT_USEEXACTALPHA; + break; + case 454: //Stop fading FOF + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[2] = !!(lines[i].flags & ML_BLOCKMONSTERS); + break; case 455: //Fade colormap { INT32 speed = (INT32)((((lines[i].flags & ML_DONTPEGBOTTOM) || !sides[lines[i].sidenum[0]].rowoffset) && lines[i].sidenum[1] != 0xFFFF) ? diff --git a/src/p_spec.c b/src/p_spec.c index bf6e05b7f..812577ed5 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2765,8 +2765,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 436: // Shatter block remotely { - INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); - INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); + INT16 sectag = (INT16)(line->args[0]); + INT16 foftag = (INT16)(line->args[1]); sector_t *sec; // Sector that the FOF is visible in ffloor_t *rover; // FOF that we are going to crumble boolean foundrover = false; // for debug, "Can't find a FOF" message @@ -2950,10 +2950,10 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; } - case 445: // Force block disappear remotely (reappear if noclimb) + case 445: // Force block disappear remotely (reappear if args[2] is set) { - INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); - INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); + INT16 sectag = (INT16)(line->args[0]); + INT16 foftag = (INT16)(line->args[1]); sector_t *sec; // Sector that the FOF is visible (or not visible) in ffloor_t *rover; // FOF to vanish/un-vanish boolean foundrover = false; // for debug, "Can't find a FOF" message @@ -2978,7 +2978,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) oldflags = rover->flags; // Abracadabra! - if (line->flags & ML_NOCLIMB) + if (line->args[2]) rover->flags |= FF_EXISTS; else rover->flags &= ~FF_EXISTS; @@ -3003,8 +3003,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 446: // Make block fall remotely (acts like FF_CRUMBLE) { - INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); - INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); + INT16 sectag = (INT16)(line->args[0]); + INT16 foftag = (INT16)(line->args[1]); sector_t *sec; // Sector that the FOF is visible in ffloor_t *rover; // FOF that we are going to make fall down boolean foundrover = false; // for debug, "Can't find a FOF" message @@ -3014,7 +3014,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (mo) // NULL check player = mo->player; - if (line->flags & ML_NOCLIMB) // don't respawn! + if (line->args[2] & TMFR_NORETURN) // don't respawn! respawn = false; TAG_ITER_SECTORS(sectag, secnum) @@ -3033,8 +3033,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) { foundrover = true; - if (line->flags & ML_BLOCKMONSTERS) // FOF flags determine respawn ability instead? - respawn = !(rover->flags & FF_NORETURN) ^ !!(line->flags & ML_NOCLIMB); // no climb inverts + if (line->args[2] & TMFR_CHECKFLAG) // FOF flags determine respawn ability instead? + respawn = !(rover->flags & FF_NORETURN) ^ !!(line->args[2] & TMFR_NORETURN); // TMFR_NORETURN inverts EV_StartCrumble(rover->master->frontsector, rover, (rover->flags & FF_FLOATBOB), player, rover->alpha, respawn); } @@ -3191,10 +3191,9 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 452: // Set FOF alpha { - INT16 destvalue = line->sidenum[1] != 0xffff ? - (INT16)(sides[line->sidenum[1]].textureoffset>>FRACBITS) : (INT16)(P_AproxDistance(line->dx, line->dy)>>FRACBITS); - INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); - INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); + INT16 destvalue = (INT16)(line->args[2]); + INT16 sectag = (INT16)(line->args[0]); + INT16 foftag = (INT16)(line->args[1]); sector_t *sec; // Sector that the FOF is visible in ffloor_t *rover; // FOF that we are going to operate boolean foundrover = false; // for debug, "Can't find a FOF" message @@ -3218,7 +3217,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) // If fading an invisible FOF whose render flags we did not yet set, // initialize its alpha to 1 // for relative alpha calc - if (!(line->flags & ML_NOCLIMB) && // do translucent + if (!(line->args[3] & TMST_DONTDOTRANSLUCENT) && // do translucent (rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE !(rover->spawnflags & FF_RENDERSIDES) && !(rover->spawnflags & FF_RENDERPLANES) && @@ -3228,16 +3227,16 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) P_RemoveFakeFloorFader(rover); P_FadeFakeFloor(rover, rover->alpha, - max(1, min(256, (line->flags & ML_EFFECT3) ? rover->alpha + destvalue : destvalue)), - 0, // set alpha immediately - false, NULL, // tic-based logic - false, // do not handle FF_EXISTS - !(line->flags & ML_NOCLIMB), // handle FF_TRANSLUCENT - false, // do not handle lighting - false, // do not handle colormap - false, // do not handle collision - false, // do not do ghost fade (no collision during fade) - true); // use exact alpha values (for opengl) + max(1, min(256, (line->args[3] & TMST_RELATIVE) ? rover->alpha + destvalue : destvalue)), + 0, // set alpha immediately + false, NULL, // tic-based logic + false, // do not handle FF_EXISTS + !(line->args[3] & TMST_DONTDOTRANSLUCENT), // handle FF_TRANSLUCENT + false, // do not handle lighting + false, // do not handle colormap + false, // do not handle collision + false, // do not do ghost fade (no collision during fade) + true); // use exact alpha values (for opengl) } } @@ -3252,12 +3251,10 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 453: // Fade FOF { - INT16 destvalue = line->sidenum[1] != 0xffff ? - (INT16)(sides[line->sidenum[1]].textureoffset>>FRACBITS) : (INT16)(line->dx>>FRACBITS); - INT16 speed = line->sidenum[1] != 0xffff ? - (INT16)(abs(sides[line->sidenum[1]].rowoffset>>FRACBITS)) : (INT16)(abs(line->dy)>>FRACBITS); - INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); - INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); + INT16 destvalue = (INT16)(line->args[2]); + INT16 speed = (INT16)(line->args[3]); + INT16 sectag = (INT16)(line->args[0]); + INT16 foftag = (INT16)(line->args[1]); sector_t *sec; // Sector that the FOF is visible in ffloor_t *rover; // FOF that we are going to operate boolean foundrover = false; // for debug, "Can't find a FOF" message @@ -3280,7 +3277,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) foundrover = true; // Prevent continuous execs from interfering on an existing fade - if (!(line->flags & ML_EFFECT5) + if (!(line->args[4] & TMFT_OVERRIDE) && rover->fadingdata) //&& ((fade_t*)rover->fadingdata)->timer > (ticbased ? 2 : speed*2)) { @@ -3292,21 +3289,21 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) P_AddFakeFloorFader(rover, secnum, j, destvalue, speed, - (line->flags & ML_EFFECT4), // tic-based logic - (line->flags & ML_EFFECT3), // Relative destvalue - !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS - !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT - !(line->flags & ML_EFFECT2), // do not handle lighting - !(line->flags & ML_EFFECT2), // do not handle colormap (ran out of flags) - !(line->flags & ML_BOUNCY), // do not handle collision - (line->flags & ML_EFFECT1), // do ghost fade (no collision during fade) - (line->flags & ML_TFERLINE)); // use exact alpha values (for opengl) + (line->args[4] & TMFT_TICBASED), // tic-based logic + (line->args[4] & TMFT_RELATIVE), // Relative destvalue + !(line->args[4] & TMFT_DONTDOEXISTS), // do not handle FF_EXISTS + !(line->args[4] & TMFT_DONTDOTRANSLUCENT), // do not handle FF_TRANSLUCENT + !(line->args[4] & TMFT_DONTDOLIGHTING), // do not handle lighting + !(line->args[4] & TMFT_DONTDOCOLORMAP), // do not handle colormap + !(line->args[4] & TMFT_IGNORECOLLISION), // do not handle collision + (line->args[4] & TMFT_GHOSTFADE), // do ghost fade (no collision during fade) + (line->args[4] & TMFT_USEEXACTALPHA)); // use exact alpha values (for opengl) else { // If fading an invisible FOF whose render flags we did not yet set, // initialize its alpha to 1 // for relative alpha calc - if (!(line->flags & ML_NOCLIMB) && // do translucent + if (!(line->args[4] & TMFT_DONTDOTRANSLUCENT) && // do translucent (rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE !(rover->spawnflags & FF_RENDERSIDES) && !(rover->spawnflags & FF_RENDERPLANES) && @@ -3316,16 +3313,16 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) P_RemoveFakeFloorFader(rover); P_FadeFakeFloor(rover, rover->alpha, - max(1, min(256, (line->flags & ML_EFFECT3) ? rover->alpha + destvalue : destvalue)), - 0, // set alpha immediately - false, NULL, // tic-based logic - !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS - !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT - !(line->flags & ML_EFFECT2), // do not handle lighting - !(line->flags & ML_EFFECT2), // do not handle colormap (ran out of flags) - !(line->flags & ML_BOUNCY), // do not handle collision - (line->flags & ML_EFFECT1), // do ghost fade (no collision during fade) - (line->flags & ML_TFERLINE)); // use exact alpha values (for opengl) + max(1, min(256, (line->args[4] & TMFT_RELATIVE) ? rover->alpha + destvalue : destvalue)), + 0, // set alpha immediately + false, NULL, // tic-based logic + !(line->args[4] & TMFT_DONTDOEXISTS), // do not handle FF_EXISTS + !(line->args[4] & TMFT_DONTDOTRANSLUCENT), // do not handle FF_TRANSLUCENT + !(line->args[4] & TMFT_DONTDOLIGHTING), // do not handle lighting + !(line->args[4] & TMFT_DONTDOCOLORMAP), // do not handle colormap + !(line->args[4] & TMFT_IGNORECOLLISION), // do not handle collision + (line->args[4] & TMFT_GHOSTFADE), // do ghost fade (no collision during fade) + (line->args[4] & TMFT_USEEXACTALPHA)); // use exact alpha values (for opengl) } } j++; @@ -3342,8 +3339,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 454: // Stop fading FOF { - INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); - INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); + INT16 sectag = (INT16)(line->args[0]); + INT16 foftag = (INT16)(line->args[1]); sector_t *sec; // Sector that the FOF is visible in ffloor_t *rover; // FOF that we are going to operate boolean foundrover = false; // for debug, "Can't find a FOF" message @@ -3365,7 +3362,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) foundrover = true; P_ResetFakeFloorFader(rover, NULL, - !(line->flags & ML_BLOCKMONSTERS)); // do not finalize collision flags + !(line->args[2])); // do not finalize collision flags } } diff --git a/src/p_spec.h b/src/p_spec.h index c5c1c6162..b8fbc3734 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -169,6 +169,32 @@ typedef enum TMB_SYNC = 1<<1, } textmapblinkinglightflags_t; +typedef enum +{ + TMFR_NORETURN = 1, + TMFR_CHECKFLAG = 1<<1, +} textmapfofrespawnflags_t; + +typedef enum +{ + TMST_RELATIVE = 1, + TMST_DONTDOTRANSLUCENT = 1<<1, +} textmapsettranslucencyflags_t; + +typedef enum +{ + TMFT_RELATIVE = 1, + TMFT_OVERRIDE = 1<<1, + TMFT_TICBASED = 1<<2, + TMFT_IGNORECOLLISION = 1<<3, + TMFT_GHOSTFADE = 1<<4, + TMFT_DONTDOTRANSLUCENT = 1<<5, + TMFT_DONTDOEXISTS = 1<<6, + TMFT_DONTDOLIGHTING = 1<<7, + TMFT_DONTDOCOLORMAP = 1<<8, + TMFT_USEEXACTALPHA = 1<<9, +} textmapfadetranslucencyflags_t; + typedef enum { TMS_VIEWPOINT = 0, From 03c1c592abc31e832e4b56a4b3384bc0d9b417a7 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 22 Sep 2021 08:57:48 +0200 Subject: [PATCH 153/377] I surrender - we need more linedef args (also adapt the remaining linedef executors to UDMF) --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 96 ++++++++++++++++++++ extras/conf/udb/Includes/SRB222_misc.cfg | 10 ++ src/doomdata.h | 2 +- src/p_setup.c | 55 ++++++++++- src/p_spec.c | 71 +++++++-------- src/p_spec.h | 10 ++ src/r_defs.h | 2 +- 7 files changed, 206 insertions(+), 40 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 9fbcc0a22..88f40b8ac 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -3169,6 +3169,52 @@ udmf } } + 461 + { + title = "Spawn Object"; + prefix = "(461)"; + arg0 + { + title = "X position"; + } + arg1 + { + title = "Y position"; + } + arg2 + { + title = "Z position"; + } + arg3 + { + title = "Angle"; + type = 8; + } + arg4 + { + title = "Randomize position?"; + type = 11; + enum = "noyes"; + } + arg5 + { + title = "Max X position"; + } + arg6 + { + title = "Max Y position"; + } + arg7 + { + title = "Max Z position"; + } + stringarg0 + { + title = "Object type"; + type = 2; + } + } + 462 { title = "Stop Timer/Exit Stage in Record Attack"; @@ -3224,6 +3270,56 @@ udmf { title = "Linedef Executor (misc.)"; + 413 + { + title = "Change Music"; + prefix = "(413)"; + arg0 + { + title = "Flags"; + type = 12; + enum + { + 1 = "For all players"; + 2 = "Seek offset from current position"; + 4 = "Fade to custom volume"; + 8 = "Don't reload after death"; + 16 = "Force music reload"; + 32 = "Don't loop"; + } + } + arg1 + { + title = "Position"; + } + arg2 + { + title = "Fade out time"; + } + arg3 + { + title = "Fade in time"; + } + arg4 + { + title = "Fade destination volume"; + } + arg5 + { + title = "Fade start volume"; + default = -1; + } + arg6 + { + title = "Track number"; + } + stringarg0 + { + title = "Music name"; + type = 2; + } + } + 414 { title = "Play Sound Effect"; diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 8e8b1d71a..1fd8f68b8 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -232,6 +232,16 @@ universalfields type = 0; default = 0; } + arg6 + { + type = 0; + default = 0; + } + arg7 + { + type = 0; + default = 0; + } stringarg0 { type = 2; diff --git a/src/doomdata.h b/src/doomdata.h index e317fec1b..7ba159a7c 100644 --- a/src/doomdata.h +++ b/src/doomdata.h @@ -196,7 +196,7 @@ typedef struct #pragma pack() #endif -#define NUMMAPTHINGARGS 6 +#define NUMMAPTHINGARGS 8 #define NUMMAPTHINGSTRINGARGS 2 // Thing definition, position, orientation and type, diff --git a/src/p_setup.c b/src/p_setup.c index 0e393d267..7b7396f74 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1305,7 +1305,6 @@ static void P_LoadSidedefs(UINT8 *data) case 334: // Trigger linedef executor: Object dye - Continuous case 335: // Trigger linedef executor: Object dye - Each time case 336: // Trigger linedef executor: Object dye - Once - case 461: // Spawns an object on the map based on texture offsets { char process[8*3+1]; memset(process,0,8*3+1); @@ -1330,6 +1329,7 @@ static void P_LoadSidedefs(UINT8 *data) case 442: // Calls P_SetMobjState on mobjs of a given type in the tagged sectors case 443: // Calls a named Lua function case 459: // Control text prompt (named tag) + case 461: // Spawns an object on the map based on texture offsets case 463: // Colorizes an object { char process[8*3+1]; @@ -3761,6 +3761,31 @@ static void P_ConvertBinaryMap(void) lines[i].args[3] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; lines[i].args[4] = lines[i].frontsector->ceilingheight >> FRACBITS; break; + case 413: //Change music + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[0] |= TMM_ALLPLAYERS; + if (lines[i].flags & ML_EFFECT1) + lines[i].args[0] |= TMM_OFFSET; + if (lines[i].flags & ML_EFFECT2) + lines[i].args[0] |= TMM_FADE; + if (lines[i].flags & ML_BLOCKMONSTERS) + lines[i].args[0] |= TMM_NORELOAD; + if (lines[i].flags & ML_BOUNCY) + lines[i].args[0] |= TMM_FORCERESET; + if (lines[i].flags & ML_EFFECT4) + lines[i].args[0] |= TMM_NOLOOP; + lines[i].args[1] = sides[lines[i].sidenum[0]].midtexture; + lines[i].args[2] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[3] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[4] = (lines[i].sidenum[1] != 0xffff) ? sides[lines[i].sidenum[1]].textureoffset >> FRACBITS : 0; + lines[i].args[5] = (lines[i].sidenum[1] != 0xffff) ? sides[lines[i].sidenum[1]].rowoffset >> FRACBITS : -1; + lines[i].args[6] = sides[lines[i].sidenum[0]].bottomtexture; + if (sides[lines[i].sidenum[0]].text) + { + lines[i].stringargs[0] = Z_Malloc(strlen(sides[lines[i].sidenum[0]].text) + 1, PU_LEVEL, NULL); + M_Memcpy(lines[i].stringargs[0], sides[lines[i].sidenum[0]].text, strlen(sides[lines[i].sidenum[0]].text) + 1); + } + break; case 414: //Play sound effect lines[i].args[2] = tag; if (tag != 0) @@ -4170,6 +4195,34 @@ static void P_ConvertBinaryMap(void) lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; break; + case 461: //Spawn object + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[2] = lines[i].frontsector->floorheight >> FRACBITS; + lines[i].args[3] = (lines[i].flags & ML_EFFECT1) ? AngleFixed(R_PointToAngle2(lines[i].v1->x, lines[i].v1->y, lines[i].v2->x, lines[i].v2->y)) >> FRACBITS : 0; + if (lines[i].flags & ML_NOCLIMB) + { + if (lines[i].sidenum[1] != 0xffff) // Make sure the linedef has a back side + { + lines[i].args[4] = 1; + lines[i].args[5] = sides[lines[i].sidenum[1]].textureoffset >> FRACBITS; + lines[i].args[6] = sides[lines[i].sidenum[1]].rowoffset >> FRACBITS; + lines[i].args[7] = lines[i].frontsector->ceilingheight >> FRACBITS; + } + else + { + CONS_Alert(CONS_WARNING, "Linedef Type %d - Spawn Object: Linedef is set for random range but has no back side.\n", lines[i].special); + lines[i].args[4] = 0; + } + } + else + lines[i].args[4] = 0; + if (sides[lines[i].sidenum[0]].text) + { + lines[i].stringargs[0] = Z_Malloc(strlen(sides[lines[i].sidenum[0]].text) + 1, PU_LEVEL, NULL); + M_Memcpy(lines[i].stringargs[0], sides[lines[i].sidenum[0]].text, strlen(sides[lines[i].sidenum[0]].text) + 1); + } + break; case 463: //Dye object if (sides[lines[i].sidenum[0]].text) { diff --git a/src/p_spec.c b/src/p_spec.c index 812577ed5..ef0703c50 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2459,19 +2459,19 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; case 413: // Change music - // console player only unless NOCLIMB is set - if ((line->flags & ML_NOCLIMB) || (mo && mo->player && P_IsLocalPlayer(mo->player)) || titlemapinaction) + // console player only unless TMM_ALLPLAYERS is set + if ((line->args[0] & TMM_ALLPLAYERS) || (mo && mo->player && P_IsLocalPlayer(mo->player)) || titlemapinaction) { - boolean musicsame = (!sides[line->sidenum[0]].text[0] || !strnicmp(sides[line->sidenum[0]].text, S_MusicName(), 7)); - UINT16 tracknum = (UINT16)max(sides[line->sidenum[0]].bottomtexture, 0); - INT32 position = (INT32)max(sides[line->sidenum[0]].midtexture, 0); - UINT32 prefadems = (UINT32)max(sides[line->sidenum[0]].textureoffset >> FRACBITS, 0); - UINT32 postfadems = (UINT32)max(sides[line->sidenum[0]].rowoffset >> FRACBITS, 0); - UINT8 fadetarget = (UINT8)max((line->sidenum[1] != 0xffff) ? sides[line->sidenum[1]].textureoffset >> FRACBITS : 0, 0); - INT16 fadesource = (INT16)max((line->sidenum[1] != 0xffff) ? sides[line->sidenum[1]].rowoffset >> FRACBITS : -1, -1); + boolean musicsame = (!line->stringargs[0] || !line->stringargs[0][0] || !strnicmp(line->stringargs[0], S_MusicName(), 7)); + UINT16 tracknum = (UINT16)max(line->args[6], 0); + INT32 position = (INT32)max(line->args[1], 0); + UINT32 prefadems = (UINT32)max(line->args[2], 0); + UINT32 postfadems = (UINT32)max(line->args[3], 0); + UINT8 fadetarget = (UINT8)max(line->args[4], 0); + INT16 fadesource = (INT16)max(line->args[5], -1); // Seek offset from current song position - if (line->flags & ML_EFFECT1) + if (line->args[0] & TMM_OFFSET) { // adjust for loop point if subtracting if (position < 0 && S_GetMusicLength() && @@ -2483,7 +2483,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) } // Fade current music to target volume (if music won't be changed) - if ((line->flags & ML_EFFECT2) && fadetarget && musicsame) + if ((line->args[0] & TMM_FADE) && fadetarget && musicsame) { // 0 fadesource means fade from current volume. // meaning that we can't specify volume 0 as the source volume -- this starts at 1. @@ -2501,22 +2501,25 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) // Change the music and apply position/fade operations else { - strncpy(mapmusname, sides[line->sidenum[0]].text, 7); + if (!line->stringargs[0]) + break; + + strncpy(mapmusname, line->stringargs[0], 7); mapmusname[6] = 0; mapmusflags = tracknum & MUSIC_TRACKMASK; - if (!(line->flags & ML_BLOCKMONSTERS)) + if (!(line->args[0] & TMM_NORELOAD)) mapmusflags |= MUSIC_RELOADRESET; - if (line->flags & ML_BOUNCY) + if (line->args[0] & TMM_FORCERESET) mapmusflags |= MUSIC_FORCERESET; mapmusposition = position; - S_ChangeMusicEx(mapmusname, mapmusflags, !(line->flags & ML_EFFECT4), position, - !(line->flags & ML_EFFECT2) ? prefadems : 0, - !(line->flags & ML_EFFECT2) ? postfadems : 0); + S_ChangeMusicEx(mapmusname, mapmusflags, !(line->args[0] & TMM_NOLOOP), position, + !(line->args[0] & TMM_FADE) ? prefadems : 0, + !(line->args[0] & TMM_FADE) ? postfadems : 0); - if ((line->flags & ML_EFFECT2) && fadetarget) + if ((line->args[0] & TMM_FADE) && fadetarget) { if (!postfadems) S_SetInternalMusicVolume(fadetarget); @@ -2525,7 +2528,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) } } - // Except, you can use the ML_BLOCKMONSTERS flag to change this behavior. + // Except, you can use the TMM_NORELOAD flag to change this behavior. // if (mapmusflags & MUSIC_RELOADRESET) then it will reset the music in G_PlayerReborn. } break; @@ -3552,34 +3555,28 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) case 461: // Spawns an object on the map based on texture offsets { - const mobjtype_t type = (mobjtype_t)(sides[line->sidenum[0]].toptexture); + const mobjtype_t type = line->stringargs[0] ? get_number(line->stringargs[0]) : MT_NULL; mobj_t *mobj; fixed_t x, y, z; - x = sides[line->sidenum[0]].textureoffset; - y = sides[line->sidenum[0]].rowoffset; - z = line->frontsector->floorheight; - if (line->flags & ML_NOCLIMB) // If noclimb is set, spawn randomly within a range + if (line->args[4]) // If args[4] is set, spawn randomly within a range { - if (line->sidenum[1] != 0xffff) // Make sure the linedef has a back side - { - x = P_RandomRange(sides[line->sidenum[0]].textureoffset>>FRACBITS, sides[line->sidenum[1]].textureoffset>>FRACBITS)<sidenum[0]].rowoffset>>FRACBITS, sides[line->sidenum[1]].rowoffset>>FRACBITS)<frontsector->floorheight>>FRACBITS, line->frontsector->ceilingheight>>FRACBITS)<special); - break; - } + x = P_RandomRange(line->args[0], line->args[5])<args[1], line->args[6])<args[2], line->args[7])<args[0] << FRACBITS; + y = line->args[1] << FRACBITS; + z = line->args[2] << FRACBITS; } mobj = P_SpawnMobj(x, y, z, type); if (mobj) { - if (line->flags & ML_EFFECT1) - mobj->angle = R_PointToAngle2(line->v1->x, line->v1->y, line->v2->x, line->v2->y); + mobj->angle = FixedAngle(line->args[3] << FRACBITS); CONS_Debug(DBG_GAMELOGIC, "Linedef Type %d - Spawn Object: %d spawned at (%d, %d, %d)\n", line->special, mobj->type, mobj->x>>FRACBITS, mobj->y>>FRACBITS, mobj->z>>FRACBITS); //TODO: Convert mobj->type to a string somehow. } else diff --git a/src/p_spec.h b/src/p_spec.h index b8fbc3734..74a2d438e 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -127,6 +127,16 @@ typedef enum TMT_RELATIVE = 1<<3, } textmapteleportflags_t; +typedef enum +{ + TMM_ALLPLAYERS = 1, + TMM_OFFSET = 1<<1, + TMM_FADE = 1<<2, + TMM_NORELOAD = 1<<3, + TMM_FORCERESET = 1<<4, + TMM_NOLOOP = 1<<5, +} textmapmusicflags_t; + typedef enum { TMSS_TRIGGERMOBJ = 0, diff --git a/src/r_defs.h b/src/r_defs.h index ab2b9fb2f..02937fd07 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -409,7 +409,7 @@ typedef enum #define HORIZONSPECIAL 41 -#define NUMLINEARGS 6 +#define NUMLINEARGS 8 #define NUMLINESTRINGARGS 2 typedef struct line_s From a61343bc8b9a39c45a7f3313e1115c1ffbe8e9ab Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 22 Sep 2021 10:38:08 +0200 Subject: [PATCH 154/377] P_LinedefExecute: Use global taglists to find trigger linedefs --- src/p_spec.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index ef0703c50..35e6f4b4c 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1873,15 +1873,16 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller */ void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller) { - size_t masterline; + INT32 masterline; CONS_Debug(DBG_GAMELOGIC, "P_LinedefExecute: Executing trigger linedefs of tag %d\n", tag); I_Assert(!actor || !P_MobjWasRemoved(actor)); // If actor is there, it must be valid. - for (masterline = 0; masterline < numlines; masterline++) + TAG_ITER_LINES(tag, masterline) { - if (Tag_FGet(&lines[masterline].tags) != tag) + if (lines[masterline].special < 300 + || lines[masterline].special > 399) continue; // "No More Enemies" and "Level Load" take care of themselves. @@ -1897,10 +1898,6 @@ void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller) || lines[masterline].special == 335)// Dye - Each time continue; - if (lines[masterline].special < 300 - || lines[masterline].special > 399) - continue; - if (!P_RunTriggerLinedef(&lines[masterline], actor, caller)) return; // cancel P_LinedefExecute if function returns false } From 280d23782c7c2e171b3eb2fdd7b2fef939a7b4b4 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 23 Sep 2021 10:21:53 +0200 Subject: [PATCH 155/377] Adapt linedef executor triggers that don't involve sector effects to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 260 +++++++++++++++++++ extras/conf/udb/Includes/SRB222_misc.cfg | 7 + src/p_setup.c | 73 ++++++ src/p_spec.c | 125 +++++---- src/p_spec.h | 47 ++++ 5 files changed, 456 insertions(+), 56 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 88f40b8ac..2f13b92e5 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2504,6 +2504,266 @@ udmf } } + linedeftrigger + { + title = "Linedef Executor Trigger"; + + 323 + { + title = "NiGHTSerize"; + prefix = "(323)"; + arg0 + { + title = "Trigger type"; + type = 11; + enum + { + 0 = "Each time"; + 1 = "Once"; + } + } + arg1 + { + title = "Mare number"; + } + arg2 + { + title = "Lap number"; + } + arg3 + { + title = "Mare comparison"; + type = 11; + enum = "comparison"; + } + arg4 + { + title = "Lap comparison"; + type = 11; + enum = "comparison"; + } + arg5 + { + title = "Compared player"; + type = 11; + enum + { + 0 = "Fastest"; + 1 = "Slowest"; + 2 = "Triggerer"; + } + } + arg6 + { + title = "NiGHTS check"; + type = 11; + enum + { + 0 = "No check"; + 1 = "Trigger if player was not NiGHTS"; + 2 = "Trigger if player was already NiGHTS"; + } + } + arg7 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Only count bonus time laps"; + 2 = "Only trigger if final mare completed"; + } + } + } + 325 + { + title = "De-NiGHTSerize"; + prefix = "(325)"; + arg0 + { + title = "Trigger type"; + type = 11; + enum + { + 0 = "Each time"; + 1 = "Once"; + } + } + arg1 + { + title = "Mare number"; + } + arg2 + { + title = "Lap number"; + } + arg3 + { + title = "Mare comparison"; + type = 11; + enum = "comparison"; + } + arg4 + { + title = "Lap comparison"; + type = 11; + enum = "comparison"; + } + arg5 + { + title = "Compared player"; + type = 11; + enum + { + 0 = "Fastest"; + 1 = "Slowest"; + 2 = "Triggerer"; + } + } + arg6 + { + title = "NiGHTS check"; + type = 11; + enum + { + 0 = "No check"; + 1 = "Trigger if nobody is now NiGHTS"; + 2 = "Trigger if somebody is still NiGHTS"; + } + } + arg7 + { + title = "Only bonus laps?"; + type = 11; + enum = "noyes"; + } + } + 327 + { + title = "NiGHTS Lap"; + prefix = "(327)"; + arg0 + { + title = "Trigger type"; + type = 11; + enum + { + 0 = "Each time"; + 1 = "Once"; + } + } + arg1 + { + title = "Mare number"; + } + arg2 + { + title = "Lap number"; + } + arg3 + { + title = "Mare comparison"; + type = 11; + enum = "comparison"; + } + arg4 + { + title = "Lap comparison"; + type = 11; + enum = "comparison"; + } + arg5 + { + title = "Compared player"; + type = 11; + enum + { + 0 = "Fastest"; + 1 = "Slowest"; + 2 = "Triggerer"; + } + } + arg6 + { + title = "Only bonus laps?"; + type = 11; + enum = "noyes"; + } + } + 329 + { + title = "Ideya Capture Touch"; + prefix = "(329)"; + arg0 + { + title = "Trigger type"; + type = 11; + enum + { + 0 = "Each time"; + 1 = "Once"; + } + } + arg1 + { + title = "Mare number"; + } + arg2 + { + title = "Lap number"; + } + arg3 + { + title = "Mare comparison"; + type = 11; + enum = "comparison"; + } + arg4 + { + title = "Lap comparison"; + type = 11; + enum = "comparison"; + } + arg5 + { + title = "Compared player"; + type = 11; + enum + { + 0 = "Fastest"; + 1 = "Slowest"; + 2 = "Triggerer"; + } + } + arg6 + { + title = "Spheres check"; + type = 11; + enum + { + 0 = "Trigger if enough spheres"; + 1 = "Trigger if not enough spheres"; + 2 = "Trigger regardless of spheres"; + } + } + arg7 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Only count bonus time laps"; + 2 = "Trigger upon entering Ideya Capture"; + } + } + } + 399 + { + title = "Level Load"; + prefix = "(399)"; + } + } + linedefexecsector { title = "Linedef Executor (sector)"; diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 1fd8f68b8..ba1e9d16e 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -488,6 +488,13 @@ enums 1 = "Accelerative"; 2 = "Displacement"; } + + comparison + { + 0 = "Equal"; + 1 = "Less than or equal"; + 2 = "Greater than or equal"; + } } //Default things filters diff --git a/src/p_setup.c b/src/p_setup.c index 7b7396f74..0dbf15386 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3682,6 +3682,79 @@ static void P_ConvertBinaryMap(void) else lines[i].args[1] = 255; break; + case 323: //NiGHTSerize - Each time + case 324: //NiGHTSerize - Once + case 325: //DeNiGHTSerize - Each time + case 326: //DeNiGHTSerize - Once + case 327: //NiGHTS lap - Each time + case 328: //NiGHTS lap - Once + case 329: //Ideya capture touch - Each time + case 330: //Ideya capture touch - Once + lines[i].args[0] = (lines[i].special + 1) % 2; + lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[2] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[3] = TMC_LTE; + else if (lines[i].flags & ML_BLOCKMONSTERS) + lines[i].args[3] = TMC_GTE; + else + lines[i].args[3] = TMC_EQUAL; + if (lines[i].flags & ML_EFFECT1) + lines[i].args[4] = TMC_LTE; + else if (lines[i].flags & ML_EFFECT2) + lines[i].args[4] = TMC_GTE; + else + lines[i].args[4] = TMC_EQUAL; + if (lines[i].flags & ML_DONTPEGBOTTOM) + lines[i].args[5] = TMNP_SLOWEST; + else if (lines[i].flags & ML_EFFECT4) + lines[i].args[5] = TMNP_TRIGGERER; + else + lines[i].args[5] = TMNP_FASTEST; + if (lines[i].special % 2 == 0) + lines[i].special--; + if (lines[i].special == 323) + { + if (lines[i].flags & ML_TFERLINE) + lines[i].args[6] = TMN_FROMNONIGHTS; + else if (lines[i].flags & ML_DONTPEGTOP) + lines[i].args[6] = TMN_FROMNIGHTS; + else + lines[i].args[6] = TMN_ALWAYS; + + if (lines[i].flags & ML_EFFECT3) + lines[i].args[7] |= TMN_BONUSLAPS; + if (lines[i].flags & ML_BOUNCY) + lines[i].args[7] |= TMN_LEVELCOMPLETION; + } + else if (lines[i].special == 325) + { + if (lines[i].flags & ML_TFERLINE) + lines[i].args[6] = TMD_NOBODYNIGHTS; + else if (lines[i].flags & ML_DONTPEGTOP) + lines[i].args[6] = TMD_SOMEBODYNIGHTS; + else + lines[i].args[6] = TMD_ALWAYS; + + lines[i].args[7] = !!(lines[i].flags & ML_EFFECT3); + } + else if (lines[i].special == 327) + lines[i].args[6] = !!(lines[i].flags & ML_EFFECT3); + else + { + if (lines[i].flags & ML_DONTPEGTOP) + lines[i].args[6] = TMS_ALWAYS; + else if (lines[i].flags & ML_BOUNCY) + lines[i].args[6] = TMS_IFNOTENOUGH; + else + lines[i].args[6] = TMS_IFENOUGH; + + if (lines[i].flags & ML_EFFECT3) + lines[i].args[7] |= TMI_BONUSLAPS; + if (lines[i].flags & ML_TFERLINE) + lines[i].args[7] |= TMI_ENTER; + } + break; case 400: //Set tagged sector's floor height/texture case 401: //Set tagged sector's ceiling height/texture lines[i].args[0] = tag; diff --git a/src/p_spec.c b/src/p_spec.c index 35e6f4b4c..18318881d 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1223,7 +1223,7 @@ void P_RunNightserizeExecutors(mobj_t *actor) for (i = 0; i < numlines; i++) { - if (lines[i].special == 323 || lines[i].special == 324) + if (lines[i].special == 323) P_RunTriggerLinedef(&lines[i], actor, NULL); } } @@ -1237,7 +1237,7 @@ void P_RunDeNightserizeExecutors(mobj_t *actor) for (i = 0; i < numlines; i++) { - if (lines[i].special == 325 || lines[i].special == 326) + if (lines[i].special == 325) P_RunTriggerLinedef(&lines[i], actor, NULL); } } @@ -1251,7 +1251,7 @@ void P_RunNightsLapExecutors(mobj_t *actor) for (i = 0; i < numlines; i++) { - if (lines[i].special == 327 || lines[i].special == 328) + if (lines[i].special == 327) P_RunTriggerLinedef(&lines[i], actor, NULL); } } @@ -1265,13 +1265,19 @@ void P_RunNightsCapsuleTouchExecutors(mobj_t *actor, boolean entering, boolean e for (i = 0; i < numlines; i++) { - if ((lines[i].special == 329 || lines[i].special == 330) - && ((entering && (lines[i].flags & ML_TFERLINE)) - || (!entering && !(lines[i].flags & ML_TFERLINE))) - && ((lines[i].flags & ML_DONTPEGTOP) - || (enoughspheres && !(lines[i].flags & ML_BOUNCY)) - || (!enoughspheres && (lines[i].flags & ML_BOUNCY)))) - P_RunTriggerLinedef(&lines[i], actor, NULL); + if (lines[i].special != 329) + continue; + + if (!!(lines[i].args[7] & TMI_ENTER) != entering) + continue; + + if (lines[i].args[6] == TMS_IFENOUGH && !enoughspheres) + continue; + + if (lines[i].args[6] == TMS_IFNOTENOUGH && enoughspheres) + continue; + + P_RunTriggerLinedef(&lines[i], actor, NULL); } } @@ -1351,27 +1357,42 @@ static boolean P_CheckNightsTriggerLine(line_t *triggerline, mobj_t *actor) INT16 specialtype = triggerline->special; size_t i; - UINT8 inputmare = max(0, min(255, sides[triggerline->sidenum[0]].textureoffset>>FRACBITS)); - UINT8 inputlap = max(0, min(255, sides[triggerline->sidenum[0]].rowoffset>>FRACBITS)); + UINT8 inputmare = max(0, min(255, triggerline->args[1])); + UINT8 inputlap = max(0, min(255, triggerline->args[2])); - boolean ltemare = triggerline->flags & ML_NOCLIMB; - boolean gtemare = triggerline->flags & ML_BLOCKMONSTERS; - boolean ltelap = triggerline->flags & ML_EFFECT1; - boolean gtelap = triggerline->flags & ML_EFFECT2; + textmapcomparison_t marecomp = triggerline->args[3]; + textmapcomparison_t lapcomp = triggerline->args[4]; + textmapnightsplayer_t checkplayer = triggerline->args[5]; - boolean lapfrombonustime = triggerline->flags & ML_EFFECT3; - boolean perglobalinverse = triggerline->flags & ML_DONTPEGBOTTOM; - boolean perglobal = !(triggerline->flags & ML_EFFECT4) && !perglobalinverse; + boolean lapfrombonustime; - boolean donomares = triggerline->flags & ML_BOUNCY; // nightserize: run at end of level (no mares) - boolean fromnonights = triggerline->flags & ML_TFERLINE; // nightserize: from non-nights // denightserize: all players no nights - boolean fromnights = triggerline->flags & ML_DONTPEGTOP; // nightserize: from nights // denightserize: >0 players are nights + boolean donomares = (specialtype == 323) && (triggerline->args[7] & TMN_LEVELCOMPLETION); // nightserize: run at end of level (no mares) UINT8 currentmare = UINT8_MAX; UINT8 currentlap = UINT8_MAX; + // Set lapfrombonustime + switch (specialtype) + { + case 323: + lapfrombonustime = !!(triggerline->args[7] & TMN_BONUSLAPS); + break; + case 325: + lapfrombonustime = !!(triggerline->args[7]); + break; + case 327: + lapfrombonustime = !!(triggerline->args[6]); + break; + case 329: + lapfrombonustime = !!(triggerline->args[7] & TMI_BONUSLAPS); + break; + default: + lapfrombonustime = false; + break; + } + // Do early returns for Nightserize - if (specialtype >= 323 && specialtype <= 324) + if (specialtype == 323) { // run only when no mares are found if (donomares && P_FindLowestMare() != UINT8_MAX) @@ -1382,7 +1403,7 @@ static boolean P_CheckNightsTriggerLine(line_t *triggerline, mobj_t *actor) return false; // run only if player is nightserizing from non-nights - if (fromnonights) + if (triggerline->args[6] == TMN_FROMNONIGHTS) { if (!actor->player) return false; @@ -1390,7 +1411,7 @@ static boolean P_CheckNightsTriggerLine(line_t *triggerline, mobj_t *actor) return false; } // run only if player is nightserizing from nights - else if (fromnights) + else if (triggerline->args[6] == TMN_FROMNIGHTS) { if (!actor->player) return false; @@ -1400,8 +1421,8 @@ static boolean P_CheckNightsTriggerLine(line_t *triggerline, mobj_t *actor) } // Get current mare and lap (and check early return for DeNightserize) - if (perglobal || perglobalinverse - || (specialtype >= 325 && specialtype <= 326 && (fromnonights || fromnights))) + if (checkplayer != TMNP_TRIGGERER + || (specialtype == 325 && triggerline->args[6] != TMD_ALWAYS)) { UINT8 playersarenights = 0; @@ -1412,19 +1433,19 @@ static boolean P_CheckNightsTriggerLine(line_t *triggerline, mobj_t *actor) continue; // denightserize: run only if all players are not nights - if (specialtype >= 325 && specialtype <= 326 && fromnonights + if (specialtype == 325 && triggerline->args[6] == TMD_NOBODYNIGHTS && players[i].powers[pw_carry] == CR_NIGHTSMODE) return false; // count number of nights players for denightserize return - if (specialtype >= 325 && specialtype <= 326 && fromnights + if (specialtype == 325 && triggerline->args[6] == TMD_SOMEBODYNIGHTS && players[i].powers[pw_carry] == CR_NIGHTSMODE) playersarenights++; lap = lapfrombonustime ? players[i].marebonuslap : players[i].marelap; // get highest mare/lap of players - if (perglobal) + if (checkplayer == TMNP_FASTEST) { if (players[i].mare > currentmare || currentmare == UINT8_MAX) { @@ -1436,7 +1457,7 @@ static boolean P_CheckNightsTriggerLine(line_t *triggerline, mobj_t *actor) currentlap = lap; } // get lowest mare/lap of players - else if (perglobalinverse) + else if (checkplayer == TMNP_SLOWEST) { if (players[i].mare < currentmare || currentmare == UINT8_MAX) { @@ -1450,12 +1471,12 @@ static boolean P_CheckNightsTriggerLine(line_t *triggerline, mobj_t *actor) } // denightserize: run only if >0 players are nights - if (specialtype >= 325 && specialtype <= 326 && fromnights + if (specialtype == 325 && triggerline->args[6] == TMD_SOMEBODYNIGHTS && playersarenights < 1) return false; } // get current mare/lap from triggering player - else if (!perglobal && !perglobalinverse) + else if (checkplayer == TMNP_TRIGGERER) { if (!actor->player) return false; @@ -1467,13 +1488,13 @@ static boolean P_CheckNightsTriggerLine(line_t *triggerline, mobj_t *actor) return false; // special case: player->marebonuslap is 0 until passing through on bonus time. Don't trigger lines looking for inputlap 0. // Compare current mare/lap to input mare/lap based on rules - if (!(specialtype >= 323 && specialtype <= 324 && donomares) // don't return false if donomares and we got this far - && ((ltemare && currentmare > inputmare) - || (gtemare && currentmare < inputmare) - || (!ltemare && !gtemare && currentmare != inputmare) - || (ltelap && currentlap > inputlap) - || (gtelap && currentlap < inputlap) - || (!ltelap && !gtelap && currentlap != inputlap)) + if (!donomares // don't return false if donomares and we got this far + && ((marecomp == TMC_LTE && currentmare > inputmare) + || (marecomp == TMC_GTE && currentmare < inputmare) + || (marecomp == TMC_EQUAL && currentmare != inputmare) + || (lapcomp == TMC_LTE && currentlap > inputlap) + || (lapcomp == TMC_GTE && currentlap < inputlap) + || (lapcomp == TMC_EQUAL && currentlap != inputlap)) ) return false; @@ -1690,14 +1711,10 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller return false; } break; - case 323: // nightserize - each time - case 324: // nightserize - once - case 325: // denightserize - each time - case 326: // denightserize - once - case 327: // nights lap - each time - case 328: // nights lap - once - case 329: // nights egg capsule touch - each time - case 330: // nights egg capsule touch - once + case 323: // nightserize + case 325: // denightserize + case 327: // nights lap + case 329: // nights egg capsule touch if (!P_CheckNightsTriggerLine(triggerline, actor)) return false; break; @@ -1846,10 +1863,10 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller || specialtype == 318 // Unlockable trigger - Once || specialtype == 320 // Unlockable - Once || specialtype == 321 || specialtype == 322 // Trigger on X calls - Continuous + Each Time - || specialtype == 324 // Nightserize - Once - || specialtype == 326 // DeNightserize - Once - || specialtype == 328 // Nights lap - Once - || specialtype == 330 // Nights Bonus Time - Once + || (specialtype == 323 && triggerline->args[0]) // Nightserize - Once + || (specialtype == 325 && triggerline->args[0]) // DeNightserize - Once + || (specialtype == 327 && triggerline->args[0]) // Nights lap - Once + || (specialtype == 329 && triggerline->args[0]) // Nights Bonus Time - Once || specialtype == 333 // Skin - Once || specialtype == 336 // Dye - Once || specialtype == 399) // Level Load @@ -6754,13 +6771,9 @@ void P_SpawnSpecials(boolean fromnetsave) // NiGHTS trigger executors case 323: - case 324: case 325: - case 326: case 327: - case 328: case 329: - case 330: break; // Skin trigger executors diff --git a/src/p_spec.h b/src/p_spec.h index 74a2d438e..0fdc216b9 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -105,6 +105,53 @@ typedef enum TMFL_SPLAT = 1<<1, } textmapfoflaserflags_t; +typedef enum +{ + TMC_EQUAL = 0, + TMC_LTE = 1, + TMC_GTE = 2, +} textmapcomparison_t; + +typedef enum +{ + TMNP_FASTEST = 0, + TMNP_SLOWEST = 1, + TMNP_TRIGGERER = 2, +} textmapnightsplayer_t; + +typedef enum +{ + TMN_ALWAYS = 0, + TMN_FROMNONIGHTS = 1, + TMN_FROMNIGHTS = 2, +} textmapnighterizeoptions_t; + +typedef enum +{ + TMN_BONUSLAPS = 1, + TMN_LEVELCOMPLETION = 1<<2, +} textmapnightserizeflags_t; + +typedef enum +{ + TMD_ALWAYS = 0, + TMD_NOBODYNIGHTS = 1, + TMD_SOMEBODYNIGHTS = 2, +} textmapdenighterizeoptions_t; + +typedef enum +{ + TMS_IFENOUGH = 0, + TMS_IFNOTENOUGH = 1, + TMS_ALWAYS = 2, +} textmapspherescheck_t; + +typedef enum +{ + TMI_BONUSLAPS = 1, + TMI_ENTER = 1<<2, +} textmapideyacaptureflags_t; + typedef enum { TMP_FLOOR = 0, From 5df1dd324d34156dbdf9f2d05933e51030ee46ab Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 23 Sep 2021 10:24:02 +0200 Subject: [PATCH 156/377] Fix oversight in T_MoveFloor --- src/p_floor.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/p_floor.c b/src/p_floor.c index eebb9366e..2da410de5 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -231,6 +231,7 @@ void T_MoveFloor(floormove_t *movefloor) remove = true; break; default: + remove = true; break; } } From f26f41e03ac9b2d8ee033d627cc9218bdf5a3141 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 26 Sep 2021 06:48:26 +0200 Subject: [PATCH 157/377] Fix thinker functions that still use tag instead of args[0] for FOFs --- src/p_floor.c | 13 +++++-------- src/p_spec.c | 10 +++++----- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/p_floor.c b/src/p_floor.c index 102ac67e0..6641c6904 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -634,7 +634,6 @@ void T_BounceCheese(bouncecheese_t *bouncer) sector_t *actionsector; boolean remove; INT32 i; - mtag_t tag = Tag_FGet(&bouncer->sourceline->tags); if (bouncer->sector->crumblestate == CRUMBLE_RESTORE || bouncer->sector->crumblestate == CRUMBLE_WAIT || bouncer->sector->crumblestate == CRUMBLE_ACTIVATED) // Oops! Crumbler says to remove yourself! @@ -649,7 +648,7 @@ void T_BounceCheese(bouncecheese_t *bouncer) } // You can use multiple target sectors, but at your own risk!!! - TAG_ITER_SECTORS(tag, i) + TAG_ITER_SECTORS(bouncer->sourceline->args[0], i) { actionsector = §ors[i]; actionsector->moved = true; @@ -773,7 +772,7 @@ void T_StartCrumble(crumble_t *crumble) ffloor_t *rover; sector_t *sector; INT32 i; - mtag_t tag = Tag_FGet(&crumble->sourceline->tags); + mtag_t tag = crumble->sourceline->args[0]; // Once done, the no-return thinker just sits there, // constantly 'returning'... kind of an oxymoron, isn't it? @@ -1301,14 +1300,13 @@ void T_NoEnemiesSector(noenemies_t *nobaddies) for (i = 0; i < sec->linecount; i++) { INT32 targetsecnum = -1; - mtag_t tag2 = Tag_FGet(&sec->lines[i]->tags); if (sec->lines[i]->special < 100 || sec->lines[i]->special >= 300) continue; FOFsector = true; - TAG_ITER_SECTORS(tag2, targetsecnum) + TAG_ITER_SECTORS(sec->lines[i]->args[0], targetsecnum) { if (T_SectorHasEnemies(§ors[targetsecnum])) return; @@ -1421,14 +1419,13 @@ void T_EachTimeThinker(eachtime_t *eachtime) for (i = 0; i < sec->linecount; i++) { INT32 targetsecnum = -1; - mtag_t tag2 = Tag_FGet(&sec->lines[i]->tags); if (sec->lines[i]->special < 100 || sec->lines[i]->special >= 300) continue; FOFsector = true; - TAG_ITER_SECTORS(tag2, targetsecnum) + TAG_ITER_SECTORS(sec->lines[i]->args[0], targetsecnum) { targetsec = §ors[targetsecnum]; @@ -2418,7 +2415,7 @@ void EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher) block->direction = 1; block->floorstartheight = block->sector->floorheight; block->ceilingstartheight = block->sector->ceilingheight; - block->tag = (INT16)Tag_FGet(§or->tags); + block->tag = (INT16)rover->master->args[0]; if (itsamonitor) { diff --git a/src/p_spec.c b/src/p_spec.c index ae144307e..f1c3e10ad 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5660,7 +5660,7 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, I if ((flags & FF_FLOATBOB)) { - P_AddFloatThinker(sec2, Tag_FGet(&master->tags), master); + P_AddFloatThinker(sec2, master->args[0], master); CheckForFloatBob = true; } @@ -5840,7 +5840,7 @@ static inline void P_AddThwompThinker(sector_t *sec, line_t *sourceline, fixed_t thwomp->floorstartheight = sec->floorheight; thwomp->ceilingstartheight = sec->ceilingheight; thwomp->delay = 1; - thwomp->tag = Tag_FGet(&sourceline->tags); + thwomp->tag = sourceline->args[0]; thwomp->sound = sound; sec->floordata = thwomp; @@ -7477,7 +7477,7 @@ void T_Scroll(scroll_t *s) if (!is3dblock) continue; - TAG_ITER_SECTORS(Tag_FGet(&line->tags), sect) + TAG_ITER_SECTORS(line->args[0], sect) { sector_t *psec; psec = sectors + sect; @@ -7552,7 +7552,7 @@ void T_Scroll(scroll_t *s) if (!is3dblock) continue; - TAG_ITER_SECTORS(Tag_FGet(&line->tags), sect) + TAG_ITER_SECTORS(line->args[0], sect) { sector_t *psec; psec = sectors + sect; @@ -7828,7 +7828,7 @@ void T_Disappear(disappear_t *d) { ffloor_t *rover; register INT32 s; - mtag_t afftag = Tag_FGet(&lines[d->affectee].tags); + mtag_t afftag = lines[d->affectee].args[0]; TAG_ITER_SECTORS(afftag, s) { From 5f7babb53fbbb40c837fd3be7687c7d8eed39b78 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 26 Sep 2021 20:42:01 +0200 Subject: [PATCH 158/377] Adapt linedef type 313 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 11 +++++++++++ src/p_floor.c | 2 +- src/p_setup.c | 3 +++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 2f13b92e5..674d20443 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2508,6 +2508,17 @@ udmf { title = "Linedef Executor Trigger"; + 313 + { + title = "No More Enemies - Once"; + prefix = "(313)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + } + 323 { title = "NiGHTSerize"; diff --git a/src/p_floor.c b/src/p_floor.c index f421b550f..6a4ef554e 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -1235,7 +1235,7 @@ void T_NoEnemiesSector(noenemies_t *nobaddies) sector_t *sec = NULL; INT32 secnum = -1; boolean FOFsector = false; - mtag_t tag = Tag_FGet(&nobaddies->sourceline->tags); + mtag_t tag = nobaddies->sourceline->args[0]; TAG_ITER_SECTORS(tag, secnum) { diff --git a/src/p_setup.c b/src/p_setup.c index 2ad6dcb06..ce0e27e38 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3715,6 +3715,9 @@ static void P_ConvertBinaryMap(void) else lines[i].args[1] = 255; break; + case 313: //No more enemies - once + lines[i].args[0] = tag; + break; case 323: //NiGHTSerize - Each time case 324: //NiGHTSerize - Once case 325: //DeNiGHTSerize - Each time From d44ef91f6f86ff504b58799c9147b64199011da3 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 28 Nov 2021 19:34:42 +0100 Subject: [PATCH 159/377] Re-add FF_BUSTUP to INT_CONST --- src/deh_tables.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/deh_tables.c b/src/deh_tables.c index f2fd38059..f14eca6a9 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -5226,6 +5226,7 @@ struct int_const_s const INT_CONST[] = { {"FF_CRUMBLE",FF_CRUMBLE}, ///< Falls 2 seconds after being stepped on, and randomly brings all touching crumbling 3dfloors down with it, providing their master sectors share the same tag (allows crumble platforms above or below, to also exist). {"FF_GOOWATER",FF_GOOWATER}, ///< Used with ::FF_SWIMMABLE. Makes thick bouncey goop. {"FF_MARIO",FF_MARIO}, ///< Acts like a question block when hit from underneath. Goodie spawned at top is determined by master sector. + {"FF_BUSTUP",FF_BUSTUP}, ///< You can spin through/punch this block and it will crumble! {"FF_QUICKSAND",FF_QUICKSAND}, ///< Quicksand! {"FF_PLATFORM",FF_PLATFORM}, ///< You can jump up through this to the top. {"FF_REVERSEPLATFORM",FF_REVERSEPLATFORM}, ///< A fall-through floor in normal gravity, a platform in reverse gravity. From 6dc49042deb1f27217fd1d5107726732c2fd9bf8 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 3 Dec 2021 18:48:16 +0100 Subject: [PATCH 160/377] Port katsy's bouncy FOF cleanup --- extras/conf/SRB2-22.cfg | 1 - extras/conf/udb/Includes/SRB222_linedefs.cfg | 6 --- src/deh_tables.c | 10 ++-- src/lua_maplib.c | 8 +-- src/p_mobj.c | 6 +-- src/p_setup.c | 2 - src/p_spec.c | 33 +++++------- src/p_user.c | 54 ++++---------------- src/r_defs.h | 14 ++--- 9 files changed, 39 insertions(+), 95 deletions(-) diff --git a/extras/conf/SRB2-22.cfg b/extras/conf/SRB2-22.cfg index fd12b5c81..3f345da4f 100644 --- a/extras/conf/SRB2-22.cfg +++ b/extras/conf/SRB2-22.cfg @@ -776,7 +776,6 @@ linedeftypes { title = "Make FOF Bouncy"; prefix = "(76)"; - flags16384text = "[14] Dampen"; } } diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index d4f24e4ab..068fc2c8c 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1733,12 +1733,6 @@ udmf { title = "Bounce strength"; } - arg2 - { - title = "Dampen?"; - type = 11; - enum = "noyes"; - } } } diff --git a/src/deh_tables.c b/src/deh_tables.c index ff2639a74..438ff2090 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -5230,12 +5230,10 @@ struct int_const_s const INT_CONST[] = { {"FF_BOUNCY",FF_BOUNCY}, ///< Bounces players {"FF_SPLAT",FF_SPLAT}, ///< Use splat flat renderer (treat cyan pixels as invisible) - // FOF special flags - {"FS_PUSHABLES",FS_PUSHABLES}, - {"FS_EXECUTOR",FS_EXECUTOR}, - {"FS_ONLYBOTTOM",FS_ONLYBOTTOM}, - {"FS_BUSTMASK",FS_BUSTMASK}, - {"FS_DAMPEN",FS_DAMPEN}, + // FOF bustable flags + {"FB_PUSHABLES",FB_PUSHABLES}, + {"FB_EXECUTOR",FB_EXECUTOR}, + {"FB_ONLYBOTTOM",FB_ONLYBOTTOM}, // Bustable FOF type {"BT_TOUCH",BT_TOUCH}, diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 534ef9a07..b54924cdf 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -196,7 +196,7 @@ enum ffloor_e { ffloor_next, ffloor_prev, ffloor_alpha, - ffloor_specialflags, + ffloor_bustflags, ffloor_busttype, ffloor_busttag, ffloor_sinkspeed, @@ -220,7 +220,7 @@ static const char *const ffloor_opt[] = { "next", "prev", "alpha", - "specialflags", + "bustflags", "busttype", "busttag", "sinkspeed", @@ -1819,8 +1819,8 @@ static int ffloor_get(lua_State *L) case ffloor_alpha: lua_pushinteger(L, ffloor->alpha); return 1; - case ffloor_specialflags: - lua_pushinteger(L, ffloor->specialflags); + case ffloor_bustflags: + lua_pushinteger(L, ffloor->bustflags); return 1; case ffloor_busttype: lua_pushinteger(L, ffloor->busttype); diff --git a/src/p_mobj.c b/src/p_mobj.c index 86c237f4a..268881811 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1688,7 +1688,7 @@ static void P_PushableCheckBustables(mobj_t *mo) if (!(rover->flags & FF_BUSTUP)) continue; - if (!(rover->specialflags & FS_PUSHABLES)) + if (!(rover->bustflags & FB_PUSHABLES)) continue; if (rover->master->frontsector->crumblestate != CRUMBLE_NONE) @@ -1698,7 +1698,7 @@ static void P_PushableCheckBustables(mobj_t *mo) bottomheight = P_GetFOFBottomZ(mo, node->m_sector, rover, mo->x, mo->y, NULL); // Height checks - if (rover->specialflags & FS_ONLYBOTTOM) + if (rover->bustflags & FB_ONLYBOTTOM) { if (mo->z + mo->momz + mo->height < bottomheight) continue; @@ -1740,7 +1740,7 @@ static void P_PushableCheckBustables(mobj_t *mo) EV_CrumbleChain(NULL, rover); // node->m_sector // Run a linedef executor?? - if (rover->specialflags & FS_EXECUTOR) + if (rover->bustflags & FB_EXECUTOR) P_LinedefExecute(rover->busttag, mo, node->m_sector); goto bustupdone; diff --git a/src/p_setup.c b/src/p_setup.c index 17d71a8bf..83a5fe26c 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3084,8 +3084,6 @@ static void P_ConvertBinaryMap(void) case 76: //Make FOF bouncy lines[i].args[0] = tag; lines[i].args[1] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; - if (lines[i].flags & ML_BOUNCY) - lines[i].args[2] = 1; break; case 100: //FOF: solid, opaque, shadowcasting case 101: //FOF: solid, opaque, non-shadowcasting diff --git a/src/p_spec.c b/src/p_spec.c index f1c3e10ad..508c340b0 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6089,10 +6089,6 @@ static void P_MakeFOFBouncy(line_t *paramline, line_t *masterline) rover->flags |= FF_BOUNCY; rover->spawnflags |= FF_BOUNCY; rover->bouncestrength = (paramline->args[1]<< FRACBITS)/100; - if (paramline->args[2]) - rover->specialflags |= FS_DAMPEN; - else - rover->specialflags &= ~FS_DAMPEN; CheckForBouncySector = true; break; } @@ -6739,7 +6735,7 @@ void P_SpawnSpecials(boolean fromnetsave) case 254: // Bustable block { UINT8 busttype = BT_REGULAR; - ffloorspecialflags_e bustflags = 0; + ffloorbustflags_e bustflags = 0; ffloorflags = FF_EXISTS|FF_BLOCKOTHERS|FF_RENDERALL|FF_BUSTUP; @@ -6762,15 +6758,15 @@ void P_SpawnSpecials(boolean fromnetsave) //Flags if (lines[i].args[3] & TMFB_PUSHABLES) - bustflags |= FS_PUSHABLES; + bustflags |= FB_PUSHABLES; if (lines[i].args[3] & TMFB_EXECUTOR) - bustflags |= FS_EXECUTOR; + bustflags |= FB_EXECUTOR; if (lines[i].args[3] & TMFB_ONLYBOTTOM) - bustflags |= FS_ONLYBOTTOM; + bustflags |= FB_ONLYBOTTOM; if (lines[i].args[3] & TMFB_SPLAT) ffloorflags |= FF_SPLAT; - if (busttype != BT_TOUCH || bustflags & FS_ONLYBOTTOM) + if (busttype != BT_TOUCH || bustflags & FB_ONLYBOTTOM) ffloorflags |= FF_BLOCKPLAYER; TAG_ITER_SECTORS(lines[i].args[0], s) @@ -6778,8 +6774,8 @@ void P_SpawnSpecials(boolean fromnetsave) ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], ffloorflags, secthinkers); if (!fflr) continue; + fflr->bustflags = bustflags; fflr->busttype = busttype; - fflr->specialflags = bustflags; fflr->busttag = lines[i].args[4]; } break; @@ -6839,12 +6835,12 @@ void P_SpawnSpecials(boolean fromnetsave) } if (lines[i].args[3] & TMFB_ONLYBOTTOM) - fflr->specialflags |= FS_ONLYBOTTOM; + fflr->bustflags |= FB_ONLYBOTTOM; if (lines[i].flags & ML_EFFECT4) - fflr->specialflags |= FS_PUSHABLES; + fflr->bustflags |= FB_PUSHABLES; if (lines[i].flags & ML_EFFECT5) { - fflr->specialflags |= FS_EXECUTOR; + fflr->bustflags |= FB_EXECUTOR; fflr->busttag = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; } } @@ -7176,7 +7172,7 @@ void P_SpawnSpecials(boolean fromnetsave) case 74: // Make FOF bustable { UINT8 busttype = BT_REGULAR; - ffloorspecialflags_e bustflags = 0; + ffloorbustflags_e bustflags = 0; if (!udmf) break; @@ -7198,11 +7194,11 @@ void P_SpawnSpecials(boolean fromnetsave) } if (lines[i].args[2] & TMFB_PUSHABLES) - bustflags |= FS_PUSHABLES; + bustflags |= FB_PUSHABLES; if (lines[i].args[2] & TMFB_EXECUTOR) - bustflags |= FS_EXECUTOR; + bustflags |= FB_EXECUTOR; if (lines[i].args[2] & TMFB_ONLYBOTTOM) - bustflags |= FS_ONLYBOTTOM; + bustflags |= FB_ONLYBOTTOM; TAG_ITER_LINES(lines[i].args[0], l) { @@ -7220,9 +7216,8 @@ void P_SpawnSpecials(boolean fromnetsave) rover->flags |= FF_BUSTUP; rover->spawnflags |= FF_BUSTUP; + rover->bustflags = bustflags; rover->busttype = busttype; - rover->specialflags &= ~FS_BUSTMASK; - rover->specialflags |= bustflags; rover->busttag = lines[i].args[3]; CheckForBustableBlocks = true; break; diff --git a/src/p_user.c b/src/p_user.c index 048f2f1f9..6466a5316 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2656,7 +2656,7 @@ static void P_CheckBustableBlocks(player_t *player) } // Height checks - if (rover->specialflags & FS_ONLYBOTTOM) + if (rover->bustflags & FB_ONLYBOTTOM) { if (player->mo->z + player->mo->momz + player->mo->height < bottomheight) continue; @@ -2710,7 +2710,7 @@ static void P_CheckBustableBlocks(player_t *player) EV_CrumbleChain(NULL, rover); // node->m_sector // Run a linedef executor?? - if (rover->specialflags & FS_EXECUTOR) + if (rover->bustflags & FB_EXECUTOR) P_LinedefExecute(rover->busttag, player->mo, node->m_sector); goto bustupdone; @@ -2766,10 +2766,6 @@ static void P_CheckBouncySectors(player_t *player) { rover->flags |= FF_BOUNCY; rover->bouncestrength = P_AproxDistance(rover->master->dx, rover->master->dy)/100; - if (rover->master->flags & ML_BOUNCY) - rover->specialflags |= FS_DAMPEN; - else - rover->specialflags &= ~FS_DAMPEN; } if (!(rover->flags & FF_BOUNCY)) @@ -2789,17 +2785,9 @@ static void P_CheckBouncySectors(player_t *player) { player->mo->momx = -FixedMul(player->mo->momx,rover->bouncestrength); player->mo->momy = -FixedMul(player->mo->momy,rover->bouncestrength); - - if (player->pflags & PF_SPINNING) - { - player->pflags &= ~PF_SPINNING; - player->pflags |= P_GetJumpFlags(player); - player->pflags |= PF_THOKKED; - } } else { - fixed_t newmom; pslope_t *slope = (abs(oldz - topheight) < abs(oldz + player->mo->height - bottomheight)) ? *rover->t_slope : *rover->b_slope; momentum.x = player->mo->momx; @@ -2809,53 +2797,29 @@ static void P_CheckBouncySectors(player_t *player) if (slope) P_ReverseQuantizeMomentumToSlope(&momentum, slope); - newmom = momentum.z = -FixedMul(momentum.z,rover->bouncestrength)/2; + momentum.z = -FixedMul(momentum.z,rover->bouncestrength)/2; - if (abs(newmom) < (rover->bouncestrength*2)) + if (abs(momentum.z) < (rover->bouncestrength*2)) goto bouncydone; - if (!(rover->specialflags & FS_DAMPEN)) - { - if (newmom > 0) - { - if (newmom < 8*FRACUNIT) - newmom = 8*FRACUNIT; - } - else if (newmom < 0) - { - if (newmom > -8*FRACUNIT) - newmom = -8*FRACUNIT; - } - } - - if (newmom > P_GetPlayerHeight(player)/2) - newmom = P_GetPlayerHeight(player)/2; - else if (newmom < -P_GetPlayerHeight(player)/2) - newmom = -P_GetPlayerHeight(player)/2; - - momentum.z = newmom*2; + if (momentum.z > FixedMul(24*FRACUNIT, player->mo->scale)) //half of the default player height + momentum.z = FixedMul(24*FRACUNIT, player->mo->scale); + else if (momentum.z < -FixedMul(24*FRACUNIT, player->mo->scale)) + momentum.z = -FixedMul(24*FRACUNIT, player->mo->scale); if (slope) P_QuantizeMomentumToSlope(&momentum, slope); player->mo->momx = momentum.x; player->mo->momy = momentum.y; - player->mo->momz = momentum.z/2; + player->mo->momz = momentum.z; if (player->pflags & PF_SPINNING) { - player->pflags &= ~PF_SPINNING; - player->pflags |= P_GetJumpFlags(player); player->pflags |= PF_THOKKED; } } - if ((player->pflags & PF_SPINNING) && player->speed < FixedMul(1<mo->scale) && player->mo->momz) - { - player->pflags &= ~PF_SPINNING; - player->pflags |= P_GetJumpFlags(player); - } - goto bouncydone; } } diff --git a/src/r_defs.h b/src/r_defs.h index cb21d5043..4cc7d2e96 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -154,12 +154,10 @@ typedef enum typedef enum { - FS_PUSHABLES = 0x1, // FF_BUSTABLE: Bustable by pushables - FS_EXECUTOR = 0x2, // FF_BUSTABLE: Trigger linedef executor - FS_ONLYBOTTOM = 0x4, // FF_BUSTABLE: Only bustable from below - FS_BUSTMASK = 0x7, - FS_DAMPEN = 0x8, // FF_BOUNCY: Dampen bounce -} ffloorspecialflags_e; + FB_PUSHABLES = 0x1, // Bustable by pushables + FB_EXECUTOR = 0x2, // Trigger linedef executor + FB_ONLYBOTTOM = 0x4, // Only bustable from below +} ffloorbustflags_e; typedef enum { @@ -201,10 +199,8 @@ typedef struct ffloor_s INT32 alpha; tic_t norender; // for culling - // Flags that are only relevant for special ffloor types - ffloorspecialflags_e specialflags; - // Only relevant for FF_BUSTUP + ffloorbustflags_e bustflags; UINT8 busttype; INT16 busttag; From 9ebc259ab3fd7cb7b98f6dc13c6c9f9b156579bb Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 6 Dec 2021 18:50:06 +0100 Subject: [PATCH 161/377] Split P_ProcessSpecialSector into multiple functions --- src/p_spec.c | 1156 ++++++++++++++++++++++++-------------------------- 1 file changed, 557 insertions(+), 599 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index c2caeb859..261f24aae 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4051,20 +4051,559 @@ static boolean P_MobjReadyToTrigger(mobj_t *mo, sector_t *sec) return (floorallowed || ceilingallowed); } +/// \todo check continues for proper splitscreen support? +static boolean P_DoAllPlayersTrigger(sector_t *sector, sector_t *roversector, boolean floortouch) +{ + INT32 i; + msecnode_t *node; + + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i]) + continue; + if (!players[i].mo) + continue; + if (players[i].spectator) + continue; + if (players[i].bot) + continue; + if (G_CoopGametype() && players[i].lives <= 0) + continue; + if (roversector) + { + if (sector->flags & SF_TRIGGERSPECIAL_TOUCH) + { + for (node = players[i].mo->touching_sectorlist; node; node = node->m_sectorlist_next) + { + if (P_ThingIsOnThe3DFloor(players[i].mo, sector, node->m_sector)) + break; + } + if (!node) + return false; + } + else if (players[i].mo->subsector && !P_ThingIsOnThe3DFloor(players[i].mo, sector, players[i].mo->subsector->sector)) // this function handles basically everything for us lmao + return false; + } + else + { + if (players[i].mo->subsector->sector != sector) + { + if (!(sector->flags & SF_TRIGGERSPECIAL_TOUCH)) + return false; + + for (node = players[i].mo->touching_sectorlist; node; node = node->m_sectorlist_next) + { + if (node->m_sector == sector) + break; + } + if (!node) + return false; + } + + if (floortouch && !P_MobjReadyToTrigger(players[i].mo, sector)) + return false; + } + } + + return true; +} + +static void P_ProcessEggCapsule(player_t *player, sector_t *sector) +{ + thinker_t *th; + mobj_t *mo2; + INT32 i; + + if (player->bot || sector->ceilingdata || sector->floordata) + return; + + // Find the center of the Eggtrap and release all the pretty animals! + // The chimps are my friends.. heeheeheheehehee..... - LouisJM + for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) + { + if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) + continue; + mo2 = (mobj_t *)th; + if (mo2->type != MT_EGGTRAP) + continue; + P_KillMobj(mo2, NULL, player->mo, 0); + } + + // clear the special so you can't push the button twice. + sector->special = 0; + + // Move the button down + EV_DoElevator(LE_CAPSULE0, NULL, elevateDown); + + // Open the top FOF + EV_DoFloor(LE_CAPSULE1, NULL, raiseFloorToNearestFast); + // Open the bottom FOF + EV_DoCeiling(LE_CAPSULE2, NULL, lowerToLowestFast); + + // Mark all players with the time to exit thingy! + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i]) + continue; + P_DoPlayerExit(&players[i]); + } +} + +static void P_ProcessSpeedPad(player_t *player, sector_t *sector, sector_t *roversector, mtag_t sectag) +{ + INT32 lineindex; + angle_t lineangle; + fixed_t linespeed; + fixed_t sfxnum; + + if (player->powers[pw_flashing] != 0 && player->powers[pw_flashing] < TICRATE/2) + return; + + lineindex = Tag_FindLineSpecial(4, sectag); + + if (lineindex == -1) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: Sector special %d missing line special #4.\n", sector->special); + return; + } + + lineangle = R_PointToAngle2(lines[lineindex].v1->x, lines[lineindex].v1->y, lines[lineindex].v2->x, lines[lineindex].v2->y); + linespeed = sides[lines[lineindex].sidenum[0]].textureoffset; + + if (linespeed == 0) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: Speed pad (tag %d) at zero speed.\n", sectag); + return; + } + + player->mo->angle = player->drawangle = lineangle; + + if (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG) + P_SetPlayerAngle(player, player->mo->angle); + + if (!(lines[lineindex].flags & ML_EFFECT4)) + { + P_UnsetThingPosition(player->mo); + if (roversector) // make FOF speed pads work + { + player->mo->x = roversector->soundorg.x; + player->mo->y = roversector->soundorg.y; + } + else + { + player->mo->x = sector->soundorg.x; + player->mo->y = sector->soundorg.y; + } + P_SetThingPosition(player->mo); + } + + P_InstaThrust(player->mo, player->mo->angle, linespeed); + + if (lines[lineindex].flags & ML_EFFECT5) // Roll! + { + if (!(player->pflags & PF_SPINNING)) + player->pflags |= PF_SPINNING; + + P_SetPlayerMobjState(player->mo, S_PLAY_ROLL); + } + + player->powers[pw_flashing] = TICRATE/3; + + sfxnum = sides[lines[lineindex].sidenum[0]].toptexture; + + if (!sfxnum) + sfxnum = sfx_spdpad; + + S_StartSound(player->mo, sfxnum); +} + +static void P_ProcessExitSector(player_t *player, mtag_t sectag) +{ + INT32 lineindex; + + if (!(gametyperules & GTR_ALLOWEXIT)) + return; + + if (player->bot) + return; + + if (!(maptol & TOL_NIGHTS) && G_IsSpecialStage(gamemap) && player->nightstime > 6) + { + player->nightstime = 6; // Just let P_Ticker take care of the rest. + return; + } + + // Exit (for FOF exits; others are handled in P_PlayerThink in p_user.c) + P_DoPlayerFinish(player); + + P_SetupSignExit(player); + + if (!G_CoopGametype()) + return; + + // Custom exit! + // important: use sectag on next line instead of player->mo->subsector->tag + // this part is different from in P_PlayerThink, this is what was causing + // FOF custom exits not to work. + lineindex = Tag_FindLineSpecial(2, sectag); + + if (lineindex == -1) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: Exit sector missing line special #2.\n"); + return; + } + + // Special goodies with the block monsters flag depending on emeralds collected + if ((lines[lineindex].flags & ML_BLOCKMONSTERS) && ALL7EMERALDS(emeralds)) + nextmapoverride = (INT16)(lines[lineindex].frontsector->ceilingheight>>FRACBITS); + else + nextmapoverride = (INT16)(lines[lineindex].frontsector->floorheight>>FRACBITS); + + if (lines[lineindex].flags & ML_NOCLIMB) + skipstats = 1; +} + +static void P_ProcessTeamBase(player_t *player, boolean redteam) +{ + mobj_t *mo; + + if (!(gametyperules & GTR_TEAMFLAGS)) + return; + + if (!P_IsObjectOnGround(player->mo)) + return; + + if (player->ctfteam != (redteam ? 1 : 2)) + return; + + if (!(player->gotflag & (redteam ? GF_BLUEFLAG : GF_REDFLAG))) + return; + + // Make sure the team still has their own + // flag at their base so they can score. + if (!P_IsFlagAtBase(redteam ? MT_BLUEFLAG : MT_REDFLAG)) + return; + + HU_SetCEchoFlags(V_AUTOFADEOUT|V_ALLOWLOWERCASE); + HU_SetCEchoDuration(5); + HU_DoCEcho(va(M_GetText("%s%s\200\\CAPTURED THE %s%s FLAG\200.\\\\\\\\"), redteam ? "\205" : "\204", player_names[player-players], redteam ? "\204" : "\205", redteam ? "BLUE" : "RED")); + + if (splitscreen || players[consoleplayer].ctfteam == (redteam ? 1 : 2)) + S_StartSound(NULL, sfx_flgcap); + else if (players[consoleplayer].ctfteam == (redteam ? 2 : 1)) + S_StartSound(NULL, sfx_lose); + + mo = P_SpawnMobj(player->mo->x,player->mo->y,player->mo->z, redteam ? MT_BLUEFLAG : MT_REDFLAG); + player->gotflag &= ~(redteam ? GF_BLUEFLAG : GF_REDFLAG); + mo->flags &= ~MF_SPECIAL; + mo->fuse = TICRATE; + mo->spawnpoint = redteam ? bflagpoint : rflagpoint; + mo->flags2 |= MF2_JUSTATTACKED; + if (redteam) + redscore += 1; + else + bluescore += 1; + P_AddPlayerScore(player, 250); +} + +static void P_ProcessZoomTube(player_t *player, sector_t *sector, mtag_t sectag, boolean end) +{ + INT32 sequence; + fixed_t speed; + INT32 lineindex; + mobj_t *waypoint = NULL; + angle_t an; + + if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT && player->powers[pw_carry] == CR_ZOOMTUBE) + return; + + if (player->powers[pw_ignorelatch] & (1<<15)) + return; + + // Find line #3 tagged to this sector + lineindex = Tag_FindLineSpecial(3, sectag); + + if (lineindex == -1) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: Sector special %d missing line special #3.\n", sector->special); + return; + } + + // Grab speed and sequence values + speed = abs(sides[lines[lineindex].sidenum[0]].textureoffset)/8; + if (end) + speed *= -1; + sequence = abs(sides[lines[lineindex].sidenum[0]].rowoffset)>>FRACBITS; + + if (speed == 0) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: Waypoint sequence %d at zero speed.\n", sequence); + return; + } + + waypoint = end ? P_GetLastWaypoint(sequence) : P_GetFirstWaypoint(sequence); + + if (!waypoint) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: %s WAYPOINT IN SEQUENCE %d NOT FOUND.\n", end ? "LAST" : "FIRST", sequence); + return; + } + + CONS_Debug(DBG_GAMELOGIC, "Waypoint %d found in sequence %d - speed = %d\n", waypoint->health, sequence, speed); + + an = R_PointToAngle2(player->mo->x, player->mo->y, waypoint->x, waypoint->y) - player->mo->angle; + + if (an > ANGLE_90 && an < ANGLE_270 && !(lines[lineindex].flags & ML_EFFECT4)) + return; // behind back + + P_SetTarget(&player->mo->tracer, waypoint); + player->powers[pw_carry] = CR_ZOOMTUBE; + player->speed = speed; + player->pflags |= PF_SPINNING; + player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE|PF_GLIDING|PF_BOUNCING|PF_SLIDING|PF_CANCARRY); + player->climbing = 0; + + if (player->mo->state-states != S_PLAY_ROLL) + { + P_SetPlayerMobjState(player->mo, S_PLAY_ROLL); + S_StartSound(player->mo, sfx_spin); + } +} + +static void P_ProcessFinishLine(player_t *player) +{ + if ((gametyperules & (GTR_RACE|GTR_LIVES)) != GTR_RACE) + return; + + if (player->exiting) + return; + + if (player->starpostnum == numstarposts) // Must have touched all the starposts + { + player->laps++; + + if (player->powers[pw_carry] == CR_NIGHTSMODE) + player->drillmeter += 48*20; + + if (player->laps >= (UINT8)cv_numlaps.value) + CONS_Printf(M_GetText("%s has finished the race.\n"), player_names[player-players]); + else if (player->laps == (UINT8)cv_numlaps.value-1) + CONS_Printf(M_GetText("%s started the \205final lap\200!\n"), player_names[player-players]); + else + CONS_Printf(M_GetText("%s started lap %u\n"), player_names[player-players], (UINT32)player->laps+1); + + // Reset starposts (checkpoints) info + player->starpostscale = player->starpostangle = player->starposttime = player->starpostnum = 0; + player->starpostx = player->starposty = player->starpostz = 0; + P_ResetStarposts(); + + // Play the starpost sound for 'consistency' + S_StartSound(player->mo, sfx_strpst); + } + else if (player->starpostnum) + { + // blatant reuse of a variable that's normally unused in circuit + if (!player->tossdelay) + S_StartSound(player->mo, sfx_lose); + player->tossdelay = 3; + } + + if (player->laps >= (unsigned)cv_numlaps.value) + { + if (P_IsLocalPlayer(player)) + { + HU_SetCEchoFlags(0); + HU_SetCEchoDuration(5); + HU_DoCEcho("FINISHED!"); + } + + P_DoPlayerExit(player); + } +} + +static void P_ProcessRopeHang(player_t *player, sector_t *sector, mtag_t sectag) +{ + INT32 sequence; + fixed_t speed; + INT32 lineindex; + mobj_t *waypointmid = NULL; + mobj_t *waypointhigh = NULL; + mobj_t *waypointlow = NULL; + mobj_t *closest = NULL; + vector3_t p, line[2], resulthigh, resultlow; + + if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT && player->powers[pw_carry] == CR_ROPEHANG) + return; + + if (player->powers[pw_ignorelatch] & (1<<15)) + return; + + if (player->mo->momz > 0) + return; + + if (player->cmd.buttons & BT_SPIN) + return; + + if (!(player->pflags & PF_SLIDING) && player->mo->state == &states[player->mo->info->painstate]) + return; + + if (player->exiting) + return; + + //initialize resulthigh and resultlow with 0 + memset(&resultlow, 0x00, sizeof(resultlow)); + memset(&resulthigh, 0x00, sizeof(resulthigh)); + + // Find line #11 tagged to this sector + lineindex = Tag_FindLineSpecial(11, sectag); + + if (lineindex == -1) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: Sector special %d missing line special #11.\n", sector->special); + return; + } + + // Grab speed and sequence values + speed = abs(sides[lines[lineindex].sidenum[0]].textureoffset)/8; + sequence = abs(sides[lines[lineindex].sidenum[0]].rowoffset)>>FRACBITS; + + if (speed == 0) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: Waypoint sequence %d at zero speed.\n", sequence); + return; + } + + // Find the closest waypoint + // Find the preceding waypoint + // Find the proceeding waypoint + // Determine the closest spot on the line between the three waypoints + // Put player at that location. + + waypointmid = P_GetClosestWaypoint(sequence, player->mo); + + if (!waypointmid) + { + CONS_Debug(DBG_GAMELOGIC, "ERROR: WAYPOINT(S) IN SEQUENCE %d NOT FOUND.\n", sequence); + return; + } + + waypointlow = P_GetPreviousWaypoint(waypointmid, true); + waypointhigh = P_GetNextWaypoint(waypointmid, true); + + CONS_Debug(DBG_GAMELOGIC, "WaypointMid: %d; WaypointLow: %d; WaypointHigh: %d\n", + waypointmid->health, waypointlow ? waypointlow->health : -1, waypointhigh ? waypointhigh->health : -1); + + // Now we have three waypoints... the closest one we're near, and the one that comes before, and after. + // Next, we need to find the closest point on the line between each set, and determine which one we're + // closest to. + + p.x = player->mo->x; + p.y = player->mo->y; + p.z = player->mo->z; + + // Waypointmid and Waypointlow: + if (waypointlow) + { + line[0].x = waypointmid->x; + line[0].y = waypointmid->y; + line[0].z = waypointmid->z; + line[1].x = waypointlow->x; + line[1].y = waypointlow->y; + line[1].z = waypointlow->z; + + P_ClosestPointOnLine3D(&p, line, &resultlow); + } + + // Waypointmid and Waypointhigh: + if (waypointhigh) + { + line[0].x = waypointmid->x; + line[0].y = waypointmid->y; + line[0].z = waypointmid->z; + line[1].x = waypointhigh->x; + line[1].y = waypointhigh->y; + line[1].z = waypointhigh->z; + + P_ClosestPointOnLine3D(&p, line, &resulthigh); + } + + // 3D support now available. Disregard the previous notice here. -Red + + P_UnsetThingPosition(player->mo); + P_ResetPlayer(player); + player->mo->momx = player->mo->momy = player->mo->momz = 0; + + if (lines[lineindex].flags & ML_EFFECT1) // Don't wrap + { + mobj_t *highest = P_GetLastWaypoint(sequence); + highest->flags |= MF_SLIDEME; + } + + // Changing the conditions on these ifs to fix issues with snapping to the wrong spot -Red + if ((lines[lineindex].flags & ML_EFFECT1) && waypointmid->health == 0) + { + closest = waypointhigh; + player->mo->x = resulthigh.x; + player->mo->y = resulthigh.y; + player->mo->z = resulthigh.z - P_GetPlayerHeight(player); + } + else if ((lines[lineindex].flags & ML_EFFECT1) && waypointmid->health == numwaypoints[sequence] - 1) + { + closest = waypointmid; + player->mo->x = resultlow.x; + player->mo->y = resultlow.y; + player->mo->z = resultlow.z - P_GetPlayerHeight(player); + } + else + { + if (P_AproxDistance(P_AproxDistance(player->mo->x-resultlow.x, player->mo->y-resultlow.y), + player->mo->z-resultlow.z) < P_AproxDistance(P_AproxDistance(player->mo->x-resulthigh.x, + player->mo->y-resulthigh.y), player->mo->z-resulthigh.z)) + { + // Line between Mid and Low is closer + closest = waypointmid; + player->mo->x = resultlow.x; + player->mo->y = resultlow.y; + player->mo->z = resultlow.z - P_GetPlayerHeight(player); + } + else + { + // Line between Mid and High is closer + closest = waypointhigh; + player->mo->x = resulthigh.x; + player->mo->y = resulthigh.y; + player->mo->z = resulthigh.z - P_GetPlayerHeight(player); + } + } + + P_SetTarget(&player->mo->tracer, closest); + player->powers[pw_carry] = CR_ROPEHANG; + + // Option for static ropes. + if (lines[lineindex].flags & ML_NOCLIMB) + player->speed = 0; + else + player->speed = speed; + + S_StartSound(player->mo, sfx_s3k4a); + + player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE|PF_GLIDING|PF_BOUNCING|PF_SLIDING|PF_CANCARRY); + player->climbing = 0; + P_SetThingPosition(player->mo); + P_SetPlayerMobjState(player->mo, S_PLAY_RIDE); +} + /** Applies a sector special to a player. * * \param player Player in the sector. * \param sector Sector with the special. * \param roversector If !NULL, sector is actually an FOF; otherwise, sector * is being physically contacted by the player. - * \todo Split up into multiple functions. * \sa P_PlayerInSpecialSector, P_PlayerOnSpecial3DFloor */ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *roversector) { - INT32 i = 0; INT32 section1, section2, section3, section4; - INT32 special; mtag_t sectag = Tag_FGet(§or->tags); section1 = GETSECSPECIAL(sector->special, 1); @@ -4086,10 +4625,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers if (section3 == 2 || section3 == 4) player->onconveyor = section3; - special = section1; - - // Process Section 1 - switch (special) + switch (section1) { case 1: // Damage (Generic) if (roversector || P_MobjReadyToTrigger(player->mo, sector)) @@ -4154,66 +4690,14 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers break; } - special = section2; - - // Process Section 2 - switch (special) + switch (section2) { case 1: // Trigger Linedef Exec (Pushable Objects) break; case 2: // Linedef executor requires all players present+doesn't require touching floor case 3: // Linedef executor requires all players present - /// \todo check continues for proper splitscreen support? - for (i = 0; i < MAXPLAYERS; i++) - { - if (!playeringame[i]) - continue; - if (!players[i].mo) - continue; - if (players[i].spectator) - continue; - if (players[i].bot) - continue; - if (G_CoopGametype() && players[i].lives <= 0) - continue; - if (roversector) - { - if (sector->flags & SF_TRIGGERSPECIAL_TOUCH) - { - msecnode_t *node; - for (node = players[i].mo->touching_sectorlist; node; node = node->m_sectorlist_next) - { - if (P_ThingIsOnThe3DFloor(players[i].mo, sector, node->m_sector)) - break; - } - if (!node) - goto DoneSection2; - } - else if (players[i].mo->subsector && !P_ThingIsOnThe3DFloor(players[i].mo, sector, players[i].mo->subsector->sector)) // this function handles basically everything for us lmao - goto DoneSection2; - } - else - { - if (players[i].mo->subsector->sector == sector) - ; - else if (sector->flags & SF_TRIGGERSPECIAL_TOUCH) - { - msecnode_t *node; - for (node = players[i].mo->touching_sectorlist; node; node = node->m_sectorlist_next) - { - if (node->m_sector == sector) - break; - } - if (!node) - goto DoneSection2; - } - else - goto DoneSection2; - - if (special == 3 && !P_MobjReadyToTrigger(players[i].mo, sector)) - goto DoneSection2; - } - } + if (!P_DoAllPlayersTrigger(sector, roversector, section2 == 3)) + break; /* FALLTHRU */ case 4: // Linedef executor that doesn't require touching floor case 5: // Linedef executor @@ -4225,57 +4709,16 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers case 8: // Tells pushable things to check FOFs break; case 9: // Egg trap capsule - { - thinker_t *th; - mobj_t *mo2; - - if (player->bot || sector->ceilingdata || sector->floordata) - return; - - // Find the center of the Eggtrap and release all the pretty animals! - // The chimps are my friends.. heeheeheheehehee..... - LouisJM - for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) - { - if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) - continue; - mo2 = (mobj_t *)th; - if (mo2->type != MT_EGGTRAP) - continue; - P_KillMobj(mo2, NULL, player->mo, 0); - } - - // clear the special so you can't push the button twice. - sector->special = 0; - - // Move the button down - EV_DoElevator(LE_CAPSULE0, NULL, elevateDown); - - // Open the top FOF - EV_DoFloor(LE_CAPSULE1, NULL, raiseFloorToNearestFast); - // Open the bottom FOF - EV_DoCeiling(LE_CAPSULE2, NULL, lowerToLowestFast); - - // Mark all players with the time to exit thingy! - for (i = 0; i < MAXPLAYERS; i++) - { - if (!playeringame[i]) - continue; - P_DoPlayerExit(&players[i]); - } + P_ProcessEggCapsule(player, sector); break; - } case 10: // Special Stage Time/Rings case 11: // Custom Gravity break; case 12: // Lua sector special break; } -DoneSection2: - special = section3; - - // Process Section 3 - switch (special) + switch (section3) { case 1: // Unused case 2: // Wind/Current @@ -4284,66 +4727,7 @@ DoneSection2: break; case 5: // Speed pad - if (player->powers[pw_flashing] != 0 && player->powers[pw_flashing] < TICRATE/2) - break; - - i = Tag_FindLineSpecial(4, sectag); - - if (i != -1) - { - angle_t lineangle; - fixed_t linespeed; - fixed_t sfxnum; - - lineangle = R_PointToAngle2(lines[i].v1->x, lines[i].v1->y, lines[i].v2->x, lines[i].v2->y); - linespeed = sides[lines[i].sidenum[0]].textureoffset; - - if (linespeed == 0) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: Speed pad (tag %d) at zero speed.\n", sectag); - break; - } - - player->mo->angle = player->drawangle = lineangle; - - if (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG) - P_SetPlayerAngle(player, player->mo->angle); - - if (!(lines[i].flags & ML_EFFECT4)) - { - P_UnsetThingPosition(player->mo); - if (roversector) // make FOF speed pads work - { - player->mo->x = roversector->soundorg.x; - player->mo->y = roversector->soundorg.y; - } - else - { - player->mo->x = sector->soundorg.x; - player->mo->y = sector->soundorg.y; - } - P_SetThingPosition(player->mo); - } - - P_InstaThrust(player->mo, player->mo->angle, linespeed); - - if (lines[i].flags & ML_EFFECT5) // Roll! - { - if (!(player->pflags & PF_SPINNING)) - player->pflags |= PF_SPINNING; - - P_SetPlayerMobjState(player->mo, S_PLAY_ROLL); - } - - player->powers[pw_flashing] = TICRATE/3; - - sfxnum = sides[lines[i].sidenum[0]].toptexture; - - if (!sfxnum) - sfxnum = sfx_spdpad; - - S_StartSound(player->mo, sfxnum); - } + P_ProcessSpeedPad(player, sector, roversector, sectag); break; case 6: // Unused @@ -4359,10 +4743,7 @@ DoneSection2: break; } - special = section4; - - // Process Section 4 - switch (special) + switch (section4) { case 1: // Starpost Activator { @@ -4376,104 +4757,15 @@ DoneSection2: } case 2: // Special stage GOAL sector / Exit Sector / CTF Flag Return - if (player->bot || !(gametyperules & GTR_ALLOWEXIT)) - break; - if (!(maptol & TOL_NIGHTS) && G_IsSpecialStage(gamemap) && player->nightstime > 6) - { - player->nightstime = 6; // Just let P_Ticker take care of the rest. - return; - } - - // Exit (for FOF exits; others are handled in P_PlayerThink in p_user.c) - { - INT32 lineindex; - - P_DoPlayerFinish(player); - - P_SetupSignExit(player); - // important: use sector->tag on next line instead of player->mo->subsector->tag - // this part is different from in P_PlayerThink, this is what was causing - // FOF custom exits not to work. - lineindex = Tag_FindLineSpecial(2, sectag); - - if (G_CoopGametype() && lineindex != -1) // Custom exit! - { - // Special goodies with the block monsters flag depending on emeralds collected - if ((lines[lineindex].flags & ML_BLOCKMONSTERS) && ALL7EMERALDS(emeralds)) - nextmapoverride = (INT16)(lines[lineindex].frontsector->ceilingheight>>FRACBITS); - else - nextmapoverride = (INT16)(lines[lineindex].frontsector->floorheight>>FRACBITS); - - if (lines[lineindex].flags & ML_NOCLIMB) - skipstats = 1; - } - } + P_ProcessExitSector(player, sectag); break; case 3: // Red Team's Base - if ((gametyperules & GTR_TEAMFLAGS) && P_IsObjectOnGround(player->mo)) - { - if (player->ctfteam == 1 && (player->gotflag & GF_BLUEFLAG)) - { - mobj_t *mo; - - // Make sure the red team still has their own - // flag at their base so they can score. - if (!P_IsFlagAtBase(MT_REDFLAG)) - break; - - HU_SetCEchoFlags(V_AUTOFADEOUT|V_ALLOWLOWERCASE); - HU_SetCEchoDuration(5); - HU_DoCEcho(va(M_GetText("\205%s\200\\CAPTURED THE \204BLUE FLAG\200.\\\\\\\\"), player_names[player-players])); - - if (splitscreen || players[consoleplayer].ctfteam == 1) - S_StartSound(NULL, sfx_flgcap); - else if (players[consoleplayer].ctfteam == 2) - S_StartSound(NULL, sfx_lose); - - mo = P_SpawnMobj(player->mo->x,player->mo->y,player->mo->z,MT_BLUEFLAG); - player->gotflag &= ~GF_BLUEFLAG; - mo->flags &= ~MF_SPECIAL; - mo->fuse = TICRATE; - mo->spawnpoint = bflagpoint; - mo->flags2 |= MF2_JUSTATTACKED; - redscore += 1; - P_AddPlayerScore(player, 250); - } - } + P_ProcessTeamBase(player, true); break; case 4: // Blue Team's Base - if ((gametyperules & GTR_TEAMFLAGS) && P_IsObjectOnGround(player->mo)) - { - if (player->ctfteam == 2 && (player->gotflag & GF_REDFLAG)) - { - mobj_t *mo; - - // Make sure the blue team still has their own - // flag at their base so they can score. - if (!P_IsFlagAtBase(MT_BLUEFLAG)) - break; - - HU_SetCEchoFlags(V_AUTOFADEOUT|V_ALLOWLOWERCASE); - HU_SetCEchoDuration(5); - HU_DoCEcho(va(M_GetText("\204%s\200\\CAPTURED THE \205RED FLAG\200.\\\\\\\\"), player_names[player-players])); - - if (splitscreen || players[consoleplayer].ctfteam == 2) - S_StartSound(NULL, sfx_flgcap); - else if (players[consoleplayer].ctfteam == 1) - S_StartSound(NULL, sfx_lose); - - mo = P_SpawnMobj(player->mo->x,player->mo->y,player->mo->z,MT_REDFLAG); - player->gotflag &= ~GF_REDFLAG; - mo->flags &= ~MF_SPECIAL; - mo->fuse = TICRATE; - mo->spawnpoint = rflagpoint; - mo->flags2 |= MF2_JUSTATTACKED; - bluescore += 1; - P_AddPlayerScore(player, 250); - } - } + P_ProcessTeamBase(player, false); break; case 5: // Fan sector @@ -4506,353 +4798,19 @@ DoneSection2: break; case 8: // Zoom Tube Start - { - INT32 sequence; - fixed_t speed; - INT32 lineindex; - mobj_t *waypoint = NULL; - angle_t an; - - if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT && player->powers[pw_carry] == CR_ZOOMTUBE) - break; - - if (player->powers[pw_ignorelatch] & (1<<15)) - break; - - // Find line #3 tagged to this sector - lineindex = Tag_FindLineSpecial(3, sectag); - - if (lineindex == -1) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: Sector special %d missing line special #3.\n", sector->special); - break; - } - - // Grab speed and sequence values - speed = abs(sides[lines[lineindex].sidenum[0]].textureoffset)/8; - sequence = abs(sides[lines[lineindex].sidenum[0]].rowoffset)>>FRACBITS; - - if (speed == 0) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: Waypoint sequence %d at zero speed.\n", sequence); - break; - } - - waypoint = P_GetFirstWaypoint(sequence); - - if (!waypoint) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: FIRST WAYPOINT IN SEQUENCE %d NOT FOUND.\n", sequence); - break; - } - else - { - CONS_Debug(DBG_GAMELOGIC, "Waypoint %d found in sequence %d - speed = %d\n", waypoint->health, sequence, speed); - } - - an = R_PointToAngle2(player->mo->x, player->mo->y, waypoint->x, waypoint->y) - player->mo->angle; - - if (an > ANGLE_90 && an < ANGLE_270 && !(lines[lineindex].flags & ML_EFFECT4)) - break; // behind back - - P_SetTarget(&player->mo->tracer, waypoint); - player->powers[pw_carry] = CR_ZOOMTUBE; - player->speed = speed; - player->pflags |= PF_SPINNING; - player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE|PF_GLIDING|PF_BOUNCING|PF_SLIDING|PF_CANCARRY); - player->climbing = 0; - - if (player->mo->state-states != S_PLAY_ROLL) - { - P_SetPlayerMobjState(player->mo, S_PLAY_ROLL); - S_StartSound(player->mo, sfx_spin); - } - } + P_ProcessZoomTube(player, sector, sectag, false); break; case 9: // Zoom Tube End - { - INT32 sequence; - fixed_t speed; - INT32 lineindex; - mobj_t *waypoint = NULL; - angle_t an; - - if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT && player->powers[pw_carry] == CR_ZOOMTUBE) - break; - - if (player->powers[pw_ignorelatch] & (1<<15)) - break; - - // Find line #3 tagged to this sector - lineindex = Tag_FindLineSpecial(3, sectag); - - if (lineindex == -1) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: Sector special %d missing line special #3.\n", sector->special); - break; - } - - // Grab speed and sequence values - speed = -abs(sides[lines[lineindex].sidenum[0]].textureoffset)/8; // Negative means reverse - sequence = abs(sides[lines[lineindex].sidenum[0]].rowoffset)>>FRACBITS; - - if (speed == 0) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: Waypoint sequence %d at zero speed.\n", sequence); - break; - } - - waypoint = P_GetLastWaypoint(sequence); - - if (!waypoint) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: LAST WAYPOINT IN SEQUENCE %d NOT FOUND.\n", sequence); - break; - } - else - { - CONS_Debug(DBG_GAMELOGIC, "Waypoint %d found in sequence %d - speed = %d\n", waypoint->health, sequence, speed); - } - - an = R_PointToAngle2(player->mo->x, player->mo->y, waypoint->x, waypoint->y) - player->mo->angle; - - if (an > ANGLE_90 && an < ANGLE_270 && !(lines[lineindex].flags & ML_EFFECT4)) - break; // behind back - - P_SetTarget(&player->mo->tracer, waypoint); - player->powers[pw_carry] = CR_ZOOMTUBE; - player->speed = speed; - player->pflags |= PF_SPINNING; - player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE|PF_GLIDING|PF_BOUNCING|PF_SLIDING|PF_CANCARRY); - player->climbing = 0; - - if (player->mo->state-states != S_PLAY_ROLL) - { - P_SetPlayerMobjState(player->mo, S_PLAY_ROLL); - S_StartSound(player->mo, sfx_spin); - } - } + P_ProcessZoomTube(player, sector, sectag, true); break; case 10: // Finish Line - if (((gametyperules & (GTR_RACE|GTR_LIVES)) == GTR_RACE) && !player->exiting) - { - if (player->starpostnum == numstarposts) // Must have touched all the starposts - { - player->laps++; - - if (player->powers[pw_carry] == CR_NIGHTSMODE) - player->drillmeter += 48*20; - - if (player->laps >= (UINT8)cv_numlaps.value) - CONS_Printf(M_GetText("%s has finished the race.\n"), player_names[player-players]); - else if (player->laps == (UINT8)cv_numlaps.value-1) - CONS_Printf(M_GetText("%s started the \205final lap\200!\n"), player_names[player-players]); - else - CONS_Printf(M_GetText("%s started lap %u\n"), player_names[player-players], (UINT32)player->laps+1); - - // Reset starposts (checkpoints) info - player->starpostscale = player->starpostangle = player->starposttime = player->starpostnum = 0; - player->starpostx = player->starposty = player->starpostz = 0; - P_ResetStarposts(); - - // Play the starpost sound for 'consistency' - S_StartSound(player->mo, sfx_strpst); - } - else if (player->starpostnum) - { - // blatant reuse of a variable that's normally unused in circuit - if (!player->tossdelay) - S_StartSound(player->mo, sfx_lose); - player->tossdelay = 3; - } - - if (player->laps >= (unsigned)cv_numlaps.value) - { - if (P_IsLocalPlayer(player)) - { - HU_SetCEchoFlags(0); - HU_SetCEchoDuration(5); - HU_DoCEcho("FINISHED!"); - } - - P_DoPlayerExit(player); - } - } + P_ProcessFinishLine(player); break; case 11: // Rope hang - { - INT32 sequence; - fixed_t speed; - INT32 lineindex; - mobj_t *waypointmid = NULL; - mobj_t *waypointhigh = NULL; - mobj_t *waypointlow = NULL; - mobj_t *closest = NULL; - vector3_t p, line[2], resulthigh, resultlow; - - if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT && player->powers[pw_carry] == CR_ROPEHANG) - break; - - if (player->powers[pw_ignorelatch] & (1<<15)) - break; - - if (player->mo->momz > 0) - break; - - if (player->cmd.buttons & BT_SPIN) - break; - - if (!(player->pflags & PF_SLIDING) && player->mo->state == &states[player->mo->info->painstate]) - break; - - if (player->exiting) - break; - - //initialize resulthigh and resultlow with 0 - memset(&resultlow, 0x00, sizeof(resultlow)); - memset(&resulthigh, 0x00, sizeof(resulthigh)); - - // Find line #11 tagged to this sector - lineindex = Tag_FindLineSpecial(11, sectag); - - if (lineindex == -1) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: Sector special %d missing line special #11.\n", sector->special); - break; - } - - // Grab speed and sequence values - speed = abs(sides[lines[lineindex].sidenum[0]].textureoffset)/8; - sequence = abs(sides[lines[lineindex].sidenum[0]].rowoffset)>>FRACBITS; - - if (speed == 0) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: Waypoint sequence %d at zero speed.\n", sequence); - break; - } - - // Find the closest waypoint - // Find the preceding waypoint - // Find the proceeding waypoint - // Determine the closest spot on the line between the three waypoints - // Put player at that location. - - waypointmid = P_GetClosestWaypoint(sequence, player->mo); - - if (!waypointmid) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: WAYPOINT(S) IN SEQUENCE %d NOT FOUND.\n", sequence); - break; - } - - waypointlow = P_GetPreviousWaypoint(waypointmid, true); - waypointhigh = P_GetNextWaypoint(waypointmid, true); - - CONS_Debug(DBG_GAMELOGIC, "WaypointMid: %d; WaypointLow: %d; WaypointHigh: %d\n", - waypointmid->health, waypointlow ? waypointlow->health : -1, waypointhigh ? waypointhigh->health : -1); - - // Now we have three waypoints... the closest one we're near, and the one that comes before, and after. - // Next, we need to find the closest point on the line between each set, and determine which one we're - // closest to. - - p.x = player->mo->x; - p.y = player->mo->y; - p.z = player->mo->z; - - // Waypointmid and Waypointlow: - if (waypointlow) - { - line[0].x = waypointmid->x; - line[0].y = waypointmid->y; - line[0].z = waypointmid->z; - line[1].x = waypointlow->x; - line[1].y = waypointlow->y; - line[1].z = waypointlow->z; - - P_ClosestPointOnLine3D(&p, line, &resultlow); - } - - // Waypointmid and Waypointhigh: - if (waypointhigh) - { - line[0].x = waypointmid->x; - line[0].y = waypointmid->y; - line[0].z = waypointmid->z; - line[1].x = waypointhigh->x; - line[1].y = waypointhigh->y; - line[1].z = waypointhigh->z; - - P_ClosestPointOnLine3D(&p, line, &resulthigh); - } - - // 3D support now available. Disregard the previous notice here. -Red - - P_UnsetThingPosition(player->mo); - P_ResetPlayer(player); - player->mo->momx = player->mo->momy = player->mo->momz = 0; - - if (lines[lineindex].flags & ML_EFFECT1) // Don't wrap - { - mobj_t *highest = P_GetLastWaypoint(sequence); - highest->flags |= MF_SLIDEME; - } - - // Changing the conditions on these ifs to fix issues with snapping to the wrong spot -Red - if ((lines[lineindex].flags & ML_EFFECT1) && waypointmid->health == 0) - { - closest = waypointhigh; - player->mo->x = resulthigh.x; - player->mo->y = resulthigh.y; - player->mo->z = resulthigh.z - P_GetPlayerHeight(player); - } - else if ((lines[lineindex].flags & ML_EFFECT1) && waypointmid->health == numwaypoints[sequence] - 1) - { - closest = waypointmid; - player->mo->x = resultlow.x; - player->mo->y = resultlow.y; - player->mo->z = resultlow.z - P_GetPlayerHeight(player); - } - else - { - if (P_AproxDistance(P_AproxDistance(player->mo->x-resultlow.x, player->mo->y-resultlow.y), - player->mo->z-resultlow.z) < P_AproxDistance(P_AproxDistance(player->mo->x-resulthigh.x, - player->mo->y-resulthigh.y), player->mo->z-resulthigh.z)) - { - // Line between Mid and Low is closer - closest = waypointmid; - player->mo->x = resultlow.x; - player->mo->y = resultlow.y; - player->mo->z = resultlow.z - P_GetPlayerHeight(player); - } - else - { - // Line between Mid and High is closer - closest = waypointhigh; - player->mo->x = resulthigh.x; - player->mo->y = resulthigh.y; - player->mo->z = resulthigh.z - P_GetPlayerHeight(player); - } - } - - P_SetTarget(&player->mo->tracer, closest); - player->powers[pw_carry] = CR_ROPEHANG; - - // Option for static ropes. - if (lines[lineindex].flags & ML_NOCLIMB) - player->speed = 0; - else - player->speed = speed; - - S_StartSound(player->mo, sfx_s3k4a); - - player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE|PF_GLIDING|PF_BOUNCING|PF_SLIDING|PF_CANCARRY); - player->climbing = 0; - P_SetThingPosition(player->mo); - P_SetPlayerMobjState(player->mo, S_PLAY_RIDE); - } + P_ProcessRopeHang(player, sector, sectag); break; case 12: // Camera noclip case 13: // Unused From 222d05a42456bb6927fdc9c14fe864d279c237e5 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 6 Dec 2021 19:33:36 +0100 Subject: [PATCH 162/377] Refactor sector special plane touching code --- src/p_spec.c | 334 ++++++++++++++++----------------------------------- 1 file changed, 105 insertions(+), 229 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 261f24aae..02e48fab2 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3879,6 +3879,53 @@ boolean P_IsFlagAtBase(mobjtype_t flag) return false; } +static boolean P_IsMobjTouchingPlane(mobj_t *mo, sector_t *sec, fixed_t floorz, fixed_t ceilingz) +{ + boolean floorallowed = ((sec->flags & SF_FLIPSPECIAL_FLOOR) && ((sec->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(mo->eflags & MFE_VERTICALFLIP)) && (mo->z == floorz)); + boolean ceilingallowed = ((sec->flags & SF_FLIPSPECIAL_CEILING) && ((sec->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (mo->eflags & MFE_VERTICALFLIP)) && (mo->z + mo->height == ceilingz)); + return (floorallowed || ceilingallowed); +} + +static boolean P_IsMobjTouchingSectorPlane(mobj_t *mo, sector_t *sec) +{ + return P_IsMobjTouchingPlane(mo, sec, P_GetSpecialBottomZ(mo, sec, sec), P_GetSpecialTopZ(mo, sec, sec)); +} + +static boolean P_IsMobjTouching3DFloor(mobj_t *mo, ffloor_t *ffloor, sector_t *sec) +{ + fixed_t topheight = P_GetSpecialTopZ(mo, sectors + ffloor->secnum, sec); + fixed_t bottomheight = P_GetSpecialBottomZ(mo, sectors + ffloor->secnum, sec); + + if (((ffloor->flags & FF_BLOCKPLAYER) && mo->player) + || ((ffloor->flags & FF_BLOCKOTHERS) && !mo->player)) + { + // Solid 3D floor: Mobj must touch the top or bottom + return P_IsMobjTouchingPlane(mo, ffloor->master->frontsector, topheight, bottomheight); + } + else + { + // Water or intangible 3D floor: Mobj must be inside + return mo->z <= topheight && (mo->z + mo->height) >= bottomheight; + } +} + +static boolean P_IsMobjTouchingPolyobj(mobj_t *mo, polyobj_t *po, sector_t *polysec) +{ + if (!(po->flags & POF_TESTHEIGHT)) // Don't do height checking + return true; + + if (po->flags & POF_SOLID) + { + // Solid polyobject: Player must touch the top or bottom + return P_IsMobjTouchingPlane(mo, polysec, polysec->ceilingheight, polysec->floorheight); + } + else + { + // Water or intangible polyobject: Player must be inside + return mo->z <= polysec->ceilingheight && (mo->z + mo->height) >= polysec->floorheight; + } +} + // // P_PlayerTouchingSectorSpecial // @@ -3905,32 +3952,14 @@ sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 n // Hmm.. maybe there's a FOF that has it... for (rover = player->mo->subsector->sector->ffloors; rover; rover = rover->next) { - fixed_t topheight, bottomheight; - if (GETSECSPECIAL(rover->master->frontsector->special, section) != number) continue; if (!(rover->flags & FF_EXISTS)) continue; - topheight = P_GetSpecialTopZ(player->mo, sectors + rover->secnum, player->mo->subsector->sector); - bottomheight = P_GetSpecialBottomZ(player->mo, sectors + rover->secnum, player->mo->subsector->sector); - - // Check the 3D floor's type... - if (rover->flags & FF_BLOCKPLAYER) - { - boolean floorallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_FLOOR) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z == topheight)); - boolean ceilingallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_CEILING) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z + player->mo->height == bottomheight)); - // Thing must be on top of the floor to be affected... - if (!(floorallowed || ceilingallowed)) - continue; - } - else - { - // Water and DEATH FOG!!! heh - if (player->mo->z > topheight || (player->mo->z + player->mo->height) < bottomheight) - continue; - } + if (!P_IsMobjTouching3DFloor(player->mo, rover, player->mo->subsector->sector)) + continue; // This FOF has the special we're looking for! return rover->master->frontsector; @@ -3950,32 +3979,14 @@ sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 n // Hmm.. maybe there's a FOF that has it... for (rover = node->m_sector->ffloors; rover; rover = rover->next) { - fixed_t topheight, bottomheight; - if (GETSECSPECIAL(rover->master->frontsector->special, section) != number) continue; if (!(rover->flags & FF_EXISTS)) continue; - topheight = P_GetSpecialTopZ(player->mo, sectors + rover->secnum, player->mo->subsector->sector); - bottomheight = P_GetSpecialBottomZ(player->mo, sectors + rover->secnum, player->mo->subsector->sector); - - // Check the 3D floor's type... - if (rover->flags & FF_BLOCKPLAYER) - { - boolean floorallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_FLOOR) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z == topheight)); - boolean ceilingallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_CEILING) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z + player->mo->height == bottomheight)); - // Thing must be on top of the floor to be affected... - if (!(floorallowed || ceilingallowed)) - continue; - } - else - { - // Water and DEATH FOG!!! heh - if (player->mo->z > topheight || (player->mo->z + player->mo->height) < bottomheight) - continue; - } + if (!P_IsMobjTouching3DFloor(player->mo, rover, node->m_sector)) + continue; // This FOF has the special we're looking for, but are we allowed to touch it? if (node->m_sector == player->mo->subsector->sector @@ -3996,14 +4007,10 @@ sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 n static boolean P_ThingIsOnThe3DFloor(mobj_t *mo, sector_t *sector, sector_t *targetsec) { ffloor_t *rover; - fixed_t top, bottom; if (!mo->player) // should NEVER happen return false; - if (!targetsec->ffloors) // also should NEVER happen - return false; - for (rover = targetsec->ffloors; rover; rover = rover->next) { if (rover->master->frontsector != sector) @@ -4013,44 +4020,12 @@ static boolean P_ThingIsOnThe3DFloor(mobj_t *mo, sector_t *sector, sector_t *tar //if (!(rover->flags & FF_EXISTS)) // return false; - top = P_GetSpecialTopZ(mo, sector, targetsec); - bottom = P_GetSpecialBottomZ(mo, sector, targetsec); - - // Check the 3D floor's type... - if (rover->flags & FF_BLOCKPLAYER) - { - boolean floorallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_FLOOR) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(mo->eflags & MFE_VERTICALFLIP)) && (mo->z == top)); - boolean ceilingallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_CEILING) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (mo->eflags & MFE_VERTICALFLIP)) && (mo->z + mo->height == bottom)); - // Thing must be on top of the floor to be affected... - if (!(floorallowed || ceilingallowed)) - continue; - } - else - { - // Water and intangible FOFs - if (mo->z > top || (mo->z + mo->height) < bottom) - return false; - } - - return true; + return P_IsMobjTouching3DFloor(mo, rover, targetsec); } return false; } -// -// P_MobjReadyToTrigger -// -// Is player standing on the sector's "ground"? -// -static boolean P_MobjReadyToTrigger(mobj_t *mo, sector_t *sec) -{ - boolean floorallowed = ((sec->flags & SF_FLIPSPECIAL_FLOOR) && ((sec->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(mo->eflags & MFE_VERTICALFLIP)) && (mo->z == P_GetSpecialBottomZ(mo, sec, sec))); - boolean ceilingallowed = ((sec->flags & SF_FLIPSPECIAL_CEILING) && ((sec->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (mo->eflags & MFE_VERTICALFLIP)) && (mo->z + mo->height == P_GetSpecialTopZ(mo, sec, sec))); - // Thing must be on top of the floor to be affected... - return (floorallowed || ceilingallowed); -} - /// \todo check continues for proper splitscreen support? static boolean P_DoAllPlayersTrigger(sector_t *sector, sector_t *roversector, boolean floortouch) { @@ -4100,7 +4075,7 @@ static boolean P_DoAllPlayersTrigger(sector_t *sector, sector_t *roversector, bo return false; } - if (floortouch && !P_MobjReadyToTrigger(players[i].mo, sector)) + if (floortouch && !P_IsMobjTouchingSectorPlane(players[i].mo, sector)) return false; } } @@ -4628,28 +4603,28 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers switch (section1) { case 1: // Damage (Generic) - if (roversector || P_MobjReadyToTrigger(player->mo, sector)) + if (roversector || P_IsMobjTouchingSectorPlane(player->mo, sector)) P_DamageMobj(player->mo, NULL, NULL, 1, 0); break; case 2: // Damage (Water) - if ((roversector || P_MobjReadyToTrigger(player->mo, sector)) && (player->powers[pw_underwater] || player->powers[pw_carry] == CR_NIGHTSMODE)) + if ((roversector || P_IsMobjTouchingSectorPlane(player->mo, sector)) && (player->powers[pw_underwater] || player->powers[pw_carry] == CR_NIGHTSMODE)) P_DamageMobj(player->mo, NULL, NULL, 1, DMG_WATER); break; case 3: // Damage (Fire) - if (roversector || P_MobjReadyToTrigger(player->mo, sector)) + if (roversector || P_IsMobjTouchingSectorPlane(player->mo, sector)) P_DamageMobj(player->mo, NULL, NULL, 1, DMG_FIRE); break; case 4: // Damage (Electrical) - if (roversector || P_MobjReadyToTrigger(player->mo, sector)) + if (roversector || P_IsMobjTouchingSectorPlane(player->mo, sector)) P_DamageMobj(player->mo, NULL, NULL, 1, DMG_ELECTRIC); break; case 5: // Spikes - if (roversector || P_MobjReadyToTrigger(player->mo, sector)) + if (roversector || P_IsMobjTouchingSectorPlane(player->mo, sector)) P_DamageMobj(player->mo, NULL, NULL, 1, DMG_SPIKE); break; case 6: // Death Pit (Camera Mod) case 7: // Death Pit (No Camera Mod) - if (roversector || P_MobjReadyToTrigger(player->mo, sector)) + if (roversector || P_IsMobjTouchingSectorPlane(player->mo, sector)) { if (player->quittime) G_MovePlayerToSpawnOrStarpost(player - players); @@ -4713,7 +4688,6 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers break; case 10: // Special Stage Time/Rings case 11: // Custom Gravity - break; case 12: // Lua sector special break; } @@ -4725,11 +4699,9 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers case 3: // Unused case 4: // Conveyor Belt break; - case 5: // Speed pad P_ProcessSpeedPad(player, sector, roversector, sectag); break; - case 6: // Unused case 7: // Unused case 8: // Unused @@ -4755,19 +4727,15 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers P_TouchStarPost(post, player, false); break; } - case 2: // Special stage GOAL sector / Exit Sector / CTF Flag Return P_ProcessExitSector(player, sectag); break; - case 3: // Red Team's Base P_ProcessTeamBase(player, true); break; - case 4: // Blue Team's Base P_ProcessTeamBase(player, false); break; - case 5: // Fan sector player->mo->momz += mobjinfo[MT_FAN].mass/4; @@ -4778,12 +4746,10 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers if (player->panim != PA_FALL) P_SetPlayerMobjState(player->mo, S_PLAY_FALL); break; - case 6: // Super Sonic transformer if (player->mo->health > 0 && !player->bot && (player->charflags & SF_SUPER) && !player->powers[pw_super] && ALL7EMERALDS(emeralds)) P_DoSuperTransformation(player, true); break; - case 7: // Make player spin if (!(player->pflags & PF_SPINNING)) { @@ -4796,19 +4762,15 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers P_InstaThrust(player->mo, player->mo->angle, FixedMul(10*FRACUNIT, player->mo->scale)); } break; - case 8: // Zoom Tube Start P_ProcessZoomTube(player, sector, sectag, false); break; - case 9: // Zoom Tube End P_ProcessZoomTube(player, sector, sectag, true); break; - case 10: // Finish Line P_ProcessFinishLine(player); break; - case 11: // Rope hang P_ProcessRopeHang(player, sector, sectag); break; @@ -4830,15 +4792,9 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers */ sector_t *P_ThingOnSpecial3DFloor(mobj_t *mo) { - sector_t *sector; ffloor_t *rover; - fixed_t topheight, bottomheight; - sector = mo->subsector->sector; - if (!sector->ffloors) - return NULL; - - for (rover = sector->ffloors; rover; rover = rover->next) + for (rover = mo->subsector->sector->ffloors; rover; rover = rover->next) { if (!rover->master->frontsector->special) continue; @@ -4846,25 +4802,8 @@ sector_t *P_ThingOnSpecial3DFloor(mobj_t *mo) if (!(rover->flags & FF_EXISTS)) continue; - topheight = P_GetSpecialTopZ(mo, sectors + rover->secnum, sector); - bottomheight = P_GetSpecialBottomZ(mo, sectors + rover->secnum, sector); - - // Check the 3D floor's type... - if (((rover->flags & FF_BLOCKPLAYER) && mo->player) - || ((rover->flags & FF_BLOCKOTHERS) && !mo->player)) - { - boolean floorallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_FLOOR) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(mo->eflags & MFE_VERTICALFLIP)) && (mo->z == topheight)); - boolean ceilingallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_CEILING) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (mo->eflags & MFE_VERTICALFLIP)) && (mo->z + mo->height == bottomheight)); - // Thing must be on top of the floor to be affected... - if (!(floorallowed || ceilingallowed)) - continue; - } - else - { - // Water and intangible FOFs - if (mo->z > topheight || (mo->z + mo->height) < bottomheight) - continue; - } + if (!P_IsMobjTouching3DFloor(mo, rover, mo->subsector->sector)) + continue; return rover->master->frontsector; } @@ -4884,7 +4823,6 @@ static void P_PlayerOnSpecial3DFloor(player_t *player, sector_t *sector) { sector_t *originalsector = player->mo->subsector->sector; ffloor_t *rover; - fixed_t topheight, bottomheight; for (rover = sector->ffloors; rover; rover = rover->next) { @@ -4894,24 +4832,8 @@ static void P_PlayerOnSpecial3DFloor(player_t *player, sector_t *sector) if (!(rover->flags & FF_EXISTS)) continue; - topheight = P_GetSpecialTopZ(player->mo, sectors + rover->secnum, sector); - bottomheight = P_GetSpecialBottomZ(player->mo, sectors + rover->secnum, sector); - - // Check the 3D floor's type... - if (rover->flags & FF_BLOCKPLAYER) - { - boolean floorallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_FLOOR) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z == topheight)); - boolean ceilingallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_CEILING) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z + player->mo->height == bottomheight)); - // Thing must be on top of the floor to be affected... - if (!(floorallowed || ceilingallowed)) - continue; - } - else - { - // Water and DEATH FOG!!! heh - if (player->mo->z > topheight || (player->mo->z + player->mo->height) < bottomheight) - continue; - } + if (!P_IsMobjTouching3DFloor(player->mo, rover, sector)) + continue; // This FOF has the special we're looking for, but are we allowed to touch it? if (sector == player->mo->subsector->sector @@ -4921,77 +4843,40 @@ static void P_PlayerOnSpecial3DFloor(player_t *player, sector_t *sector) if TELEPORTED return; } } - - // Allow sector specials to be applied to polyobjects! - if (player->mo->subsector->polyList) - { - polyobj_t *po = player->mo->subsector->polyList; - sector_t *polysec; - boolean touching = false; - boolean inside = false; - - while (po) - { - if (po->flags & POF_NOSPECIALS) - { - po = (polyobj_t *)(po->link.next); - continue; - } - - polysec = po->lines[0]->backsector; - - if ((polysec->flags & SF_TRIGGERSPECIAL_TOUCH)) - touching = P_MobjTouchingPolyobj(po, player->mo); - else - touching = false; - - inside = P_MobjInsidePolyobj(po, player->mo); - - if (!(inside || touching)) - { - po = (polyobj_t *)(po->link.next); - continue; - } - - // We're inside it! Yess... - if (!polysec->special) - { - po = (polyobj_t *)(po->link.next); - continue; - } - - if (!(po->flags & POF_TESTHEIGHT)) // Don't do height checking - ; - else if (po->flags & POF_SOLID) - { - boolean floorallowed = ((polysec->flags & SF_FLIPSPECIAL_FLOOR) && ((polysec->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z == polysec->ceilingheight)); - boolean ceilingallowed = ((polysec->flags & SF_FLIPSPECIAL_CEILING) && ((polysec->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z + player->mo->height == polysec->floorheight)); - // Thing must be on top of the floor to be affected... - if (!(floorallowed || ceilingallowed)) - { - po = (polyobj_t *)(po->link.next); - continue; - } - } - else - { - // Water and DEATH FOG!!! heh - if (player->mo->z > polysec->ceilingheight || (player->mo->z + player->mo->height) < polysec->floorheight) - { - po = (polyobj_t *)(po->link.next); - continue; - } - } - - P_ProcessSpecialSector(player, polysec, sector); - if TELEPORTED return; - - po = (polyobj_t *)(po->link.next); - } - } } -#define VDOORSPEED (FRACUNIT*2) +static void P_PlayerOnSpecialPolyobj(player_t *player, sector_t *sector) +{ + sector_t *originalsector = player->mo->subsector->sector; + polyobj_t *po; + sector_t *polysec; + boolean touching = false; + boolean inside = false; + + //TODO: Check polyobjects in sector + for (po = player->mo->subsector->polyList; po; po = (polyobj_t *)(po->link.next)) + { + if (po->flags & POF_NOSPECIALS) + continue; + + polysec = po->lines[0]->backsector; + + if (!polysec->special) + continue; + + touching = (polysec->flags & SF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, player->mo); + inside = P_MobjInsidePolyobj(po, player->mo); + + if (!(inside || touching)) + continue; + + if (!P_IsMobjTouchingPolyobj(player->mo, po, polysec)) + continue; + + P_ProcessSpecialSector(player, polysec, sector); + if TELEPORTED return; + } +} // // P_RunSpecialSectorCheck @@ -5001,7 +4886,6 @@ static void P_PlayerOnSpecial3DFloor(player_t *player, sector_t *sector) static void P_RunSpecialSectorCheck(player_t *player, sector_t *sector) { boolean nofloorneeded = false; - fixed_t f_affectpoint, c_affectpoint; if (!sector->special) // nothing special, exit return; @@ -5060,24 +4944,8 @@ static void P_RunSpecialSectorCheck(player_t *player, sector_t *sector) break; } - if (nofloorneeded) - { + if (nofloorneeded || P_IsMobjTouchingSectorPlane(player->mo, sector)) P_ProcessSpecialSector(player, sector, NULL); - return; - } - - f_affectpoint = P_GetSpecialBottomZ(player->mo, sector, sector); - c_affectpoint = P_GetSpecialTopZ(player->mo, sector, sector); - - { - boolean floorallowed = ((sector->flags & SF_FLIPSPECIAL_FLOOR) && ((sector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z == f_affectpoint)); - boolean ceilingallowed = ((sector->flags & SF_FLIPSPECIAL_CEILING) && ((sector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z + player->mo->height == c_affectpoint)); - // Thing must be on top of the floor to be affected... - if (!(floorallowed || ceilingallowed)) - return; - } - - P_ProcessSpecialSector(player, sector, NULL); } /** Checks if the player is in a special sector or FOF and apply any specials. @@ -5099,6 +4967,10 @@ void P_PlayerInSpecialSector(player_t *player) P_PlayerOnSpecial3DFloor(player, originalsector); // Handle FOFs first. if TELEPORTED return; + // Allow sector specials to be applied to polyobjects! + P_PlayerOnSpecialPolyobj(player, originalsector); + if TELEPORTED return; + P_RunSpecialSectorCheck(player, originalsector); if TELEPORTED return; @@ -5114,6 +4986,10 @@ void P_PlayerInSpecialSector(player_t *player) P_PlayerOnSpecial3DFloor(player, loopsector); if TELEPORTED return; + // Check polyobjects... + P_PlayerOnSpecialPolyobj(player, loopsector); + if TELEPORTED return; + if (!(loopsector->flags & SF_TRIGGERSPECIAL_TOUCH)) continue; From c9ed4841296912167f412a45fdd3815a84012bc5 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 7 Dec 2021 07:17:58 +0100 Subject: [PATCH 163/377] Rewrite each time thinker --- src/p_floor.c | 316 ++++++++++++++++++++++++-------------------------- src/p_local.h | 1 - src/p_saveg.c | 2 - src/p_spec.c | 6 +- src/p_spec.h | 5 +- src/p_user.c | 83 ------------- 6 files changed, 156 insertions(+), 257 deletions(-) diff --git a/src/p_floor.c b/src/p_floor.c index 7fbc1ad4c..551469a29 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -1272,216 +1272,198 @@ void T_NoEnemiesSector(noenemies_t *nobaddies) P_RemoveThinker(&nobaddies->thinker); } -// -// P_IsObjectOnRealGround -// -// Helper function for T_EachTimeThinker -// Like P_IsObjectOnGroundIn, except ONLY THE REAL GROUND IS CONSIDERED, NOT FOFS -// I'll consider whether to make this a more globally accessible function or whatever in future -// -- Monster Iestyn -// -static boolean P_IsObjectOnRealGround(mobj_t *mo, sector_t *sec) +static sector_t *P_Check3DFloorTriggers(player_t *player, sector_t *sector, line_t *sourceline) { - // Is the object in reverse gravity? - if (mo->eflags & MFE_VERTICALFLIP) + ffloor_t *rover; + + for (rover = sector->ffloors; rover; rover = rover->next) { - // Detect if the player is on the ceiling. - if (mo->z+mo->height >= P_GetSpecialTopZ(mo, sec, sec)) - return true; + if (GETSECSPECIAL(rover->master->frontsector->special, 2) < 2 || GETSECSPECIAL(rover->master->frontsector->special, 2) > 7) + continue; + + if (!(rover->flags & FF_EXISTS)) + continue; + + if (!Tag_Find(&sourceline->tags, Tag_FGet(&rover->master->frontsector->tags))) + return false; + + if (!P_IsMobjTouching3DFloor(player->mo, rover, sector)) + continue; + + // This FOF has the special we're looking for, but are we allowed to touch it? + if (sector == player->mo->subsector->sector + || (rover->master->frontsector->flags & SF_TRIGGERSPECIAL_TOUCH)) + return rover->master->frontsector; } - // Nope! - else - { - // Detect if the player is on the floor. - if (mo->z <= P_GetSpecialBottomZ(mo, sec, sec)) - return true; - } - return false; + + return NULL; } -static boolean P_IsMobjTouchingSector(mobj_t *mo, sector_t *sec) +static sector_t *P_CheckPolyobjTriggers(player_t *player, line_t *sourceline) { - msecnode_t *node; + polyobj_t *po; + sector_t *polysec; + boolean touching = false; + boolean inside = false; - if (mo->subsector->sector == sec) - return true; + for (po = player->mo->subsector->polyList; po; po = (polyobj_t *)(po->link.next)) //TODO + { + if (po->flags & POF_NOSPECIALS) + continue; - if (!(sec->flags & SF_TRIGGERSPECIAL_TOUCH)) + polysec = po->lines[0]->backsector; + + if (GETSECSPECIAL(polysec->special, 2) < 2 || GETSECSPECIAL(polysec->special, 2) > 7) + continue; + + if (!Tag_Find(&sourceline->tags, Tag_FGet(&polysec->tags))) + return false; + + touching = (polysec->flags & SF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, player->mo); + inside = P_MobjInsidePolyobj(po, player->mo); + + if (!(inside || touching)) + continue; + + if (!P_IsMobjTouchingPolyobj(player->mo, po, polysec)) + continue; + + return polysec; + } + + return NULL; +} + +static boolean P_CheckSectorTriggers(player_t *player, sector_t *sector, line_t *sourceline) +{ + if (GETSECSPECIAL(sector->special, 2) < 2 || GETSECSPECIAL(sector->special, 2) > 7) return false; - for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next) + if (!Tag_Find(&sourceline->tags, Tag_FGet(§or->tags))) + return false; + + if (GETSECSPECIAL(sector->special, 2) != 3 && GETSECSPECIAL(sector->special, 2) != 5) + return true; // "Anywhere in sector" types + + return P_IsMobjTouchingSectorPlane(player->mo, sector); + +} + +static sector_t *P_FindPlayerTrigger(player_t *player, line_t *sourceline) +{ + sector_t *originalsector; + sector_t *loopsector; + msecnode_t *node; + sector_t *caller; + + if (!player->mo) + return NULL; + + originalsector = player->mo->subsector->sector; + + caller = P_Check3DFloorTriggers(player, originalsector, sourceline); // Handle FOFs first. + + if (caller) + return caller; + + // Allow sector specials to be applied to polyobjects! + caller = P_CheckPolyobjTriggers(player, sourceline); + + if (caller) + return caller; + + if (P_CheckSectorTriggers(player, originalsector, sourceline)) + return originalsector; + + // Iterate through touching_sectorlist for SF_TRIGGERSPECIAL_TOUCH + for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) { - if (node->m_sector == sec) - return true; + loopsector = node->m_sector; + + if (loopsector == originalsector) // Don't duplicate + continue; + + // Check 3D floors... + caller = P_Check3DFloorTriggers(player, loopsector, sourceline); // Handle FOFs first. + + if (caller) + return caller; + + //TODO: Check polyobjects in loopsector + + if (!(loopsector->flags & SF_TRIGGERSPECIAL_TOUCH)) + continue; + + if (P_CheckSectorTriggers(player, loopsector, sourceline)) + return loopsector; } return false; } -// -// T_EachTimeThinker -// -// Runs a linedef exec whenever a player enters an area. -// Keeps track of players currently in the area and notices any changes. -// -// \sa P_AddEachTimeThinker -// +static boolean P_CheckAllTrigger(eachtime_t *eachtime) +{ + size_t i; + + for (i = 0; i < MAXPLAYERS; i++) + { + if (P_IsPlayerValid(i) && !eachtime->playersInArea[i]) + return false; + } + + return true; +} + void T_EachTimeThinker(eachtime_t *eachtime) { - size_t i, j; - sector_t *sec = NULL; - sector_t *targetsec = NULL; - INT32 secnum = -1; + size_t i; boolean oldPlayersInArea[MAXPLAYERS]; - boolean oldPlayersOnArea[MAXPLAYERS]; - boolean *oldPlayersArea; - boolean *playersArea; - boolean FOFsector = false; - boolean floortouch = false; - fixed_t bottomheight, topheight; - ffloor_t *rover; + sector_t *caller[MAXPLAYERS]; + boolean allPlayersChecked = false; + boolean allPlayersTrigger = false; mtag_t tag = Tag_FGet(&eachtime->sourceline->tags); for (i = 0; i < MAXPLAYERS; i++) { oldPlayersInArea[i] = eachtime->playersInArea[i]; - oldPlayersOnArea[i] = eachtime->playersOnArea[i]; - eachtime->playersInArea[i] = false; - eachtime->playersOnArea[i] = false; - } - - TAG_ITER_SECTORS(tag, secnum) - { - sec = §ors[secnum]; - - FOFsector = false; - - if (GETSECSPECIAL(sec->special, 2) == 3 || GETSECSPECIAL(sec->special, 2) == 5) - floortouch = true; - else if (GETSECSPECIAL(sec->special, 2) >= 1 && GETSECSPECIAL(sec->special, 2) <= 8) - floortouch = false; - else - continue; - - // Check the lines of this sector, to see if it is a FOF control sector. - for (i = 0; i < sec->linecount; i++) - { - INT32 targetsecnum = -1; - - if (sec->lines[i]->special < 100 || sec->lines[i]->special >= 300) - continue; - - FOFsector = true; - - TAG_ITER_SECTORS(sec->lines[i]->args[0], targetsecnum) - { - targetsec = §ors[targetsecnum]; - - // Find the FOF corresponding to the control linedef - for (rover = targetsec->ffloors; rover; rover = rover->next) - { - if (rover->master == sec->lines[i]) - break; - } - - if (!rover) // This should be impossible, but don't complain if it is the case somehow - continue; - - if (!(rover->flags & FF_EXISTS)) // If the FOF does not "exist", we pretend that nobody's there - continue; - - for (j = 0; j < MAXPLAYERS; j++) - { - if (!P_IsPlayerValid(j)) - continue; - - if (!P_IsMobjTouchingSector(players[j].mo, targetsec)) - continue; - - topheight = P_GetSpecialTopZ(players[j].mo, sec, targetsec); - bottomheight = P_GetSpecialBottomZ(players[j].mo, sec, targetsec); - - if (players[j].mo->z > topheight) - continue; - - if (players[j].mo->z + players[j].mo->height < bottomheight) - continue; - - if (floortouch && P_IsObjectOnGroundIn(players[j].mo, targetsec)) - eachtime->playersOnArea[j] = true; - else - eachtime->playersInArea[j] = true; - } - } - } - - if (!FOFsector) - { - for (i = 0; i < MAXPLAYERS; i++) - { - if (!P_IsPlayerValid(i)) - continue; - - if (!P_IsMobjTouchingSector(players[i].mo, sec)) - continue; - - if (!(players[i].mo->subsector->sector == sec - || P_PlayerTouchingSectorSpecial(&players[i], 2, (GETSECSPECIAL(sec->special, 2))) == sec)) - continue; - - if (floortouch && P_IsObjectOnRealGround(players[i].mo, sec)) - eachtime->playersOnArea[i] = true; - else - eachtime->playersInArea[i] = true; - } - } - } - - // Check if a new player entered. - // If not, check if a player hit the floor. - // If either condition is true, execute. - if (floortouch) - { - playersArea = eachtime->playersOnArea; - oldPlayersArea = oldPlayersOnArea; - } - else - { - playersArea = eachtime->playersInArea; - oldPlayersArea = oldPlayersInArea; + caller[i] = P_IsPlayerValid(i) ? P_FindPlayerTrigger(&players[i], eachtime->sourceline) : NULL; + eachtime->playersInArea[i] = caller[i] != NULL; } // Easy check... nothing has changed - if (!memcmp(playersArea, oldPlayersArea, sizeof(boolean)*MAXPLAYERS)) + if (!memcmp(eachtime->playersInArea, oldPlayersInArea, sizeof(boolean)*MAXPLAYERS)) return; - // If sector has an "all players" trigger type, all players need to be in area - if (GETSECSPECIAL(sec->special, 2) == 2 || GETSECSPECIAL(sec->special, 2) == 3) - { - for (i = 0; i < MAXPLAYERS; i++) - { - if (P_IsPlayerValid(i) && !playersArea[i]) - return; - } - } - // Trigger for every player who has entered (and exited, if triggerOnExit) for (i = 0; i < MAXPLAYERS; i++) { - if (playersArea[i] == oldPlayersArea[i]) + if (eachtime->playersInArea[i] == oldPlayersInArea[i]) continue; // If player has just left, check if still valid - if (!playersArea[i] && (!eachtime->triggerOnExit || !P_IsPlayerValid(i))) + if (!eachtime->playersInArea[i] && (!eachtime->triggerOnExit || !P_IsPlayerValid(i))) continue; + // If sector has an "all players" trigger type, all players need to be in area + if (caller[i] && (GETSECSPECIAL(caller[i]->special, 2) == 2 || GETSECSPECIAL(caller[i]->special, 2) == 3)) + { + if (!allPlayersChecked) + { + allPlayersChecked = true; + allPlayersTrigger = P_CheckAllTrigger(eachtime); + } + + if (!allPlayersTrigger) + continue; + } + CONS_Debug(DBG_GAMELOGIC, "Trying to activate each time executor with tag %d\n", tag); // 03/08/14 -Monster Iestyn // No more stupid hacks involving changing eachtime->sourceline's tag or special or whatever! // This should now run ONLY the stuff for eachtime->sourceline itself, instead of all trigger linedefs sharing the same tag. // Makes much more sense doing it this way, honestly. - P_RunTriggerLinedef(eachtime->sourceline, players[i].mo, sec); + P_RunTriggerLinedef(eachtime->sourceline, players[i].mo, caller[i]); if (!eachtime->sourceline->special) // this happens only for "Trigger on X calls" linedefs P_RemoveThinker(&eachtime->thinker); diff --git a/src/p_local.h b/src/p_local.h index 1fcd3050d..bbcd86b39 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -148,7 +148,6 @@ boolean P_PlayerShouldUseSpinHeight(player_t *player); boolean P_IsObjectInGoop(mobj_t *mo); boolean P_IsObjectOnGround(mobj_t *mo); -boolean P_IsObjectOnGroundIn(mobj_t *mo, sector_t *sec); boolean P_InSpaceSector(mobj_t *mo); boolean P_InQuicksand(mobj_t *mo); boolean P_PlayerHitFloor(player_t *player, boolean dorollstuff); diff --git a/src/p_saveg.c b/src/p_saveg.c index b17011837..bc9c31d64 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2012,7 +2012,6 @@ static void SaveEachTimeThinker(const thinker_t *th, const UINT8 type) for (i = 0; i < MAXPLAYERS; i++) { WRITECHAR(save_p, ht->playersInArea[i]); - WRITECHAR(save_p, ht->playersOnArea[i]); } WRITECHAR(save_p, ht->triggerOnExit); } @@ -3130,7 +3129,6 @@ static thinker_t* LoadEachTimeThinker(actionf_p1 thinker) for (i = 0; i < MAXPLAYERS; i++) { ht->playersInArea[i] = READCHAR(save_p); - ht->playersOnArea[i] = READCHAR(save_p); } ht->triggerOnExit = READCHAR(save_p); return &ht->thinker; diff --git a/src/p_spec.c b/src/p_spec.c index 02e48fab2..feab9f2b6 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3886,12 +3886,12 @@ static boolean P_IsMobjTouchingPlane(mobj_t *mo, sector_t *sec, fixed_t floorz, return (floorallowed || ceilingallowed); } -static boolean P_IsMobjTouchingSectorPlane(mobj_t *mo, sector_t *sec) +boolean P_IsMobjTouchingSectorPlane(mobj_t *mo, sector_t *sec) { return P_IsMobjTouchingPlane(mo, sec, P_GetSpecialBottomZ(mo, sec, sec), P_GetSpecialTopZ(mo, sec, sec)); } -static boolean P_IsMobjTouching3DFloor(mobj_t *mo, ffloor_t *ffloor, sector_t *sec) +boolean P_IsMobjTouching3DFloor(mobj_t *mo, ffloor_t *ffloor, sector_t *sec) { fixed_t topheight = P_GetSpecialTopZ(mo, sectors + ffloor->secnum, sec); fixed_t bottomheight = P_GetSpecialBottomZ(mo, sectors + ffloor->secnum, sec); @@ -3909,7 +3909,7 @@ static boolean P_IsMobjTouching3DFloor(mobj_t *mo, ffloor_t *ffloor, sector_t *s } } -static boolean P_IsMobjTouchingPolyobj(mobj_t *mo, polyobj_t *po, sector_t *polysec) +boolean P_IsMobjTouchingPolyobj(mobj_t *mo, polyobj_t *po, sector_t *polysec) { if (!(po->flags & POF_TESTHEIGHT)) // Don't do height checking return true; diff --git a/src/p_spec.h b/src/p_spec.h index 0fdc216b9..5e79e9737 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -338,6 +338,10 @@ INT32 P_FindMinSurroundingLight(sector_t *sector, INT32 max); void P_SetupSignExit(player_t *player); boolean P_IsFlagAtBase(mobjtype_t flag); +boolean P_IsMobjTouchingSectorPlane(mobj_t *mo, sector_t *sec); +boolean P_IsMobjTouching3DFloor(mobj_t *mo, ffloor_t *ffloor, sector_t *sec); +boolean P_IsMobjTouchingPolyobj(mobj_t *mo, polyobj_t *po, sector_t *polysec); + void P_SwitchWeather(INT32 weathernum); boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller); @@ -680,7 +684,6 @@ typedef struct thinker_t thinker; line_t *sourceline; // Source line of the thinker boolean playersInArea[MAXPLAYERS]; - boolean playersOnArea[MAXPLAYERS]; boolean triggerOnExit; } eachtime_t; diff --git a/src/p_user.c b/src/p_user.c index 9921ed078..4858c6ddd 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1728,89 +1728,6 @@ boolean P_IsObjectOnGround(mobj_t *mo) return false; } -// -// P_IsObjectOnGroundIn -// -// Returns true if the player is -// on the ground in a specific sector. Takes reverse -// gravity and FOFs into account. -// -boolean P_IsObjectOnGroundIn(mobj_t *mo, sector_t *sec) -{ - ffloor_t *rover; - - // Is the object in reverse gravity? - if (mo->eflags & MFE_VERTICALFLIP) - { - // Detect if the player is on the ceiling. - if (mo->z+mo->height >= P_GetSpecialTopZ(mo, sec, sec)) - return true; - // Otherwise, detect if the player is on the bottom of a FOF. - else - { - for (rover = sec->ffloors; rover; rover = rover->next) - { - // If the FOF doesn't exist, continue. - if (!(rover->flags & FF_EXISTS)) - continue; - - // If the FOF is configured to let the object through, continue. - if (!((rover->flags & FF_BLOCKPLAYER && mo->player) - || (rover->flags & FF_BLOCKOTHERS && !mo->player))) - continue; - - // If the the platform is intangible from below, continue. - if (rover->flags & FF_PLATFORM) - continue; - - // If the FOF is a water block, continue. (Unnecessary check?) - if (rover->flags & FF_SWIMMABLE) - continue; - - // Actually check if the player is on the suitable FOF. - if (mo->z+mo->height == P_GetSpecialBottomZ(mo, sectors + rover->secnum, sec)) - return true; - } - } - } - // Nope! - else - { - // Detect if the player is on the floor. - if (mo->z <= P_GetSpecialBottomZ(mo, sec, sec)) - return true; - // Otherwise, detect if the player is on the top of a FOF. - else - { - for (rover = sec->ffloors; rover; rover = rover->next) - { - // If the FOF doesn't exist, continue. - if (!(rover->flags & FF_EXISTS)) - continue; - - // If the FOF is configured to let the object through, continue. - if (!((rover->flags & FF_BLOCKPLAYER && mo->player) - || (rover->flags & FF_BLOCKOTHERS && !mo->player))) - continue; - - // If the the platform is intangible from above, continue. - if (rover->flags & FF_REVERSEPLATFORM) - continue; - - // If the FOF is a water block, continue. (Unnecessary check?) - if (rover->flags & FF_SWIMMABLE) - continue; - - // Actually check if the player is on the suitable FOF. - if (mo->z == P_GetSpecialTopZ(mo, sectors + rover->secnum, sec)) - return true; - } - } - } - - return false; -} - // // P_SetObjectMomZ // From 3cd56e456dc8dd52d185e0e5048feede9af34b18 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 7 Dec 2021 19:20:26 +0100 Subject: [PATCH 164/377] Rewrite pushable/mobj linedef executor trigger code --- src/p_mobj.c | 30 +------------- src/p_spec.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++----- src/p_spec.h | 2 + 3 files changed, 105 insertions(+), 37 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index fa1ed2443..2c6315271 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10048,15 +10048,7 @@ void P_MobjThinker(mobj_t *mobj) tmfloorthing = tmhitthing = NULL; // Sector special (2,8) allows ANY mobj to trigger a linedef exec - if (mobj->subsector && GETSECSPECIAL(mobj->subsector->sector->special, 2) == 8) - { - sector_t *sec2 = P_ThingOnSpecial3DFloor(mobj); - if (sec2 && GETSECSPECIAL(sec2->special, 2) == 1) - { - mtag_t tag = Tag_FGet(&sec2->tags); - P_LinedefExecute(tag, mobj, sec2); - } - } + P_CheckMobjTrigger(mobj); if (mobj->scale != mobj->destscale) P_MobjScaleThink(mobj); // Slowly scale up/down to reach your destscale. @@ -10271,28 +10263,10 @@ boolean P_RailThinker(mobj_t *mobj) // Unquick, unoptimized function for pushables void P_PushableThinker(mobj_t *mobj) { - sector_t *sec; - I_Assert(mobj != NULL); I_Assert(!P_MobjWasRemoved(mobj)); - sec = mobj->subsector->sector; - - if (GETSECSPECIAL(sec->special, 2) == 1 && mobj->z == sec->floorheight) - { - mtag_t tag = Tag_FGet(&sec->tags); - P_LinedefExecute(tag, mobj, sec); - } - -// else if (GETSECSPECIAL(sec->special, 2) == 8) - { - sector_t *sec2 = P_ThingOnSpecial3DFloor(mobj); - if (sec2 && GETSECSPECIAL(sec2->special, 2) == 1) - { - mtag_t tag = Tag_FGet(&sec2->tags); - P_LinedefExecute(tag, mobj, sec2); - } - } + P_CheckPushableTrigger(mobj, mobj->subsector->sector); // it has to be pushable RIGHT NOW for this part to happen if (mobj->flags & MF_PUSHABLE && !(mobj->momx || mobj->momy)) diff --git a/src/p_spec.c b/src/p_spec.c index feab9f2b6..f4e0648f7 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4811,7 +4811,7 @@ sector_t *P_ThingOnSpecial3DFloor(mobj_t *mo) return NULL; } -#define TELEPORTED (player->mo->subsector->sector != originalsector) +#define TELEPORTED(mo) (mo->subsector->sector != originalsector) /** Checks if a player is standing on or is inside a 3D floor (e.g. water) and * applies any specials. @@ -4840,7 +4840,7 @@ static void P_PlayerOnSpecial3DFloor(player_t *player, sector_t *sector) || (rover->master->frontsector->flags & SF_TRIGGERSPECIAL_TOUCH)) { P_ProcessSpecialSector(player, rover->master->frontsector, sector); - if TELEPORTED return; + if TELEPORTED(player->mo) return; } } } @@ -4874,7 +4874,7 @@ static void P_PlayerOnSpecialPolyobj(player_t *player, sector_t *sector) continue; P_ProcessSpecialSector(player, polysec, sector); - if TELEPORTED return; + if TELEPORTED(player->mo) return; } } @@ -4965,14 +4965,14 @@ void P_PlayerInSpecialSector(player_t *player) originalsector = player->mo->subsector->sector; P_PlayerOnSpecial3DFloor(player, originalsector); // Handle FOFs first. - if TELEPORTED return; + if TELEPORTED(player->mo) return; // Allow sector specials to be applied to polyobjects! P_PlayerOnSpecialPolyobj(player, originalsector); - if TELEPORTED return; + if TELEPORTED(player->mo) return; P_RunSpecialSectorCheck(player, originalsector); - if TELEPORTED return; + if TELEPORTED(player->mo) return; // Iterate through touching_sectorlist for SF_TRIGGERSPECIAL_TOUCH for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) @@ -4984,20 +4984,112 @@ void P_PlayerInSpecialSector(player_t *player) // Check 3D floors... P_PlayerOnSpecial3DFloor(player, loopsector); - if TELEPORTED return; + if TELEPORTED(player->mo) return; // Check polyobjects... P_PlayerOnSpecialPolyobj(player, loopsector); - if TELEPORTED return; + if TELEPORTED(player->mo) return; if (!(loopsector->flags & SF_TRIGGERSPECIAL_TOUCH)) continue; P_RunSpecialSectorCheck(player, loopsector); - if TELEPORTED return; + if TELEPORTED(player->mo) return; } } +static void P_CheckMobj3DFloorTrigger(mobj_t *mo) +{ + sector_t *originalsector = mo->subsector->sector; + ffloor_t *rover; + mtag_t tag; + + for (rover = mo->subsector->sector->ffloors; rover; rover = rover->next) + { + if (GETSECSPECIAL(rover->master->frontsector->special, 2) != 1) + continue; + + if (!(rover->flags & FF_EXISTS)) + continue; + + if (!P_IsMobjTouching3DFloor(mo, rover, mo->subsector->sector)) + continue; + + tag = Tag_FGet(&rover->master->frontsector->tags); + P_LinedefExecute(tag, mo, rover->master->frontsector); + if TELEPORTED(mo) return; + } +} + +static void P_CheckMobjPolyobjTrigger(mobj_t *mo) +{ + sector_t *originalsector = mo->subsector->sector; + polyobj_t *po; + sector_t *polysec; + boolean touching = false; + boolean inside = false; + mtag_t tag; + + for (po = mo->subsector->polyList; po; po = (polyobj_t *)(po->link.next)) + { + if (po->flags & POF_NOSPECIALS) + continue; + + polysec = po->lines[0]->backsector; + + if (!polysec->special) + continue; + + touching = (polysec->flags & SF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, mo); + inside = P_MobjInsidePolyobj(po, mo); + + if (!(inside || touching)) + continue; + + if (!P_IsMobjTouchingPolyobj(mo, po, polysec)) + continue; + + tag = Tag_FGet(&polysec->tags); + P_LinedefExecute(tag, mo, polysec); + if TELEPORTED(mo) return; + } +} + +void P_CheckPushableTrigger(mobj_t *mobj, sector_t *sec) +{ + sector_t *originalsector = mobj->subsector->sector; + + P_CheckMobj3DFloorTrigger(mobj); + if TELEPORTED(mobj) return; + + P_CheckMobjPolyobjTrigger(mobj); + if TELEPORTED(mobj) return; + + if (GETSECSPECIAL(sec->special, 2) == 1 && P_IsMobjTouchingSectorPlane(mobj, sec)) + { + mtag_t tag = Tag_FGet(&sec->tags); + P_LinedefExecute(tag, mobj, sec); + } +} + +void P_CheckMobjTrigger(mobj_t *mobj) +{ + sector_t *originalsector; + + if (!mobj->subsector) + return; + + originalsector = mobj->subsector->sector; + + if (GETSECSPECIAL(originalsector->special, 2) != 8) + return; + + P_CheckMobj3DFloorTrigger(mobj); + if TELEPORTED(mobj) return; + + P_CheckMobjPolyobjTrigger(mobj); +} + #undef TELEPORTED /** Animate planes, scroll walls, etc. and keeps track of level timelimit and exits if time is up. diff --git a/src/p_spec.h b/src/p_spec.h index 5e79e9737..50387fbd8 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -322,6 +322,8 @@ void P_SpawnSpecials(boolean fromnetsave); void P_UpdateSpecials(void); sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 number); void P_PlayerInSpecialSector(player_t *player); +void P_CheckPushableTrigger(mobj_t *mobj, sector_t *sec); +void P_CheckMobjTrigger(mobj_t *mobj); void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *roversector); fixed_t P_FindLowestFloorSurrounding(sector_t *sec); From c8cb09664714389ca82a886433027921472e6396 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 7 Dec 2021 21:39:45 +0100 Subject: [PATCH 165/377] "Floor touch" sector specials are no longer contaminated by "anywhere in sector" specials --- src/p_spec.c | 137 +++++++++++++++++---------------------------------- 1 file changed, 44 insertions(+), 93 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index f4e0648f7..bfaa97ba8 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4192,7 +4192,7 @@ static void P_ProcessSpeedPad(player_t *player, sector_t *sector, sector_t *rove S_StartSound(player->mo, sfxnum); } -static void P_ProcessExitSector(player_t *player, mtag_t sectag) +static void P_ProcessExitSector(player_t *player, boolean isTouching, mtag_t sectag) { INT32 lineindex; @@ -4202,9 +4202,10 @@ static void P_ProcessExitSector(player_t *player, mtag_t sectag) if (player->bot) return; - if (!(maptol & TOL_NIGHTS) && G_IsSpecialStage(gamemap) && player->nightstime > 6) + if (!(maptol & TOL_NIGHTS) && G_IsSpecialStage(gamemap)) { - player->nightstime = 6; // Just let P_Ticker take care of the rest. + if (player->nightstime > 6 && isTouching) + player->nightstime = 6; // Just let P_Ticker take care of the rest. return; } @@ -4580,6 +4581,10 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers { INT32 section1, section2, section3, section4; mtag_t sectag = Tag_FGet(§or->tags); + boolean isTouching; + + if (!sector->special) + return; section1 = GETSECSPECIAL(sector->special, 1); section2 = GETSECSPECIAL(sector->special, 2); @@ -4600,37 +4605,38 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers if (section3 == 2 || section3 == 4) player->onconveyor = section3; + isTouching = roversector || P_IsMobjTouchingSectorPlane(player->mo, sector); + switch (section1) { case 1: // Damage (Generic) - if (roversector || P_IsMobjTouchingSectorPlane(player->mo, sector)) + if (isTouching) P_DamageMobj(player->mo, NULL, NULL, 1, 0); break; case 2: // Damage (Water) - if ((roversector || P_IsMobjTouchingSectorPlane(player->mo, sector)) && (player->powers[pw_underwater] || player->powers[pw_carry] == CR_NIGHTSMODE)) + if (isTouching && (player->powers[pw_underwater] || player->powers[pw_carry] == CR_NIGHTSMODE)) P_DamageMobj(player->mo, NULL, NULL, 1, DMG_WATER); break; case 3: // Damage (Fire) - if (roversector || P_IsMobjTouchingSectorPlane(player->mo, sector)) + if (isTouching) P_DamageMobj(player->mo, NULL, NULL, 1, DMG_FIRE); break; case 4: // Damage (Electrical) - if (roversector || P_IsMobjTouchingSectorPlane(player->mo, sector)) + if (isTouching) P_DamageMobj(player->mo, NULL, NULL, 1, DMG_ELECTRIC); break; case 5: // Spikes - if (roversector || P_IsMobjTouchingSectorPlane(player->mo, sector)) + if (isTouching) P_DamageMobj(player->mo, NULL, NULL, 1, DMG_SPIKE); break; case 6: // Death Pit (Camera Mod) case 7: // Death Pit (No Camera Mod) - if (roversector || P_IsMobjTouchingSectorPlane(player->mo, sector)) - { - if (player->quittime) - G_MovePlayerToSpawnOrStarpost(player - players); - else - P_DamageMobj(player->mo, NULL, NULL, 1, DMG_DEATHPIT); - } + if (!isTouching) + break; + if (player->quittime) + G_MovePlayerToSpawnOrStarpost(player - players); + else + P_DamageMobj(player->mo, NULL, NULL, 1, DMG_DEATHPIT); break; case 8: // Instant Kill if (player->quittime) @@ -4639,6 +4645,9 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers P_DamageMobj(player->mo, NULL, NULL, 1, DMG_INSTAKILL); break; case 9: // Ring Drainer (Floor Touch) + if (!isTouching) + break; + /* FALLTHRU */ case 10: // Ring Drainer (No Floor Touch) if (leveltime % (TICRATE/2) == 0 && player->rings > 0) { @@ -4647,6 +4656,9 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers } break; case 11: // Special Stage Damage + if (!isTouching) + break; + if (player->exiting || player->bot) // Don't do anything for bots or players who have just finished break; @@ -4678,13 +4690,16 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers case 5: // Linedef executor case 6: // Linedef executor (7 Emeralds) case 7: // Linedef executor (NiGHTS Mare) + if ((section2 == 3 || section2 == 5) && !isTouching) + break; if (!player->bot) P_LinedefExecute(sectag, player->mo, sector); break; case 8: // Tells pushable things to check FOFs break; case 9: // Egg trap capsule - P_ProcessEggCapsule(player, sector); + if (roversector) + P_ProcessEggCapsule(player, sector); break; case 10: // Special Stage Time/Rings case 11: // Custom Gravity @@ -4700,7 +4715,8 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers case 4: // Conveyor Belt break; case 5: // Speed pad - P_ProcessSpeedPad(player, sector, roversector, sectag); + if (isTouching) + P_ProcessSpeedPad(player, sector, roversector, sectag); break; case 6: // Unused case 7: // Unused @@ -4728,13 +4744,15 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers break; } case 2: // Special stage GOAL sector / Exit Sector / CTF Flag Return - P_ProcessExitSector(player, sectag); + P_ProcessExitSector(player, isTouching, sectag); break; case 3: // Red Team's Base - P_ProcessTeamBase(player, true); + if (isTouching) + P_ProcessTeamBase(player, true); break; case 4: // Blue Team's Base - P_ProcessTeamBase(player, false); + if (isTouching) + P_ProcessTeamBase(player, false); break; case 5: // Fan sector player->mo->momz += mobjinfo[MT_FAN].mass/4; @@ -4751,6 +4769,8 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers P_DoSuperTransformation(player, true); break; case 7: // Make player spin + if (!isTouching) + break; if (!(player->pflags & PF_SPINNING)) { player->pflags |= PF_SPINNING; @@ -4772,7 +4792,8 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers P_ProcessFinishLine(player); break; case 11: // Rope hang - P_ProcessRopeHang(player, sector, sectag); + if (isTouching) + P_ProcessRopeHang(player, sector, sectag); break; case 12: // Camera noclip case 13: // Unused @@ -4878,76 +4899,6 @@ static void P_PlayerOnSpecialPolyobj(player_t *player, sector_t *sector) } } -// -// P_RunSpecialSectorCheck -// -// Helper function to P_PlayerInSpecialSector -// -static void P_RunSpecialSectorCheck(player_t *player, sector_t *sector) -{ - boolean nofloorneeded = false; - - if (!sector->special) // nothing special, exit - return; - - if (GETSECSPECIAL(sector->special, 2) == 9) // Egg trap capsule -- should only be for 3dFloors! - return; - - // The list of specials that activate without floor touch - // Check Section 1 - switch(GETSECSPECIAL(sector->special, 1)) - { - case 2: // Damage (water) - case 8: // Instant kill - case 10: // Ring drainer that doesn't require floor touch - case 12: // Space countdown - nofloorneeded = true; - break; - } - - // Check Section 2 - switch(GETSECSPECIAL(sector->special, 2)) - { - case 2: // Linedef executor (All players needed) - case 4: // Linedef executor - case 6: // Linedef executor (7 Emeralds) - case 7: // Linedef executor (NiGHTS Mare) - nofloorneeded = true; - break; - } - - // Check Section 3 -/* switch(GETSECSPECIAL(sector->special, 3)) - { - - }*/ - - // Check Section 4 - switch(GETSECSPECIAL(sector->special, 4)) - { - case 2: // Level Exit / GOAL Sector / Flag Return - if (!(maptol & TOL_NIGHTS) && G_IsSpecialStage(gamemap)) - { - // Special stage GOAL sector - // requires touching floor. - break; - } - /* FALLTHRU */ - - case 1: // Starpost activator - case 5: // Fan sector - case 6: // Super Sonic Transform - case 8: // Zoom Tube Start - case 9: // Zoom Tube End - case 10: // Finish line - nofloorneeded = true; - break; - } - - if (nofloorneeded || P_IsMobjTouchingSectorPlane(player->mo, sector)) - P_ProcessSpecialSector(player, sector, NULL); -} - /** Checks if the player is in a special sector or FOF and apply any specials. * * \param player Player to check. @@ -4971,7 +4922,7 @@ void P_PlayerInSpecialSector(player_t *player) P_PlayerOnSpecialPolyobj(player, originalsector); if TELEPORTED(player->mo) return; - P_RunSpecialSectorCheck(player, originalsector); + P_ProcessSpecialSector(player, originalsector, NULL); if TELEPORTED(player->mo) return; // Iterate through touching_sectorlist for SF_TRIGGERSPECIAL_TOUCH @@ -4993,7 +4944,7 @@ void P_PlayerInSpecialSector(player_t *player) if (!(loopsector->flags & SF_TRIGGERSPECIAL_TOUCH)) continue; - P_RunSpecialSectorCheck(player, loopsector); + P_ProcessSpecialSector(player, loopsector, NULL); if TELEPORTED(player->mo) return; } } From 1a2b0d24ab845d67e27fc7bf75a4c569e01c660d Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 8 Dec 2021 20:29:10 +0100 Subject: [PATCH 166/377] Make all players triggers work if players are in different sectors with the same tag --- src/p_floor.c | 129 ------------------------------------ src/p_spec.c | 177 +++++++++++++++++++++++++++++++++++--------------- src/p_spec.h | 1 + 3 files changed, 125 insertions(+), 182 deletions(-) diff --git a/src/p_floor.c b/src/p_floor.c index 551469a29..fabc8de28 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -1272,135 +1272,6 @@ void T_NoEnemiesSector(noenemies_t *nobaddies) P_RemoveThinker(&nobaddies->thinker); } -static sector_t *P_Check3DFloorTriggers(player_t *player, sector_t *sector, line_t *sourceline) -{ - ffloor_t *rover; - - for (rover = sector->ffloors; rover; rover = rover->next) - { - if (GETSECSPECIAL(rover->master->frontsector->special, 2) < 2 || GETSECSPECIAL(rover->master->frontsector->special, 2) > 7) - continue; - - if (!(rover->flags & FF_EXISTS)) - continue; - - if (!Tag_Find(&sourceline->tags, Tag_FGet(&rover->master->frontsector->tags))) - return false; - - if (!P_IsMobjTouching3DFloor(player->mo, rover, sector)) - continue; - - // This FOF has the special we're looking for, but are we allowed to touch it? - if (sector == player->mo->subsector->sector - || (rover->master->frontsector->flags & SF_TRIGGERSPECIAL_TOUCH)) - return rover->master->frontsector; - } - - return NULL; -} - -static sector_t *P_CheckPolyobjTriggers(player_t *player, line_t *sourceline) -{ - polyobj_t *po; - sector_t *polysec; - boolean touching = false; - boolean inside = false; - - for (po = player->mo->subsector->polyList; po; po = (polyobj_t *)(po->link.next)) //TODO - { - if (po->flags & POF_NOSPECIALS) - continue; - - polysec = po->lines[0]->backsector; - - if (GETSECSPECIAL(polysec->special, 2) < 2 || GETSECSPECIAL(polysec->special, 2) > 7) - continue; - - if (!Tag_Find(&sourceline->tags, Tag_FGet(&polysec->tags))) - return false; - - touching = (polysec->flags & SF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, player->mo); - inside = P_MobjInsidePolyobj(po, player->mo); - - if (!(inside || touching)) - continue; - - if (!P_IsMobjTouchingPolyobj(player->mo, po, polysec)) - continue; - - return polysec; - } - - return NULL; -} - -static boolean P_CheckSectorTriggers(player_t *player, sector_t *sector, line_t *sourceline) -{ - if (GETSECSPECIAL(sector->special, 2) < 2 || GETSECSPECIAL(sector->special, 2) > 7) - return false; - - if (!Tag_Find(&sourceline->tags, Tag_FGet(§or->tags))) - return false; - - if (GETSECSPECIAL(sector->special, 2) != 3 && GETSECSPECIAL(sector->special, 2) != 5) - return true; // "Anywhere in sector" types - - return P_IsMobjTouchingSectorPlane(player->mo, sector); - -} - -static sector_t *P_FindPlayerTrigger(player_t *player, line_t *sourceline) -{ - sector_t *originalsector; - sector_t *loopsector; - msecnode_t *node; - sector_t *caller; - - if (!player->mo) - return NULL; - - originalsector = player->mo->subsector->sector; - - caller = P_Check3DFloorTriggers(player, originalsector, sourceline); // Handle FOFs first. - - if (caller) - return caller; - - // Allow sector specials to be applied to polyobjects! - caller = P_CheckPolyobjTriggers(player, sourceline); - - if (caller) - return caller; - - if (P_CheckSectorTriggers(player, originalsector, sourceline)) - return originalsector; - - // Iterate through touching_sectorlist for SF_TRIGGERSPECIAL_TOUCH - for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) - { - loopsector = node->m_sector; - - if (loopsector == originalsector) // Don't duplicate - continue; - - // Check 3D floors... - caller = P_Check3DFloorTriggers(player, loopsector, sourceline); // Handle FOFs first. - - if (caller) - return caller; - - //TODO: Check polyobjects in loopsector - - if (!(loopsector->flags & SF_TRIGGERSPECIAL_TOUCH)) - continue; - - if (P_CheckSectorTriggers(player, loopsector, sourceline)) - return loopsector; - } - - return false; -} - static boolean P_CheckAllTrigger(eachtime_t *eachtime) { size_t i; diff --git a/src/p_spec.c b/src/p_spec.c index bfaa97ba8..49ba3adaf 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3998,39 +3998,142 @@ sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 n return NULL; } -// -// P_ThingIsOnThe3DFloor -// -// This checks whether the mobj is on/in the FOF we want it to be at -// Needed for the "All players" trigger sector specials only -// -static boolean P_ThingIsOnThe3DFloor(mobj_t *mo, sector_t *sector, sector_t *targetsec) +static sector_t *P_Check3DFloorTriggers(player_t *player, sector_t *sector, line_t *sourceline) { ffloor_t *rover; - if (!mo->player) // should NEVER happen - return false; - - for (rover = targetsec->ffloors; rover; rover = rover->next) + for (rover = sector->ffloors; rover; rover = rover->next) { - if (rover->master->frontsector != sector) + if (GETSECSPECIAL(rover->master->frontsector->special, 2) < 2 || GETSECSPECIAL(rover->master->frontsector->special, 2) > 7) continue; - // we're assuming the FOF existed when the first player touched it - //if (!(rover->flags & FF_EXISTS)) - // return false; + if (!(rover->flags & FF_EXISTS)) + continue; - return P_IsMobjTouching3DFloor(mo, rover, targetsec); + if (!Tag_Find(&sourceline->tags, Tag_FGet(&rover->master->frontsector->tags))) + return false; + + if (!P_IsMobjTouching3DFloor(player->mo, rover, sector)) + continue; + + // This FOF has the special we're looking for, but are we allowed to touch it? + if (sector == player->mo->subsector->sector + || (rover->master->frontsector->flags & SF_TRIGGERSPECIAL_TOUCH)) + return rover->master->frontsector; + } + + return NULL; +} + +static sector_t *P_CheckPolyobjTriggers(player_t *player, line_t *sourceline) +{ + polyobj_t *po; + sector_t *polysec; + boolean touching = false; + boolean inside = false; + + for (po = player->mo->subsector->polyList; po; po = (polyobj_t *)(po->link.next)) //TODO + { + if (po->flags & POF_NOSPECIALS) + continue; + + polysec = po->lines[0]->backsector; + + if (GETSECSPECIAL(polysec->special, 2) < 2 || GETSECSPECIAL(polysec->special, 2) > 7) + continue; + + if (!Tag_Find(&sourceline->tags, Tag_FGet(&polysec->tags))) + return false; + + touching = (polysec->flags & SF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, player->mo); + inside = P_MobjInsidePolyobj(po, player->mo); + + if (!(inside || touching)) + continue; + + if (!P_IsMobjTouchingPolyobj(player->mo, po, polysec)) + continue; + + return polysec; + } + + return NULL; +} + +static boolean P_CheckSectorTriggers(player_t *player, sector_t *sector, line_t *sourceline) +{ + if (GETSECSPECIAL(sector->special, 2) < 2 || GETSECSPECIAL(sector->special, 2) > 7) + return false; + + if (!Tag_Find(&sourceline->tags, Tag_FGet(§or->tags))) + return false; + + if (GETSECSPECIAL(sector->special, 2) != 3 && GETSECSPECIAL(sector->special, 2) != 5) + return true; // "Anywhere in sector" types + + return P_IsMobjTouchingSectorPlane(player->mo, sector); + +} + +sector_t *P_FindPlayerTrigger(player_t *player, line_t *sourceline) +{ + sector_t *originalsector; + sector_t *loopsector; + msecnode_t *node; + sector_t *caller; + + if (!player->mo) + return NULL; + + originalsector = player->mo->subsector->sector; + + caller = P_Check3DFloorTriggers(player, originalsector, sourceline); // Handle FOFs first. + + if (caller) + return caller; + + // Allow sector specials to be applied to polyobjects! + caller = P_CheckPolyobjTriggers(player, sourceline); + + if (caller) + return caller; + + if (P_CheckSectorTriggers(player, originalsector, sourceline)) + return originalsector; + + // Iterate through touching_sectorlist for SF_TRIGGERSPECIAL_TOUCH + for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) + { + loopsector = node->m_sector; + + if (loopsector == originalsector) // Don't duplicate + continue; + + // Check 3D floors... + caller = P_Check3DFloorTriggers(player, loopsector, sourceline); // Handle FOFs first. + + if (caller) + return caller; + + //TODO: Check polyobjects in loopsector + + if (!(loopsector->flags & SF_TRIGGERSPECIAL_TOUCH)) + continue; + + if (P_CheckSectorTriggers(player, loopsector, sourceline)) + return loopsector; } return false; } /// \todo check continues for proper splitscreen support? -static boolean P_DoAllPlayersTrigger(sector_t *sector, sector_t *roversector, boolean floortouch) +static boolean P_DoAllPlayersTrigger(mtag_t sectag) { INT32 i; - msecnode_t *node; + line_t dummyline; + dummyline.tags.count = 1; + dummyline.tags.tags = §ag; for (i = 0; i < MAXPLAYERS; i++) { @@ -4044,40 +4147,8 @@ static boolean P_DoAllPlayersTrigger(sector_t *sector, sector_t *roversector, bo continue; if (G_CoopGametype() && players[i].lives <= 0) continue; - if (roversector) - { - if (sector->flags & SF_TRIGGERSPECIAL_TOUCH) - { - for (node = players[i].mo->touching_sectorlist; node; node = node->m_sectorlist_next) - { - if (P_ThingIsOnThe3DFloor(players[i].mo, sector, node->m_sector)) - break; - } - if (!node) - return false; - } - else if (players[i].mo->subsector && !P_ThingIsOnThe3DFloor(players[i].mo, sector, players[i].mo->subsector->sector)) // this function handles basically everything for us lmao - return false; - } - else - { - if (players[i].mo->subsector->sector != sector) - { - if (!(sector->flags & SF_TRIGGERSPECIAL_TOUCH)) - return false; - - for (node = players[i].mo->touching_sectorlist; node; node = node->m_sectorlist_next) - { - if (node->m_sector == sector) - break; - } - if (!node) - return false; - } - - if (floortouch && !P_IsMobjTouchingSectorPlane(players[i].mo, sector)) - return false; - } + if (!P_FindPlayerTrigger(&players[i], &dummyline)) + return false; } return true; @@ -4683,7 +4754,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers break; case 2: // Linedef executor requires all players present+doesn't require touching floor case 3: // Linedef executor requires all players present - if (!P_DoAllPlayersTrigger(sector, roversector, section2 == 3)) + if (!P_DoAllPlayersTrigger(sectag)) break; /* FALLTHRU */ case 4: // Linedef executor that doesn't require touching floor diff --git a/src/p_spec.h b/src/p_spec.h index 50387fbd8..79cd4a6f4 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -324,6 +324,7 @@ sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 n void P_PlayerInSpecialSector(player_t *player); void P_CheckPushableTrigger(mobj_t *mobj, sector_t *sec); void P_CheckMobjTrigger(mobj_t *mobj); +sector_t *P_FindPlayerTrigger(player_t *player, line_t *sourceline); void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *roversector); fixed_t P_FindLowestFloorSurrounding(sector_t *sec); From 060bc5fde06e9e7b7b039e23e0cc4d6f85646297 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 8 Dec 2021 21:07:26 +0100 Subject: [PATCH 167/377] Replace P_ThingOnSpecial3DFloor with the more versatile P_MobjTouchingSectorSpecial --- src/lua_baselib.c | 26 +++---- src/p_mobj.c | 6 +- src/p_spec.c | 177 ++++++++++++++++++++++++---------------------- src/p_spec.h | 3 +- 4 files changed, 110 insertions(+), 102 deletions(-) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index f51143556..d64f8abd2 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -2202,6 +2202,19 @@ static int lib_pExplodeMissile(lua_State *L) return 0; } +static int lib_pMobjTouchingSectorSpecial(lua_State *L) +{ + mobj_t *mo = *((mobj_t**)luaL_checkudata(L, 1, META_MOBJ)); + INT32 section = (INT32)luaL_checkinteger(L, 2); + INT32 number = (INT32)luaL_checkinteger(L, 3); + //HUDSAFE + INLEVEL + if (!mo) + return LUA_ErrInvalid(L, "mobj_t"); + LUA_PushUserdata(L, P_MobjTouchingSectorSpecial(mo, section, number), META_SECTOR); + return 1; +} + static int lib_pPlayerTouchingSectorSpecial(lua_State *L) { player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); @@ -2353,17 +2366,6 @@ static int lib_pFadeLight(lua_State *L) return 0; } -static int lib_pThingOnSpecial3DFloor(lua_State *L) -{ - mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); - NOHUD - INLEVEL - if (!mo) - return LUA_ErrInvalid(L, "mobj_t"); - LUA_PushUserdata(L, P_ThingOnSpecial3DFloor(mo), META_SECTOR); - return 1; -} - static int lib_pIsFlagAtBase(lua_State *L) { mobjtype_t flag = luaL_checkinteger(L, 1); @@ -4056,6 +4058,7 @@ static luaL_Reg lib[] = { {"P_SetMobjStateNF",lib_pSetMobjStateNF}, {"P_DoSuperTransformation",lib_pDoSuperTransformation}, {"P_ExplodeMissile",lib_pExplodeMissile}, + {"P_MobjTouchingSectorSpecial",lib_pMobjTouchingSectorSpecial}, {"P_PlayerTouchingSectorSpecial",lib_pPlayerTouchingSectorSpecial}, {"P_FindLowestFloorSurrounding",lib_pFindLowestFloorSurrounding}, {"P_FindHighestFloorSurrounding",lib_pFindHighestFloorSurrounding}, @@ -4068,7 +4071,6 @@ static luaL_Reg lib[] = { {"P_LinedefExecute",lib_pLinedefExecute}, {"P_SpawnLightningFlash",lib_pSpawnLightningFlash}, {"P_FadeLight",lib_pFadeLight}, - {"P_ThingOnSpecial3DFloor",lib_pThingOnSpecial3DFloor}, {"P_IsFlagAtBase",lib_pIsFlagAtBase}, {"P_SetupLevelSky",lib_pSetupLevelSky}, {"P_SetSkyboxMobj",lib_pSetSkyboxMobj}, diff --git a/src/p_mobj.c b/src/p_mobj.c index 2c6315271..d0af3112e 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9611,13 +9611,9 @@ static boolean P_MobjRegularThink(mobj_t *mobj) break; case MT_BLUEFLAG: case MT_REDFLAG: - { - sector_t* sec2; - sec2 = P_ThingOnSpecial3DFloor(mobj); - if ((sec2 && GETSECSPECIAL(sec2->special, 4) == 2) || (GETSECSPECIAL(mobj->subsector->sector->special, 4) == 2)) + if (P_MobjTouchingSectorSpecial(mobj, 4, 2)) mobj->fuse = 1; // Return to base. break; - } case MT_SPINDUST: // Spindash dust mobj->momx = FixedMul(mobj->momx, (3*FRACUNIT)/4); // originally 50000 mobj->momy = FixedMul(mobj->momy, (3*FRACUNIT)/4); // same diff --git a/src/p_spec.c b/src/p_spec.c index 49ba3adaf..265cba2b5 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3926,6 +3926,99 @@ boolean P_IsMobjTouchingPolyobj(mobj_t *mo, polyobj_t *po, sector_t *polysec) } } +static sector_t *P_MobjTouching3DFloorSpecial(mobj_t *mo, sector_t *sector, INT32 section, INT32 number) +{ + ffloor_t *rover; + + for (rover = sector->ffloors; rover; rover = rover->next) + { + if (GETSECSPECIAL(rover->master->frontsector->special, section) != number) + continue; + + if (!(rover->flags & FF_EXISTS)) + continue; + + if (!P_IsMobjTouching3DFloor(mo, rover, sector)) + continue; + + // This FOF has the special we're looking for, but are we allowed to touch it? + if (sector == mo->subsector->sector + || (rover->master->frontsector->flags & SF_TRIGGERSPECIAL_TOUCH)) + return rover->master->frontsector; + } + + return NULL; +} + +static sector_t *P_MobjTouchingPolyobjSpecial(mobj_t *mo, INT32 section, INT32 number) +{ + polyobj_t *po; + sector_t *polysec; + boolean touching = false; + boolean inside = false; + + for (po = mo->subsector->polyList; po; po = (polyobj_t *)(po->link.next)) + { + if (po->flags & POF_NOSPECIALS) + continue; + + polysec = po->lines[0]->backsector; + + if (GETSECSPECIAL(polysec->special, section) != number) + continue; + + touching = (polysec->flags & SF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, mo); + inside = P_MobjInsidePolyobj(po, mo); + + if (!(inside || touching)) + continue; + + if (!P_IsMobjTouchingPolyobj(mo, po, polysec)) + continue; + + return polysec; + } + + return NULL; +} + +sector_t *P_MobjTouchingSectorSpecial(mobj_t *mo, INT32 section, INT32 number) +{ + msecnode_t *node; + sector_t *result; + + result = P_MobjTouching3DFloorSpecial(mo, mo->subsector->sector, section, number); + if (result) + return result; + + result = P_MobjTouchingPolyobjSpecial(mo, section, number); + if (result) + return result; + + if (GETSECSPECIAL(mo->subsector->sector->special, section) == number) + return mo->subsector->sector; + + for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next) + { + if (node->m_sector == mo->subsector->sector) // Don't duplicate + continue; + + result = P_MobjTouching3DFloorSpecial(mo, node->m_sector, section, number); + if (result) + return result; + + //TODO: Check polyobjects in node->m_sector + + if (!(node->m_sector->flags & SF_TRIGGERSPECIAL_TOUCH)) + continue; + + if (GETSECSPECIAL(mo->subsector->sector->special, section) == number) + return node->m_sector; + } + + return NULL; +} + // // P_PlayerTouchingSectorSpecial // @@ -3939,63 +4032,10 @@ boolean P_IsMobjTouchingPolyobj(mobj_t *mo, polyobj_t *po, sector_t *polysec) // sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 number) { - msecnode_t *node; - ffloor_t *rover; - if (!player->mo) return NULL; - // Check default case first - if (GETSECSPECIAL(player->mo->subsector->sector->special, section) == number) - return player->mo->subsector->sector; - - // Hmm.. maybe there's a FOF that has it... - for (rover = player->mo->subsector->sector->ffloors; rover; rover = rover->next) - { - if (GETSECSPECIAL(rover->master->frontsector->special, section) != number) - continue; - - if (!(rover->flags & FF_EXISTS)) - continue; - - if (!P_IsMobjTouching3DFloor(player->mo, rover, player->mo->subsector->sector)) - continue; - - // This FOF has the special we're looking for! - return rover->master->frontsector; - } - - for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) - { - if (GETSECSPECIAL(node->m_sector->special, section) == number) - { - // This sector has the special we're looking for, but - // are we allowed to touch it? - if (node->m_sector == player->mo->subsector->sector - || (node->m_sector->flags & SF_TRIGGERSPECIAL_TOUCH)) - return node->m_sector; - } - - // Hmm.. maybe there's a FOF that has it... - for (rover = node->m_sector->ffloors; rover; rover = rover->next) - { - if (GETSECSPECIAL(rover->master->frontsector->special, section) != number) - continue; - - if (!(rover->flags & FF_EXISTS)) - continue; - - if (!P_IsMobjTouching3DFloor(player->mo, rover, node->m_sector)) - continue; - - // This FOF has the special we're looking for, but are we allowed to touch it? - if (node->m_sector == player->mo->subsector->sector - || (rover->master->frontsector->flags & SF_TRIGGERSPECIAL_TOUCH)) - return rover->master->frontsector; - } - } - - return NULL; + return P_MobjTouchingSectorSpecial(player->mo, section, number); } static sector_t *P_Check3DFloorTriggers(player_t *player, sector_t *sector, line_t *sourceline) @@ -4874,35 +4914,6 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers } } -/** Checks if an object is standing on or is inside a special 3D floor. - * If so, the sector is returned. - * - * \param mo Object to check. - * \return Pointer to the sector with a special type, or NULL if no special 3D - * floors are being contacted. - * \sa P_PlayerOnSpecial3DFloor - */ -sector_t *P_ThingOnSpecial3DFloor(mobj_t *mo) -{ - ffloor_t *rover; - - for (rover = mo->subsector->sector->ffloors; rover; rover = rover->next) - { - if (!rover->master->frontsector->special) - continue; - - if (!(rover->flags & FF_EXISTS)) - continue; - - if (!P_IsMobjTouching3DFloor(mo, rover, mo->subsector->sector)) - continue; - - return rover->master->frontsector; - } - - return NULL; -} - #define TELEPORTED(mo) (mo->subsector->sector != originalsector) /** Checks if a player is standing on or is inside a 3D floor (e.g. water) and diff --git a/src/p_spec.h b/src/p_spec.h index 79cd4a6f4..2ff2cd64c 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -320,6 +320,7 @@ void P_SpawnSpecials(boolean fromnetsave); // every tic void P_UpdateSpecials(void); +sector_t *P_MobjTouchingSectorSpecial(mobj_t *mo, INT32 section, INT32 number); sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 number); void P_PlayerInSpecialSector(player_t *player); void P_CheckPushableTrigger(mobj_t *mobj, sector_t *sec); @@ -922,6 +923,4 @@ void T_PlaneDisplace(planedisplace_t *pd); void P_CalcHeight(player_t *player); -sector_t *P_ThingOnSpecial3DFloor(mobj_t *mo); - #endif From 44434a64d1e92b82d02bab4bd354c49dceb782e0 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 07:10:16 +0100 Subject: [PATCH 168/377] Refactor P_RunTriggerLinedef --- src/p_spec.c | 476 +++++++++++++++++++++++++-------------------------- 1 file changed, 233 insertions(+), 243 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 265cba2b5..ed2f9eb97 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1501,263 +1501,109 @@ static boolean P_CheckNightsTriggerLine(line_t *triggerline, mobj_t *actor) return true; } -/** Used by P_LinedefExecute to check a trigger linedef's conditions - * The linedef executor specials in the trigger linedef's sector are run if all conditions are met. - * Return false cancels P_LinedefExecute, this happens if a condition is not met. - * - * \param triggerline Trigger linedef to check conditions for; should NEVER be NULL. - * \param actor Object initiating the action; should not be NULL. - * \param caller Sector in which the action was started. May be NULL. - * \sa P_ProcessLineSpecial, P_LinedefExecute - */ -boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller) +static boolean P_CheckPlayerMare(line_t *triggerline, INT32 targetmare) { - sector_t *ctlsector; - fixed_t dist = P_AproxDistance(triggerline->dx, triggerline->dy)>>FRACBITS; - size_t i, linecnt, sectori; - INT16 specialtype = triggerline->special; + UINT8 mare; - ///////////////////////////////////////////////// - // Distance-checking/sector trigger conditions // - ///////////////////////////////////////////////// + if (!(maptol & TOL_NIGHTS)) + return false; - // Linetypes 303 and 304 require a specific - // number, or minimum or maximum, of rings. - if (specialtype == 303 || specialtype == 304) + mare = P_FindLowestMare(); + + if (triggerline->flags & ML_NOCLIMB) + return mare <= targetmare; + + if (triggerline->flags & ML_BLOCKMONSTERS) + return mare >= targetmare; + + return mare == targetmare; +} + +static boolean P_CheckPlayerRings(line_t *triggerline, mobj_t *actor, INT32 targetrings) +{ + INT32 rings = 0; + size_t i; + + // With the passuse flag, count all player's + // rings. + if (triggerline->flags & ML_EFFECT4) { - fixed_t rings = 0; - - // With the passuse flag, count all player's - // rings. - if (triggerline->flags & ML_EFFECT4) + for (i = 0; i < MAXPLAYERS; i++) { - for (i = 0; i < MAXPLAYERS; i++) - { - if (!playeringame[i] || players[i].spectator) - continue; + if (!playeringame[i] || players[i].spectator) + continue; - if (!players[i].mo || ((maptol & TOL_NIGHTS) ? players[i].spheres : players[i].rings) <= 0) - continue; + if (!players[i].mo || ((maptol & TOL_NIGHTS) ? players[i].spheres : players[i].rings) <= 0) + continue; - rings += (maptol & TOL_NIGHTS) ? players[i].spheres : players[i].rings; - } - } - else - { - if (!(actor && actor->player)) - return false; // no player to count rings from here, sorry - - rings = (maptol & TOL_NIGHTS) ? actor->player->spheres : actor->player->rings; - } - - if (triggerline->flags & ML_NOCLIMB) - { - if (rings > dist) - return false; - } - else if (triggerline->flags & ML_BLOCKMONSTERS) - { - if (rings < dist) - return false; - } - else - { - if (rings != dist) - return false; + rings += (maptol & TOL_NIGHTS) ? players[i].spheres : players[i].rings; } } - else if (specialtype >= 314 && specialtype <= 315) + else { - msecnode_t *node; - mobj_t *mo; - INT32 numpush = 0; - INT32 numneeded = dist; + if (!(actor && actor->player)) + return false; // no player to count rings from here, sorry - if (!caller) - return false; // we need a calling sector to find pushables in, silly! - - // Count the pushables in this sector - node = caller->touching_thinglist; // things touching this sector - while (node) - { - mo = node->m_thing; - if ((mo->flags & MF_PUSHABLE) || ((mo->info->flags & MF_PUSHABLE) && mo->fuse)) - numpush++; - node = node->m_thinglist_next; - } - - if (triggerline->flags & ML_NOCLIMB) // Need at least or more - { - if (numpush < numneeded) - return false; - } - else if (triggerline->flags & ML_EFFECT4) // Need less than - { - if (numpush >= numneeded) - return false; - } - else // Need exact - { - if (numpush != numneeded) - return false; - } - } - else if (caller) - { - if (GETSECSPECIAL(caller->special, 2) == 6) - { - if (!(ALL7EMERALDS(emeralds))) - return false; - } - else if (GETSECSPECIAL(caller->special, 2) == 7) - { - UINT8 mare; - - if (!(maptol & TOL_NIGHTS)) - return false; - - mare = P_FindLowestMare(); - - if (triggerline->flags & ML_NOCLIMB) - { - if (!(mare <= dist)) - return false; - } - else if (triggerline->flags & ML_BLOCKMONSTERS) - { - if (!(mare >= dist)) - return false; - } - else - { - if (!(mare == dist)) - return false; - } - } - // If we were not triggered by a sector type especially for the purpose, - // a Linedef Executor linedef trigger is not handling sector triggers properly, return. - - else if ((!GETSECSPECIAL(caller->special, 2) || GETSECSPECIAL(caller->special, 2) > 7) && (specialtype > 322)) - { - CONS_Alert(CONS_WARNING, - M_GetText("Linedef executor trigger isn't handling sector triggers properly!\nspecialtype = %d, if you are not a dev, report this warning instance\nalong with the wad that caused it!\n"), - specialtype); - return false; - } + rings = (maptol & TOL_NIGHTS) ? actor->player->spheres : actor->player->rings; } - ////////////////////////////////////// - // Miscellaneous trigger conditions // - ////////////////////////////////////// + if (triggerline->flags & ML_NOCLIMB) + return rings <= targetrings; - switch (specialtype) + if (triggerline->flags & ML_BLOCKMONSTERS) + return rings >= targetrings; + + return rings == targetrings; +} + +static boolean P_CheckPushables(line_t *triggerline, sector_t *caller, INT32 targetpushables) +{ + msecnode_t *node; + mobj_t *mo; + INT32 numpushables = 0; + + if (!caller) + return false; // we need a calling sector to find pushables in, silly! + + // Count the pushables in this sector + for (node = caller->touching_thinglist; node; node = node->m_thinglist_next) { - case 305: // continuous - case 306: // each time - case 307: // once - if (!(actor && actor->player && actor->player->charability == dist/10)) - return false; - break; - case 309: // continuous - case 310: // each time - // Only red team members can activate this. - if (!(actor && actor->player && actor->player->ctfteam == 1)) - return false; - break; - case 311: // continuous - case 312: // each time - // Only blue team members can activate this. - if (!(actor && actor->player && actor->player->ctfteam == 2)) - return false; - break; - case 317: // continuous - case 318: // once - { // Unlockable triggers required - INT32 trigid = (INT32)(sides[triggerline->sidenum[0]].textureoffset>>FRACBITS); - - if ((modifiedgame && !savemoddata) || (netgame || multiplayer)) - return false; - else if (trigid < 0 || trigid > 31) // limited by 32 bit variable - { - CONS_Debug(DBG_GAMELOGIC, "Unlockable trigger (sidedef %hu): bad trigger ID %d\n", triggerline->sidenum[0], trigid); - return false; - } - else if (!(unlocktriggers & (1 << trigid))) - return false; - } - break; - case 319: // continuous - case 320: // once - { // An unlockable itself must be unlocked! - INT32 unlockid = (INT32)(sides[triggerline->sidenum[0]].textureoffset>>FRACBITS); - - if ((modifiedgame && !savemoddata) || (netgame || multiplayer)) - return false; - else if (unlockid < 0 || unlockid >= MAXUNLOCKABLES) // limited by unlockable count - { - CONS_Debug(DBG_GAMELOGIC, "Unlockable check (sidedef %hu): bad unlockable ID %d\n", triggerline->sidenum[0], unlockid); - return false; - } - else if (!(unlockables[unlockid-1].unlocked)) - return false; - } - break; - case 321: // continuous - case 322: // each time - // decrement calls left before triggering - if (triggerline->callcount > 0) - { - if (--triggerline->callcount > 0) - return false; - } - break; - case 323: // nightserize - case 325: // denightserize - case 327: // nights lap - case 329: // nights egg capsule touch - if (!P_CheckNightsTriggerLine(triggerline, actor)) - return false; - break; - case 331: // continuous - case 332: // each time - case 333: // once - if (!(actor && actor->player && ((stricmp(triggerline->text, skins[actor->player->skin].name) == 0) ^ ((triggerline->flags & ML_NOCLIMB) == ML_NOCLIMB)))) - return false; - break; - case 334: // object dye - continuous - case 335: // object dye - each time - case 336: // object dye - once - { - INT32 triggercolor = (INT32)sides[triggerline->sidenum[0]].toptexture; - UINT16 color = (actor->player ? actor->player->powers[pw_dye] : actor->color); - boolean invert = (triggerline->flags & ML_NOCLIMB ? true : false); - - if (invert ^ (triggercolor != color)) - return false; - } - default: - break; + mo = node->m_thing; + if ((mo->flags & MF_PUSHABLE) || ((mo->info->flags & MF_PUSHABLE) && mo->fuse)) + numpushables++; } - ///////////////////////////////// - // Processing linedef specials // - ///////////////////////////////// + if (triggerline->flags & ML_NOCLIMB) + return numpushables >= targetpushables; - ctlsector = triggerline->frontsector; - sectori = (size_t)(ctlsector - sectors); - linecnt = ctlsector->linecount; + if (triggerline->flags & ML_EFFECT4) + return numpushables <= targetpushables; + + return numpushables == targetpushables; +} + +static void P_ActivateLinedefExecutor(line_t *line, mobj_t *actor, sector_t *caller) +{ + if (line->special < 400 || line->special >= 500) + return; + + if (line->executordelay) + P_AddExecutorDelay(line, actor, caller); + else + P_ProcessLineSpecial(line, actor, caller); +} + +static boolean P_ActivateLinedefExecutorsInSector(line_t *triggerline, mobj_t *actor, sector_t *caller) +{ + sector_t *ctlsector = triggerline->frontsector; + size_t sectori = (size_t)(ctlsector - sectors); + size_t linecnt = ctlsector->linecount; + size_t i; if (triggerline->flags & ML_EFFECT5) // disregard order for efficiency { for (i = 0; i < linecnt; i++) - if (ctlsector->lines[i]->special >= 400 - && ctlsector->lines[i]->special < 500) - { - if (ctlsector->lines[i]->executordelay) - P_AddExecutorDelay(ctlsector->lines[i], actor, caller); - else - P_ProcessLineSpecial(ctlsector->lines[i], actor, caller); - } + P_ActivateLinedefExecutor(ctlsector->lines[i], actor, caller); } else // walk around the sector in a defined order { @@ -1838,17 +1684,161 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller if (i == masterlineindex) break; - if (ctlsector->lines[i]->special >= 400 - && ctlsector->lines[i]->special < 500) - { - if (ctlsector->lines[i]->executordelay) - P_AddExecutorDelay(ctlsector->lines[i], actor, caller); - else - P_ProcessLineSpecial(ctlsector->lines[i], actor, caller); - } + P_ActivateLinedefExecutor(ctlsector->lines[i], actor, caller); } } + return true; +} + +/** Used by P_LinedefExecute to check a trigger linedef's conditions + * The linedef executor specials in the trigger linedef's sector are run if all conditions are met. + * Return false cancels P_LinedefExecute, this happens if a condition is not met. + * + * \param triggerline Trigger linedef to check conditions for; should NEVER be NULL. + * \param actor Object initiating the action; should not be NULL. + * \param caller Sector in which the action was started. May be NULL. + * \sa P_ProcessLineSpecial, P_LinedefExecute + */ +boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller) +{ + fixed_t dist = P_AproxDistance(triggerline->dx, triggerline->dy)>>FRACBITS; + INT16 specialtype = triggerline->special; + + //////////////////////// + // Trigger conditions // + //////////////////////// + + if (caller) + { + if (GETSECSPECIAL(caller->special, 2) == 6) + { + if (!(ALL7EMERALDS(emeralds))) + return false; + } + else if (GETSECSPECIAL(caller->special, 2) == 7) + { + if (!P_CheckPlayerMare(triggerline, dist)) + return false; + } + // If we were not triggered by a sector type especially for the purpose, + // a Linedef Executor linedef trigger is not handling sector triggers properly, return. + + else if ((!GETSECSPECIAL(caller->special, 2) || GETSECSPECIAL(caller->special, 2) > 7) && (specialtype > 322)) + { + CONS_Alert(CONS_WARNING, + M_GetText("Linedef executor trigger isn't handling sector triggers properly!\nspecialtype = %d, if you are not a dev, report this warning instance\nalong with the wad that caused it!\n"), + specialtype); + return false; + } + } + + switch (specialtype) + { + case 303: // continuous + case 304: // once + if (!P_CheckPlayerRings(triggerline, actor, dist)) + return false; + break; + case 305: // continuous + case 306: // each time + case 307: // once + if (!(actor && actor->player && actor->player->charability == dist/10)) + return false; + break; + case 309: // continuous + case 310: // each time + // Only red team members can activate this. + if (!(actor && actor->player && actor->player->ctfteam == 1)) + return false; + break; + case 311: // continuous + case 312: // each time + // Only blue team members can activate this. + if (!(actor && actor->player && actor->player->ctfteam == 2)) + return false; + break; + case 314: // continuous + case 315: // once + if (!P_CheckPushables(triggerline, caller, dist)) + return false; + break; + case 317: // continuous + case 318: // once + { // Unlockable triggers required + INT32 trigid = (INT32)(sides[triggerline->sidenum[0]].textureoffset>>FRACBITS); + + if ((modifiedgame && !savemoddata) || (netgame || multiplayer)) + return false; + else if (trigid < 0 || trigid > 31) // limited by 32 bit variable + { + CONS_Debug(DBG_GAMELOGIC, "Unlockable trigger (sidedef %hu): bad trigger ID %d\n", triggerline->sidenum[0], trigid); + return false; + } + else if (!(unlocktriggers & (1 << trigid))) + return false; + } + break; + case 319: // continuous + case 320: // once + { // An unlockable itself must be unlocked! + INT32 unlockid = (INT32)(sides[triggerline->sidenum[0]].textureoffset>>FRACBITS); + + if ((modifiedgame && !savemoddata) || (netgame || multiplayer)) + return false; + else if (unlockid < 0 || unlockid >= MAXUNLOCKABLES) // limited by unlockable count + { + CONS_Debug(DBG_GAMELOGIC, "Unlockable check (sidedef %hu): bad unlockable ID %d\n", triggerline->sidenum[0], unlockid); + return false; + } + else if (!(unlockables[unlockid-1].unlocked)) + return false; + } + break; + case 321: // continuous + case 322: // each time + // decrement calls left before triggering + if (triggerline->callcount > 0) + { + if (--triggerline->callcount > 0) + return false; + } + break; + case 323: // nightserize + case 325: // denightserize + case 327: // nights lap + case 329: // nights egg capsule touch + if (!P_CheckNightsTriggerLine(triggerline, actor)) + return false; + break; + case 331: // continuous + case 332: // each time + case 333: // once + if (!(actor && actor->player && ((stricmp(triggerline->text, skins[actor->player->skin].name) == 0) ^ ((triggerline->flags & ML_NOCLIMB) == ML_NOCLIMB)))) + return false; + break; + case 334: // object dye - continuous + case 335: // object dye - each time + case 336: // object dye - once + { + INT32 triggercolor = (INT32)sides[triggerline->sidenum[0]].toptexture; + UINT16 color = (actor->player ? actor->player->powers[pw_dye] : actor->color); + boolean invert = (triggerline->flags & ML_NOCLIMB ? true : false); + + if (invert ^ (triggercolor != color)) + return false; + } + default: + break; + } + + ///////////////////////////////// + // Processing linedef specials // + ///////////////////////////////// + + if (!P_ActivateLinedefExecutorsInSector(triggerline, actor, caller)) + return false; + // "Trigger on X calls" linedefs reset if noclimb is set if ((specialtype == 321 || specialtype == 322) && triggerline->flags & ML_NOCLIMB) triggerline->callcount = sides[triggerline->sidenum[0]].textureoffset>>FRACBITS; From f60873c19b2f2d26193c48d62fa03cba196f121a Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 07:30:55 +0100 Subject: [PATCH 169/377] Adapt linedef types 300-302 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 12 +++++++++++ extras/conf/udb/Includes/SRB222_misc.cfg | 8 ++++++++ src/p_setup.c | 11 ++++++++++ src/p_spec.c | 21 +++++++++++--------- src/p_spec.h | 9 +++++++++ 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 776e9ba2d..489f7fc88 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2502,6 +2502,18 @@ udmf { title = "Linedef Executor Trigger"; + 300 + { + title = "Basic"; + prefix = "(300)"; + arg0 + { + title = "Trigger type"; + type = 11; + enum = "triggertype"; + } + } + 313 { title = "No More Enemies - Once"; diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index ba1e9d16e..2f2992b0d 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -495,6 +495,14 @@ enums 1 = "Less than or equal"; 2 = "Greater than or equal"; } + + triggertype + { + 0 = "Continuous"; + 1 = "Once"; + 2 = "Each time on entry"; + 3 = "Each time on entry/exit"; + } } //Default things filters diff --git a/src/p_setup.c b/src/p_setup.c index ab0254c08..d70137676 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3713,6 +3713,17 @@ static void P_ConvertBinaryMap(void) else lines[i].args[1] = 255; break; + case 300: //Trigger linedef executor - Continuous + lines[i].args[0] = TMT_CONTINUOUS; + break; + case 301: //Trigger linedef executor - Each time + lines[i].args[0] = (lines[i].flags & ML_BOUNCY) ? TMT_EACHTIMEENTERANDEXIT : TMT_EACHTIMEENTER; + lines[i].special = 300; + break; + case 302: //Trigger linedef executor - Once + lines[i].args[0] = TMT_ONCE; + lines[i].special = 300; + break; case 313: //No more enemies - once lines[i].args[0] = tag; break; diff --git a/src/p_spec.c b/src/p_spec.c index ed2f9eb97..4db5ef218 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1844,7 +1844,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller triggerline->callcount = sides[triggerline->sidenum[0]].textureoffset>>FRACBITS; else // These special types work only once - if (specialtype == 302 // Once + if ((specialtype == 300 && triggerline->args[0] == TMT_ONCE) // Once || specialtype == 304 // Ring count - Once || specialtype == 307 // Character ability - Once || specialtype == 308 // Race only - Once @@ -1896,7 +1896,7 @@ void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller) if (lines[masterline].special == 313 || lines[masterline].special == 399 // Each-time executors handle themselves, too - || lines[masterline].special == 301 // Each time + || (lines[masterline].special == 300 && lines[masterline].args[0] > TMT_EACHTIMEMASK) // Each time || lines[masterline].special == 306 // Character ability - Each time || lines[masterline].special == 310 // CTF Red team - Each time || lines[masterline].special == 312 // CTF Blue team - Each time @@ -5639,7 +5639,7 @@ static inline void P_AddNoEnemiesThinker(line_t *sourceline) * \sa P_SpawnSpecials, T_EachTimeThinker * \author SSNTails */ -static void P_AddEachTimeThinker(line_t *sourceline) +static void P_AddEachTimeThinker(line_t *sourceline, boolean triggerOnExit) { eachtime_t *eachtime; @@ -5650,7 +5650,7 @@ static void P_AddEachTimeThinker(line_t *sourceline) eachtime->thinker.function.acp1 = (actionf_p1)T_EachTimeThinker; eachtime->sourceline = sourceline; - eachtime->triggerOnExit = !!(sourceline->flags & ML_BOUNCY); + eachtime->triggerOnExit = triggerOnExit; } /** Adds a camera scanner. @@ -6659,8 +6659,12 @@ void P_SpawnSpecials(boolean fromnetsave) } break; - case 300: // Linedef executor (combines with sector special 974/975) and commands - case 302: + case 300: // Trigger linedef executor + if (lines[i].args[0] > TMT_EACHTIMEMASK) + P_AddEachTimeThinker(&lines[i], lines[i].args[0] == TMT_EACHTIMEENTERANDEXIT); + break; + + // Count rings case 303: case 304: @@ -6683,12 +6687,11 @@ void P_SpawnSpecials(boolean fromnetsave) // Each time executors case 306: - case 301: case 310: case 312: case 332: case 335: - P_AddEachTimeThinker(&lines[i]); + P_AddEachTimeThinker(&lines[i], !!(lines[i].flags & ML_BOUNCY)); break; // No More Enemies Linedef Exec @@ -6717,7 +6720,7 @@ void P_SpawnSpecials(boolean fromnetsave) else lines[i].callcount = sides[lines[i].sidenum[0]].textureoffset>>FRACBITS; if (lines[i].special == 322) // Each time - P_AddEachTimeThinker(&lines[i]); + P_AddEachTimeThinker(&lines[i], !!(lines[i].flags & ML_BOUNCY)); break; // NiGHTS trigger executors diff --git a/src/p_spec.h b/src/p_spec.h index 2ff2cd64c..b7968432c 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -105,6 +105,15 @@ typedef enum TMFL_SPLAT = 1<<1, } textmapfoflaserflags_t; +typedef enum +{ + TMT_CONTINUOUS = 0, + TMT_ONCE = 1, + TMT_EACHTIMEMASK = TMT_ONCE, + TMT_EACHTIMEENTER = 2, + TMT_EACHTIMEENTERANDEXIT = 3, +} textmaptriggertype_t; + typedef enum { TMC_EQUAL = 0, From 92e724faca5c6e97d8bcfea5faed038f81641056 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 07:47:01 +0100 Subject: [PATCH 170/377] Adapt linedef types 303-304 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 28 ++++++++++++++ src/p_setup.c | 13 +++++++ src/p_spec.c | 39 ++++++++++---------- 3 files changed, 60 insertions(+), 20 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 489f7fc88..8b8d1555b 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2514,6 +2514,34 @@ udmf } } + 303 + { + title = "Ring Count"; + prefix = "(303)"; + arg0 + { + title = "Trigger type"; + type = 11; + enum = "triggertype"; + } + arg1 + { + title = "Rings"; + } + arg2 + { + title = "Comparison"; + type = 11; + enum = "comparison"; + } + arg3 + { + title = "Count all players?"; + type = 11; + enum = "noyes"; + } + } + 313 { title = "No More Enemies - Once"; diff --git a/src/p_setup.c b/src/p_setup.c index d70137676..ef568b578 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3724,6 +3724,19 @@ static void P_ConvertBinaryMap(void) lines[i].args[0] = TMT_ONCE; lines[i].special = 300; break; + case 303: //Ring count - Continuous + case 304: //Ring count - Once + lines[i].args[0] = (lines[i].special == 304) ? TMT_ONCE : TMT_CONTINUOUS; + lines[i].args[1] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[2] = TMC_LTE; + else if (lines[i].flags & ML_BLOCKMONSTERS) + lines[i].args[2] = TMC_GTE; + else + lines[i].args[2] = TMC_EQUAL; + lines[i].args[3] = !!(lines[i].flags & ML_EFFECT4); + lines[i].special = 303; + break; case 313: //No more enemies - once lines[i].args[0] = tag; break; diff --git a/src/p_spec.c b/src/p_spec.c index 4db5ef218..631f61a4a 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1519,14 +1519,14 @@ static boolean P_CheckPlayerMare(line_t *triggerline, INT32 targetmare) return mare == targetmare; } -static boolean P_CheckPlayerRings(line_t *triggerline, mobj_t *actor, INT32 targetrings) +static boolean P_CheckPlayerRings(line_t *triggerline, mobj_t *actor) { INT32 rings = 0; + INT32 targetrings = triggerline->args[1]; size_t i; - // With the passuse flag, count all player's - // rings. - if (triggerline->flags & ML_EFFECT4) + // Count all players' rings. + if (triggerline->args[3]) { for (i = 0; i < MAXPLAYERS; i++) { @@ -1547,13 +1547,16 @@ static boolean P_CheckPlayerRings(line_t *triggerline, mobj_t *actor, INT32 targ rings = (maptol & TOL_NIGHTS) ? actor->player->spheres : actor->player->rings; } - if (triggerline->flags & ML_NOCLIMB) - return rings <= targetrings; - - if (triggerline->flags & ML_BLOCKMONSTERS) - return rings >= targetrings; - - return rings == targetrings; + switch (triggerline->args[2]) + { + case TMC_EQUAL: + default: + return rings == targetrings; + case TMC_GTE: + return rings >= targetrings; + case TMC_LTE: + return rings <= targetrings; + } } static boolean P_CheckPushables(line_t *triggerline, sector_t *caller, INT32 targetpushables) @@ -1735,9 +1738,8 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller switch (specialtype) { - case 303: // continuous - case 304: // once - if (!P_CheckPlayerRings(triggerline, actor, dist)) + case 303: + if (!P_CheckPlayerRings(triggerline, actor)) return false; break; case 305: // continuous @@ -1844,8 +1846,8 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller triggerline->callcount = sides[triggerline->sidenum[0]].textureoffset>>FRACBITS; else // These special types work only once - if ((specialtype == 300 && triggerline->args[0] == TMT_ONCE) // Once - || specialtype == 304 // Ring count - Once + if ((specialtype == 300 && triggerline->args[0] == TMT_ONCE) // Basic + || (specialtype == 303 && triggerline->args[0] == TMT_ONCE) // Ring count || specialtype == 307 // Character ability - Once || specialtype == 308 // Race only - Once || specialtype == 313 // No More Enemies - Once @@ -6660,14 +6662,11 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 300: // Trigger linedef executor + case 303: // Count rings if (lines[i].args[0] > TMT_EACHTIMEMASK) P_AddEachTimeThinker(&lines[i], lines[i].args[0] == TMT_EACHTIMEENTERANDEXIT); break; - // Count rings - case 303: - case 304: - // Charability linedef executors case 305: case 307: From f86dff8cf2c27b9111bef31681ef6c7eda0b713b Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 07:56:15 +0100 Subject: [PATCH 171/377] Adapt linedef types 314-315 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 22 +++++++++++++ src/p_setup.c | 12 +++++++ src/p_spec.c | 33 ++++++++++---------- 3 files changed, 50 insertions(+), 17 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 8b8d1555b..17b772f35 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2553,6 +2553,28 @@ udmf } } + 314 + { + title = "Number of Pushables"; + prefix = "(314)"; + arg0 + { + title = "Trigger type"; + type = 11; + enum = "triggertype"; + } + arg1 + { + title = "Pushables"; + } + arg2 + { + title = "Comparison"; + type = 11; + enum = "comparison"; + } + } + 323 { title = "NiGHTSerize"; diff --git a/src/p_setup.c b/src/p_setup.c index ef568b578..c2fee35b6 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3740,6 +3740,18 @@ static void P_ConvertBinaryMap(void) case 313: //No more enemies - once lines[i].args[0] = tag; break; + case 314: //Number of pushables - Continuous + case 315: //Number of pushables - Once + lines[i].args[0] = (lines[i].special == 315) ? TMT_ONCE : TMT_CONTINUOUS; + lines[i].args[1] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[2] = TMC_GTE; + else if (lines[i].flags & ML_EFFECT4) + lines[i].args[2] = TMC_GTE; + else + lines[i].args[2] = TMC_EQUAL; + lines[i].special = 314; + break; case 323: //NiGHTSerize - Each time case 324: //NiGHTSerize - Once case 325: //DeNiGHTSerize - Each time diff --git a/src/p_spec.c b/src/p_spec.c index 631f61a4a..0e552f688 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1559,11 +1559,12 @@ static boolean P_CheckPlayerRings(line_t *triggerline, mobj_t *actor) } } -static boolean P_CheckPushables(line_t *triggerline, sector_t *caller, INT32 targetpushables) +static boolean P_CheckPushables(line_t *triggerline, sector_t *caller) { msecnode_t *node; mobj_t *mo; INT32 numpushables = 0; + INT32 targetpushables = triggerline->args[1]; if (!caller) return false; // we need a calling sector to find pushables in, silly! @@ -1576,13 +1577,16 @@ static boolean P_CheckPushables(line_t *triggerline, sector_t *caller, INT32 tar numpushables++; } - if (triggerline->flags & ML_NOCLIMB) - return numpushables >= targetpushables; - - if (triggerline->flags & ML_EFFECT4) - return numpushables <= targetpushables; - - return numpushables == targetpushables; + switch (triggerline->args[2]) + { + case TMC_EQUAL: + default: + return numpushables == targetpushables; + case TMC_GTE: + return numpushables >= targetpushables; + case TMC_LTE: + return numpushables <= targetpushables; + } } static void P_ActivateLinedefExecutor(line_t *line, mobj_t *actor, sector_t *caller) @@ -1760,9 +1764,8 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller if (!(actor && actor->player && actor->player->ctfteam == 2)) return false; break; - case 314: // continuous - case 315: // once - if (!P_CheckPushables(triggerline, caller, dist)) + case 314: + if (!P_CheckPushables(triggerline, caller)) return false; break; case 317: // continuous @@ -1851,7 +1854,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller || specialtype == 307 // Character ability - Once || specialtype == 308 // Race only - Once || specialtype == 313 // No More Enemies - Once - || specialtype == 315 // No of pushables - Once + || (specialtype == 314 && triggerline->args[0] == TMT_ONCE) // No of pushables || specialtype == 318 // Unlockable trigger - Once || specialtype == 320 // Unlockable - Once || specialtype == 321 || specialtype == 322 // Trigger on X calls - Continuous + Each Time @@ -6663,6 +6666,7 @@ void P_SpawnSpecials(boolean fromnetsave) case 300: // Trigger linedef executor case 303: // Count rings + case 314: // Pushable linedef executors (count # of pushables) if (lines[i].args[0] > TMT_EACHTIMEMASK) P_AddEachTimeThinker(&lines[i], lines[i].args[0] == TMT_EACHTIMEENTERANDEXIT); break; @@ -6698,11 +6702,6 @@ void P_SpawnSpecials(boolean fromnetsave) P_AddNoEnemiesThinker(&lines[i]); break; - // Pushable linedef executors (count # of pushables) - case 314: - case 315: - break; - // Unlock trigger executors case 317: case 318: From 9d87e97275dfffd42ec8420dba3032fdccafcc11 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 08:08:04 +0100 Subject: [PATCH 172/377] Adapt linedef types 317-320 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 32 ++++++++++++++++++++ src/p_setup.c | 12 ++++++++ src/p_spec.c | 24 +++++---------- 3 files changed, 52 insertions(+), 16 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 17b772f35..f5eddf380 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2575,6 +2575,38 @@ udmf } } + 317 + { + title = "Condition Set Trigger"; + prefix = "(317)"; + arg0 + { + title = "Trigger type"; + type = 11; + enum = "triggertype"; + } + arg1 + { + title = "Trigger ID"; + } + } + + 319 + { + title = "Unlockable"; + prefix = "(319)"; + arg0 + { + title = "Trigger type"; + type = 11; + enum = "triggertype"; + } + arg1 + { + title = "Unlockable ID"; + } + } + 323 { title = "NiGHTSerize"; diff --git a/src/p_setup.c b/src/p_setup.c index c2fee35b6..add37c25b 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3752,6 +3752,18 @@ static void P_ConvertBinaryMap(void) lines[i].args[2] = TMC_EQUAL; lines[i].special = 314; break; + case 317: //Condition set trigger - Continuous + case 318: //Condition set trigger - Once + lines[i].args[0] = (lines[i].special == 318) ? TMT_ONCE : TMT_CONTINUOUS; + lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].special = 317; + break; + case 319: //Unlockable trigger - Continuous + case 320: //Unlockable trigger - Once + lines[i].args[0] = (lines[i].special == 320) ? TMT_ONCE : TMT_CONTINUOUS; + lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].special = 319; + break; case 323: //NiGHTSerize - Each time case 324: //NiGHTSerize - Once case 325: //DeNiGHTSerize - Each time diff --git a/src/p_spec.c b/src/p_spec.c index 0e552f688..ca084750b 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1768,10 +1768,9 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller if (!P_CheckPushables(triggerline, caller)) return false; break; - case 317: // continuous - case 318: // once + case 317: { // Unlockable triggers required - INT32 trigid = (INT32)(sides[triggerline->sidenum[0]].textureoffset>>FRACBITS); + INT32 trigid = triggerline->args[1]; if ((modifiedgame && !savemoddata) || (netgame || multiplayer)) return false; @@ -1784,10 +1783,9 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller return false; } break; - case 319: // continuous - case 320: // once + case 319: { // An unlockable itself must be unlocked! - INT32 unlockid = (INT32)(sides[triggerline->sidenum[0]].textureoffset>>FRACBITS); + INT32 unlockid = triggerline->args[1]; if ((modifiedgame && !savemoddata) || (netgame || multiplayer)) return false; @@ -1855,8 +1853,8 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller || specialtype == 308 // Race only - Once || specialtype == 313 // No More Enemies - Once || (specialtype == 314 && triggerline->args[0] == TMT_ONCE) // No of pushables - || specialtype == 318 // Unlockable trigger - Once - || specialtype == 320 // Unlockable - Once + || (specialtype == 317 && triggerline->args[0] == TMT_ONCE) // Unlockable trigger + || (specialtype == 319 && triggerline->args[0] == TMT_ONCE) // Unlockable || specialtype == 321 || specialtype == 322 // Trigger on X calls - Continuous + Each Time || (specialtype == 323 && triggerline->args[0]) // Nightserize - Once || (specialtype == 325 && triggerline->args[0]) // DeNightserize - Once @@ -6667,6 +6665,8 @@ void P_SpawnSpecials(boolean fromnetsave) case 300: // Trigger linedef executor case 303: // Count rings case 314: // Pushable linedef executors (count # of pushables) + case 317: // Condition set trigger + case 319: // Unlockable trigger if (lines[i].args[0] > TMT_EACHTIMEMASK) P_AddEachTimeThinker(&lines[i], lines[i].args[0] == TMT_EACHTIMEENTERANDEXIT); break; @@ -6702,14 +6702,6 @@ void P_SpawnSpecials(boolean fromnetsave) P_AddNoEnemiesThinker(&lines[i]); break; - // Unlock trigger executors - case 317: - case 318: - break; - case 319: - case 320: - break; - // Trigger on X calls case 321: case 322: From 875ba7915ccbc0f85fad81f27c635e69f702d660 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 08:49:50 +0100 Subject: [PATCH 173/377] Adapt linedef types 309-312 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 18 ++++++++++++ extras/conf/udb/Includes/SRB222_misc.cfg | 6 ++++ src/p_setup.c | 11 +++++++ src/p_spec.c | 31 ++++++++------------ src/p_spec.h | 6 ++++ 5 files changed, 54 insertions(+), 18 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index f5eddf380..e74d4978e 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2542,6 +2542,24 @@ udmf } } + 309 + { + title = "CTF Team"; + prefix = "(309)"; + arg0 + { + title = "Trigger type"; + type = 11; + enum = "triggertype"; + } + arg1 + { + title = "Team"; + type = 11; + enum = "team"; + } + } + 313 { title = "No More Enemies - Once"; diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 2f2992b0d..4b37d4628 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -503,6 +503,12 @@ enums 2 = "Each time on entry"; 3 = "Each time on entry/exit"; } + + team + { + 0 = "Red"; + 1 = "Blue"; + } } //Default things filters diff --git a/src/p_setup.c b/src/p_setup.c index add37c25b..4b567d324 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3737,6 +3737,17 @@ static void P_ConvertBinaryMap(void) lines[i].args[3] = !!(lines[i].flags & ML_EFFECT4); lines[i].special = 303; break; + case 309: //CTF red team - continuous + case 310: //CTF red team - each time + case 311: //CTF blue team - continuous + case 312: //CTF blue team - each time + if (lines[i].special % 2 == 1) + lines[i].args[0] = (lines[i].flags & ML_BOUNCY) ? TMT_EACHTIMEENTERANDEXIT : TMT_EACHTIMEENTER; + else + lines[i].args[0] = TMT_CONTINUOUS; + lines[i].args[1] = (lines[i].special > 310) ? TMT_BLUE : TMT_RED; + lines[i].special = 309; + break; case 313: //No more enemies - once lines[i].args[0] = tag; break; diff --git a/src/p_spec.c b/src/p_spec.c index ca084750b..f75cd5419 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1752,16 +1752,11 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller if (!(actor && actor->player && actor->player->charability == dist/10)) return false; break; - case 309: // continuous - case 310: // each time - // Only red team members can activate this. - if (!(actor && actor->player && actor->player->ctfteam == 1)) + case 309: + // Only red/blue team members can activate this. + if (!(actor && actor->player)) return false; - break; - case 311: // continuous - case 312: // each time - // Only blue team members can activate this. - if (!(actor && actor->player && actor->player->ctfteam == 2)) + if (actor->player->ctfteam != ((triggerline->args[1] == TMT_RED) ? 1 : 2)) return false; break; case 314: @@ -1851,6 +1846,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller || (specialtype == 303 && triggerline->args[0] == TMT_ONCE) // Ring count || specialtype == 307 // Character ability - Once || specialtype == 308 // Race only - Once + || (specialtype == 309 && triggerline->args[0] == TMT_ONCE) // CTF team || specialtype == 313 // No More Enemies - Once || (specialtype == 314 && triggerline->args[0] == TMT_ONCE) // No of pushables || (specialtype == 317 && triggerline->args[0] == TMT_ONCE) // Unlockable trigger @@ -6662,6 +6658,14 @@ void P_SpawnSpecials(boolean fromnetsave) } break; + // Linedef executor triggers for CTF teams. + case 309: + if (!(gametyperules & GTR_TEAMFLAGS)) + { + lines[i].special = 0; + break; + } + /* FALLTHRU */ case 300: // Trigger linedef executor case 303: // Count rings case 314: // Pushable linedef executors (count # of pushables) @@ -6681,17 +6685,8 @@ void P_SpawnSpecials(boolean fromnetsave) lines[i].special = 0; break; - // Linedef executor triggers for CTF teams. - case 309: - case 311: - if (!(gametyperules & GTR_TEAMFLAGS)) - lines[i].special = 0; - break; - // Each time executors case 306: - case 310: - case 312: case 332: case 335: P_AddEachTimeThinker(&lines[i], !!(lines[i].flags & ML_BOUNCY)); diff --git a/src/p_spec.h b/src/p_spec.h index b7968432c..0ed5ad8d4 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -114,6 +114,12 @@ typedef enum TMT_EACHTIMEENTERANDEXIT = 3, } textmaptriggertype_t; +typedef enum +{ + TMT_RED = 0, + TMT_BLUE = 1, +} textmapteam_t; + typedef enum { TMC_EQUAL = 0, From 2638e1212c6ec60b60fbe17004e0d17fce261da4 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 16:10:39 +0100 Subject: [PATCH 174/377] Fix a typo --- src/p_setup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_setup.c b/src/p_setup.c index 4b567d324..03f45eb02 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3741,7 +3741,7 @@ static void P_ConvertBinaryMap(void) case 310: //CTF red team - each time case 311: //CTF blue team - continuous case 312: //CTF blue team - each time - if (lines[i].special % 2 == 1) + if (lines[i].special % 2 == 0) lines[i].args[0] = (lines[i].flags & ML_BOUNCY) ? TMT_EACHTIMEENTERANDEXIT : TMT_EACHTIMEENTER; else lines[i].args[0] = TMT_CONTINUOUS; From 126cbdd189cf2385fed537108d548050d5424518 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 18:15:27 +0100 Subject: [PATCH 175/377] Adapt linedef types 321-322 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 26 ++++++++++++++++++++ extras/conf/udb/Includes/SRB222_misc.cfg | 7 ++++++ src/p_setup.c | 16 ++++++++++++ src/p_spec.c | 23 +++++++---------- src/p_spec.h | 8 ++++++ 5 files changed, 66 insertions(+), 14 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index e74d4978e..76bb2c5ba 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2625,6 +2625,32 @@ udmf } } + 321 + { + title = "Trigger After X Calls"; + prefix = "(321)"; + arg0 + { + title = "Trigger type"; + type = 11; + enum = "xtriggertype"; + } + arg1 + { + title = "Calls"; + } + arg2 + { + title = "Can retrigger?"; + type = 11; + enum = "noyes"; + } + arg3 + { + title = "Starting calls"; + } + } + 323 { title = "NiGHTSerize"; diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 4b37d4628..1e11ad255 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -504,6 +504,13 @@ enums 3 = "Each time on entry/exit"; } + xtriggertype + { + 0 = "Continuous"; + 1 = "Each time on entry"; + 2 = "Each time on entry/exit"; + } + team { 0 = "Red"; diff --git a/src/p_setup.c b/src/p_setup.c index 03f45eb02..a459e6401 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3775,6 +3775,22 @@ static void P_ConvertBinaryMap(void) lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].special = 319; break; + case 321: //Trigger after X calls - Continuous + case 322: //Trigger after X calls - Each time + if (lines[i].special % 2 == 0) + lines[i].args[0] = (lines[i].flags & ML_BOUNCY) ? TMXT_EACHTIMEENTERANDEXIT : TMXT_EACHTIMEENTER; + else + lines[i].args[0] = TMXT_CONTINUOUS; + lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + if (lines[i].flags & ML_NOCLIMB) + { + lines[i].args[2] = 1; + lines[i].args[3] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + } + else + lines[i].args[2] = lines[i].args[3] = 0; + lines[i].special = 321; + break; case 323: //NiGHTSerize - Each time case 324: //NiGHTSerize - Once case 325: //DeNiGHTSerize - Each time diff --git a/src/p_spec.c b/src/p_spec.c index f75cd5419..5f3ce50d8 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1793,8 +1793,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller return false; } break; - case 321: // continuous - case 322: // each time + case 321: // decrement calls left before triggering if (triggerline->callcount > 0) { @@ -1837,9 +1836,9 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller if (!P_ActivateLinedefExecutorsInSector(triggerline, actor, caller)) return false; - // "Trigger on X calls" linedefs reset if noclimb is set - if ((specialtype == 321 || specialtype == 322) && triggerline->flags & ML_NOCLIMB) - triggerline->callcount = sides[triggerline->sidenum[0]].textureoffset>>FRACBITS; + // "Trigger on X calls" linedefs reset if args[2] is set + if (specialtype == 321 && triggerline->args[2]) + triggerline->callcount = triggerline->args[3]; else // These special types work only once if ((specialtype == 300 && triggerline->args[0] == TMT_ONCE) // Basic @@ -1851,7 +1850,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller || (specialtype == 314 && triggerline->args[0] == TMT_ONCE) // No of pushables || (specialtype == 317 && triggerline->args[0] == TMT_ONCE) // Unlockable trigger || (specialtype == 319 && triggerline->args[0] == TMT_ONCE) // Unlockable - || specialtype == 321 || specialtype == 322 // Trigger on X calls - Continuous + Each Time + || specialtype == 321 // Trigger on X calls || (specialtype == 323 && triggerline->args[0]) // Nightserize - Once || (specialtype == 325 && triggerline->args[0]) // DeNightserize - Once || (specialtype == 327 && triggerline->args[0]) // Nights lap - Once @@ -1899,7 +1898,7 @@ void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller) || lines[masterline].special == 306 // Character ability - Each time || lines[masterline].special == 310 // CTF Red team - Each time || lines[masterline].special == 312 // CTF Blue team - Each time - || lines[masterline].special == 322 // Trigger on X calls - Each Time + || (lines[masterline].special == 321 && lines[masterline].args[0] > TMXT_EACHTIMEMASK) // Trigger after X calls - Each time || lines[masterline].special == 332 // Skin - Each time || lines[masterline].special == 335)// Dye - Each time continue; @@ -6699,13 +6698,9 @@ void P_SpawnSpecials(boolean fromnetsave) // Trigger on X calls case 321: - case 322: - if (lines[i].flags & ML_NOCLIMB && sides[lines[i].sidenum[0]].rowoffset > 0) // optional "starting" count - lines[i].callcount = sides[lines[i].sidenum[0]].rowoffset>>FRACBITS; - else - lines[i].callcount = sides[lines[i].sidenum[0]].textureoffset>>FRACBITS; - if (lines[i].special == 322) // Each time - P_AddEachTimeThinker(&lines[i], !!(lines[i].flags & ML_BOUNCY)); + lines[i].callcount = (lines[i].args[2] && lines[i].args[3] > 0) ? lines[i].args[3] : lines[i].args[1]; // optional "starting" count + if (lines[i].args[0] > TMXT_EACHTIMEMASK) // Each time + P_AddEachTimeThinker(&lines[i], lines[i].args[0] == TMXT_EACHTIMEENTERANDEXIT); break; // NiGHTS trigger executors diff --git a/src/p_spec.h b/src/p_spec.h index 0ed5ad8d4..a317467f8 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -114,6 +114,14 @@ typedef enum TMT_EACHTIMEENTERANDEXIT = 3, } textmaptriggertype_t; +typedef enum +{ + TMXT_CONTINUOUS = 0, + TMXT_EACHTIMEMASK = TMXT_CONTINUOUS, + TMXT_EACHTIMEENTER = 1, + TMXT_EACHTIMEENTERANDEXIT = 2, +} textmapxtriggertype_t; + typedef enum { TMT_RED = 0, From 670e32908e3a2ed2f7bf67ef53074cb70532bf28 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 18:56:50 +0100 Subject: [PATCH 176/377] Adapt linedef type 308 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 65 +++++++++++++++++ src/p_setup.c | 5 ++ src/p_spec.c | 76 ++++++++++++++------ src/p_spec.h | 9 +++ 4 files changed, 135 insertions(+), 20 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 76bb2c5ba..b4ef7f36a 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2542,6 +2542,71 @@ udmf } } + 308 + { + title = "Gametype"; + prefix = "(308)"; + arg0 + { + title = "Trigger type"; + type = 11; + enum = "triggertype"; + } + arg1 + { + title = "Rules"; + type = 12; + enum + { + 1 = "Campaign"; + 2 = "Ringslinger"; + 4 = "Spectators"; + 8 = "Lives"; + 16 = "Teams"; + 32 = "First person"; + 64 = "Match emeralds"; + 128 = "Team flags"; + 256 = "Coop"; + 512 = "Allow special stages"; + 1024 = "Spawn emerald tokens"; + 2048 = "Emerald hunt"; + 4096 = "Race"; + 8192 = "Tag"; + 16384 = "Point limit"; + 32768 = "Time limit"; + 65536 = "Overtime"; + 131072 = "Hurt messages"; + 262144 = "Friendly fire"; + 524288 = "Hide time countdown"; + 1048576 = "Frozen after hide time"; + 2097152 = "Blindfolded view"; + 4194304 = "Respawn delay"; + 8388608 = "Award pity shield"; + 16777216 = "Death score penalty"; + 33554432 = "No spectator spawn"; + 67108864 = "Use match starts"; + 134217728 = "Spawn invincibility"; + 268435456 = "Allow enemies"; + 536870912 = "Allow exit sectors"; + 1073741824 = "No title card"; + 2147483648 = "Allow cutscenes"; + } + } + arg2 + { + title = "Check if"; + type = 11; + enum + { + 0 = "Has all"; + 1 = "Has any"; + 2 = "Has exactly"; + 3 = "Doesn't have all"; + 4 = "Doesn't have any"; + } + } + } + 309 { title = "CTF Team"; diff --git a/src/p_setup.c b/src/p_setup.c index a459e6401..6b98ed738 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3737,6 +3737,11 @@ static void P_ConvertBinaryMap(void) lines[i].args[3] = !!(lines[i].flags & ML_EFFECT4); lines[i].special = 303; break; + case 308: //Race only - once + lines[i].args[0] = TMT_ONCE; + lines[i].args[1] = GTR_RACE; + lines[i].args[2] = TMG_HASANY; + break; case 309: //CTF red team - continuous case 310: //CTF red team - each time case 311: //CTF blue team - continuous diff --git a/src/p_spec.c b/src/p_spec.c index 5f3ce50d8..be0455fba 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1844,7 +1844,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller if ((specialtype == 300 && triggerline->args[0] == TMT_ONCE) // Basic || (specialtype == 303 && triggerline->args[0] == TMT_ONCE) // Ring count || specialtype == 307 // Character ability - Once - || specialtype == 308 // Race only - Once + || (specialtype == 308 && triggerline->args[0] == TMT_ONCE) // Gametype || (specialtype == 309 && triggerline->args[0] == TMT_ONCE) // CTF team || specialtype == 313 // No More Enemies - Once || (specialtype == 314 && triggerline->args[0] == TMT_ONCE) // No of pushables @@ -1891,16 +1891,26 @@ void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller) continue; // "No More Enemies" and "Level Load" take care of themselves. - if (lines[masterline].special == 313 - || lines[masterline].special == 399 - // Each-time executors handle themselves, too - || (lines[masterline].special == 300 && lines[masterline].args[0] > TMT_EACHTIMEMASK) // Each time - || lines[masterline].special == 306 // Character ability - Each time - || lines[masterline].special == 310 // CTF Red team - Each time - || lines[masterline].special == 312 // CTF Blue team - Each time - || (lines[masterline].special == 321 && lines[masterline].args[0] > TMXT_EACHTIMEMASK) // Trigger after X calls - Each time - || lines[masterline].special == 332 // Skin - Each time - || lines[masterline].special == 335)// Dye - Each time + if (lines[masterline].special == 313 || lines[masterline].special == 399) + continue; + + // Each-time executors handle themselves, too + if ((lines[masterline].special == 300 // Basic + || lines[masterline].special == 303 // Ring count + || lines[masterline].special == 308 // Gametype + || lines[masterline].special == 309 // CTF team + || lines[masterline].special == 314 // Number of pushables + || lines[masterline].special == 317 // Condition set trigger + || lines[masterline].special == 319) // Unlockable trigger + && lines[masterline].args[0] > TMT_EACHTIMEMASK) + continue; + + if (lines[masterline].special == 321 && lines[masterline].args[0] > TMXT_EACHTIMEMASK) // Trigger after X calls + continue; + + if (lines[masterline].special == 306 // Character ability + || lines[masterline].special == 332 // Skin + || lines[masterline].special == 335)// Dye continue; if (!P_RunTriggerLinedef(&lines[masterline], actor, caller)) @@ -5857,6 +5867,24 @@ static void P_MakeFOFBouncy(line_t *paramline, line_t *masterline) } +static boolean P_CheckGametypeRules(INT32 checktype, UINT32 target) +{ + switch (checktype) + { + case TMG_HASALL: + default: + return (gametyperules & target) == target; + case TMG_HASANY: + return !!(gametyperules & target); + case TMG_HASEXACTLY: + return gametyperules == target; + case TMG_DOESNTHAVEALL: + return (gametyperules & target) != target; + case TMG_DOESNTHAVEANY: + return !(gametyperules & target); + } +} + /** After the map has loaded, scans for specials that spawn 3Dfloors and * thinkers. * @@ -6657,14 +6685,6 @@ void P_SpawnSpecials(boolean fromnetsave) } break; - // Linedef executor triggers for CTF teams. - case 309: - if (!(gametyperules & GTR_TEAMFLAGS)) - { - lines[i].special = 0; - break; - } - /* FALLTHRU */ case 300: // Trigger linedef executor case 303: // Count rings case 314: // Pushable linedef executors (count # of pushables) @@ -6680,8 +6700,24 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 308: // Race-only linedef executor. Triggers once. - if (!(gametyperules & GTR_RACE)) + if (!P_CheckGametypeRules(lines[i].args[2], (UINT32)lines[i].args[1])) + { lines[i].special = 0; + break; + } + if (lines[i].args[0] > TMT_EACHTIMEMASK) + P_AddEachTimeThinker(&lines[i], lines[i].args[0] == TMT_EACHTIMEENTERANDEXIT); + break; + + // Linedef executor triggers for CTF teams. + case 309: + if (!(gametyperules & GTR_TEAMFLAGS)) + { + lines[i].special = 0; + break; + } + if (lines[i].args[0] > TMT_EACHTIMEMASK) + P_AddEachTimeThinker(&lines[i], lines[i].args[0] == TMT_EACHTIMEENTERANDEXIT); break; // Each time executors diff --git a/src/p_spec.h b/src/p_spec.h index a317467f8..c60bdda66 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -122,6 +122,15 @@ typedef enum TMXT_EACHTIMEENTERANDEXIT = 2, } textmapxtriggertype_t; +typedef enum +{ + TMG_HASALL = 0, + TMG_HASANY = 1, + TMG_HASEXACTLY = 2, + TMG_DOESNTHAVEALL = 3, + TMG_DOESNTHAVEANY = 4, +} textmapgametypecheck_t; + typedef enum { TMT_RED = 0, From a7f5bcfea7755c58989072999d846dc7d50cc7f3 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 19:17:16 +0100 Subject: [PATCH 177/377] Adapt linedef type 305-307 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 36 ++++++++++++++++++++ src/p_setup.c | 24 +++++++++---- src/p_spec.c | 22 +++++------- 3 files changed, 63 insertions(+), 19 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index b4ef7f36a..065c9dc46 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2542,6 +2542,42 @@ udmf } } + 305 + { + title = "Character Ability"; + prefix = "(305)"; + arg0 + { + title = "Trigger type"; + type = 11; + enum = "triggertype"; + } + arg1 + { + title = "Ability"; + type = 11; + enum + { + 0 = "None"; + 1 = "Thok"; + 2 = "Fly"; + 3 = "Glide and climb"; + 4 = "Homing attack"; + 5 = "Swim"; + 6 = "Double jump"; + 7 = "Float"; + 8 = "Float with slow descent"; + 9 = "Telekinesis"; + 10 = "Fall switch"; + 11 = "Jump boost"; + 12 = "Air drill"; + 13 = "Jump-thok"; + 14 = "Pogo bounce"; + 15 = "Twin spin"; + } + } + } + 308 { title = "Gametype"; diff --git a/src/p_setup.c b/src/p_setup.c index 6b98ed738..e4080f256 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3714,14 +3714,14 @@ static void P_ConvertBinaryMap(void) lines[i].args[1] = 255; break; case 300: //Trigger linedef executor - Continuous - lines[i].args[0] = TMT_CONTINUOUS; - break; case 301: //Trigger linedef executor - Each time - lines[i].args[0] = (lines[i].flags & ML_BOUNCY) ? TMT_EACHTIMEENTERANDEXIT : TMT_EACHTIMEENTER; - lines[i].special = 300; - break; case 302: //Trigger linedef executor - Once - lines[i].args[0] = TMT_ONCE; + if (lines[i].special == 302) + lines[i].args[0] = TMT_ONCE; + else if (lines[i].special == 301) + lines[i].args[0] = (lines[i].flags & ML_BOUNCY) ? TMT_EACHTIMEENTERANDEXIT : TMT_EACHTIMEENTER; + else + lines[i].args[0] = TMT_CONTINUOUS; lines[i].special = 300; break; case 303: //Ring count - Continuous @@ -3737,6 +3737,18 @@ static void P_ConvertBinaryMap(void) lines[i].args[3] = !!(lines[i].flags & ML_EFFECT4); lines[i].special = 303; break; + case 305: //Character ability - Continuous + case 306: //Character ability - Each time + case 307: //Character ability - Once + if (lines[i].special == 307) + lines[i].args[0] = TMT_ONCE; + else if (lines[i].special == 306) + lines[i].args[0] = (lines[i].flags & ML_BOUNCY) ? TMT_EACHTIMEENTERANDEXIT : TMT_EACHTIMEENTER; + else + lines[i].args[0] = TMT_CONTINUOUS; + lines[i].args[1] = (P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS) / 10; + lines[i].special = 305; + break; case 308: //Race only - once lines[i].args[0] = TMT_ONCE; lines[i].args[1] = GTR_RACE; diff --git a/src/p_spec.c b/src/p_spec.c index be0455fba..013d72300 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1501,9 +1501,10 @@ static boolean P_CheckNightsTriggerLine(line_t *triggerline, mobj_t *actor) return true; } -static boolean P_CheckPlayerMare(line_t *triggerline, INT32 targetmare) +static boolean P_CheckPlayerMare(line_t *triggerline) { UINT8 mare; + INT32 targetmare = P_AproxDistance(triggerline->dx, triggerline->dy) >> FRACBITS; if (!(maptol & TOL_NIGHTS)) return false; @@ -1709,7 +1710,6 @@ static boolean P_ActivateLinedefExecutorsInSector(line_t *triggerline, mobj_t *a */ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller) { - fixed_t dist = P_AproxDistance(triggerline->dx, triggerline->dy)>>FRACBITS; INT16 specialtype = triggerline->special; //////////////////////// @@ -1725,7 +1725,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller } else if (GETSECSPECIAL(caller->special, 2) == 7) { - if (!P_CheckPlayerMare(triggerline, dist)) + if (!P_CheckPlayerMare(triggerline)) return false; } // If we were not triggered by a sector type especially for the purpose, @@ -1746,10 +1746,8 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller if (!P_CheckPlayerRings(triggerline, actor)) return false; break; - case 305: // continuous - case 306: // each time - case 307: // once - if (!(actor && actor->player && actor->player->charability == dist/10)) + case 305: + if (!(actor && actor->player && actor->player->charability == triggerline->args[1])) return false; break; case 309: @@ -1843,7 +1841,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller // These special types work only once if ((specialtype == 300 && triggerline->args[0] == TMT_ONCE) // Basic || (specialtype == 303 && triggerline->args[0] == TMT_ONCE) // Ring count - || specialtype == 307 // Character ability - Once + || (specialtype == 305 && triggerline->args[0] == TMT_ONCE) // Character ability || (specialtype == 308 && triggerline->args[0] == TMT_ONCE) // Gametype || (specialtype == 309 && triggerline->args[0] == TMT_ONCE) // CTF team || specialtype == 313 // No More Enemies - Once @@ -1897,6 +1895,7 @@ void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller) // Each-time executors handle themselves, too if ((lines[masterline].special == 300 // Basic || lines[masterline].special == 303 // Ring count + || lines[masterline].special == 305 // Character ability || lines[masterline].special == 308 // Gametype || lines[masterline].special == 309 // CTF team || lines[masterline].special == 314 // Number of pushables @@ -1908,8 +1907,7 @@ void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller) if (lines[masterline].special == 321 && lines[masterline].args[0] > TMXT_EACHTIMEMASK) // Trigger after X calls continue; - if (lines[masterline].special == 306 // Character ability - || lines[masterline].special == 332 // Skin + if (lines[masterline].special == 332 // Skin || lines[masterline].special == 335)// Dye continue; @@ -6687,6 +6685,7 @@ void P_SpawnSpecials(boolean fromnetsave) case 300: // Trigger linedef executor case 303: // Count rings + case 305: // Character ability case 314: // Pushable linedef executors (count # of pushables) case 317: // Condition set trigger case 319: // Unlockable trigger @@ -6694,9 +6693,6 @@ void P_SpawnSpecials(boolean fromnetsave) P_AddEachTimeThinker(&lines[i], lines[i].args[0] == TMT_EACHTIMEENTERANDEXIT); break; - // Charability linedef executors - case 305: - case 307: break; case 308: // Race-only linedef executor. Triggers once. From adaf599e87c5f916e25fc90aa53c440498bb5e14 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 19:33:02 +0100 Subject: [PATCH 178/377] Adapt linedef types 331-333 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 24 ++++++++++++++++++ src/p_setup.c | 17 +++++++++++++ src/p_spec.c | 26 +++++++++----------- 3 files changed, 52 insertions(+), 15 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 065c9dc46..eef89d144 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -3001,6 +3001,30 @@ udmf } } } + + 331 + { + title = "Player Skin"; + prefix = "(331)"; + arg0 + { + title = "Trigger type"; + type = 11; + enum = "triggertype"; + } + arg1 + { + title = "Invert choice?"; + type = 11; + enum = "noyes"; + } + stringarg0 + { + title = "Skin name"; + type = 2; + } + } + 399 { title = "Level Load"; diff --git a/src/p_setup.c b/src/p_setup.c index e4080f256..abdc643c5 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3881,6 +3881,23 @@ static void P_ConvertBinaryMap(void) lines[i].args[7] |= TMI_ENTER; } break; + case 331: // Player skin - continuous + case 332: // Player skin - each time + case 333: // Player skin - once + if (lines[i].special == 303) + lines[i].args[0] = TMT_ONCE; + else if (lines[i].special == 302) + lines[i].args[0] = (lines[i].flags & ML_BOUNCY) ? TMT_EACHTIMEENTERANDEXIT : TMT_EACHTIMEENTER; + else + lines[i].args[0] = TMT_CONTINUOUS; + lines[i].args[1] = !!(lines[i].flags & ML_NOCLIMB); + if (lines[i].text) + { + lines[i].stringargs[0] = Z_Malloc(strlen(lines[i].text) + 1, PU_LEVEL, NULL); + M_Memcpy(lines[i].stringargs[0], lines[i].text, strlen(lines[i].text) + 1); + } + lines[i].special = 331; + break; case 400: //Set tagged sector's floor height/texture case 401: //Set tagged sector's ceiling height/texture lines[i].args[0] = tag; diff --git a/src/p_spec.c b/src/p_spec.c index 013d72300..94a4cc7da 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1806,10 +1806,12 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller if (!P_CheckNightsTriggerLine(triggerline, actor)) return false; break; - case 331: // continuous - case 332: // each time - case 333: // once - if (!(actor && actor->player && ((stricmp(triggerline->text, skins[actor->player->skin].name) == 0) ^ ((triggerline->flags & ML_NOCLIMB) == ML_NOCLIMB)))) + case 331: + if (!(actor && actor->player)) + return false; + if (!triggerline->stringargs[0]) + return false; + if (!(stricmp(triggerline->stringargs[0], skins[actor->player->skin].name) == 0) ^ !!(triggerline->args[1])) return false; break; case 334: // object dye - continuous @@ -1853,7 +1855,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller || (specialtype == 325 && triggerline->args[0]) // DeNightserize - Once || (specialtype == 327 && triggerline->args[0]) // Nights lap - Once || (specialtype == 329 && triggerline->args[0]) // Nights Bonus Time - Once - || specialtype == 333 // Skin - Once + || (specialtype == 333 && triggerline->args[0] == TMT_ONCE) // Player skin || specialtype == 336 // Dye - Once || specialtype == 399) // Level Load triggerline->special = 0; // Clear it out @@ -1900,15 +1902,15 @@ void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller) || lines[masterline].special == 309 // CTF team || lines[masterline].special == 314 // Number of pushables || lines[masterline].special == 317 // Condition set trigger - || lines[masterline].special == 319) // Unlockable trigger + || lines[masterline].special == 319 // Unlockable trigger + || lines[masterline].special == 331) // Player skin && lines[masterline].args[0] > TMT_EACHTIMEMASK) continue; if (lines[masterline].special == 321 && lines[masterline].args[0] > TMXT_EACHTIMEMASK) // Trigger after X calls continue; - if (lines[masterline].special == 332 // Skin - || lines[masterline].special == 335)// Dye + if (lines[masterline].special == 335) // Dye continue; if (!P_RunTriggerLinedef(&lines[masterline], actor, caller)) @@ -6689,6 +6691,7 @@ void P_SpawnSpecials(boolean fromnetsave) case 314: // Pushable linedef executors (count # of pushables) case 317: // Condition set trigger case 319: // Unlockable trigger + case 331: // Player skin if (lines[i].args[0] > TMT_EACHTIMEMASK) P_AddEachTimeThinker(&lines[i], lines[i].args[0] == TMT_EACHTIMEENTERANDEXIT); break; @@ -6717,8 +6720,6 @@ void P_SpawnSpecials(boolean fromnetsave) break; // Each time executors - case 306: - case 332: case 335: P_AddEachTimeThinker(&lines[i], !!(lines[i].flags & ML_BOUNCY)); break; @@ -6742,11 +6743,6 @@ void P_SpawnSpecials(boolean fromnetsave) case 329: break; - // Skin trigger executors - case 331: - case 333: - break; - // Object dye executors case 334: case 336: From c43d5c7183479fce9496e5d1d04f4cbaac617218 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 19:49:17 +0100 Subject: [PATCH 179/377] Adapt linedef types 334-336 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 38 ++++++++++++++++++++ src/p_setup.c | 23 ++++++++++-- src/p_spec.c | 30 +++++----------- 3 files changed, 66 insertions(+), 25 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index eef89d144..f5fb423f3 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -739,6 +739,21 @@ doom title = "Player Skin - Once"; prefix = "(333)"; } + 334 + { + title = "Object Dye - Continuous"; + prefix = "(334)"; + } + 335 + { + title = "Object Dye - Each Time"; + prefix = "(335)"; + } + 336 + { + title = "Object Dye - Once"; + prefix = "(336)"; + } 399 { title = "Level Load"; @@ -3025,6 +3040,29 @@ udmf } } + 334 + { + title = "Object Dye"; + prefix = "(334)"; + arg0 + { + title = "Trigger type"; + type = 11; + enum = "triggertype"; + } + arg1 + { + title = "Invert choice?"; + type = 11; + enum = "noyes"; + } + stringarg0 + { + title = "Color"; + type = 2; + } + } + 399 { title = "Level Load"; diff --git a/src/p_setup.c b/src/p_setup.c index abdc643c5..95e3c487b 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1302,9 +1302,6 @@ static void P_LoadSidedefs(UINT8 *data) case 9: // Mace parameters case 14: // Bustable block parameters case 15: // Fan particle spawner parameters - case 334: // Trigger linedef executor: Object dye - Continuous - case 335: // Trigger linedef executor: Object dye - Each time - case 336: // Trigger linedef executor: Object dye - Once { char process[8*3+1]; memset(process,0,8*3+1); @@ -1324,6 +1321,9 @@ static void P_LoadSidedefs(UINT8 *data) case 331: // Trigger linedef executor: Skin - Continuous case 332: // Trigger linedef executor: Skin - Each time case 333: // Trigger linedef executor: Skin - Once + case 334: // Trigger linedef executor: Object dye - Continuous + case 335: // Trigger linedef executor: Object dye - Each time + case 336: // Trigger linedef executor: Object dye - Once case 425: // Calls P_SetMobjState on calling mobj case 434: // Custom Power case 442: // Calls P_SetMobjState on mobjs of a given type in the tagged sectors @@ -3898,6 +3898,23 @@ static void P_ConvertBinaryMap(void) } lines[i].special = 331; break; + case 334: // Object dye - continuous + case 335: // Object dye - each time + case 336: // Object dye - once + if (lines[i].special == 336) + lines[i].args[0] = TMT_ONCE; + else if (lines[i].special == 335) + lines[i].args[0] = (lines[i].flags & ML_BOUNCY) ? TMT_EACHTIMEENTERANDEXIT : TMT_EACHTIMEENTER; + else + lines[i].args[0] = TMT_CONTINUOUS; + lines[i].args[1] = !!(lines[i].flags & ML_NOCLIMB); + if (sides[lines[i].sidenum[0]].text) + { + lines[i].stringargs[0] = Z_Malloc(strlen(sides[lines[i].sidenum[0]].text) + 1, PU_LEVEL, NULL); + M_Memcpy(lines[i].stringargs[0], sides[lines[i].sidenum[0]].text, strlen(sides[lines[i].sidenum[0]].text) + 1); + } + lines[i].special = 334; + break; case 400: //Set tagged sector's floor height/texture case 401: //Set tagged sector's ceiling height/texture lines[i].args[0] = tag; diff --git a/src/p_spec.c b/src/p_spec.c index 94a4cc7da..f5982e6f2 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1814,15 +1814,12 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller if (!(stricmp(triggerline->stringargs[0], skins[actor->player->skin].name) == 0) ^ !!(triggerline->args[1])) return false; break; - case 334: // object dye - continuous - case 335: // object dye - each time - case 336: // object dye - once + case 334: // object dye { - INT32 triggercolor = (INT32)sides[triggerline->sidenum[0]].toptexture; + INT32 triggercolor = triggerline->stringargs[0] ? get_number(triggerline->stringargs[0]) : SKINCOLOR_NONE; UINT16 color = (actor->player ? actor->player->powers[pw_dye] : actor->color); - boolean invert = (triggerline->flags & ML_NOCLIMB ? true : false); - if (invert ^ (triggercolor != color)) + if (!!(triggerline->args[1]) ^ (triggercolor != color)) return false; } default: @@ -1855,8 +1852,8 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller || (specialtype == 325 && triggerline->args[0]) // DeNightserize - Once || (specialtype == 327 && triggerline->args[0]) // Nights lap - Once || (specialtype == 329 && triggerline->args[0]) // Nights Bonus Time - Once - || (specialtype == 333 && triggerline->args[0] == TMT_ONCE) // Player skin - || specialtype == 336 // Dye - Once + || (specialtype == 331 && triggerline->args[0] == TMT_ONCE) // Player skin + || (specialtype == 334 && triggerline->args[0] == TMT_ONCE) // Object dye || specialtype == 399) // Level Load triggerline->special = 0; // Clear it out @@ -1903,16 +1900,14 @@ void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller) || lines[masterline].special == 314 // Number of pushables || lines[masterline].special == 317 // Condition set trigger || lines[masterline].special == 319 // Unlockable trigger - || lines[masterline].special == 331) // Player skin + || lines[masterline].special == 331 // Player skin + || lines[masterline].special == 334) // Object dye && lines[masterline].args[0] > TMT_EACHTIMEMASK) continue; if (lines[masterline].special == 321 && lines[masterline].args[0] > TMXT_EACHTIMEMASK) // Trigger after X calls continue; - if (lines[masterline].special == 335) // Dye - continue; - if (!P_RunTriggerLinedef(&lines[masterline], actor, caller)) return; // cancel P_LinedefExecute if function returns false } @@ -6692,6 +6687,7 @@ void P_SpawnSpecials(boolean fromnetsave) case 317: // Condition set trigger case 319: // Unlockable trigger case 331: // Player skin + case 334: // Object dye if (lines[i].args[0] > TMT_EACHTIMEMASK) P_AddEachTimeThinker(&lines[i], lines[i].args[0] == TMT_EACHTIMEENTERANDEXIT); break; @@ -6719,11 +6715,6 @@ void P_SpawnSpecials(boolean fromnetsave) P_AddEachTimeThinker(&lines[i], lines[i].args[0] == TMT_EACHTIMEENTERANDEXIT); break; - // Each time executors - case 335: - P_AddEachTimeThinker(&lines[i], !!(lines[i].flags & ML_BOUNCY)); - break; - // No More Enemies Linedef Exec case 313: P_AddNoEnemiesThinker(&lines[i]); @@ -6743,11 +6734,6 @@ void P_SpawnSpecials(boolean fromnetsave) case 329: break; - // Object dye executors - case 334: - case 336: - break; - case 399: // Linedef execute on map load // This is handled in P_RunLevelLoadExecutors. break; From 22420f92d2a8c63bf76059cada6c10d6d1a63715 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 20:02:03 +0100 Subject: [PATCH 180/377] Some trigger lineder cleanup --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 2 +- src/p_spec.c | 44 +++++++++++--------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index f5fb423f3..7635f03be 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2678,7 +2678,7 @@ udmf 313 { - title = "No More Enemies - Once"; + title = "No More Enemies"; prefix = "(313)"; arg0 { diff --git a/src/p_spec.c b/src/p_spec.c index f5982e6f2..340427b80 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1837,25 +1837,31 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller if (specialtype == 321 && triggerline->args[2]) triggerline->callcount = triggerline->args[3]; else - // These special types work only once - if ((specialtype == 300 && triggerline->args[0] == TMT_ONCE) // Basic - || (specialtype == 303 && triggerline->args[0] == TMT_ONCE) // Ring count - || (specialtype == 305 && triggerline->args[0] == TMT_ONCE) // Character ability - || (specialtype == 308 && triggerline->args[0] == TMT_ONCE) // Gametype - || (specialtype == 309 && triggerline->args[0] == TMT_ONCE) // CTF team - || specialtype == 313 // No More Enemies - Once - || (specialtype == 314 && triggerline->args[0] == TMT_ONCE) // No of pushables - || (specialtype == 317 && triggerline->args[0] == TMT_ONCE) // Unlockable trigger - || (specialtype == 319 && triggerline->args[0] == TMT_ONCE) // Unlockable - || specialtype == 321 // Trigger on X calls - || (specialtype == 323 && triggerline->args[0]) // Nightserize - Once - || (specialtype == 325 && triggerline->args[0]) // DeNightserize - Once - || (specialtype == 327 && triggerline->args[0]) // Nights lap - Once - || (specialtype == 329 && triggerline->args[0]) // Nights Bonus Time - Once - || (specialtype == 331 && triggerline->args[0] == TMT_ONCE) // Player skin - || (specialtype == 334 && triggerline->args[0] == TMT_ONCE) // Object dye - || specialtype == 399) // Level Load - triggerline->special = 0; // Clear it out + { + // These special types work only once + if (specialtype == 313 // No more enemies + || specialtype == 321 // Trigger on X calls + || specialtype == 399) // Level Load + triggerline->special = 0; + else if ((specialtype == 323 // Nightserize + || specialtype == 325 // DeNightserize + || specialtype == 327 // Nights lap + || specialtype == 329) // Nights bonus time + && triggerline->args[0]) + triggerline->special = 0; + else if ((specialtype == 300 // Basic + || specialtype == 303 // Ring count + || specialtype == 305 // Character ability + || specialtype == 308 // Gametype + || specialtype == 309 // CTF team + || specialtype == 314 // No of pushables + || specialtype == 317 // Unlockable trigger + || specialtype == 319 // Unlockable + || specialtype == 331 // Player skin + || specialtype == 334) // Object dye + && triggerline->args[0] == TMT_ONCE) + triggerline->special = 0; + } return true; } From 18e8ebf394c880153ff8b062e18dad27a10e2ea2 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 20:37:39 +0100 Subject: [PATCH 181/377] Add emerald check trigger linedef types and deprecate the emerald check sector type --- extras/conf/SRB2-22.cfg | 22 +++++++- extras/conf/udb/Includes/SRB222_linedefs.cfg | 57 +++++++++++++++++--- extras/conf/udb/Includes/SRB222_misc.cfg | 9 ++++ extras/conf/udb/Includes/SRB222_sectors.cfg | 4 +- src/p_setup.c | 15 +++++- src/p_spec.c | 41 +++++++++++--- src/p_spec.h | 12 ++--- 7 files changed, 134 insertions(+), 26 deletions(-) diff --git a/extras/conf/SRB2-22.cfg b/extras/conf/SRB2-22.cfg index 0d5b7ab92..7c53d99f6 100644 --- a/extras/conf/SRB2-22.cfg +++ b/extras/conf/SRB2-22.cfg @@ -431,7 +431,7 @@ sectortypes 48 = "Trigger Line Ex. (Floor Touch, All Players)"; 64 = "Trigger Line Ex. (Anywhere in Sector)"; 80 = "Trigger Line Ex. (Floor Touch)"; - 96 = "Trigger Line Ex. (Emerald Check)"; + 96 = "Trigger Line Ex. (Emerald Check) "; 112 = "Trigger Line Ex. (NiGHTS Mare)"; 128 = "Check for Linedef Executor on FOFs"; 144 = "Egg Capsule"; @@ -486,7 +486,7 @@ gen_sectortypes 48 = "Trigger Line Ex. (Floor Touch, All Players)"; 64 = "Trigger Line Ex. (Anywhere in Sector)"; 80 = "Trigger Line Ex. (Floor Touch)"; - 96 = "Trigger Line Ex. (Emerald Check)"; + 96 = "Trigger Line Ex. (Emerald Check) "; 112 = "Trigger Line Ex. (NiGHTS Mare)"; 128 = "Check for Linedef Executor on FOFs"; 144 = "Egg Capsule"; @@ -1982,6 +1982,24 @@ linedeftypes prefix = "(336)"; } + 337 + { + title = "Emerald Check - Continuous"; + prefix = "(337)"; + } + + 338 + { + title = "Emerald Check - Each Time"; + prefix = "(338)"; + } + + 339 + { + title = "Emerald Check - Once"; + prefix = "(339)"; + } + 399 { title = "Level Load"; diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 7635f03be..940d4b650 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -754,6 +754,21 @@ doom title = "Object Dye - Once"; prefix = "(336)"; } + 337 + { + title = "Emerald Check - Continuous"; + prefix = "(337)"; + } + 338 + { + title = "Emerald Check - Each Time"; + prefix = "(338)"; + } + 339 + { + title = "Emerald Check - Once"; + prefix = "(339)"; + } 399 { title = "Level Load"; @@ -2647,14 +2662,7 @@ udmf { title = "Check if"; type = 11; - enum - { - 0 = "Has all"; - 1 = "Has any"; - 2 = "Has exactly"; - 3 = "Doesn't have all"; - 4 = "Doesn't have any"; - } + enum = "flagcheck"; } } @@ -3063,6 +3071,39 @@ udmf } } + 337 + { + title = "Emerald Check"; + prefix = "(337)"; + arg0 + { + title = "Trigger type"; + type = 11; + enum = "triggertype"; + } + arg1 + { + title = "Emeralds"; + type = 12; + enum + { + 1 = "Emerald 1"; + 2 = "Emerald 2"; + 4 = "Emerald 3"; + 8 = "Emerald 4"; + 16 = "Emerald 5"; + 32 = "Emerald 6"; + 64 = "Emerald 7"; + } + } + arg2 + { + title = "Check if"; + type = 11; + enum = "flagcheck"; + } + } + 399 { title = "Level Load"; diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 1e11ad255..f4a60581a 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -516,6 +516,15 @@ enums 0 = "Red"; 1 = "Blue"; } + + flagcheck + { + 0 = "Has all"; + 1 = "Has any"; + 2 = "Has exactly"; + 3 = "Doesn't have all"; + 4 = "Doesn't have any"; + } } //Default things filters diff --git a/extras/conf/udb/Includes/SRB222_sectors.cfg b/extras/conf/udb/Includes/SRB222_sectors.cfg index d0b7ba082..e02bfd7cc 100644 --- a/extras/conf/udb/Includes/SRB222_sectors.cfg +++ b/extras/conf/udb/Includes/SRB222_sectors.cfg @@ -21,7 +21,7 @@ sectortypes 48 = "Trigger Line Ex. (Floor Touch, All Players)"; 64 = "Trigger Line Ex. (Anywhere in Sector)"; 80 = "Trigger Line Ex. (Floor Touch)"; - 96 = "Trigger Line Ex. (Emerald Check)"; + 96 = "Trigger Line Ex. (Emerald Check) "; 112 = "Trigger Line Ex. (NiGHTS Mare)"; 128 = "Check for Linedef Executor on FOFs"; 144 = "Egg Capsule"; @@ -74,7 +74,7 @@ gen_sectortypes 48 = "Trigger Line Ex. (Floor Touch, All Players)"; 64 = "Trigger Line Ex. (Anywhere in Sector)"; 80 = "Trigger Line Ex. (Floor Touch)"; - 96 = "Trigger Line Ex. (Emerald Check)"; + 96 = "Trigger Line Ex. (Emerald Check) "; 112 = "Trigger Line Ex. (NiGHTS Mare)"; 128 = "Check for Linedef Executor on FOFs"; 144 = "Egg Capsule"; diff --git a/src/p_setup.c b/src/p_setup.c index 95e3c487b..6a1218f41 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3752,7 +3752,7 @@ static void P_ConvertBinaryMap(void) case 308: //Race only - once lines[i].args[0] = TMT_ONCE; lines[i].args[1] = GTR_RACE; - lines[i].args[2] = TMG_HASANY; + lines[i].args[2] = TMF_HASANY; break; case 309: //CTF red team - continuous case 310: //CTF red team - each time @@ -3915,6 +3915,19 @@ static void P_ConvertBinaryMap(void) } lines[i].special = 334; break; + case 337: //Emerald check - continuous + case 338: //Emerald check - each time + case 339: //Emerald check - once + if (lines[i].special == 339) + lines[i].args[0] = TMT_ONCE; + else if (lines[i].special == 338) + lines[i].args[0] = (lines[i].flags & ML_BOUNCY) ? TMT_EACHTIMEENTERANDEXIT : TMT_EACHTIMEENTER; + else + lines[i].args[0] = TMT_CONTINUOUS; + lines[i].args[1] = EMERALD1|EMERALD2|EMERALD3|EMERALD4|EMERALD5|EMERALD6|EMERALD7; + lines[i].args[2] = TMF_HASALL; + lines[i].special = 337; + break; case 400: //Set tagged sector's floor height/texture case 401: //Set tagged sector's ceiling height/texture lines[i].args[0] = tag; diff --git a/src/p_spec.c b/src/p_spec.c index 340427b80..7c3f01333 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1590,6 +1590,24 @@ static boolean P_CheckPushables(line_t *triggerline, sector_t *caller) } } +static boolean P_CheckEmeralds(INT32 checktype, UINT16 target) +{ + switch (checktype) + { + case TMF_HASALL: + default: + return (emeralds & target) == target; + case TMF_HASANY: + return !!(emeralds & target); + case TMF_HASEXACTLY: + return emeralds == target; + case TMF_DOESNTHAVEALL: + return (emeralds & target) != target; + case TMF_DOESNTHAVEANY: + return !(emeralds & target); + } +} + static void P_ActivateLinedefExecutor(line_t *line, mobj_t *actor, sector_t *caller) { if (line->special < 400 || line->special >= 500) @@ -1720,6 +1738,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller { if (GETSECSPECIAL(caller->special, 2) == 6) { + CONS_Alert(CONS_WARNING, M_GetText("Deprecated emerald check sector type detected. Please use linedef types 337-339 instead.\n")); if (!(ALL7EMERALDS(emeralds))) return false; } @@ -1822,6 +1841,11 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller if (!!(triggerline->args[1]) ^ (triggercolor != color)) return false; } + break; + case 337: // emerald check + if (!P_CheckEmeralds(triggerline->args[2], (UINT16)triggerline->args[1])) + return false; + break; default: break; } @@ -1858,7 +1882,8 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller || specialtype == 317 // Unlockable trigger || specialtype == 319 // Unlockable || specialtype == 331 // Player skin - || specialtype == 334) // Object dye + || specialtype == 334 // Object dye + || specialtype == 337) // Emerald check && triggerline->args[0] == TMT_ONCE) triggerline->special = 0; } @@ -1907,7 +1932,8 @@ void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller) || lines[masterline].special == 317 // Condition set trigger || lines[masterline].special == 319 // Unlockable trigger || lines[masterline].special == 331 // Player skin - || lines[masterline].special == 334) // Object dye + || lines[masterline].special == 334 // Object dye + || lines[masterline].special == 337) // Emerald check && lines[masterline].args[0] > TMT_EACHTIMEMASK) continue; @@ -5872,16 +5898,16 @@ static boolean P_CheckGametypeRules(INT32 checktype, UINT32 target) { switch (checktype) { - case TMG_HASALL: + case TMF_HASALL: default: return (gametyperules & target) == target; - case TMG_HASANY: + case TMF_HASANY: return !!(gametyperules & target); - case TMG_HASEXACTLY: + case TMF_HASEXACTLY: return gametyperules == target; - case TMG_DOESNTHAVEALL: + case TMF_DOESNTHAVEALL: return (gametyperules & target) != target; - case TMG_DOESNTHAVEANY: + case TMF_DOESNTHAVEANY: return !(gametyperules & target); } } @@ -6694,6 +6720,7 @@ void P_SpawnSpecials(boolean fromnetsave) case 319: // Unlockable trigger case 331: // Player skin case 334: // Object dye + case 337: // Emerald check if (lines[i].args[0] > TMT_EACHTIMEMASK) P_AddEachTimeThinker(&lines[i], lines[i].args[0] == TMT_EACHTIMEENTERANDEXIT); break; diff --git a/src/p_spec.h b/src/p_spec.h index c60bdda66..ac42cd464 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -124,12 +124,12 @@ typedef enum typedef enum { - TMG_HASALL = 0, - TMG_HASANY = 1, - TMG_HASEXACTLY = 2, - TMG_DOESNTHAVEALL = 3, - TMG_DOESNTHAVEANY = 4, -} textmapgametypecheck_t; + TMF_HASALL = 0, + TMF_HASANY = 1, + TMF_HASEXACTLY = 2, + TMF_DOESNTHAVEALL = 3, + TMF_DOESNTHAVEANY = 4, +} textmapflagcheck_t; typedef enum { From dc4dd7581013c89cd0116e0cb88818c303f15d51 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 20:57:44 +0100 Subject: [PATCH 182/377] Add NiGHTS mare trigger linedef type and deprecate the NiGHTS mare sector type --- extras/conf/SRB2-22.cfg | 28 +++++++++++++-- extras/conf/udb/Includes/SRB222_linedefs.cfg | 37 ++++++++++++++++++++ src/p_setup.c | 20 ++++++++++- src/p_spec.c | 31 ++++++++++++++-- 4 files changed, 111 insertions(+), 5 deletions(-) diff --git a/extras/conf/SRB2-22.cfg b/extras/conf/SRB2-22.cfg index 7c53d99f6..9aeada89b 100644 --- a/extras/conf/SRB2-22.cfg +++ b/extras/conf/SRB2-22.cfg @@ -432,7 +432,7 @@ sectortypes 64 = "Trigger Line Ex. (Anywhere in Sector)"; 80 = "Trigger Line Ex. (Floor Touch)"; 96 = "Trigger Line Ex. (Emerald Check) "; - 112 = "Trigger Line Ex. (NiGHTS Mare)"; + 112 = "Trigger Line Ex. (NiGHTS Mare) "; 128 = "Check for Linedef Executor on FOFs"; 144 = "Egg Capsule"; 160 = "Special Stage Time/Spheres Parameters"; @@ -487,7 +487,7 @@ gen_sectortypes 64 = "Trigger Line Ex. (Anywhere in Sector)"; 80 = "Trigger Line Ex. (Floor Touch)"; 96 = "Trigger Line Ex. (Emerald Check) "; - 112 = "Trigger Line Ex. (NiGHTS Mare)"; + 112 = "Trigger Line Ex. (NiGHTS Mare) "; 128 = "Check for Linedef Executor on FOFs"; 144 = "Egg Capsule"; 160 = "Special Stage Time/Spheres Parameters"; @@ -2000,6 +2000,30 @@ linedeftypes prefix = "(339)"; } + 340 + { + title = "NiGHTS Mare - Continuous"; + flags2text = "[1] Mare greater or equal"; + flags64text = "[6] Mare less or equal"; + prefix = "(340)"; + } + + 341 + { + title = "NiGHTS Mare - Each Time"; + flags2text = "[1] Mare greater or equal"; + flags64text = "[6] Mare less or equal"; + prefix = "(341)"; + } + + 342 + { + title = "NiGHTS Mare - Once"; + flags2text = "[1] Mare greater or equal"; + flags64text = "[6] Mare less or equal"; + prefix = "(342)"; + } + 399 { title = "Level Load"; diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 940d4b650..d108821f7 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -769,6 +769,21 @@ doom title = "Emerald Check - Once"; prefix = "(339)"; } + 340 + { + title = "NiGHTS Mare - Continuous"; + prefix = "(340)"; + } + 341 + { + title = "NiGHTS Mare - Each Time"; + prefix = "(341)"; + } + 342 + { + title = "NiGHTS Mare - Once"; + prefix = "(342)"; + } 399 { title = "Level Load"; @@ -3104,6 +3119,28 @@ udmf } } + 340 + { + title = "NiGHTS Mare"; + prefix = "(340)"; + arg0 + { + title = "Trigger type"; + type = 11; + enum = "triggertype"; + } + arg1 + { + title = "Mare"; + } + arg2 + { + title = "Comparison"; + type = 11; + enum = "comparison"; + } + } + 399 { title = "Level Load"; diff --git a/src/p_setup.c b/src/p_setup.c index 6a1218f41..aa687bfa2 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3775,7 +3775,7 @@ static void P_ConvertBinaryMap(void) if (lines[i].flags & ML_NOCLIMB) lines[i].args[2] = TMC_GTE; else if (lines[i].flags & ML_EFFECT4) - lines[i].args[2] = TMC_GTE; + lines[i].args[2] = TMC_LTE; else lines[i].args[2] = TMC_EQUAL; lines[i].special = 314; @@ -3928,6 +3928,24 @@ static void P_ConvertBinaryMap(void) lines[i].args[2] = TMF_HASALL; lines[i].special = 337; break; + case 340: //NiGHTS mare - continuous + case 341: //NiGHTS mare - each time + case 342: //NiGHTS mare - once + if (lines[i].special == 342) + lines[i].args[0] = TMT_ONCE; + else if (lines[i].special == 341) + lines[i].args[0] = (lines[i].flags & ML_BOUNCY) ? TMT_EACHTIMEENTERANDEXIT : TMT_EACHTIMEENTER; + else + lines[i].args[0] = TMT_CONTINUOUS; + lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[2] = TMC_LTE; + else if (lines[i].flags & ML_BLOCKMONSTERS) + lines[i].args[2] = TMC_GTE; + else + lines[i].args[2] = TMC_EQUAL; + lines[i].special = 340; + break; case 400: //Set tagged sector's floor height/texture case 401: //Set tagged sector's ceiling height/texture lines[i].args[0] = tag; diff --git a/src/p_spec.c b/src/p_spec.c index 7c3f01333..58f28cddb 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1501,7 +1501,7 @@ static boolean P_CheckNightsTriggerLine(line_t *triggerline, mobj_t *actor) return true; } -static boolean P_CheckPlayerMare(line_t *triggerline) +static boolean P_CheckPlayerMareOld(line_t *triggerline) { UINT8 mare; INT32 targetmare = P_AproxDistance(triggerline->dx, triggerline->dy) >> FRACBITS; @@ -1520,6 +1520,28 @@ static boolean P_CheckPlayerMare(line_t *triggerline) return mare == targetmare; } +static boolean P_CheckPlayerMare(line_t *triggerline) +{ + UINT8 mare; + INT32 targetmare = triggerline->args[1]; + + if (!(maptol & TOL_NIGHTS)) + return false; + + mare = P_FindLowestMare(); + + switch (triggerline->args[2]) + { + case TMC_EQUAL: + default: + return mare == targetmare; + case TMC_GTE: + return mare >= targetmare; + case TMC_LTE: + return mare <= targetmare; + } +} + static boolean P_CheckPlayerRings(line_t *triggerline, mobj_t *actor) { INT32 rings = 0; @@ -1744,7 +1766,8 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller } else if (GETSECSPECIAL(caller->special, 2) == 7) { - if (!P_CheckPlayerMare(triggerline)) + CONS_Alert(CONS_WARNING, M_GetText("Deprecated NiGHTS mare sector type detected. Please use linedef types 340-342 instead.\n")); + if (!P_CheckPlayerMareOld(triggerline)) return false; } // If we were not triggered by a sector type especially for the purpose, @@ -1846,6 +1869,10 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller if (!P_CheckEmeralds(triggerline->args[2], (UINT16)triggerline->args[1])) return false; break; + case 340: // NiGHTS mare + if (!P_CheckPlayerMare(triggerline)) + return false; + break; default: break; } From cc38cd007114931727233d7496b7dcca37b3512d Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 21:00:22 +0100 Subject: [PATCH 183/377] Remove outdated console warning that never happens anyway --- src/p_spec.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 58f28cddb..27bc3b435 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1770,16 +1770,6 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller if (!P_CheckPlayerMareOld(triggerline)) return false; } - // If we were not triggered by a sector type especially for the purpose, - // a Linedef Executor linedef trigger is not handling sector triggers properly, return. - - else if ((!GETSECSPECIAL(caller->special, 2) || GETSECSPECIAL(caller->special, 2) > 7) && (specialtype > 322)) - { - CONS_Alert(CONS_WARNING, - M_GetText("Linedef executor trigger isn't handling sector triggers properly!\nspecialtype = %d, if you are not a dev, report this warning instance\nalong with the wad that caused it!\n"), - specialtype); - return false; - } } switch (specialtype) From a35a3b3edc2e9bacd09c4a6afc95aea5e1078ecc Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 21:15:11 +0100 Subject: [PATCH 184/377] Sector specials: Give up on trying to find polyobjects in touched sectors --- src/p_spec.c | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 27bc3b435..33109db6b 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4049,8 +4049,6 @@ sector_t *P_MobjTouchingSectorSpecial(mobj_t *mo, INT32 section, INT32 number) if (result) return result; - //TODO: Check polyobjects in node->m_sector - if (!(node->m_sector->flags & SF_TRIGGERSPECIAL_TOUCH)) continue; @@ -4197,8 +4195,6 @@ sector_t *P_FindPlayerTrigger(player_t *player, line_t *sourceline) if (caller) return caller; - //TODO: Check polyobjects in loopsector - if (!(loopsector->flags & SF_TRIGGERSPECIAL_TOUCH)) continue; @@ -4990,7 +4986,7 @@ static void P_PlayerOnSpecial3DFloor(player_t *player, sector_t *sector) } } -static void P_PlayerOnSpecialPolyobj(player_t *player, sector_t *sector) +static void P_PlayerOnSpecialPolyobj(player_t *player) { sector_t *originalsector = player->mo->subsector->sector; polyobj_t *po; @@ -4998,7 +4994,6 @@ static void P_PlayerOnSpecialPolyobj(player_t *player, sector_t *sector) boolean touching = false; boolean inside = false; - //TODO: Check polyobjects in sector for (po = player->mo->subsector->polyList; po; po = (polyobj_t *)(po->link.next)) { if (po->flags & POF_NOSPECIALS) @@ -5018,7 +5013,7 @@ static void P_PlayerOnSpecialPolyobj(player_t *player, sector_t *sector) if (!P_IsMobjTouchingPolyobj(player->mo, po, polysec)) continue; - P_ProcessSpecialSector(player, polysec, sector); + P_ProcessSpecialSector(player, polysec, originalsector); if TELEPORTED(player->mo) return; } } @@ -5043,7 +5038,7 @@ void P_PlayerInSpecialSector(player_t *player) if TELEPORTED(player->mo) return; // Allow sector specials to be applied to polyobjects! - P_PlayerOnSpecialPolyobj(player, originalsector); + P_PlayerOnSpecialPolyobj(player); if TELEPORTED(player->mo) return; P_ProcessSpecialSector(player, originalsector, NULL); @@ -5061,10 +5056,6 @@ void P_PlayerInSpecialSector(player_t *player) P_PlayerOnSpecial3DFloor(player, loopsector); if TELEPORTED(player->mo) return; - // Check polyobjects... - P_PlayerOnSpecialPolyobj(player, loopsector); - if TELEPORTED(player->mo) return; - if (!(loopsector->flags & SF_TRIGGERSPECIAL_TOUCH)) continue; From 21f8baea4a0f0a3538e6f0c4b38bf7fe63ccc407 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 21:36:46 +0100 Subject: [PATCH 185/377] Make trigger conditions for "all players" triggers consistent --- src/p_floor.c | 23 +++-------------------- src/p_spec.c | 32 +++++++++++++++++++++++--------- src/p_spec.h | 2 ++ 3 files changed, 28 insertions(+), 29 deletions(-) diff --git a/src/p_floor.c b/src/p_floor.c index fabc8de28..c3a13d802 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -1043,23 +1043,6 @@ void T_MarioBlockChecker(mariocheck_t *block) } } -static boolean P_IsPlayerValid(size_t playernum) -{ - if (!playeringame[playernum]) - return false; - - if (!players[playernum].mo) - return false; - - if (players[playernum].mo->health <= 0) - return false; - - if (players[playernum].spectator) - return false; - - return true; -} - // This is the Thwomp's 'brain'. It looks around for players nearby, and if // it finds any, **SMASH**!!! Muahahhaa.... void T_ThwompSector(thwomp_t *thwomp) @@ -1278,7 +1261,7 @@ static boolean P_CheckAllTrigger(eachtime_t *eachtime) for (i = 0; i < MAXPLAYERS; i++) { - if (P_IsPlayerValid(i) && !eachtime->playersInArea[i]) + if (P_CanPlayerTrigger(i) && !eachtime->playersInArea[i]) return false; } @@ -1297,7 +1280,7 @@ void T_EachTimeThinker(eachtime_t *eachtime) for (i = 0; i < MAXPLAYERS; i++) { oldPlayersInArea[i] = eachtime->playersInArea[i]; - caller[i] = P_IsPlayerValid(i) ? P_FindPlayerTrigger(&players[i], eachtime->sourceline) : NULL; + caller[i] = P_CanPlayerTrigger(i) ? P_FindPlayerTrigger(&players[i], eachtime->sourceline) : NULL; eachtime->playersInArea[i] = caller[i] != NULL; } @@ -1312,7 +1295,7 @@ void T_EachTimeThinker(eachtime_t *eachtime) continue; // If player has just left, check if still valid - if (!eachtime->playersInArea[i] && (!eachtime->triggerOnExit || !P_IsPlayerValid(i))) + if (!eachtime->playersInArea[i] && (!eachtime->triggerOnExit || !P_CanPlayerTrigger(i))) continue; // If sector has an "all players" trigger type, all players need to be in area diff --git a/src/p_spec.c b/src/p_spec.c index 33109db6b..a1eb4183c 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4205,6 +4205,28 @@ sector_t *P_FindPlayerTrigger(player_t *player, line_t *sourceline) return false; } +boolean P_IsPlayerValid(size_t playernum) +{ + if (!playeringame[playernum]) + return false; + + if (!players[playernum].mo) + return false; + + if (players[playernum].mo->health <= 0) + return false; + + if (players[playernum].spectator) + return false; + + return true; +} + +boolean P_CanPlayerTrigger(size_t playernum) +{ + return P_IsPlayerValid(playernum) && !players[playernum].bot; +} + /// \todo check continues for proper splitscreen support? static boolean P_DoAllPlayersTrigger(mtag_t sectag) { @@ -4215,15 +4237,7 @@ static boolean P_DoAllPlayersTrigger(mtag_t sectag) for (i = 0; i < MAXPLAYERS; i++) { - if (!playeringame[i]) - continue; - if (!players[i].mo) - continue; - if (players[i].spectator) - continue; - if (players[i].bot) - continue; - if (G_CoopGametype() && players[i].lives <= 0) + if (!P_CanPlayerTrigger(i)) continue; if (!P_FindPlayerTrigger(&players[i], &dummyline)) return false; diff --git a/src/p_spec.h b/src/p_spec.h index ac42cd464..054f2daf5 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -358,6 +358,8 @@ void P_PlayerInSpecialSector(player_t *player); void P_CheckPushableTrigger(mobj_t *mobj, sector_t *sec); void P_CheckMobjTrigger(mobj_t *mobj); sector_t *P_FindPlayerTrigger(player_t *player, line_t *sourceline); +boolean P_IsPlayerValid(size_t playernum); +boolean P_CanPlayerTrigger(size_t playernum); void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *roversector); fixed_t P_FindLowestFloorSurrounding(sector_t *sec); From 2c0fb5e80fa60d875031b9b2204b8eeff79084ab Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 9 Dec 2021 22:12:48 +0100 Subject: [PATCH 186/377] Delete accidentally added .orig file --- src/p_spec.c.orig | 9150 --------------------------------------------- 1 file changed, 9150 deletions(-) delete mode 100644 src/p_spec.c.orig diff --git a/src/p_spec.c.orig b/src/p_spec.c.orig deleted file mode 100644 index 244f7166b..000000000 --- a/src/p_spec.c.orig +++ /dev/null @@ -1,9150 +0,0 @@ -// SONIC ROBO BLAST 2 -//----------------------------------------------------------------------------- -// Copyright (C) 1993-1996 by id Software, Inc. -// Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2021 by Sonic Team Junior. -// -// This program is free software distributed under the -// terms of the GNU General Public License, version 2. -// See the 'LICENSE' file for more details. -//----------------------------------------------------------------------------- -/// \file p_spec.c -/// \brief Implements special effects: -/// Texture animation, height or lighting changes -/// according to adjacent sectors, respective -/// utility functions, etc. -/// Line Tag handling. Line and Sector triggers. - -#include "dehacked.h" -#include "doomdef.h" -#include "g_game.h" -#include "p_local.h" -#include "p_setup.h" // levelflats for flat animation -#include "r_data.h" -#include "r_textures.h" -#include "m_random.h" -#include "p_mobj.h" -#include "i_system.h" -#include "s_sound.h" -#include "w_wad.h" -#include "z_zone.h" -#include "r_main.h" //Two extra includes. -#include "r_sky.h" -#include "p_polyobj.h" -#include "p_slopes.h" -#include "hu_stuff.h" -#include "v_video.h" // V_AUTOFADEOUT|V_ALLOWLOWERCASE -#include "m_misc.h" -#include "m_cond.h" //unlock triggers -#include "lua_hook.h" // LUA_HookLinedefExecute -#include "f_finale.h" // control text prompt -#include "r_skins.h" // skins - -#ifdef HW3SOUND -#include "hardware/hw3sound.h" -#endif - -// Not sure if this is necessary, but it was in w_wad.c, so I'm putting it here too -Shadow Hog -#include - -mobj_t *skyboxmo[2]; // current skybox mobjs: 0 = viewpoint, 1 = centerpoint -mobj_t *skyboxviewpnts[16]; // array of MT_SKYBOX viewpoint mobjs -mobj_t *skyboxcenterpnts[16]; // array of MT_SKYBOX centerpoint mobjs - -// Amount (dx, dy) vector linedef is shifted right to get scroll amount -#define SCROLL_SHIFT 5 - -/** Animated texture descriptor - * This keeps track of an animated texture or an animated flat. - * \sa P_UpdateSpecials, P_InitPicAnims, animdef_t - */ -typedef struct -{ - SINT8 istexture; ///< ::true for a texture, ::false for a flat - INT32 picnum; ///< The end flat number - INT32 basepic; ///< The start flat number - INT32 numpics; ///< Number of frames in the animation - tic_t speed; ///< Number of tics for which each frame is shown -} anim_t; - -#if defined(_MSC_VER) -#pragma pack(1) -#endif - -/** Animated texture definition. - * Used for loading an ANIMDEFS lump from a wad. - * - * Animations are defined by the first and last frame (i.e., flat or texture). - * The animation sequence uses all flats between the start and end entry, in - * the order found in the wad. - * - * \sa anim_t - */ -typedef struct -{ - SINT8 istexture; ///< True for a texture, false for a flat. - char endname[9]; ///< Name of the last frame, null-terminated. - char startname[9]; ///< Name of the first frame, null-terminated. - INT32 speed ; ///< Number of tics for which each frame is shown. -} ATTRPACK animdef_t; - -#if defined(_MSC_VER) -#pragma pack() -#endif - -typedef struct -{ - UINT32 count; - thinker_t **thinkers; -} thinkerlist_t; - -static void P_SpawnScrollers(void); -static void P_SpawnFriction(void); -static void P_SpawnPushers(void); -static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t *source, INT32 affectee, INT32 referrer, INT32 exclusive, INT32 slider); //SoM: 3/9/2000 -static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); -static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finalize); -#define P_RemoveFakeFloorFader(l) P_ResetFakeFloorFader(l, NULL, false); -static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 sourcevalue, INT16 destvalue, INT16 speed, boolean ticbased, INT32 *timer, - boolean doexists, boolean dotranslucent, boolean dolighting, boolean docolormap, - boolean docollision, boolean doghostfade, boolean exactalpha); -static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, - INT16 destvalue, INT16 speed, boolean ticbased, boolean relative, - boolean doexists, boolean dotranslucent, boolean dolighting, boolean docolormap, - boolean docollision, boolean doghostfade, boolean exactalpha); -static void P_ResetColormapFader(sector_t *sector); -static void Add_ColormapFader(sector_t *sector, extracolormap_t *source_exc, extracolormap_t *dest_exc, - boolean ticbased, INT32 duration); -static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); -static void P_AddFloatThinker(sector_t *sec, UINT16 tag, line_t *sourceline); -//static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); -static void P_AddFakeFloorsByLine(size_t line, INT32 alpha, ffloortype_e ffloorflags, thinkerlist_t *secthinkers); -static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec); -static void Add_Friction(INT32 friction, INT32 movefactor, INT32 affectee, INT32 referrer); -static void P_AddPlaneDisplaceThinker(INT32 type, fixed_t speed, INT32 control, INT32 affectee, UINT8 reverse); - - -//SoM: 3/7/2000: New sturcture without limits. -static anim_t *lastanim; -static anim_t *anims = NULL; /// \todo free leak -static size_t maxanims; - -// Animating line specials - -// Init animated textures -// - now called at level loading P_SetupLevel() - -static animdef_t *animdefs = NULL; - -// Increase the size of animdefs to make room for a new animation definition -static void GrowAnimDefs(void) -{ - maxanims++; - animdefs = (animdef_t *)Z_Realloc(animdefs, sizeof(animdef_t)*(maxanims + 1), PU_STATIC, NULL); -} - -// A prototype; here instead of p_spec.h, so they're "private" -void P_ParseANIMDEFSLump(INT32 wadNum, UINT16 lumpnum); -void P_ParseAnimationDefintion(SINT8 istexture); - -/** Sets up texture and flat animations. - * - * Converts an ::animdef_t array loaded from a lump into - * ::anim_t format. - * - * Issues an error if any animation cycles are invalid. - * - * \sa P_FindAnimatedFlat, P_SetupLevelFlatAnims - * \author Steven McGranahan (original), Shadow Hog (had to rewrite it to handle multiple WADs), JTE (had to rewrite it to handle multiple WADs _correctly_) - */ -void P_InitPicAnims(void) -{ - // Init animation - INT32 w; // WAD - size_t i; - - I_Assert(animdefs == NULL); - - maxanims = 0; - - for (w = numwadfiles-1; w >= 0; w--) - { - UINT16 animdefsLumpNum; - - // Find ANIMDEFS lump in the WAD - animdefsLumpNum = W_CheckNumForNamePwad("ANIMDEFS", w, 0); - - while (animdefsLumpNum != INT16_MAX) - { - P_ParseANIMDEFSLump(w, animdefsLumpNum); - animdefsLumpNum = W_CheckNumForNamePwad("ANIMDEFS", (UINT16)w, animdefsLumpNum + 1); - } - } - - // Define the last one - animdefs[maxanims].istexture = -1; - strncpy(animdefs[maxanims].endname, "", 9); - strncpy(animdefs[maxanims].startname, "", 9); - animdefs[maxanims].speed = 0; - - if (anims) - free(anims); - - anims = (anim_t *)malloc(sizeof (*anims)*(maxanims + 1)); - if (!anims) - I_Error("Not enough free memory for ANIMDEFS data"); - - lastanim = anims; - for (i = 0; animdefs[i].istexture != -1; i++) - { - if (animdefs[i].istexture) - { - if (R_CheckTextureNumForName(animdefs[i].startname) == -1) - continue; - - lastanim->picnum = R_TextureNumForName(animdefs[i].endname); - lastanim->basepic = R_TextureNumForName(animdefs[i].startname); - } - else - { - if ((W_CheckNumForName(animdefs[i].startname)) == LUMPERROR) - continue; - - lastanim->picnum = R_GetFlatNumForName(animdefs[i].endname); - lastanim->basepic = R_GetFlatNumForName(animdefs[i].startname); - } - - lastanim->istexture = animdefs[i].istexture; - lastanim->numpics = lastanim->picnum - lastanim->basepic + 1; - - if (lastanim->numpics < 2) - { - free(anims); - I_Error("P_InitPicAnims: bad cycle from %s to %s", - animdefs[i].startname, animdefs[i].endname); - } - - lastanim->speed = LONG(animdefs[i].speed); - lastanim++; - } - lastanim->istexture = -1; - R_ClearTextureNumCache(false); - - // Clear animdefs now that we're done with it. - // We'll only be using anims from now on. - Z_Free(animdefs); - animdefs = NULL; -} - -void P_ParseANIMDEFSLump(INT32 wadNum, UINT16 lumpnum) -{ - char *animdefsLump; - size_t animdefsLumpLength; - char *animdefsText; - char *animdefsToken; - char *p; - - // Since lumps AREN'T \0-terminated like I'd assumed they should be, I'll - // need to make a space of memory where I can ensure that it will terminate - // correctly. Start by loading the relevant data from the WAD. - animdefsLump = (char *)W_CacheLumpNumPwad(wadNum,lumpnum,PU_STATIC); - // If that didn't exist, we have nothing to do here. - if (animdefsLump == NULL) return; - // If we're still here, then it DOES exist; figure out how long it is, and allot memory accordingly. - animdefsLumpLength = W_LumpLengthPwad(wadNum,lumpnum); - animdefsText = (char *)Z_Malloc((animdefsLumpLength+1)*sizeof(char),PU_STATIC,NULL); - // Now move the contents of the lump into this new location. - memmove(animdefsText,animdefsLump,animdefsLumpLength); - // Make damn well sure the last character in our new memory location is \0. - animdefsText[animdefsLumpLength] = '\0'; - // Finally, free up the memory from the first data load, because we really - // don't need it. - Z_Free(animdefsLump); - - // Now, let's start parsing this thing - p = animdefsText; - animdefsToken = M_GetToken(p); - while (animdefsToken != NULL) - { - if (stricmp(animdefsToken, "TEXTURE") == 0) - { - Z_Free(animdefsToken); - P_ParseAnimationDefintion(1); - } - else if (stricmp(animdefsToken, "FLAT") == 0) - { - Z_Free(animdefsToken); - P_ParseAnimationDefintion(0); - } - else if (stricmp(animdefsToken, "OSCILLATE") == 0) - { - // This probably came off the tail of an earlier definition. It's technically legal syntax, but we don't support it. - I_Error("Error parsing ANIMDEFS lump: Animation definitions utilizing \"OSCILLATE\" (the animation plays in reverse when it reaches the end) are not supported by SRB2"); - } - else - { - I_Error("Error parsing ANIMDEFS lump: Expected \"TEXTURE\" or \"FLAT\", got \"%s\"",animdefsToken); - } - // parse next line - while (*p != '\0' && *p != '\n') ++p; - if (*p == '\n') ++p; - animdefsToken = M_GetToken(p); - } - Z_Free(animdefsToken); - Z_Free((void *)animdefsText); -} - -void P_ParseAnimationDefintion(SINT8 istexture) -{ - char *animdefsToken; - size_t animdefsTokenLength; - char *endPos; - INT32 animSpeed; - size_t i; - - // Startname - animdefsToken = M_GetToken(NULL); - if (animdefsToken == NULL) - { - I_Error("Error parsing ANIMDEFS lump: Unexpected end of file where start texture/flat name should be"); - } - if (stricmp(animdefsToken, "OPTIONAL") == 0) - { - // This is meaningful to ZDoom - it tells the program NOT to bomb out - // if the textures can't be found - but it's useless in SRB2, so we'll - // just smile, nod, and carry on - Z_Free(animdefsToken); - animdefsToken = M_GetToken(NULL); - - if (animdefsToken == NULL) - { - I_Error("Error parsing ANIMDEFS lump: Unexpected end of file where start texture/flat name should be"); - } - else if (stricmp(animdefsToken, "RANGE") == 0) - { - // Oh. Um. Apparently "OPTIONAL" is a texture name. Naughty. - // I should probably handle this more gracefully, but right now - // I can't be bothered; especially since ZDoom doesn't handle this - // condition at all. - I_Error("Error parsing ANIMDEFS lump: \"OPTIONAL\" is a keyword; you cannot use it as the startname of an animation"); - } - } - animdefsTokenLength = strlen(animdefsToken); - if (animdefsTokenLength>8) - { - I_Error("Error parsing ANIMDEFS lump: lump name \"%s\" exceeds 8 characters", animdefsToken); - } - - // Search for existing animdef - for (i = 0; i < maxanims; i++) - if (animdefs[i].istexture == istexture // Check if it's the same type! - && stricmp(animdefsToken, animdefs[i].startname) == 0) - { - //CONS_Alert(CONS_NOTICE, "Duplicate animation: %s\n", animdefsToken); - - // If we weren't parsing in reverse order, we would `break` here and parse the new data into the existing slot we found. - // Instead, we're just going to skip parsing the rest of this line entirely. - Z_Free(animdefsToken); - return; - } - - // Not found - if (i == maxanims) - { - // Increase the size to make room for the new animation definition - GrowAnimDefs(); - strncpy(animdefs[i].startname, animdefsToken, 9); - } - - // animdefs[i].startname is now set to animdefsToken either way. - Z_Free(animdefsToken); - - // set texture type - animdefs[i].istexture = istexture; - - // "RANGE" - animdefsToken = M_GetToken(NULL); - if (animdefsToken == NULL) - { - I_Error("Error parsing ANIMDEFS lump: Unexpected end of file where \"RANGE\" after \"%s\"'s startname should be", animdefs[i].startname); - } - if (stricmp(animdefsToken, "ALLOWDECALS") == 0) - { - // Another ZDoom keyword, ho-hum. Skip it, move on to the next token. - Z_Free(animdefsToken); - animdefsToken = M_GetToken(NULL); - } - if (stricmp(animdefsToken, "PIC") == 0) - { - // This is technically legitimate ANIMDEFS syntax, but SRB2 doesn't support it. - I_Error("Error parsing ANIMDEFS lump: Animation definitions utilizing \"PIC\" (specific frames instead of a consecutive range) are not supported by SRB2"); - } - if (stricmp(animdefsToken, "RANGE") != 0) - { - I_Error("Error parsing ANIMDEFS lump: Expected \"RANGE\" after \"%s\"'s startname, got \"%s\"", animdefs[i].startname, animdefsToken); - } - Z_Free(animdefsToken); - - // Endname - animdefsToken = M_GetToken(NULL); - if (animdefsToken == NULL) - { - I_Error("Error parsing ANIMDEFS lump: Unexpected end of file where \"%s\"'s end texture/flat name should be", animdefs[i].startname); - } - animdefsTokenLength = strlen(animdefsToken); - if (animdefsTokenLength>8) - { - I_Error("Error parsing ANIMDEFS lump: lump name \"%s\" exceeds 8 characters", animdefsToken); - } - strncpy(animdefs[i].endname, animdefsToken, 9); - Z_Free(animdefsToken); - - // "TICS" - animdefsToken = M_GetToken(NULL); - if (animdefsToken == NULL) - { - I_Error("Error parsing ANIMDEFS lump: Unexpected end of file where \"%s\"'s \"TICS\" should be", animdefs[i].startname); - } - if (stricmp(animdefsToken, "RAND") == 0) - { - // This is technically legitimate ANIMDEFS syntax, but SRB2 doesn't support it. - I_Error("Error parsing ANIMDEFS lump: Animation definitions utilizing \"RAND\" (random duration per frame) are not supported by SRB2"); - } - if (stricmp(animdefsToken, "TICS") != 0) - { - I_Error("Error parsing ANIMDEFS lump: Expected \"TICS\" in animation definition for \"%s\", got \"%s\"", animdefs[i].startname, animdefsToken); - } - Z_Free(animdefsToken); - - // Speed - animdefsToken = M_GetToken(NULL); - if (animdefsToken == NULL) - { - I_Error("Error parsing ANIMDEFS lump: Unexpected end of file where \"%s\"'s animation speed should be", animdefs[i].startname); - } - endPos = NULL; -#ifndef AVOID_ERRNO - errno = 0; -#endif - animSpeed = strtol(animdefsToken,&endPos,10); - if (endPos == animdefsToken // Empty string - || *endPos != '\0' // Not end of string -#ifndef AVOID_ERRNO - || errno == ERANGE // Number out-of-range -#endif - || animSpeed < 0) // Number is not positive - { - I_Error("Error parsing ANIMDEFS lump: Expected a positive integer for \"%s\"'s animation speed, got \"%s\"", animdefs[i].startname, animdefsToken); - } - animdefs[i].speed = animSpeed; - Z_Free(animdefsToken); - -#ifdef WALLFLATS - // hehe... uhh..... - if (!istexture) - { - GrowAnimDefs(); - M_Memcpy(&animdefs[maxanims-1], &animdefs[i], sizeof(animdef_t)); - animdefs[maxanims-1].istexture = 1; - } -#endif -} - -/** Checks for flats in levelflats that are part of a flat animation sequence - * and sets them up for animation. - * - * \param animnum Index into ::anims to find flats for. - * \sa P_SetupLevelFlatAnims - */ -static inline void P_FindAnimatedFlat(INT32 animnum) -{ - size_t i; - lumpnum_t startflatnum, endflatnum; - levelflat_t *foundflats; - - foundflats = levelflats; - startflatnum = anims[animnum].basepic; - endflatnum = anims[animnum].picnum; - - // note: high word of lumpnum is the wad number - if ((startflatnum>>16) != (endflatnum>>16)) - I_Error("AnimatedFlat start %s not in same wad as end %s\n", - animdefs[animnum].startname, animdefs[animnum].endname); - - // - // now search through the levelflats if this anim flat sequence is used - // - for (i = 0; i < numlevelflats; i++, foundflats++) - { - // is that levelflat from the flat anim sequence ? - if ((anims[animnum].istexture) && (foundflats->type == LEVELFLAT_TEXTURE) - && ((UINT16)foundflats->u.texture.num >= startflatnum && (UINT16)foundflats->u.texture.num <= endflatnum)) - { - foundflats->u.texture.basenum = startflatnum; - foundflats->animseq = foundflats->u.texture.num - startflatnum; - foundflats->numpics = endflatnum - startflatnum + 1; - foundflats->speed = anims[animnum].speed; - - CONS_Debug(DBG_SETUP, "animflat: #%03d name:%.8s animseq:%d numpics:%d speed:%d\n", - atoi(sizeu1(i)), foundflats->name, foundflats->animseq, - foundflats->numpics,foundflats->speed); - } - else if ((!anims[animnum].istexture) && (foundflats->type == LEVELFLAT_FLAT) - && (foundflats->u.flat.lumpnum >= startflatnum && foundflats->u.flat.lumpnum <= endflatnum)) - { - foundflats->u.flat.baselumpnum = startflatnum; - foundflats->animseq = foundflats->u.flat.lumpnum - startflatnum; - foundflats->numpics = endflatnum - startflatnum + 1; - foundflats->speed = anims[animnum].speed; - - CONS_Debug(DBG_SETUP, "animflat: #%03d name:%.8s animseq:%d numpics:%d speed:%d\n", - atoi(sizeu1(i)), foundflats->name, foundflats->animseq, - foundflats->numpics,foundflats->speed); - } - } -} - -/** Sets up all flats used in a level. - * - * \sa P_InitPicAnims, P_FindAnimatedFlat - */ -void P_SetupLevelFlatAnims(void) -{ - INT32 i; - - // the original game flat anim sequences - for (i = 0; anims[i].istexture != -1; i++) - P_FindAnimatedFlat(i); -} - -// -// UTILITIES -// - -#if 0 -/** Gets a side from a sector line. - * - * \param currentSector Sector the line is in. - * \param line Index of the line within the sector. - * \param side 0 for front, 1 for back. - * \return Pointer to the side_t of the side you want. - * \sa getSector, twoSided, getNextSector - */ -static inline side_t *getSide(INT32 currentSector, INT32 line, INT32 side) -{ - return &sides[(sectors[currentSector].lines[line])->sidenum[side]]; -} - -/** Gets a sector from a sector line. - * - * \param currentSector Sector the line is in. - * \param line Index of the line within the sector. - * \param side 0 for front, 1 for back. - * \return Pointer to the ::sector_t of the sector on that side. - * \sa getSide, twoSided, getNextSector - */ -static inline sector_t *getSector(INT32 currentSector, INT32 line, INT32 side) -{ - return sides[(sectors[currentSector].lines[line])->sidenum[side]].sector; -} - -/** Determines whether a sector line is two-sided. - * Uses the Boom method, checking if the line's back side is set to -1, rather - * than looking for ::ML_TWOSIDED. - * - * \param sector The sector. - * \param line Line index within the sector. - * \return 1 if the sector is two-sided, 0 otherwise. - * \sa getSide, getSector, getNextSector - */ -static inline boolean twoSided(INT32 sector, INT32 line) -{ - return (sectors[sector].lines[line])->sidenum[1] != 0xffff; -} -#endif - -/** Finds sector next to current. - * - * \param line Pointer to the line to cross. - * \param sec Pointer to the current sector. - * \return Pointer to a ::sector_t of the adjacent sector, or NULL if the line - * is one-sided. - * \sa getSide, getSector, twoSided - * \author Steven McGranahan - */ -static sector_t *getNextSector(line_t *line, sector_t *sec) -{ - if (line->frontsector == sec) - { - if (line->backsector != sec) - return line->backsector; - else - return NULL; - } - return line->frontsector; -} - -/** Finds lowest floor in adjacent sectors. - * - * \param sec Sector to start in. - * \return Lowest floor height in an adjacent sector. - * \sa P_FindHighestFloorSurrounding, P_FindNextLowestFloor, - * P_FindLowestCeilingSurrounding - */ -fixed_t P_FindLowestFloorSurrounding(sector_t *sec) -{ - size_t i; - line_t *check; - sector_t *other; - fixed_t floorh; - - floorh = sec->floorheight; - - for (i = 0; i < sec->linecount; i++) - { - check = sec->lines[i]; - other = getNextSector(check,sec); - - if (!other) - continue; - - if (other->floorheight < floorh) - floorh = other->floorheight; - } - return floorh; -} - -/** Finds highest floor in adjacent sectors. - * - * \param sec Sector to start in. - * \return Highest floor height in an adjacent sector. - * \sa P_FindLowestFloorSurrounding, P_FindNextHighestFloor, - * P_FindHighestCeilingSurrounding - */ -fixed_t P_FindHighestFloorSurrounding(sector_t *sec) -{ - size_t i; - line_t *check; - sector_t *other; - fixed_t floorh = -500*FRACUNIT; - INT32 foundsector = 0; - - for (i = 0; i < sec->linecount; i++) - { - check = sec->lines[i]; - other = getNextSector(check, sec); - - if (!other) - continue; - - if (other->floorheight > floorh || !foundsector) - floorh = other->floorheight; - - if (!foundsector) - foundsector = 1; - } - return floorh; -} - -/** Finds next highest floor in adjacent sectors. - * - * \param sec Sector to start in. - * \param currentheight Height to start at. - * \return Next highest floor height in an adjacent sector, or currentheight - * if there are none higher. - * \sa P_FindHighestFloorSurrounding, P_FindNextLowestFloor, - * P_FindNextHighestCeiling - * \author Lee Killough - */ -fixed_t P_FindNextHighestFloor(sector_t *sec, fixed_t currentheight) -{ - sector_t *other; - size_t i; - fixed_t height; - - for (i = 0; i < sec->linecount; i++) - { - other = getNextSector(sec->lines[i],sec); - if (other && other->floorheight > currentheight) - { - height = other->floorheight; - while (++i < sec->linecount) - { - other = getNextSector(sec->lines[i], sec); - if (other && - other->floorheight < height && - other->floorheight > currentheight) - height = other->floorheight; - } - return height; - } - } - return currentheight; -} - -//////////////////////////////////////////////////// -// SoM: Start new Boom functions -//////////////////////////////////////////////////// - -/** Finds next lowest floor in adjacent sectors. - * - * \param sec Sector to start in. - * \param currentheight Height to start at. - * \return Next lowest floor height in an adjacent sector, or currentheight - * if there are none lower. - * \sa P_FindLowestFloorSurrounding, P_FindNextHighestFloor, - * P_FindNextLowestCeiling - * \author Lee Killough - */ -fixed_t P_FindNextLowestFloor(sector_t *sec, fixed_t currentheight) -{ - sector_t *other; - size_t i; - fixed_t height; - - for (i = 0; i < sec->linecount; i++) - { - other = getNextSector(sec->lines[i], sec); - if (other && other->floorheight < currentheight) - { - height = other->floorheight; - while (++i < sec->linecount) - { - other = getNextSector(sec->lines[i], sec); - if (other && other->floorheight > height - && other->floorheight < currentheight) - height = other->floorheight; - } - return height; - } - } - return currentheight; -} - -#if 0 -/** Finds next lowest ceiling in adjacent sectors. - * - * \param sec Sector to start in. - * \param currentheight Height to start at. - * \return Next lowest ceiling height in an adjacent sector, or currentheight - * if there are none lower. - * \sa P_FindLowestCeilingSurrounding, P_FindNextHighestCeiling, - * P_FindNextLowestFloor - * \author Lee Killough - */ -static fixed_t P_FindNextLowestCeiling(sector_t *sec, fixed_t currentheight) -{ - sector_t *other; - size_t i; - fixed_t height; - - for (i = 0; i < sec->linecount; i++) - { - other = getNextSector(sec->lines[i],sec); - if (other && other->ceilingheight < currentheight) - { - height = other->ceilingheight; - while (++i < sec->linecount) - { - other = getNextSector(sec->lines[i],sec); - if (other && other->ceilingheight > height - && other->ceilingheight < currentheight) - height = other->ceilingheight; - } - return height; - } - } - return currentheight; -} - -/** Finds next highest ceiling in adjacent sectors. - * - * \param sec Sector to start in. - * \param currentheight Height to start at. - * \return Next highest ceiling height in an adjacent sector, or currentheight - * if there are none higher. - * \sa P_FindHighestCeilingSurrounding, P_FindNextLowestCeiling, - * P_FindNextHighestFloor - * \author Lee Killough - */ -static fixed_t P_FindNextHighestCeiling(sector_t *sec, fixed_t currentheight) -{ - sector_t *other; - size_t i; - fixed_t height; - - for (i = 0; i < sec->linecount; i++) - { - other = getNextSector(sec->lines[i], sec); - if (other && other->ceilingheight > currentheight) - { - height = other->ceilingheight; - while (++i < sec->linecount) - { - other = getNextSector(sec->lines[i],sec); - if (other && other->ceilingheight < height - && other->ceilingheight > currentheight) - height = other->ceilingheight; - } - return height; - } - } - return currentheight; -} -#endif - -//////////////////////////// -// End New Boom functions -//////////////////////////// - -/** Finds lowest ceiling in adjacent sectors. - * - * \param sec Sector to start in. - * \return Lowest ceiling height in an adjacent sector. - * \sa P_FindHighestCeilingSurrounding, P_FindNextLowestCeiling, - * P_FindLowestFloorSurrounding - */ -fixed_t P_FindLowestCeilingSurrounding(sector_t *sec) -{ - size_t i; - line_t *check; - sector_t *other; - fixed_t height = 32000*FRACUNIT; //SoM: 3/7/2000: Remove ovf - INT32 foundsector = 0; - - for (i = 0; i < sec->linecount; i++) - { - check = sec->lines[i]; - other = getNextSector(check, sec); - - if (!other) - continue; - - if (other->ceilingheight < height || !foundsector) - height = other->ceilingheight; - - if (!foundsector) - foundsector = 1; - } - return height; -} - -/** Finds Highest ceiling in adjacent sectors. - * - * \param sec Sector to start in. - * \return Highest ceiling height in an adjacent sector. - * \sa P_FindLowestCeilingSurrounding, P_FindNextHighestCeiling, - * P_FindHighestFloorSurrounding - */ -fixed_t P_FindHighestCeilingSurrounding(sector_t *sec) -{ - size_t i; - line_t *check; - sector_t *other; - fixed_t height = 0; - INT32 foundsector = 0; - - for (i = 0; i < sec->linecount; i++) - { - check = sec->lines[i]; - other = getNextSector(check, sec); - - if (!other) - continue; - - if (other->ceilingheight > height || !foundsector) - height = other->ceilingheight; - - if (!foundsector) - foundsector = 1; - } - return height; -} - -#if 0 -//SoM: 3/7/2000: UTILS..... -// -// P_FindShortestTextureAround() -// -// Passed a sector number, returns the shortest lower texture on a -// linedef bounding the sector. -// -// -static fixed_t P_FindShortestTextureAround(INT32 secnum) -{ - fixed_t minsize = 32000<linecount; i++) - { - if (twoSided(secnum, i)) - { - side = getSide(secnum,i,0); - if (side->bottomtexture > 0) - if (textureheight[side->bottomtexture] < minsize) - minsize = textureheight[side->bottomtexture]; - side = getSide(secnum,i,1); - if (side->bottomtexture > 0) - if (textureheight[side->bottomtexture] < minsize) - minsize = textureheight[side->bottomtexture]; - } - } - return minsize; -} - -//SoM: 3/7/2000: Stuff.... (can you tell I'm getting tired? It's 12 : 30!) -// -// P_FindShortestUpperAround() -// -// Passed a sector number, returns the shortest upper texture on a -// linedef bounding the sector. -// -// -static fixed_t P_FindShortestUpperAround(INT32 secnum) -{ - fixed_t minsize = 32000<linecount; i++) - { - if (twoSided(secnum, i)) - { - side = getSide(secnum,i,0); - if (side->toptexture > 0) - if (textureheight[side->toptexture] < minsize) - minsize = textureheight[side->toptexture]; - side = getSide(secnum,i,1); - if (side->toptexture > 0) - if (textureheight[side->toptexture] < minsize) - minsize = textureheight[side->toptexture]; - } - } - return minsize; -} - -//SoM: 3/7/2000 -// -// P_FindModelFloorSector() -// -// Passed a floor height and a sector number, return a pointer to a -// a sector with that floor height across the lowest numbered two sided -// line surrounding the sector. -// -// Note: If no sector at that height bounds the sector passed, return NULL -// -// -static sector_t *P_FindModelFloorSector(fixed_t floordestheight, INT32 secnum) -{ - size_t i; - sector_t *sec = §ors[secnum]; - - for (i = 0; i < sec->linecount; i++) - { - if (twoSided(secnum, i)) - { - if (getSide(secnum,i,0)->sector-sectors == secnum) - sec = getSector(secnum,i,1); - else - sec = getSector(secnum,i,0); - - if (sec->floorheight == floordestheight) - return sec; - } - } - return NULL; -} - -// -// P_FindModelCeilingSector() -// -// Passed a ceiling height and a sector number, return a pointer to a -// a sector with that ceiling height across the lowest numbered two sided -// line surrounding the sector. -// -// Note: If no sector at that height bounds the sector passed, return NULL -// -static sector_t *P_FindModelCeilingSector(fixed_t ceildestheight, INT32 secnum) -{ - size_t i; - sector_t *sec = §ors[secnum]; - - for (i = 0; i < sec->linecount; i++) - { - if (twoSided(secnum, i)) - { - if (getSide(secnum, i, 0)->sector - sectors == secnum) - sec = getSector(secnum, i, 1); - else - sec = getSector(secnum, i, 0); - - if (sec->ceilingheight == ceildestheight) - return sec; - } - } - return NULL; -} -#endif - -// Parses arguments for parameterized polyobject door types -static boolean PolyDoor(line_t *line) -{ - polydoordata_t pdd; - - pdd.polyObjNum = Tag_FGet(&line->tags); // polyobject id - - switch(line->special) - { - case 480: // Polyobj_DoorSlide - pdd.doorType = POLY_DOOR_SLIDE; - pdd.speed = sides[line->sidenum[0]].textureoffset / 8; - pdd.angle = R_PointToAngle2(line->v1->x, line->v1->y, line->v2->x, line->v2->y); // angle of motion - pdd.distance = sides[line->sidenum[0]].rowoffset; - - if (line->sidenum[1] != 0xffff) - pdd.delay = sides[line->sidenum[1]].textureoffset >> FRACBITS; // delay in tics - else - pdd.delay = 0; - break; - case 481: // Polyobj_DoorSwing - pdd.doorType = POLY_DOOR_SWING; - pdd.speed = sides[line->sidenum[0]].textureoffset >> FRACBITS; // angular speed - pdd.distance = sides[line->sidenum[0]].rowoffset >> FRACBITS; // angular distance - - if (line->sidenum[1] != 0xffff) - pdd.delay = sides[line->sidenum[1]].textureoffset >> FRACBITS; // delay in tics - else - pdd.delay = 0; - break; - default: - return 0; // ??? - } - - return EV_DoPolyDoor(&pdd); -} - -// Parses arguments for parameterized polyobject move specials -static boolean PolyMove(line_t *line) -{ - polymovedata_t pmd; - - pmd.polyObjNum = Tag_FGet(&line->tags); - pmd.speed = sides[line->sidenum[0]].textureoffset / 8; - pmd.angle = R_PointToAngle2(line->v1->x, line->v1->y, line->v2->x, line->v2->y); - pmd.distance = sides[line->sidenum[0]].rowoffset; - - pmd.overRide = (line->special == 483); // Polyobj_OR_Move - - return EV_DoPolyObjMove(&pmd); -} - -// Makes a polyobject invisible and intangible -// If NOCLIMB is ticked, the polyobject will still be tangible, just not visible. -static void PolyInvisible(line_t *line) -{ - INT32 polyObjNum = Tag_FGet(&line->tags); - polyobj_t *po; - - if (!(po = Polyobj_GetForNum(polyObjNum))) - { - CONS_Debug(DBG_POLYOBJ, "PolyInvisible: bad polyobj %d\n", polyObjNum); - return; - } - - // don't allow line actions to affect bad polyobjects - if (po->isBad) - return; - - if (!(line->flags & ML_NOCLIMB)) - po->flags &= ~POF_SOLID; - - po->flags |= POF_NOSPECIALS; - po->flags &= ~POF_RENDERALL; -} - -// Makes a polyobject visible and tangible -// If NOCLIMB is ticked, the polyobject will not be tangible, just visible. -static void PolyVisible(line_t *line) -{ - INT32 polyObjNum = Tag_FGet(&line->tags); - polyobj_t *po; - - if (!(po = Polyobj_GetForNum(polyObjNum))) - { - CONS_Debug(DBG_POLYOBJ, "PolyVisible: bad polyobj %d\n", polyObjNum); - return; - } - - // don't allow line actions to affect bad polyobjects - if (po->isBad) - return; - - if (!(line->flags & ML_NOCLIMB)) - po->flags |= POF_SOLID; - - po->flags &= ~POF_NOSPECIALS; - po->flags |= (po->spawnflags & POF_RENDERALL); -} - - -// Sets the translucency of a polyobject -// Frontsector floor / 100 = translevel -static void PolyTranslucency(line_t *line) -{ - INT32 polyObjNum = Tag_FGet(&line->tags); - polyobj_t *po; - INT32 value; - - if (!(po = Polyobj_GetForNum(polyObjNum))) - { - CONS_Debug(DBG_POLYOBJ, "EV_DoPolyObjWaypoint: bad polyobj %d\n", polyObjNum); - return; - } - - // don't allow line actions to affect bad polyobjects - if (po->isBad) - return; - - // If Front X Offset is specified, use that. Else, use floorheight. - value = (sides[line->sidenum[0]].textureoffset ? sides[line->sidenum[0]].textureoffset : line->frontsector->floorheight) >> FRACBITS; - - // If DONTPEGBOTTOM, specify raw translucency value. Else, take it out of 1000. - if (!(line->flags & ML_DONTPEGBOTTOM)) - value /= 100; - - if (line->flags & ML_EFFECT3) // relative calc - po->translucency += value; - else - po->translucency = value; - - po->translucency = max(min(po->translucency, NUMTRANSMAPS), 0); -} - -// Makes a polyobject translucency fade and applies tangibility -static boolean PolyFade(line_t *line) -{ - INT32 polyObjNum = Tag_FGet(&line->tags); - polyobj_t *po; - polyfadedata_t pfd; - INT32 value; - - if (!(po = Polyobj_GetForNum(polyObjNum))) - { - CONS_Debug(DBG_POLYOBJ, "PolyFade: bad polyobj %d\n", polyObjNum); - return 0; - } - - // don't allow line actions to affect bad polyobjects - if (po->isBad) - return 0; - - // Prevent continuous execs from interfering on an existing fade - if (!(line->flags & ML_EFFECT5) - && po->thinker - && po->thinker->function.acp1 == (actionf_p1)T_PolyObjFade) - { - CONS_Debug(DBG_POLYOBJ, "Line type 492 Executor: Fade PolyObject thinker already exists\n"); - return 0; - } - - pfd.polyObjNum = polyObjNum; - - // If Front X Offset is specified, use that. Else, use floorheight. - value = (sides[line->sidenum[0]].textureoffset ? sides[line->sidenum[0]].textureoffset : line->frontsector->floorheight) >> FRACBITS; - - // If DONTPEGBOTTOM, specify raw translucency value. Else, take it out of 1000. - if (!(line->flags & ML_DONTPEGBOTTOM)) - value /= 100; - - if (line->flags & ML_EFFECT3) // relative calc - pfd.destvalue = po->translucency + value; - else - pfd.destvalue = value; - - pfd.destvalue = max(min(pfd.destvalue, NUMTRANSMAPS), 0); - - // already equal, nothing to do - if (po->translucency == pfd.destvalue) - return 1; - - pfd.docollision = !(line->flags & ML_BOUNCY); // do not handle collision flags - pfd.doghostfade = (line->flags & ML_EFFECT1); // do ghost fade (no collision flags during fade) - pfd.ticbased = (line->flags & ML_EFFECT4); // Speed = Tic Duration - - // allow Back Y Offset to be consistent with other fade specials - pfd.speed = (line->sidenum[1] != 0xFFFF && !sides[line->sidenum[0]].rowoffset) ? - abs(sides[line->sidenum[1]].rowoffset>>FRACBITS) - : abs(sides[line->sidenum[0]].rowoffset>>FRACBITS); - - - return EV_DoPolyObjFade(&pfd); -} - -// Parses arguments for parameterized polyobject waypoint movement -static boolean PolyWaypoint(line_t *line) -{ - polywaypointdata_t pwd; - - pwd.polyObjNum = Tag_FGet(&line->tags); - pwd.speed = sides[line->sidenum[0]].textureoffset / 8; - pwd.sequence = sides[line->sidenum[0]].rowoffset >> FRACBITS; // Sequence # - - // Behavior after reaching the last waypoint? - if (line->flags & ML_EFFECT3) - pwd.returnbehavior = PWR_WRAP; // Wrap back to first waypoint - else if (line->flags & ML_EFFECT2) - pwd.returnbehavior = PWR_COMEBACK; // Go through sequence in reverse - else - pwd.returnbehavior = PWR_STOP; // Stop - - // Flags - pwd.flags = 0; - if (line->flags & ML_EFFECT1) - pwd.flags |= PWF_REVERSE; - if (line->flags & ML_EFFECT4) - pwd.flags |= PWF_LOOP; - - return EV_DoPolyObjWaypoint(&pwd); -} - -// Parses arguments for parameterized polyobject rotate specials -static boolean PolyRotate(line_t *line) -{ - polyrotdata_t prd; - - prd.polyObjNum = Tag_FGet(&line->tags); - prd.speed = sides[line->sidenum[0]].textureoffset >> FRACBITS; // angular speed - prd.distance = sides[line->sidenum[0]].rowoffset >> FRACBITS; // angular distance - - // Polyobj_(OR_)RotateRight have dir == -1 - prd.direction = (line->special == 484 || line->special == 485) ? -1 : 1; - - // Polyobj_OR types have override set to true - prd.overRide = (line->special == 485 || line->special == 487); - - if (line->flags & ML_NOCLIMB) - prd.turnobjs = 0; - else if (line->flags & ML_EFFECT4) - prd.turnobjs = 2; - else - prd.turnobjs = 1; - - return EV_DoPolyObjRotate(&prd); -} - -// Parses arguments for polyobject flag waving special -static boolean PolyFlag(line_t *line) -{ - polyflagdata_t pfd; - - pfd.polyObjNum = Tag_FGet(&line->tags); - pfd.speed = P_AproxDistance(line->dx, line->dy) >> FRACBITS; - pfd.angle = R_PointToAngle2(line->v1->x, line->v1->y, line->v2->x, line->v2->y) >> ANGLETOFINESHIFT; - pfd.momx = sides[line->sidenum[0]].textureoffset >> FRACBITS; - - return EV_DoPolyObjFlag(&pfd); -} - -// Parses arguments for parameterized polyobject move-by-sector-heights specials -static boolean PolyDisplace(line_t *line) -{ - polydisplacedata_t pdd; - - pdd.polyObjNum = Tag_FGet(&line->tags); - - pdd.controlSector = line->frontsector; - pdd.dx = line->dx>>8; - pdd.dy = line->dy>>8; - - return EV_DoPolyObjDisplace(&pdd); -} - - -// Parses arguments for parameterized polyobject rotate-by-sector-heights specials -static boolean PolyRotDisplace(line_t *line) -{ - polyrotdisplacedata_t pdd; - fixed_t anginter, distinter; - - pdd.polyObjNum = Tag_FGet(&line->tags); - pdd.controlSector = line->frontsector; - - // Rotate 'anginter' interval for each 'distinter' interval from the control sector. - // Use default values if not provided as fallback. - anginter = sides[line->sidenum[0]].rowoffset ? sides[line->sidenum[0]].rowoffset : 90*FRACUNIT; - distinter = sides[line->sidenum[0]].textureoffset ? sides[line->sidenum[0]].textureoffset : 128*FRACUNIT; - pdd.rotscale = FixedDiv(anginter, distinter); - - // Same behavior as other rotators when carrying things. - if (line->flags & ML_NOCLIMB) - pdd.turnobjs = 0; - else if (line->flags & ML_EFFECT4) - pdd.turnobjs = 2; - else - pdd.turnobjs = 1; - - return EV_DoPolyObjRotDisplace(&pdd); -} - - -// -// P_RunNightserizeExecutors -// -void P_RunNightserizeExecutors(mobj_t *actor) -{ - size_t i; - - for (i = 0; i < numlines; i++) - { - if (lines[i].special == 323 || lines[i].special == 324) - P_RunTriggerLinedef(&lines[i], actor, NULL); - } -} - -// -// P_RunDeNightserizeExecutors -// -void P_RunDeNightserizeExecutors(mobj_t *actor) -{ - size_t i; - - for (i = 0; i < numlines; i++) - { - if (lines[i].special == 325 || lines[i].special == 326) - P_RunTriggerLinedef(&lines[i], actor, NULL); - } -} - -// -// P_RunNightsLapExecutors -// -void P_RunNightsLapExecutors(mobj_t *actor) -{ - size_t i; - - for (i = 0; i < numlines; i++) - { - if (lines[i].special == 327 || lines[i].special == 328) - P_RunTriggerLinedef(&lines[i], actor, NULL); - } -} - -// -// P_RunNightsCapsuleTouchExecutors -// -void P_RunNightsCapsuleTouchExecutors(mobj_t *actor, boolean entering, boolean enoughspheres) -{ - size_t i; - - for (i = 0; i < numlines; i++) - { - if ((lines[i].special == 329 || lines[i].special == 330) - && ((entering && (lines[i].flags & ML_TFERLINE)) - || (!entering && !(lines[i].flags & ML_TFERLINE))) - && ((lines[i].flags & ML_DONTPEGTOP) - || (enoughspheres && !(lines[i].flags & ML_BOUNCY)) - || (!enoughspheres && (lines[i].flags & ML_BOUNCY)))) - P_RunTriggerLinedef(&lines[i], actor, NULL); - } -} - -/** Finds minimum light from an adjacent sector. - * - * \param sector Sector to start in. - * \param max Maximum value to return. - * \return Minimum light value from an adjacent sector, or max if the minimum - * light value is greater than max. - */ -INT32 P_FindMinSurroundingLight(sector_t *sector, INT32 max) -{ - size_t i; - INT32 min = max; - line_t *line; - sector_t *check; - - for (i = 0; i < sector->linecount; i++) - { - line = sector->lines[i]; - check = getNextSector(line,sector); - - if (!check) - continue; - - if (check->lightlevel < min) - min = check->lightlevel; - } - return min; -} - -void T_ExecutorDelay(executor_t *e) -{ - if (--e->timer <= 0) - { - if (e->caller && P_MobjWasRemoved(e->caller)) // If the mobj died while we were delaying - P_SetTarget(&e->caller, NULL); // Call with no mobj! - P_ProcessLineSpecial(e->line, e->caller, e->sector); - P_SetTarget(&e->caller, NULL); // Let the mobj know it can be removed now. - P_RemoveThinker(&e->thinker); - } -} - -static void P_AddExecutorDelay(line_t *line, mobj_t *mobj, sector_t *sector) -{ - executor_t *e; - INT32 delay; - - if (udmf) - delay = line->executordelay; - else - { - if (!line->backsector) - I_Error("P_AddExecutorDelay: Line has no backsector!\n"); - - delay = (line->backsector->ceilingheight >> FRACBITS) + (line->backsector->floorheight >> FRACBITS); - } - - e = Z_Calloc(sizeof (*e), PU_LEVSPEC, NULL); - - e->thinker.function.acp1 = (actionf_p1)T_ExecutorDelay; - e->line = line; - e->sector = sector; - e->timer = delay; - P_SetTarget(&e->caller, mobj); // Use P_SetTarget to make sure the mobj doesn't get freed while we're delaying. - P_AddThinker(THINK_MAIN, &e->thinker); -} - -/** Used by P_RunTriggerLinedef to check a NiGHTS trigger linedef's conditions - * - * \param triggerline Trigger linedef to check conditions for; should NEVER be NULL. - * \param actor Object initiating the action; should not be NULL. - * \sa P_RunTriggerLinedef - */ -static boolean P_CheckNightsTriggerLine(line_t *triggerline, mobj_t *actor) -{ - INT16 specialtype = triggerline->special; - size_t i; - - UINT8 inputmare = max(0, min(255, sides[triggerline->sidenum[0]].textureoffset>>FRACBITS)); - UINT8 inputlap = max(0, min(255, sides[triggerline->sidenum[0]].rowoffset>>FRACBITS)); - - boolean ltemare = triggerline->flags & ML_NOCLIMB; - boolean gtemare = triggerline->flags & ML_BLOCKMONSTERS; - boolean ltelap = triggerline->flags & ML_EFFECT1; - boolean gtelap = triggerline->flags & ML_EFFECT2; - - boolean lapfrombonustime = triggerline->flags & ML_EFFECT3; - boolean perglobalinverse = triggerline->flags & ML_DONTPEGBOTTOM; - boolean perglobal = !(triggerline->flags & ML_EFFECT4) && !perglobalinverse; - - boolean donomares = triggerline->flags & ML_BOUNCY; // nightserize: run at end of level (no mares) - boolean fromnonights = triggerline->flags & ML_TFERLINE; // nightserize: from non-nights // denightserize: all players no nights - boolean fromnights = triggerline->flags & ML_DONTPEGTOP; // nightserize: from nights // denightserize: >0 players are nights - - UINT8 currentmare = UINT8_MAX; - UINT8 currentlap = UINT8_MAX; - - // Do early returns for Nightserize - if (specialtype >= 323 && specialtype <= 324) - { - // run only when no mares are found - if (donomares && P_FindLowestMare() != UINT8_MAX) - return false; - - // run only if there is a mare present - if (!donomares && P_FindLowestMare() == UINT8_MAX) - return false; - - // run only if player is nightserizing from non-nights - if (fromnonights) - { - if (!actor->player) - return false; - else if (actor->player->powers[pw_carry] == CR_NIGHTSMODE) - return false; - } - // run only if player is nightserizing from nights - else if (fromnights) - { - if (!actor->player) - return false; - else if (actor->player->powers[pw_carry] != CR_NIGHTSMODE) - return false; - } - } - - // Get current mare and lap (and check early return for DeNightserize) - if (perglobal || perglobalinverse - || (specialtype >= 325 && specialtype <= 326 && (fromnonights || fromnights))) - { - UINT8 playersarenights = 0; - - for (i = 0; i < MAXPLAYERS; i++) - { - UINT8 lap; - if (!playeringame[i] || players[i].spectator) - continue; - - // denightserize: run only if all players are not nights - if (specialtype >= 325 && specialtype <= 326 && fromnonights - && players[i].powers[pw_carry] == CR_NIGHTSMODE) - return false; - - // count number of nights players for denightserize return - if (specialtype >= 325 && specialtype <= 326 && fromnights - && players[i].powers[pw_carry] == CR_NIGHTSMODE) - playersarenights++; - - lap = lapfrombonustime ? players[i].marebonuslap : players[i].marelap; - - // get highest mare/lap of players - if (perglobal) - { - if (players[i].mare > currentmare || currentmare == UINT8_MAX) - { - currentmare = players[i].mare; - currentlap = UINT8_MAX; - } - if (players[i].mare == currentmare - && (lap > currentlap || currentlap == UINT8_MAX)) - currentlap = lap; - } - // get lowest mare/lap of players - else if (perglobalinverse) - { - if (players[i].mare < currentmare || currentmare == UINT8_MAX) - { - currentmare = players[i].mare; - currentlap = UINT8_MAX; - } - if (players[i].mare == currentmare - && (lap < currentlap || currentlap == UINT8_MAX)) - currentlap = lap; - } - } - - // denightserize: run only if >0 players are nights - if (specialtype >= 325 && specialtype <= 326 && fromnights - && playersarenights < 1) - return false; - } - // get current mare/lap from triggering player - else if (!perglobal && !perglobalinverse) - { - if (!actor->player) - return false; - currentmare = actor->player->mare; - currentlap = lapfrombonustime ? actor->player->marebonuslap : actor->player->marelap; - } - - if (lapfrombonustime && !currentlap) - return false; // special case: player->marebonuslap is 0 until passing through on bonus time. Don't trigger lines looking for inputlap 0. - - // Compare current mare/lap to input mare/lap based on rules - if (!(specialtype >= 323 && specialtype <= 324 && donomares) // don't return false if donomares and we got this far - && ((ltemare && currentmare > inputmare) - || (gtemare && currentmare < inputmare) - || (!ltemare && !gtemare && currentmare != inputmare) - || (ltelap && currentlap > inputlap) - || (gtelap && currentlap < inputlap) - || (!ltelap && !gtelap && currentlap != inputlap)) - ) - return false; - - return true; -} - -/** Used by P_LinedefExecute to check a trigger linedef's conditions - * The linedef executor specials in the trigger linedef's sector are run if all conditions are met. - * Return false cancels P_LinedefExecute, this happens if a condition is not met. - * - * \param triggerline Trigger linedef to check conditions for; should NEVER be NULL. - * \param actor Object initiating the action; should not be NULL. - * \param caller Sector in which the action was started. May be NULL. - * \sa P_ProcessLineSpecial, P_LinedefExecute - */ -boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller) -{ - sector_t *ctlsector; - fixed_t dist = P_AproxDistance(triggerline->dx, triggerline->dy)>>FRACBITS; - size_t i, linecnt, sectori; - INT16 specialtype = triggerline->special; - - ///////////////////////////////////////////////// - // Distance-checking/sector trigger conditions // - ///////////////////////////////////////////////// - - // Linetypes 303 and 304 require a specific - // number, or minimum or maximum, of rings. - if (specialtype == 303 || specialtype == 304) - { - fixed_t rings = 0; - - // With the passuse flag, count all player's - // rings. - if (triggerline->flags & ML_EFFECT4) - { - for (i = 0; i < MAXPLAYERS; i++) - { - if (!playeringame[i] || players[i].spectator) - continue; - - if (!players[i].mo || ((maptol & TOL_NIGHTS) ? players[i].spheres : players[i].rings) <= 0) - continue; - - rings += (maptol & TOL_NIGHTS) ? players[i].spheres : players[i].rings; - } - } - else - { - if (!(actor && actor->player)) - return false; // no player to count rings from here, sorry - - rings = (maptol & TOL_NIGHTS) ? actor->player->spheres : actor->player->rings; - } - - if (triggerline->flags & ML_NOCLIMB) - { - if (rings > dist) - return false; - } - else if (triggerline->flags & ML_BLOCKMONSTERS) - { - if (rings < dist) - return false; - } - else - { - if (rings != dist) - return false; - } - } - else if (specialtype >= 314 && specialtype <= 315) - { - msecnode_t *node; - mobj_t *mo; - INT32 numpush = 0; - INT32 numneeded = dist; - - if (!caller) - return false; // we need a calling sector to find pushables in, silly! - - // Count the pushables in this sector - node = caller->touching_thinglist; // things touching this sector - while (node) - { - mo = node->m_thing; - if ((mo->flags & MF_PUSHABLE) || ((mo->info->flags & MF_PUSHABLE) && mo->fuse)) - numpush++; - node = node->m_thinglist_next; - } - - if (triggerline->flags & ML_NOCLIMB) // Need at least or more - { - if (numpush < numneeded) - return false; - } - else if (triggerline->flags & ML_EFFECT4) // Need less than - { - if (numpush >= numneeded) - return false; - } - else // Need exact - { - if (numpush != numneeded) - return false; - } - } - else if (caller) - { - if (GETSECSPECIAL(caller->special, 2) == 6) - { - if (!(ALL7EMERALDS(emeralds))) - return false; - } - else if (GETSECSPECIAL(caller->special, 2) == 7) - { - UINT8 mare; - - if (!(maptol & TOL_NIGHTS)) - return false; - - mare = P_FindLowestMare(); - - if (triggerline->flags & ML_NOCLIMB) - { - if (!(mare <= dist)) - return false; - } - else if (triggerline->flags & ML_BLOCKMONSTERS) - { - if (!(mare >= dist)) - return false; - } - else - { - if (!(mare == dist)) - return false; - } - } - // If we were not triggered by a sector type especially for the purpose, - // a Linedef Executor linedef trigger is not handling sector triggers properly, return. - - else if ((!GETSECSPECIAL(caller->special, 2) || GETSECSPECIAL(caller->special, 2) > 7) && (specialtype > 322)) - { - CONS_Alert(CONS_WARNING, - M_GetText("Linedef executor trigger isn't handling sector triggers properly!\nspecialtype = %d, if you are not a dev, report this warning instance\nalong with the wad that caused it!\n"), - specialtype); - return false; - } - } - - ////////////////////////////////////// - // Miscellaneous trigger conditions // - ////////////////////////////////////// - - switch (specialtype) - { - case 305: // continuous - case 306: // each time - case 307: // once - if (!(actor && actor->player && actor->player->charability == dist/10)) - return false; - break; - case 309: // continuous - case 310: // each time - // Only red team members can activate this. - if (!(actor && actor->player && actor->player->ctfteam == 1)) - return false; - break; - case 311: // continuous - case 312: // each time - // Only blue team members can activate this. - if (!(actor && actor->player && actor->player->ctfteam == 2)) - return false; - break; - case 317: // continuous - case 318: // once - { // Unlockable triggers required - INT32 trigid = (INT32)(sides[triggerline->sidenum[0]].textureoffset>>FRACBITS); - - if ((modifiedgame && !savemoddata) || (netgame || multiplayer)) - return false; - else if (trigid < 0 || trigid > 31) // limited by 32 bit variable - { - CONS_Debug(DBG_GAMELOGIC, "Unlockable trigger (sidedef %hu): bad trigger ID %d\n", triggerline->sidenum[0], trigid); - return false; - } - else if (!(unlocktriggers & (1 << trigid))) - return false; - } - break; - case 319: // continuous - case 320: // once - { // An unlockable itself must be unlocked! - INT32 unlockid = (INT32)(sides[triggerline->sidenum[0]].textureoffset>>FRACBITS); - - if ((modifiedgame && !savemoddata) || (netgame || multiplayer)) - return false; - else if (unlockid < 0 || unlockid >= MAXUNLOCKABLES) // limited by unlockable count - { - CONS_Debug(DBG_GAMELOGIC, "Unlockable check (sidedef %hu): bad unlockable ID %d\n", triggerline->sidenum[0], unlockid); - return false; - } - else if (!(unlockables[unlockid-1].unlocked)) - return false; - } - break; - case 321: // continuous - case 322: // each time - // decrement calls left before triggering - if (triggerline->callcount > 0) - { - if (--triggerline->callcount > 0) - return false; - } - break; - case 323: // nightserize - each time - case 324: // nightserize - once - case 325: // denightserize - each time - case 326: // denightserize - once - case 327: // nights lap - each time - case 328: // nights lap - once - case 329: // nights egg capsule touch - each time - case 330: // nights egg capsule touch - once - if (!P_CheckNightsTriggerLine(triggerline, actor)) - return false; - break; - case 331: // continuous - case 332: // each time - case 333: // once - if (!(actor && actor->player && ((stricmp(triggerline->text, skins[actor->player->skin].name) == 0) ^ ((triggerline->flags & ML_NOCLIMB) == ML_NOCLIMB)))) - return false; - break; - case 334: // object dye - continuous - case 335: // object dye - each time - case 336: // object dye - once - { - INT32 triggercolor = (INT32)sides[triggerline->sidenum[0]].toptexture; - UINT16 color = (actor->player ? actor->player->powers[pw_dye] : actor->color); - boolean invert = (triggerline->flags & ML_NOCLIMB ? true : false); - - if (invert ^ (triggercolor != color)) - return false; - } - default: - break; - } - - ///////////////////////////////// - // Processing linedef specials // - ///////////////////////////////// - - ctlsector = triggerline->frontsector; - sectori = (size_t)(ctlsector - sectors); - linecnt = ctlsector->linecount; - - if (triggerline->flags & ML_EFFECT5) // disregard order for efficiency - { - for (i = 0; i < linecnt; i++) - if (ctlsector->lines[i]->special >= 400 - && ctlsector->lines[i]->special < 500) - { - if (ctlsector->lines[i]->executordelay) - P_AddExecutorDelay(ctlsector->lines[i], actor, caller); - else - P_ProcessLineSpecial(ctlsector->lines[i], actor, caller); - } - } - else // walk around the sector in a defined order - { - boolean backwards = false; - size_t j, masterlineindex = (size_t)-1; - - for (i = 0; i < linecnt; i++) - if (ctlsector->lines[i] == triggerline) - { - masterlineindex = i; - break; - } - -#ifdef PARANOIA - if (masterlineindex == (size_t)-1) - { - const size_t li = (size_t)(ctlsector->lines[i] - lines); - I_Error("Line %s isn't linked into its front sector", sizeu1(li)); - } -#endif - - // i == masterlineindex - for (;;) - { - if (backwards) // v2 to v1 - { - for (j = 0; j < linecnt; j++) - { - if (i == j) - continue; - if (ctlsector->lines[i]->v1 == ctlsector->lines[j]->v2) - { - i = j; - break; - } - if (ctlsector->lines[i]->v1 == ctlsector->lines[j]->v1) - { - i = j; - backwards = false; - break; - } - } - if (j == linecnt) - { - const size_t vertexei = (size_t)(ctlsector->lines[i]->v1 - vertexes); - CONS_Debug(DBG_GAMELOGIC, "Warning: Sector %s is not closed at vertex %s (%d, %d)\n", - sizeu1(sectori), sizeu2(vertexei), ctlsector->lines[i]->v1->x, ctlsector->lines[i]->v1->y); - return false; // abort - } - } - else // v1 to v2 - { - for (j = 0; j < linecnt; j++) - { - if (i == j) - continue; - if (ctlsector->lines[i]->v2 == ctlsector->lines[j]->v1) - { - i = j; - break; - } - if (ctlsector->lines[i]->v2 == ctlsector->lines[j]->v2) - { - i = j; - backwards = true; - break; - } - } - if (j == linecnt) - { - const size_t vertexei = (size_t)(ctlsector->lines[i]->v1 - vertexes); - CONS_Debug(DBG_GAMELOGIC, "Warning: Sector %s is not closed at vertex %s (%d, %d)\n", - sizeu1(sectori), sizeu2(vertexei), ctlsector->lines[i]->v2->x, ctlsector->lines[i]->v2->y); - return false; // abort - } - } - - if (i == masterlineindex) - break; - - if (ctlsector->lines[i]->special >= 400 - && ctlsector->lines[i]->special < 500) - { - if (ctlsector->lines[i]->executordelay) - P_AddExecutorDelay(ctlsector->lines[i], actor, caller); - else - P_ProcessLineSpecial(ctlsector->lines[i], actor, caller); - } - } - } - - // "Trigger on X calls" linedefs reset if noclimb is set - if ((specialtype == 321 || specialtype == 322) && triggerline->flags & ML_NOCLIMB) - triggerline->callcount = sides[triggerline->sidenum[0]].textureoffset>>FRACBITS; - else - // These special types work only once - if (specialtype == 302 // Once - || specialtype == 304 // Ring count - Once - || specialtype == 307 // Character ability - Once - || specialtype == 308 // Race only - Once - || specialtype == 313 // No More Enemies - Once - || specialtype == 315 // No of pushables - Once - || specialtype == 318 // Unlockable trigger - Once - || specialtype == 320 // Unlockable - Once - || specialtype == 321 || specialtype == 322 // Trigger on X calls - Continuous + Each Time - || specialtype == 324 // Nightserize - Once - || specialtype == 326 // DeNightserize - Once - || specialtype == 328 // Nights lap - Once - || specialtype == 330 // Nights Bonus Time - Once - || specialtype == 333 // Skin - Once - || specialtype == 336 // Dye - Once - || specialtype == 399) // Level Load - triggerline->special = 0; // Clear it out - - return true; -} - -/** Runs a linedef executor. - * Can be called by: - * - a player moving into a special sector or FOF. - * - a pushable object moving into a special sector or FOF. - * - a ceiling or floor movement from a previous linedef executor finishing. - * - any object in a state with the A_LinedefExecute() action. - * - * \param tag Tag of the linedef executor to run. - * \param actor Object initiating the action; should not be NULL. - * \param caller Sector in which the action was started. May be NULL. - * \sa P_ProcessLineSpecial, P_RunTriggerLinedef - * \author Graue - */ -void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller) -{ - size_t masterline; - - CONS_Debug(DBG_GAMELOGIC, "P_LinedefExecute: Executing trigger linedefs of tag %d\n", tag); - - I_Assert(!actor || !P_MobjWasRemoved(actor)); // If actor is there, it must be valid. - - for (masterline = 0; masterline < numlines; masterline++) - { - if (Tag_FGet(&lines[masterline].tags) != tag) - continue; - - // "No More Enemies" and "Level Load" take care of themselves. - if (lines[masterline].special == 313 - || lines[masterline].special == 399 - // Each-time executors handle themselves, too - || lines[masterline].special == 301 // Each time - || lines[masterline].special == 306 // Character ability - Each time - || lines[masterline].special == 310 // CTF Red team - Each time - || lines[masterline].special == 312 // CTF Blue team - Each time - || lines[masterline].special == 322 // Trigger on X calls - Each Time - || lines[masterline].special == 332 // Skin - Each time - || lines[masterline].special == 335)// Dye - Each time - continue; - - if (lines[masterline].special < 300 - || lines[masterline].special > 399) - continue; - - if (!P_RunTriggerLinedef(&lines[masterline], actor, caller)) - return; // cancel P_LinedefExecute if function returns false - } -} - -// -// P_SwitchWeather -// -// Switches the weather! -// -void P_SwitchWeather(INT32 weathernum) -{ - boolean purge = false; - INT32 swap = 0; - - switch (weathernum) - { - case PRECIP_NONE: // None - if (curWeather == PRECIP_NONE) - return; // Nothing to do. - purge = true; - break; - case PRECIP_STORM: // Storm - case PRECIP_STORM_NOSTRIKES: // Storm w/ no lightning - case PRECIP_RAIN: // Rain - if (curWeather == PRECIP_SNOW || curWeather == PRECIP_BLANK || curWeather == PRECIP_STORM_NORAIN) - swap = PRECIP_RAIN; - break; - case PRECIP_SNOW: // Snow - if (curWeather == PRECIP_SNOW) - return; // Nothing to do. - if (curWeather == PRECIP_RAIN || curWeather == PRECIP_STORM || curWeather == PRECIP_STORM_NOSTRIKES || curWeather == PRECIP_BLANK || curWeather == PRECIP_STORM_NORAIN) - swap = PRECIP_SNOW; // Need to delete the other precips. - break; - case PRECIP_STORM_NORAIN: // Storm w/o rain - if (curWeather == PRECIP_SNOW - || curWeather == PRECIP_STORM - || curWeather == PRECIP_STORM_NOSTRIKES - || curWeather == PRECIP_RAIN - || curWeather == PRECIP_BLANK) - swap = PRECIP_STORM_NORAIN; - else if (curWeather == PRECIP_STORM_NORAIN) - return; - break; - case PRECIP_BLANK: - if (curWeather == PRECIP_SNOW - || curWeather == PRECIP_STORM - || curWeather == PRECIP_STORM_NOSTRIKES - || curWeather == PRECIP_RAIN) - swap = PRECIP_BLANK; - else if (curWeather == PRECIP_STORM_NORAIN) - swap = PRECIP_BLANK; - else if (curWeather == PRECIP_BLANK) - return; - break; - default: - CONS_Debug(DBG_GAMELOGIC, "P_SwitchWeather: Unknown weather type %d.\n", weathernum); - break; - } - - if (purge) - { - thinker_t *think; - precipmobj_t *precipmobj; - - for (think = thlist[THINK_PRECIP].next; think != &thlist[THINK_PRECIP]; think = think->next) - { - if (think->function.acp1 != (actionf_p1)P_NullPrecipThinker) - continue; // not a precipmobj thinker - - precipmobj = (precipmobj_t *)think; - - P_RemovePrecipMobj(precipmobj); - } - } - else if (swap && !((swap == PRECIP_BLANK && curWeather == PRECIP_STORM_NORAIN) || (swap == PRECIP_STORM_NORAIN && curWeather == PRECIP_BLANK))) // Rather than respawn all that crap, reuse it! - { - thinker_t *think; - precipmobj_t *precipmobj; - state_t *st; - - for (think = thlist[THINK_PRECIP].next; think != &thlist[THINK_PRECIP]; think = think->next) - { - if (think->function.acp1 != (actionf_p1)P_NullPrecipThinker) - continue; // not a precipmobj thinker - precipmobj = (precipmobj_t *)think; - - if (swap == PRECIP_RAIN) // Snow To Rain - { - precipmobj->flags = mobjinfo[MT_RAIN].flags; - st = &states[mobjinfo[MT_RAIN].spawnstate]; - precipmobj->state = st; - precipmobj->tics = st->tics; - precipmobj->sprite = st->sprite; - precipmobj->frame = st->frame; - precipmobj->momz = mobjinfo[MT_RAIN].speed; - - precipmobj->precipflags &= ~PCF_INVISIBLE; - - precipmobj->precipflags |= PCF_RAIN; - //think->function.acp1 = (actionf_p1)P_RainThinker; - } - else if (swap == PRECIP_SNOW) // Rain To Snow - { - INT32 z; - - precipmobj->flags = mobjinfo[MT_SNOWFLAKE].flags; - z = M_RandomByte(); - - if (z < 64) - z = 2; - else if (z < 144) - z = 1; - else - z = 0; - - st = &states[mobjinfo[MT_SNOWFLAKE].spawnstate+z]; - precipmobj->state = st; - precipmobj->tics = st->tics; - precipmobj->sprite = st->sprite; - precipmobj->frame = st->frame; - precipmobj->momz = mobjinfo[MT_SNOWFLAKE].speed; - - precipmobj->precipflags &= ~(PCF_INVISIBLE|PCF_RAIN); - - //think->function.acp1 = (actionf_p1)P_SnowThinker; - } - else if (swap == PRECIP_BLANK || swap == PRECIP_STORM_NORAIN) // Remove precip, but keep it around for reuse. - { - //think->function.acp1 = (actionf_p1)P_NullPrecipThinker; - - precipmobj->precipflags |= PCF_INVISIBLE; - } - } - } - - switch (weathernum) - { - case PRECIP_SNOW: // snow - curWeather = PRECIP_SNOW; - - if (!swap) - P_SpawnPrecipitation(); - - break; - case PRECIP_RAIN: // rain - { - boolean dontspawn = false; - - if (curWeather == PRECIP_RAIN || curWeather == PRECIP_STORM || curWeather == PRECIP_STORM_NOSTRIKES) - dontspawn = true; - - curWeather = PRECIP_RAIN; - - if (!dontspawn && !swap) - P_SpawnPrecipitation(); - - break; - } - case PRECIP_STORM: // storm - { - boolean dontspawn = false; - - if (curWeather == PRECIP_RAIN || curWeather == PRECIP_STORM || curWeather == PRECIP_STORM_NOSTRIKES) - dontspawn = true; - - curWeather = PRECIP_STORM; - - if (!dontspawn && !swap) - P_SpawnPrecipitation(); - - break; - } - case PRECIP_STORM_NOSTRIKES: // storm w/o lightning - { - boolean dontspawn = false; - - if (curWeather == PRECIP_RAIN || curWeather == PRECIP_STORM || curWeather == PRECIP_STORM_NOSTRIKES) - dontspawn = true; - - curWeather = PRECIP_STORM_NOSTRIKES; - - if (!dontspawn && !swap) - P_SpawnPrecipitation(); - - break; - } - case PRECIP_STORM_NORAIN: // storm w/o rain - curWeather = PRECIP_STORM_NORAIN; - - if (!swap) - P_SpawnPrecipitation(); - - break; - case PRECIP_BLANK: - curWeather = PRECIP_BLANK; - - if (!swap) - P_SpawnPrecipitation(); - - break; - default: - curWeather = PRECIP_NONE; - break; - } -} - -/** Gets an object. - * - * \param type Object type to look for. - * \param s Sector number to look in. - * \return Pointer to the first ::type found in the sector. - * \sa P_GetPushThing - */ -static mobj_t *P_GetObjectTypeInSectorNum(mobjtype_t type, size_t s) -{ - sector_t *sec = sectors + s; - mobj_t *thing = sec->thinglist; - - while (thing) - { - if (thing->type == type) - return thing; - thing = thing->snext; - } - return NULL; -} - -/** Processes the line special triggered by an object. - * - * \param line Line with the special command on it. - * \param mo mobj that triggered the line. Must be valid and non-NULL. - * \param callsec sector in which action was initiated; this can be NULL. - * Because of the A_LinedefExecute() action, even if non-NULL, - * this sector might not have the same tag as the linedef executor, - * and it might not have the linedef executor sector type. - * \todo Handle mo being NULL gracefully. T_MoveFloor() and T_MoveCeiling() - * don't have an object to pass. - * \todo Split up into multiple functions. - * \sa P_LinedefExecute - * \author Graue - */ -static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) -{ - INT32 secnum = -1; - mobj_t *bot = NULL; - mtag_t tag = Tag_FGet(&line->tags); - - I_Assert(!mo || !P_MobjWasRemoved(mo)); // If mo is there, mo must be valid! - - if (mo && mo->player && botingame) - bot = players[secondarydisplayplayer].mo; - - // note: only commands with linedef types >= 400 && < 500 can be used - switch (line->special) - { - case 400: // Set tagged sector's floor height/pic - EV_DoFloor(line, instantMoveFloorByFrontSector); - break; - - case 401: // Set tagged sector's ceiling height/pic - EV_DoCeiling(line, instantMoveCeilingByFrontSector); - break; - - case 402: // Set tagged sector's light level - { - INT16 newlightlevel; - INT32 newfloorlightsec, newceilinglightsec; - - newlightlevel = line->frontsector->lightlevel; - newfloorlightsec = line->frontsector->floorlightsec; - newceilinglightsec = line->frontsector->ceilinglightsec; - - // act on all sectors with the same tag as the triggering linedef - TAG_ITER_SECTORS(tag, secnum) - { - if (sectors[secnum].lightingdata) - { - // Stop the lighting madness going on in this sector! - P_RemoveThinker(&((elevator_t *)sectors[secnum].lightingdata)->thinker); - sectors[secnum].lightingdata = NULL; - - // No, it's not an elevator_t, but any struct with a thinker_t named - // 'thinker' at the beginning will do here. (We don't know what it - // actually is: could be lightlevel_t, fireflicker_t, glow_t, etc.) - } - - sectors[secnum].lightlevel = newlightlevel; - sectors[secnum].floorlightsec = newfloorlightsec; - sectors[secnum].ceilinglightsec = newceilinglightsec; - } - } - break; - - case 403: // Move floor, linelen = speed, frontsector floor = dest height - EV_DoFloor(line, moveFloorByFrontSector); - break; - - case 404: // Move ceiling, linelen = speed, frontsector ceiling = dest height - EV_DoCeiling(line, moveCeilingByFrontSector); - break; - - case 405: // Move floor by front side texture offsets, offset x = speed, offset y = amount to raise/lower - EV_DoFloor(line, moveFloorByFrontTexture); - break; - - case 407: // Move ceiling by front side texture offsets, offset x = speed, offset y = amount to raise/lower - EV_DoCeiling(line, moveCeilingByFrontTexture); - break; - -/* case 405: // Lower floor by line, dx = speed, dy = amount to lower - EV_DoFloor(line, lowerFloorByLine); - break; - - case 406: // Raise floor by line, dx = speed, dy = amount to raise - EV_DoFloor(line, raiseFloorByLine); - break; - - case 407: // Lower ceiling by line, dx = speed, dy = amount to lower - EV_DoCeiling(line, lowerCeilingByLine); - break; - - case 408: // Raise ceiling by line, dx = speed, dy = amount to raise - EV_DoCeiling(line, raiseCeilingByLine); - break;*/ - - case 409: // Change tagged sectors' tag - // (formerly "Change calling sectors' tag", but behavior was changed) - { - TAG_ITER_SECTORS(tag, secnum) - Tag_SectorFSet(secnum,(INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS)); - break; - } - - case 410: // Change front sector's tag - Tag_SectorFSet((UINT32)(line->frontsector - sectors), (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS)); - break; - - case 411: // Stop floor/ceiling movement in tagged sector(s) - TAG_ITER_SECTORS(tag, secnum) - { - if (sectors[secnum].floordata) - { - if (sectors[secnum].floordata == sectors[secnum].ceilingdata) // elevator - { - P_RemoveThinker(&((elevator_t *)sectors[secnum].floordata)->thinker); - sectors[secnum].floordata = sectors[secnum].ceilingdata = NULL; - sectors[secnum].floorspeed = sectors[secnum].ceilspeed = 0; - } - else // floormove - { - P_RemoveThinker(&((floormove_t *)sectors[secnum].floordata)->thinker); - sectors[secnum].floordata = NULL; - sectors[secnum].floorspeed = 0; - } - } - - if (sectors[secnum].ceilingdata) // ceiling - { - P_RemoveThinker(&((ceiling_t *)sectors[secnum].ceilingdata)->thinker); - sectors[secnum].ceilingdata = NULL; - sectors[secnum].ceilspeed = 0; - } - } - break; - - case 412: // Teleport the player or thing - { - mobj_t *dest; - - if (!mo) // nothing to teleport - return; - - if (line->flags & ML_EFFECT3) // Relative silent teleport - { - fixed_t x, y, z; - - x = sides[line->sidenum[0]].textureoffset; - y = sides[line->sidenum[0]].rowoffset; - z = line->frontsector->ceilingheight; - - P_UnsetThingPosition(mo); - mo->x += x; - mo->y += y; - mo->z += z; - P_SetThingPosition(mo); - - if (mo->player) - { - if (bot) // This might put poor Tails in a wall if he's too far behind! D: But okay, whatever! >:3 - P_TeleportMove(bot, bot->x + x, bot->y + y, bot->z + z); - if (splitscreen && mo->player == &players[secondarydisplayplayer] && camera2.chase) - { - camera2.x += x; - camera2.y += y; - camera2.z += z; - camera2.subsector = R_PointInSubsector(camera2.x, camera2.y); - } - else if (camera.chase && mo->player == &players[displayplayer]) - { - camera.x += x; - camera.y += y; - camera.z += z; - camera.subsector = R_PointInSubsector(camera.x, camera.y); - } - } - } - else - { - if ((secnum = Tag_Iterate_Sectors(tag, 0)) < 0) - return; - - dest = P_GetObjectTypeInSectorNum(MT_TELEPORTMAN, secnum); - if (!dest) - return; - - if (bot) - P_Teleport(bot, dest->x, dest->y, dest->z, (line->flags & ML_NOCLIMB) ? mo->angle : dest->angle, (line->flags & ML_BLOCKMONSTERS) == 0, (line->flags & ML_EFFECT4) == ML_EFFECT4); - if (line->flags & ML_BLOCKMONSTERS) - P_Teleport(mo, dest->x, dest->y, dest->z, (line->flags & ML_NOCLIMB) ? mo->angle : dest->angle, false, (line->flags & ML_EFFECT4) == ML_EFFECT4); - else - { - P_Teleport(mo, dest->x, dest->y, dest->z, (line->flags & ML_NOCLIMB) ? mo->angle : dest->angle, true, (line->flags & ML_EFFECT4) == ML_EFFECT4); - // Play the 'bowrwoosh!' sound - S_StartSound(dest, sfx_mixup); - } - } - } - break; - - case 413: // Change music - // console player only unless NOCLIMB is set - if ((line->flags & ML_NOCLIMB) || (mo && mo->player && P_IsLocalPlayer(mo->player)) || titlemapinaction) - { - boolean musicsame = (!sides[line->sidenum[0]].text[0] || !strnicmp(sides[line->sidenum[0]].text, S_MusicName(), 7)); - UINT16 tracknum = (UINT16)max(sides[line->sidenum[0]].bottomtexture, 0); - INT32 position = (INT32)max(sides[line->sidenum[0]].midtexture, 0); - UINT32 prefadems = (UINT32)max(sides[line->sidenum[0]].textureoffset >> FRACBITS, 0); - UINT32 postfadems = (UINT32)max(sides[line->sidenum[0]].rowoffset >> FRACBITS, 0); - UINT8 fadetarget = (UINT8)max((line->sidenum[1] != 0xffff) ? sides[line->sidenum[1]].textureoffset >> FRACBITS : 0, 0); - INT16 fadesource = (INT16)max((line->sidenum[1] != 0xffff) ? sides[line->sidenum[1]].rowoffset >> FRACBITS : -1, -1); - - // Seek offset from current song position - if (line->flags & ML_EFFECT1) - { - // adjust for loop point if subtracting - if (position < 0 && S_GetMusicLength() && - S_GetMusicPosition() > S_GetMusicLoopPoint() && - S_GetMusicPosition() + position < S_GetMusicLoopPoint()) - position = max(S_GetMusicLength() - (S_GetMusicLoopPoint() - (S_GetMusicPosition() + position)), 0); - else - position = max(S_GetMusicPosition() + position, 0); - } - - // Fade current music to target volume (if music won't be changed) - if ((line->flags & ML_EFFECT2) && fadetarget && musicsame) - { - // 0 fadesource means fade from current volume. - // meaning that we can't specify volume 0 as the source volume -- this starts at 1. - if (!fadesource) - fadesource = -1; - - if (!postfadems) - S_SetInternalMusicVolume(fadetarget); - else - S_FadeMusicFromVolume(fadetarget, fadesource, postfadems); - - if (position) - S_SetMusicPosition(position); - } - // Change the music and apply position/fade operations - else - { - strncpy(mapmusname, sides[line->sidenum[0]].text, 7); - mapmusname[6] = 0; - - mapmusflags = tracknum & MUSIC_TRACKMASK; - if (!(line->flags & ML_BLOCKMONSTERS)) - mapmusflags |= MUSIC_RELOADRESET; - if (line->flags & ML_BOUNCY) - mapmusflags |= MUSIC_FORCERESET; - - mapmusposition = position; - - S_ChangeMusicEx(mapmusname, mapmusflags, !(line->flags & ML_EFFECT4), position, - !(line->flags & ML_EFFECT2) ? prefadems : 0, - !(line->flags & ML_EFFECT2) ? postfadems : 0); - - if ((line->flags & ML_EFFECT2) && fadetarget) - { - if (!postfadems) - S_SetInternalMusicVolume(fadetarget); - else - S_FadeMusicFromVolume(fadetarget, fadesource, postfadems); - } - } - - // Except, you can use the ML_BLOCKMONSTERS flag to change this behavior. - // if (mapmusflags & MUSIC_RELOADRESET) then it will reset the music in G_PlayerReborn. - } - break; - - case 414: // Play SFX - { - INT32 sfxnum; - - sfxnum = sides[line->sidenum[0]].toptexture; - - if (sfxnum == sfx_None) - return; // Do nothing! - if (sfxnum < sfx_None || sfxnum >= NUMSFX) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 414 Executor: sfx number %d is invalid!\n", sfxnum); - return; - } - - if (tag != 0) // Do special stuff only if a non-zero linedef tag is set - { - // Play sounds from tagged sectors' origins. - if (line->flags & ML_EFFECT5) // Repeat Midtexture - { - // Additionally play the sound from tagged sectors' soundorgs - sector_t *sec; - - TAG_ITER_SECTORS(tag, secnum) - { - sec = §ors[secnum]; - S_StartSound(&sec->soundorg, sfxnum); - } - } - - // Play the sound without origin for anyone, as long as they're inside tagged areas. - else - { - UINT8 i = 0; - mobj_t* camobj = players[displayplayer].mo; - ffloor_t *rover; - boolean foundit = false; - - for (i = 0; i < 2; camobj = players[secondarydisplayplayer].mo, i++) - { - if (!camobj) - continue; - - if (foundit || Tag_Find(&camobj->subsector->sector->tags, tag)) - { - foundit = true; - break; - } - - // Only trigger if mobj is touching the tag - for(rover = camobj->subsector->sector->ffloors; rover; rover = rover->next) - { - if (!Tag_Find(&rover->master->frontsector->tags, tag)) - continue; - - if (camobj->z > P_GetSpecialTopZ(camobj, sectors + rover->secnum, camobj->subsector->sector)) - continue; - - if (camobj->z + camobj->height < P_GetSpecialBottomZ(camobj, sectors + rover->secnum, camobj->subsector->sector)) - continue; - - foundit = true; - break; - } - } - - if (foundit) - S_StartSound(NULL, sfxnum); - } - } - else - { - if (line->flags & ML_NOCLIMB) - { - // play the sound from nowhere, but only if display player triggered it - if (mo && mo->player && (mo->player == &players[displayplayer] || mo->player == &players[secondarydisplayplayer])) - S_StartSound(NULL, sfxnum); - } - else if (line->flags & ML_EFFECT4) - { - // play the sound from nowhere - S_StartSound(NULL, sfxnum); - } - else if (line->flags & ML_BLOCKMONSTERS) - { - // play the sound from calling sector's soundorg - if (callsec) - S_StartSound(&callsec->soundorg, sfxnum); - else if (mo) - S_StartSound(&mo->subsector->sector->soundorg, sfxnum); - } - else if (mo) - { - // play the sound from mobj that triggered it - S_StartSound(mo, sfxnum); - } - } - } - break; - - case 415: // Run a script - if (cv_runscripts.value) - { - INT32 scrnum; - lumpnum_t lumpnum; - char newname[9]; - - strcpy(newname, G_BuildMapName(gamemap)); - newname[0] = 'S'; - newname[1] = 'C'; - newname[2] = 'R'; - - scrnum = sides[line->sidenum[0]].textureoffset>>FRACBITS; - if (scrnum < 0 || scrnum > 999) - { - scrnum = 0; - newname[5] = newname[6] = newname[7] = '0'; - } - else - { - newname[5] = (char)('0' + (char)((scrnum/100))); - newname[6] = (char)('0' + (char)((scrnum%100)/10)); - newname[7] = (char)('0' + (char)(scrnum%10)); - } - newname[8] = '\0'; - - lumpnum = W_CheckNumForName(newname); - - if (lumpnum == LUMPERROR || W_LumpLength(lumpnum) == 0) - { - CONS_Debug(DBG_SETUP, "SOC Error: script lump %s not found/not valid.\n", newname); - } - else - COM_BufInsertText(W_CacheLumpNum(lumpnum, PU_CACHE)); - } - break; - - case 416: // Spawn adjustable fire flicker - TAG_ITER_SECTORS(tag, secnum) - { - if (line->flags & ML_NOCLIMB && line->backsector) - { - // Use front sector for min light level, back sector for max. - // This is tricky because P_SpawnAdjustableFireFlicker expects - // the maxsector (second argument) to also be the target - // sector, so we have to do some light level twiddling. - fireflicker_t *flick; - INT16 reallightlevel = sectors[secnum].lightlevel; - sectors[secnum].lightlevel = line->backsector->lightlevel; - - flick = P_SpawnAdjustableFireFlicker(line->frontsector, §ors[secnum], - P_AproxDistance(line->dx, line->dy)>>FRACBITS); - - // Make sure the starting light level is in range. - if (reallightlevel < flick->minlight) - reallightlevel = (INT16)flick->minlight; - else if (reallightlevel > flick->maxlight) - reallightlevel = (INT16)flick->maxlight; - - sectors[secnum].lightlevel = reallightlevel; - } - else - { - // Use front sector for min, target sector for max, - // the same way linetype 61 does it. - P_SpawnAdjustableFireFlicker(line->frontsector, §ors[secnum], - P_AproxDistance(line->dx, line->dy)>>FRACBITS); - } - } - break; - - case 417: // Spawn adjustable glowing light - TAG_ITER_SECTORS(tag, secnum) - { - if (line->flags & ML_NOCLIMB && line->backsector) - { - // Use front sector for min light level, back sector for max. - // This is tricky because P_SpawnAdjustableGlowingLight expects - // the maxsector (second argument) to also be the target - // sector, so we have to do some light level twiddling. - glow_t *glow; - INT16 reallightlevel = sectors[secnum].lightlevel; - sectors[secnum].lightlevel = line->backsector->lightlevel; - - glow = P_SpawnAdjustableGlowingLight(line->frontsector, §ors[secnum], - P_AproxDistance(line->dx, line->dy)>>FRACBITS); - - // Make sure the starting light level is in range. - if (reallightlevel < glow->minlight) - reallightlevel = (INT16)glow->minlight; - else if (reallightlevel > glow->maxlight) - reallightlevel = (INT16)glow->maxlight; - - sectors[secnum].lightlevel = reallightlevel; - } - else - { - // Use front sector for min, target sector for max, - // the same way linetype 602 does it. - P_SpawnAdjustableGlowingLight(line->frontsector, §ors[secnum], - P_AproxDistance(line->dx, line->dy)>>FRACBITS); - } - } - break; - - case 418: // Spawn adjustable strobe flash (unsynchronized) - TAG_ITER_SECTORS(tag, secnum) - { - if (line->flags & ML_NOCLIMB && line->backsector) - { - // Use front sector for min light level, back sector for max. - // This is tricky because P_SpawnAdjustableGlowingLight expects - // the maxsector (second argument) to also be the target - // sector, so we have to do some light level twiddling. - strobe_t *flash; - INT16 reallightlevel = sectors[secnum].lightlevel; - sectors[secnum].lightlevel = line->backsector->lightlevel; - - flash = P_SpawnAdjustableStrobeFlash(line->frontsector, §ors[secnum], - abs(line->dx)>>FRACBITS, abs(line->dy)>>FRACBITS, false); - - // Make sure the starting light level is in range. - if (reallightlevel < flash->minlight) - reallightlevel = (INT16)flash->minlight; - else if (reallightlevel > flash->maxlight) - reallightlevel = (INT16)flash->maxlight; - - sectors[secnum].lightlevel = reallightlevel; - } - else - { - // Use front sector for min, target sector for max, - // the same way linetype 602 does it. - P_SpawnAdjustableStrobeFlash(line->frontsector, §ors[secnum], - abs(line->dx)>>FRACBITS, abs(line->dy)>>FRACBITS, false); - } - } - break; - - case 419: // Spawn adjustable strobe flash (synchronized) - TAG_ITER_SECTORS(tag, secnum) - { - if (line->flags & ML_NOCLIMB && line->backsector) - { - // Use front sector for min light level, back sector for max. - // This is tricky because P_SpawnAdjustableGlowingLight expects - // the maxsector (second argument) to also be the target - // sector, so we have to do some light level twiddling. - strobe_t *flash; - INT16 reallightlevel = sectors[secnum].lightlevel; - sectors[secnum].lightlevel = line->backsector->lightlevel; - - flash = P_SpawnAdjustableStrobeFlash(line->frontsector, §ors[secnum], - abs(line->dx)>>FRACBITS, abs(line->dy)>>FRACBITS, true); - - // Make sure the starting light level is in range. - if (reallightlevel < flash->minlight) - reallightlevel = (INT16)flash->minlight; - else if (reallightlevel > flash->maxlight) - reallightlevel = (INT16)flash->maxlight; - - sectors[secnum].lightlevel = reallightlevel; - } - else - { - // Use front sector for min, target sector for max, - // the same way linetype 602 does it. - P_SpawnAdjustableStrobeFlash(line->frontsector, §ors[secnum], - abs(line->dx)>>FRACBITS, abs(line->dy)>>FRACBITS, true); - } - } - break; - - case 420: // Fade light levels in tagged sectors to new value - P_FadeLight(tag, - (line->flags & ML_DONTPEGBOTTOM) ? max(sides[line->sidenum[0]].textureoffset>>FRACBITS, 0) : line->frontsector->lightlevel, - // failsafe: if user specifies Back Y Offset and NOT Front Y Offset, use the Back Offset - // to be consistent with other light and fade specials - (line->flags & ML_DONTPEGBOTTOM) ? - ((line->sidenum[1] != 0xFFFF && !(sides[line->sidenum[0]].rowoffset>>FRACBITS)) ? - max(min(sides[line->sidenum[1]].rowoffset>>FRACBITS, 255), 0) - : max(min(sides[line->sidenum[0]].rowoffset>>FRACBITS, 255), 0)) - : abs(P_AproxDistance(line->dx, line->dy))>>FRACBITS, - (line->flags & ML_EFFECT4), - (line->flags & ML_EFFECT5)); - break; - - case 421: // Stop lighting effect in tagged sectors - TAG_ITER_SECTORS(tag, secnum) - if (sectors[secnum].lightingdata) - { - P_RemoveThinker(&((elevator_t *)sectors[secnum].lightingdata)->thinker); - sectors[secnum].lightingdata = NULL; - } - break; - - case 422: // Cut away to another view - { - mobj_t *altview; - - if ((!mo || !mo->player) && !titlemapinaction) // only players have views, and title screens - return; - - if ((secnum = Tag_Iterate_Sectors(tag, 0)) < 0) - return; - - altview = P_GetObjectTypeInSectorNum(MT_ALTVIEWMAN, secnum); - if (!altview) - return; - - // If titlemap, set the camera ref for title's thinker - // This is not revoked until overwritten; awayviewtics is ignored - if (titlemapinaction) - titlemapcameraref = altview; - else - { - P_SetTarget(&mo->player->awayviewmobj, altview); - mo->player->awayviewtics = P_AproxDistance(line->dx, line->dy)>>FRACBITS; - } - - - if (line->flags & ML_NOCLIMB) // lets you specify a vertical angle - { - INT32 aim; - - aim = sides[line->sidenum[0]].textureoffset>>FRACBITS; - aim = (aim + 360) % 360; - aim *= (ANGLE_90>>8); - aim /= 90; - aim <<= 8; - if (titlemapinaction) - titlemapcameraref->cusval = (angle_t)aim; - else - mo->player->awayviewaiming = (angle_t)aim; - } - else - { - // straight ahead - if (!titlemapinaction) - mo->player->awayviewaiming = 0; - // don't do cusval cause that's annoying - } - } - break; - - case 423: // Change Sky - if ((mo && mo->player && P_IsLocalPlayer(mo->player)) || (line->flags & ML_NOCLIMB)) - P_SetupLevelSky(sides[line->sidenum[0]].textureoffset>>FRACBITS, (line->flags & ML_NOCLIMB)); - break; - - case 424: // Change Weather - if (line->flags & ML_NOCLIMB) - { - globalweather = (UINT8)(sides[line->sidenum[0]].textureoffset>>FRACBITS); - P_SwitchWeather(globalweather); - } - else if (mo && mo->player && P_IsLocalPlayer(mo->player)) - P_SwitchWeather(sides[line->sidenum[0]].textureoffset>>FRACBITS); - break; - - case 425: // Calls P_SetMobjState on calling mobj - if (mo && !mo->player) - P_SetMobjState(mo, sides[line->sidenum[0]].toptexture); //P_AproxDistance(line->dx, line->dy)>>FRACBITS); - break; - - case 426: // Moves the mobj to its sector's soundorg and on the floor, and stops it - if (!mo) - return; - - if (line->flags & ML_NOCLIMB) - { - P_UnsetThingPosition(mo); - mo->x = mo->subsector->sector->soundorg.x; - mo->y = mo->subsector->sector->soundorg.y; - mo->z = mo->floorz; - P_SetThingPosition(mo); - } - - mo->momx = mo->momy = mo->momz = 1; - mo->pmomz = 0; - - if (mo->player) - { - mo->player->rmomx = mo->player->rmomy = 1; - mo->player->cmomx = mo->player->cmomy = 0; - P_ResetPlayer(mo->player); - P_SetPlayerMobjState(mo, S_PLAY_STND); - - // Reset bot too. - if (bot) { - if (line->flags & ML_NOCLIMB) - P_TeleportMove(bot, mo->x, mo->y, mo->z); - bot->momx = bot->momy = bot->momz = 1; - bot->pmomz = 0; - bot->player->rmomx = bot->player->rmomy = 1; - bot->player->cmomx = bot->player->cmomy = 0; - P_ResetPlayer(bot->player); - P_SetPlayerMobjState(bot, S_PLAY_STND); - } - } - break; - - case 427: // Awards points if the mobj is a player - if (mo && mo->player) - P_AddPlayerScore(mo->player, sides[line->sidenum[0]].textureoffset>>FRACBITS); - break; - - case 428: // Start floating platform movement - EV_DoElevator(line, elevateContinuous, true); - break; - - case 429: // Crush Ceiling Down Once - EV_DoCrush(line, crushCeilOnce); - break; - - case 430: // Crush Floor Up Once - EV_DoFloor(line, crushFloorOnce); - break; - - case 431: // Crush Floor & Ceiling to middle Once - EV_DoCrush(line, crushBothOnce); - break; - - case 432: // Enable 2D Mode (Disable if noclimb) - if (mo && mo->player) - { - if (line->flags & ML_NOCLIMB) - mo->flags2 &= ~MF2_TWOD; - else - mo->flags2 |= MF2_TWOD; - - // Copy effect to bot if necessary - // (Teleport them to you so they don't break it.) - if (bot && (bot->flags2 & MF2_TWOD) != (mo->flags2 & MF2_TWOD)) { - bot->flags2 = (bot->flags2 & ~MF2_TWOD) | (mo->flags2 & MF2_TWOD); - P_TeleportMove(bot, mo->x, mo->y, mo->z); - } - } - break; - - case 433: // Flip gravity (Flop gravity if noclimb) Works on pushables, too! - if (line->flags & ML_NOCLIMB) - mo->flags2 &= ~MF2_OBJECTFLIP; - else - mo->flags2 |= MF2_OBJECTFLIP; - if (bot) - bot->flags2 = (bot->flags2 & ~MF2_OBJECTFLIP) | (mo->flags2 & MF2_OBJECTFLIP); - break; - - case 434: // Custom Power - if (mo && mo->player) - { - mobj_t *dummy = P_SpawnMobj(mo->x, mo->y, mo->z, MT_NULL); - - var1 = sides[line->sidenum[0]].toptexture; //(line->dx>>FRACBITS)-1; - - if (line->sidenum[1] != 0xffff && line->flags & ML_BLOCKMONSTERS) // read power from back sidedef - var2 = sides[line->sidenum[1]].toptexture; - else if (line->flags & ML_NOCLIMB) // 'Infinite' - var2 = UINT16_MAX; - else - var2 = sides[line->sidenum[0]].textureoffset>>FRACBITS; - - P_SetTarget(&dummy->target, mo); - A_CustomPower(dummy); - - if (bot) { - P_SetTarget(&dummy->target, bot); - A_CustomPower(dummy); - } - P_RemoveMobj(dummy); - } - break; - - case 435: // Change scroller direction - { - scroll_t *scroller; - thinker_t *th; - - for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next) - { - if (th->function.acp1 != (actionf_p1)T_Scroll) - continue; - - scroller = (scroll_t *)th; - if (!Tag_Find(§ors[scroller->affectee].tags, tag)) - continue; - - scroller->dx = FixedMul(line->dx>>SCROLL_SHIFT, CARRYFACTOR); - scroller->dy = FixedMul(line->dy>>SCROLL_SHIFT, CARRYFACTOR); - } - } - break; - - case 436: // Shatter block remotely - { - INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); - INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); - sector_t *sec; // Sector that the FOF is visible in - ffloor_t *rover; // FOF that we are going to crumble - boolean foundrover = false; // for debug, "Can't find a FOF" message - - TAG_ITER_SECTORS(sectag, secnum) - { - sec = sectors + secnum; - - if (!sec->ffloors) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 436 Executor: Target sector #%d has no FOFs.\n", secnum); - return; - } - - for (rover = sec->ffloors; rover; rover = rover->next) - { - if (Tag_Find(&rover->master->frontsector->tags, foftag)) - { - foundrover = true; - - EV_CrumbleChain(sec, rover); - } - } - - if (!foundrover) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 436 Executor: Can't find a FOF control sector with tag %d\n", foftag); - return; - } - } - } - break; - - case 437: // Disable Player Controls - if (mo && mo->player) - { - UINT16 fractime = (UINT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); - if (fractime < 1) - fractime = 1; //instantly wears off upon leaving - if (line->flags & ML_NOCLIMB) - fractime |= 1<<15; //more crazy &ing, as if music stuff wasn't enough - mo->player->powers[pw_nocontrol] = fractime; - if (bot) - bot->player->powers[pw_nocontrol] = fractime; - } - break; - - case 438: // Set player scale - if (mo) - { - mo->destscale = FixedDiv(P_AproxDistance(line->dx, line->dy), 100<destscale < FRACUNIT/100) - mo->destscale = FRACUNIT/100; - if (mo->player && bot) - bot->destscale = mo->destscale; - } - break; - - case 439: // Set texture - { - size_t linenum; - side_t *set = &sides[line->sidenum[0]], *this; - boolean always = !(line->flags & ML_NOCLIMB); // If noclimb: Only change mid texture if mid texture already exists on tagged lines, etc. - - for (linenum = 0; linenum < numlines; linenum++) - { - if (lines[linenum].special == 439) - continue; // Don't override other set texture lines! - - if (!Tag_Find(&lines[linenum].tags, tag)) - continue; // Find tagged lines - - // Front side - this = &sides[lines[linenum].sidenum[0]]; - if (always || this->toptexture) this->toptexture = set->toptexture; - if (always || this->midtexture) this->midtexture = set->midtexture; - if (always || this->bottomtexture) this->bottomtexture = set->bottomtexture; - - if (lines[linenum].sidenum[1] == 0xffff) - continue; // One-sided stops here. - - // Back side - this = &sides[lines[linenum].sidenum[1]]; - if (always || this->toptexture) this->toptexture = set->toptexture; - if (always || this->midtexture) this->midtexture = set->midtexture; - if (always || this->bottomtexture) this->bottomtexture = set->bottomtexture; - } - } - break; - - case 440: // Play race countdown and start Metal Sonic - if (!metalrecording && !metalplayback) - G_DoPlayMetal(); - break; - - case 441: // Trigger unlockable - if ((!modifiedgame || savemoddata) && !(netgame || multiplayer)) - { - INT32 trigid = (INT32)(sides[line->sidenum[0]].textureoffset>>FRACBITS); - - if (trigid < 0 || trigid > 31) // limited by 32 bit variable - CONS_Debug(DBG_GAMELOGIC, "Unlockable trigger (sidedef %hu): bad trigger ID %d\n", line->sidenum[0], trigid); - else - { - unlocktriggers |= 1 << trigid; - - // Unlocked something? - if (M_UpdateUnlockablesAndExtraEmblems()) - { - S_StartSound(NULL, sfx_s3k68); - G_SaveGameData(); // only save if unlocked something - } - } - } - - // Execute one time only - line->special = 0; - break; - - case 442: // Calls P_SetMobjState on mobjs of a given type in the tagged sectors - { - const mobjtype_t type = (mobjtype_t)sides[line->sidenum[0]].toptexture; - statenum_t state = NUMSTATES; - sector_t *sec; - mobj_t *thing; - - if (line->sidenum[1] != 0xffff) - state = (statenum_t)sides[line->sidenum[1]].toptexture; - - TAG_ITER_SECTORS(tag, secnum) - { - boolean tryagain; - sec = sectors + secnum; - do { - tryagain = false; - for (thing = sec->thinglist; thing; thing = thing->snext) - if (thing->type == type) - { - if (state != NUMSTATES) - { - if (!P_SetMobjState(thing, state)) // set state to specific state - { // mobj was removed - tryagain = true; // snext is corrupt, we'll have to start over. - break; - } - } - else if (!P_SetMobjState(thing, thing->state->nextstate)) // set state to nextstate - { // mobj was removed - tryagain = true; // snext is corrupt, we'll have to start over. - break; - } - } - } while (tryagain); - } - break; - } - - case 443: // Calls a named Lua function - if (line->stringargs[0]) - LUA_HookLinedefExecute(line, mo, callsec); - else - CONS_Alert(CONS_WARNING, "Linedef %s is missing the hook name of the Lua function to call! (This should be given in arg0str)\n", sizeu1(line-lines)); - break; - - case 444: // Earthquake camera - { - quake.intensity = sides[line->sidenum[0]].textureoffset; - quake.radius = sides[line->sidenum[0]].rowoffset; - quake.time = P_AproxDistance(line->dx, line->dy)>>FRACBITS; - - quake.epicenter = NULL; /// \todo - - // reasonable defaults. - if (!quake.intensity) - quake.intensity = 8<sidenum[0]].textureoffset>>FRACBITS); - INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); - sector_t *sec; // Sector that the FOF is visible (or not visible) in - ffloor_t *rover; // FOF to vanish/un-vanish - boolean foundrover = false; // for debug, "Can't find a FOF" message - ffloortype_e oldflags; // store FOF's old flags - - TAG_ITER_SECTORS(sectag, secnum) - { - sec = sectors + secnum; - - if (!sec->ffloors) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 445 Executor: Target sector #%d has no FOFs.\n", secnum); - return; - } - - for (rover = sec->ffloors; rover; rover = rover->next) - { - if (Tag_Find(&rover->master->frontsector->tags, foftag)) - { - foundrover = true; - - oldflags = rover->flags; - - // Abracadabra! - if (line->flags & ML_NOCLIMB) - rover->flags |= FF_EXISTS; - else - rover->flags &= ~FF_EXISTS; - - // if flags changed, reset sector's light list - if (rover->flags != oldflags) - { - sec->moved = true; - P_RecalcPrecipInSector(sec); - } - } - } - - if (!foundrover) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 445 Executor: Can't find a FOF control sector with tag %d\n", foftag); - return; - } - } - } - break; - - case 446: // Make block fall remotely (acts like FF_CRUMBLE) - { - INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); - INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); - sector_t *sec; // Sector that the FOF is visible in - ffloor_t *rover; // FOF that we are going to make fall down - boolean foundrover = false; // for debug, "Can't find a FOF" message - player_t *player = NULL; // player that caused FOF to fall - boolean respawn = true; // should the fallen FOF respawn? - - if (mo) // NULL check - player = mo->player; - - if (line->flags & ML_NOCLIMB) // don't respawn! - respawn = false; - - TAG_ITER_SECTORS(sectag, secnum) - { - sec = sectors + secnum; - - if (!sec->ffloors) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 446 Executor: Target sector #%d has no FOFs.\n", secnum); - return; - } - - for (rover = sec->ffloors; rover; rover = rover->next) - { - if (Tag_Find(&rover->master->frontsector->tags, foftag)) - { - foundrover = true; - - if (line->flags & ML_BLOCKMONSTERS) // FOF flags determine respawn ability instead? - respawn = !(rover->flags & FF_NORETURN) ^ !!(line->flags & ML_NOCLIMB); // no climb inverts - - EV_StartCrumble(rover->master->frontsector, rover, (rover->flags & FF_FLOATBOB), player, rover->alpha, respawn); - } - } - - if (!foundrover) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 446 Executor: Can't find a FOF control sector with tag %d\n", foftag); - return; - } - } - } - break; - - case 447: // Change colormap of tagged sectors! - // Basically this special applies a colormap to the tagged sectors, just like 606 (the colormap linedef) - // Except it is activated by linedef executor, not level load - // This could even override existing colormaps I believe - // -- Monster Iestyn 14/06/18 - { - extracolormap_t *source; - if (!udmf) - source = sides[line->sidenum[0]].colormap_data; - else - { - if (!line->args[1]) - source = line->frontsector->extra_colormap; - else - { - INT32 sourcesec = Tag_Iterate_Sectors(line->args[1], 0); - if (sourcesec == -1) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 447 Executor: Can't find sector with source colormap (tag %d)!\n", line->args[1]); - return; - } - source = sectors[sourcesec].extra_colormap; - } - } - TAG_ITER_SECTORS(line->args[0], secnum) - { - if (sectors[secnum].colormap_protected) - continue; - - P_ResetColormapFader(§ors[secnum]); - - if (line->args[2] & TMCF_RELATIVE) - { - extracolormap_t *target = (!udmf && (line->flags & ML_TFERLINE) && line->sidenum[1] != 0xFFFF) ? - sides[line->sidenum[1]].colormap_data : sectors[secnum].extra_colormap; // use back colormap instead of target sector - - extracolormap_t *exc = R_AddColormaps( - target, - source, - line->args[2] & TMCF_SUBLIGHTR, - line->args[2] & TMCF_SUBLIGHTG, - line->args[2] & TMCF_SUBLIGHTB, - line->args[2] & TMCF_SUBLIGHTA, - line->args[2] & TMCF_SUBFADER, - line->args[2] & TMCF_SUBFADEG, - line->args[2] & TMCF_SUBFADEB, - line->args[2] & TMCF_SUBFADEA, - line->args[2] & TMCF_SUBFADESTART, - line->args[2] & TMCF_SUBFADEEND, - line->args[2] & TMCF_IGNOREFLAGS, - false); - - if (!(sectors[secnum].extra_colormap = R_GetColormapFromList(exc))) - { - exc->colormap = R_CreateLightTable(exc); - R_AddColormapToList(exc); - sectors[secnum].extra_colormap = exc; - } - else - Z_Free(exc); - } - else - sectors[secnum].extra_colormap = source; - } - break; - } - case 448: // Change skybox viewpoint/centerpoint - if ((mo && mo->player && P_IsLocalPlayer(mo->player)) || (line->flags & ML_NOCLIMB)) - { - INT32 viewid = sides[line->sidenum[0]].textureoffset>>FRACBITS; - INT32 centerid = sides[line->sidenum[0]].rowoffset>>FRACBITS; - - if ((line->flags & (ML_EFFECT4|ML_BLOCKMONSTERS)) == ML_EFFECT4) // Solid Midtexture is on but Block Enemies is off? - { - CONS_Alert(CONS_WARNING, - M_GetText("Skybox switch linedef (tag %d) doesn't have anything to do.\nConsider changing the linedef's flag configuration or removing it entirely.\n"), - tag); - } - else - { - // set viewpoint mobj - if (!(line->flags & ML_EFFECT4)) // Solid Midtexture turns off viewpoint setting - { - if (viewid >= 0 && viewid < 16) - skyboxmo[0] = skyboxviewpnts[viewid]; - else - skyboxmo[0] = NULL; - } - - // set centerpoint mobj - if (line->flags & ML_BLOCKMONSTERS) // Block Enemies turns ON centerpoint setting - { - if (centerid >= 0 && centerid < 16) - skyboxmo[1] = skyboxcenterpnts[centerid]; - else - skyboxmo[1] = NULL; - } - } - - CONS_Debug(DBG_GAMELOGIC, "Line type 448 Executor: viewid = %d, centerid = %d, viewpoint? = %s, centerpoint? = %s\n", - viewid, - centerid, - ((line->flags & ML_EFFECT4) ? "no" : "yes"), - ((line->flags & ML_BLOCKMONSTERS) ? "yes" : "no")); - } - break; - - case 449: // Enable bosses with parameter - { - INT32 bossid = sides[line->sidenum[0]].textureoffset>>FRACBITS; - if (bossid & ~15) // if any bits other than first 16 are set - { - CONS_Alert(CONS_WARNING, - M_GetText("Boss enable linedef (tag %d) has an invalid texture x offset.\nConsider changing it or removing it entirely.\n"), - tag); - break; - } - if (line->flags & ML_NOCLIMB) - { - bossdisabled |= (1<sidenum[0]].textureoffset>>FRACBITS; - INT32 rvalue2 = sides[line->sidenum[0]].rowoffset>>FRACBITS; - INT32 result; - - if (rvalue1 <= rvalue2) - result = P_RandomRange(rvalue1, rvalue2); - else - result = P_RandomRange(rvalue2, rvalue1); - - P_LinedefExecute((INT16)result, mo, NULL); - break; - } - - case 452: // Set FOF alpha - { - INT16 destvalue = line->sidenum[1] != 0xffff ? - (INT16)(sides[line->sidenum[1]].textureoffset>>FRACBITS) : (INT16)(P_AproxDistance(line->dx, line->dy)>>FRACBITS); - INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); - INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); - sector_t *sec; // Sector that the FOF is visible in - ffloor_t *rover; // FOF that we are going to operate - boolean foundrover = false; // for debug, "Can't find a FOF" message - - TAG_ITER_SECTORS(sectag, secnum) - { - sec = sectors + secnum; - - if (!sec->ffloors) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 452 Executor: Target sector #%d has no FOFs.\n", secnum); - return; - } - - for (rover = sec->ffloors; rover; rover = rover->next) - { - if (Tag_Find(&rover->master->frontsector->tags, foftag)) - { - foundrover = true; - - // If fading an invisible FOF whose render flags we did not yet set, - // initialize its alpha to 1 - // for relative alpha calc - if (!(line->flags & ML_NOCLIMB) && // do translucent - (rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE - !(rover->spawnflags & FF_RENDERSIDES) && - !(rover->spawnflags & FF_RENDERPLANES) && - !(rover->flags & FF_RENDERALL)) - rover->alpha = 1; - - P_RemoveFakeFloorFader(rover); - P_FadeFakeFloor(rover, - rover->alpha, - max(1, min(256, (line->flags & ML_EFFECT3) ? rover->alpha + destvalue : destvalue)), - 0, // set alpha immediately - false, NULL, // tic-based logic - false, // do not handle FF_EXISTS - !(line->flags & ML_NOCLIMB), // handle FF_TRANSLUCENT - false, // do not handle lighting - false, // do not handle colormap - false, // do not handle collision - false, // do not do ghost fade (no collision during fade) - true); // use exact alpha values (for opengl) - } - } - - if (!foundrover) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 452 Executor: Can't find a FOF control sector with tag %d\n", foftag); - return; - } - } - break; - } - - case 453: // Fade FOF - { - INT16 destvalue = line->sidenum[1] != 0xffff ? - (INT16)(sides[line->sidenum[1]].textureoffset>>FRACBITS) : (INT16)(line->dx>>FRACBITS); - INT16 speed = line->sidenum[1] != 0xffff ? - (INT16)(abs(sides[line->sidenum[1]].rowoffset>>FRACBITS)) : (INT16)(abs(line->dy)>>FRACBITS); - INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); - INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); - sector_t *sec; // Sector that the FOF is visible in - ffloor_t *rover; // FOF that we are going to operate - boolean foundrover = false; // for debug, "Can't find a FOF" message - size_t j = 0; // sec->ffloors is saved as ffloor #0, ss->ffloors->next is #1, etc - - TAG_ITER_SECTORS(sectag, secnum) - { - sec = sectors + secnum; - - if (!sec->ffloors) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 453 Executor: Target sector #%d has no FOFs.\n", secnum); - return; - } - - for (rover = sec->ffloors; rover; rover = rover->next) - { - if (Tag_Find(&rover->master->frontsector->tags, foftag)) - { - foundrover = true; - - // Prevent continuous execs from interfering on an existing fade - if (!(line->flags & ML_EFFECT5) - && rover->fadingdata) - //&& ((fade_t*)rover->fadingdata)->timer > (ticbased ? 2 : speed*2)) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 453 Executor: Fade FOF thinker already exists, timer: %d\n", ((fade_t*)rover->fadingdata)->timer); - continue; - } - - if (speed > 0) - P_AddFakeFloorFader(rover, secnum, j, - destvalue, - speed, - (line->flags & ML_EFFECT4), // tic-based logic - (line->flags & ML_EFFECT3), // Relative destvalue - !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS - !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT - !(line->flags & ML_EFFECT2), // do not handle lighting - !(line->flags & ML_EFFECT2), // do not handle colormap (ran out of flags) - !(line->flags & ML_BOUNCY), // do not handle collision - (line->flags & ML_EFFECT1), // do ghost fade (no collision during fade) - (line->flags & ML_TFERLINE)); // use exact alpha values (for opengl) - else - { - // If fading an invisible FOF whose render flags we did not yet set, - // initialize its alpha to 1 - // for relative alpha calc - if (!(line->flags & ML_NOCLIMB) && // do translucent - (rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE - !(rover->spawnflags & FF_RENDERSIDES) && - !(rover->spawnflags & FF_RENDERPLANES) && - !(rover->flags & FF_RENDERALL)) - rover->alpha = 1; - - P_RemoveFakeFloorFader(rover); - P_FadeFakeFloor(rover, - rover->alpha, - max(1, min(256, (line->flags & ML_EFFECT3) ? rover->alpha + destvalue : destvalue)), - 0, // set alpha immediately - false, NULL, // tic-based logic - !(line->flags & ML_BLOCKMONSTERS), // do not handle FF_EXISTS - !(line->flags & ML_NOCLIMB), // do not handle FF_TRANSLUCENT - !(line->flags & ML_EFFECT2), // do not handle lighting - !(line->flags & ML_EFFECT2), // do not handle colormap (ran out of flags) - !(line->flags & ML_BOUNCY), // do not handle collision - (line->flags & ML_EFFECT1), // do ghost fade (no collision during fade) - (line->flags & ML_TFERLINE)); // use exact alpha values (for opengl) - } - } - j++; - } - - if (!foundrover) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 453 Executor: Can't find a FOF control sector with tag %d\n", foftag); - return; - } - } - break; - } - - case 454: // Stop fading FOF - { - INT16 sectag = (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS); - INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); - sector_t *sec; // Sector that the FOF is visible in - ffloor_t *rover; // FOF that we are going to operate - boolean foundrover = false; // for debug, "Can't find a FOF" message - - TAG_ITER_SECTORS(sectag, secnum) - { - sec = sectors + secnum; - - if (!sec->ffloors) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 454 Executor: Target sector #%d has no FOFs.\n", secnum); - return; - } - - for (rover = sec->ffloors; rover; rover = rover->next) - { - if (Tag_Find(&rover->master->frontsector->tags, foftag)) - { - foundrover = true; - - P_ResetFakeFloorFader(rover, NULL, - !(line->flags & ML_BLOCKMONSTERS)); // do not finalize collision flags - } - } - - if (!foundrover) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 454 Executor: Can't find a FOF control sector with tag %d\n", foftag); - return; - } - } - break; - } - - case 455: // Fade colormap - { - extracolormap_t *dest; - if (!udmf) - dest = sides[line->sidenum[0]].colormap_data; - else - { - if (!line->args[1]) - dest = line->frontsector->extra_colormap; - else - { - INT32 destsec = Tag_Iterate_Sectors(line->args[1], 0); - if (destsec == -1) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 455 Executor: Can't find sector with destination colormap (tag %d)!\n", line->args[1]); - return; - } - dest = sectors[destsec].extra_colormap; - } - } - - TAG_ITER_SECTORS(line->args[0], secnum) - { - extracolormap_t *source_exc, *dest_exc, *exc; - - if (sectors[secnum].colormap_protected) - continue; - - // Don't interrupt ongoing fade - if (!(line->args[3] & TMCF_OVERRIDE) - && sectors[secnum].fadecolormapdata) - //&& ((fadecolormap_t*)sectors[secnum].fadecolormapdata)->timer > (ticbased ? 2 : speed*2)) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 455 Executor: Fade color thinker already exists, timer: %d\n", ((fadecolormap_t*)sectors[secnum].fadecolormapdata)->timer); - continue; - } - - if (!udmf && (line->flags & ML_TFERLINE)) // use back colormap instead of target sector - sectors[secnum].extra_colormap = (line->sidenum[1] != 0xFFFF) ? - sides[line->sidenum[1]].colormap_data : NULL; - - exc = sectors[secnum].extra_colormap; - - if (!(line->args[3] & TMCF_FROMBLACK) // Override fade from default rgba - && !R_CheckDefaultColormap(dest, true, false, false) - && R_CheckDefaultColormap(exc, true, false, false)) - { - exc = R_CopyColormap(exc, false); - exc->rgba = R_GetRgbaRGB(dest->rgba) + R_PutRgbaA(R_GetRgbaA(exc->rgba)); - //exc->fadergba = R_GetRgbaRGB(dest->rgba) + R_PutRgbaA(R_GetRgbaA(exc->fadergba)); - - if (!(source_exc = R_GetColormapFromList(exc))) - { - exc->colormap = R_CreateLightTable(exc); - R_AddColormapToList(exc); - source_exc = exc; - } - else - Z_Free(exc); - - sectors[secnum].extra_colormap = source_exc; - } - else - source_exc = exc ? exc : R_GetDefaultColormap(); - - if (line->args[3] & TMCF_RELATIVE) - { - exc = R_AddColormaps( - source_exc, - dest, - line->args[3] & TMCF_SUBLIGHTR, - line->args[3] & TMCF_SUBLIGHTG, - line->args[3] & TMCF_SUBLIGHTB, - line->args[3] & TMCF_SUBLIGHTA, - line->args[3] & TMCF_SUBFADER, - line->args[3] & TMCF_SUBFADEG, - line->args[3] & TMCF_SUBFADEB, - line->args[3] & TMCF_SUBFADEA, - line->args[3] & TMCF_SUBFADESTART, - line->args[3] & TMCF_SUBFADEEND, - line->args[3] & TMCF_IGNOREFLAGS, - false); - } - else - exc = R_CopyColormap(dest, false); - - if (!(dest_exc = R_GetColormapFromList(exc))) - { - exc->colormap = R_CreateLightTable(exc); - R_AddColormapToList(exc); - dest_exc = exc; - } - else - Z_Free(exc); - - Add_ColormapFader(§ors[secnum], source_exc, dest_exc, true, // tic-based timing - line->args[2]); - } - break; - } - case 456: // Stop fade colormap - TAG_ITER_SECTORS(line->args[0], secnum) - P_ResetColormapFader(§ors[secnum]); - break; - - case 457: // Track mobj angle to point - if (mo) - { - INT32 failureangle = FixedAngle((min(max(abs(sides[line->sidenum[0]].textureoffset>>FRACBITS), 0), 360))*FRACUNIT); - INT32 failuredelay = abs(sides[line->sidenum[0]].rowoffset>>FRACBITS); - INT32 failureexectag = line->sidenum[1] != 0xffff ? - (INT32)(sides[line->sidenum[1]].textureoffset>>FRACBITS) : 0; - boolean persist = (line->flags & ML_EFFECT2); - mobj_t *anchormo; - - if ((secnum = Tag_Iterate_Sectors(tag, 0)) < 0) - return; - - anchormo = P_GetObjectTypeInSectorNum(MT_ANGLEMAN, secnum); - if (!anchormo) - return; - - mo->eflags |= MFE_TRACERANGLE; - P_SetTarget(&mo->tracer, anchormo); - mo->lastlook = persist; // don't disable behavior after first failure - mo->extravalue1 = failureangle; // angle to exceed for failure state - mo->extravalue2 = failureexectag; // exec tag for failure state (angle is not within range) - mo->cusval = mo->cvmem = failuredelay; // cusval = tics to allow failure before line trigger; cvmem = decrement timer - } - break; - - case 458: // Stop tracking mobj angle to point - if (mo && (mo->eflags & MFE_TRACERANGLE)) - { - mo->eflags &= ~MFE_TRACERANGLE; - P_SetTarget(&mo->tracer, NULL); - mo->lastlook = mo->cvmem = mo->cusval = mo->extravalue1 = mo->extravalue2 = 0; - } - break; - - case 459: // Control Text Prompt - // console player only unless NOCLIMB is set - if (mo && mo->player && P_IsLocalPlayer(mo->player) && (!bot || bot != mo)) - { - INT32 promptnum = max(0, (sides[line->sidenum[0]].textureoffset>>FRACBITS)-1); - INT32 pagenum = max(0, (sides[line->sidenum[0]].rowoffset>>FRACBITS)-1); - INT32 postexectag = abs((line->sidenum[1] != 0xFFFF) ? sides[line->sidenum[1]].textureoffset>>FRACBITS : tag); - - boolean closetextprompt = (line->flags & ML_BLOCKMONSTERS); - //boolean allplayers = (line->flags & ML_NOCLIMB); - boolean runpostexec = (line->flags & ML_EFFECT1); - boolean blockcontrols = !(line->flags & ML_EFFECT2); - boolean freezerealtime = !(line->flags & ML_EFFECT3); - //boolean freezethinkers = (line->flags & ML_EFFECT4); - boolean callbynamedtag = (line->flags & ML_TFERLINE); - - if (closetextprompt) - F_EndTextPrompt(false, false); - else - { - if (callbynamedtag && sides[line->sidenum[0]].text && sides[line->sidenum[0]].text[0]) - F_GetPromptPageByNamedTag(sides[line->sidenum[0]].text, &promptnum, &pagenum); - F_StartTextPrompt(promptnum, pagenum, mo, runpostexec ? postexectag : 0, blockcontrols, freezerealtime); - } - } - break; - - case 460: // Award rings - { - INT16 rings = (sides[line->sidenum[0]].textureoffset>>FRACBITS); - INT32 delay = (sides[line->sidenum[0]].rowoffset>>FRACBITS); - if (mo && mo->player) - { - if (delay <= 0 || !(leveltime % delay)) - P_GivePlayerRings(mo->player, rings); - } - } - break; - - case 461: // Spawns an object on the map based on texture offsets - { - const mobjtype_t type = (mobjtype_t)(sides[line->sidenum[0]].toptexture); - mobj_t *mobj; - - fixed_t x, y, z; - x = sides[line->sidenum[0]].textureoffset; - y = sides[line->sidenum[0]].rowoffset; - z = line->frontsector->floorheight; - - if (line->flags & ML_NOCLIMB) // If noclimb is set, spawn randomly within a range - { - if (line->sidenum[1] != 0xffff) // Make sure the linedef has a back side - { - x = P_RandomRange(sides[line->sidenum[0]].textureoffset>>FRACBITS, sides[line->sidenum[1]].textureoffset>>FRACBITS)<sidenum[0]].rowoffset>>FRACBITS, sides[line->sidenum[1]].rowoffset>>FRACBITS)<frontsector->floorheight>>FRACBITS, line->frontsector->ceilingheight>>FRACBITS)<special); - break; - } - } - - mobj = P_SpawnMobj(x, y, z, type); - if (mobj) - { - if (line->flags & ML_EFFECT1) - mobj->angle = R_PointToAngle2(line->v1->x, line->v1->y, line->v2->x, line->v2->y); - CONS_Debug(DBG_GAMELOGIC, "Linedef Type %d - Spawn Object: %d spawned at (%d, %d, %d)\n", line->special, mobj->type, mobj->x>>FRACBITS, mobj->y>>FRACBITS, mobj->z>>FRACBITS); //TODO: Convert mobj->type to a string somehow. - } - else - CONS_Alert(CONS_ERROR,"Linedef Type %d - Spawn Object: Object did not spawn!\n", line->special); - } - break; - - case 462: // Stop clock (and end level in record attack) - if (G_PlatformGametype()) - { - stoppedclock = true; - CONS_Debug(DBG_GAMELOGIC, "Clock stopped!\n"); - if (modeattacking) - { - UINT8 i; - for (i = 0; i < MAXPLAYERS; i++) - { - if (!playeringame[i]) - continue; - P_DoPlayerExit(&players[i]); - } - } - } - break; - - case 463: // Dye object - { - INT32 color = sides[line->sidenum[0]].toptexture; - - if (mo) - { - if (color < 0 || color >= numskincolors) - return; - - var1 = 0; - var2 = color; - A_Dye(mo); - } - } - break; - - case 464: // Trigger Egg Capsule - { - thinker_t *th; - mobj_t *mo2; - - // Find the center of the Eggtrap and release all the pretty animals! - // The chimps are my friends.. heeheeheheehehee..... - LouisJM - for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) - { - if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) - continue; - - mo2 = (mobj_t *)th; - - if (mo2->type != MT_EGGTRAP) - continue; - - if (!mo2->spawnpoint) - continue; - - if (mo2->spawnpoint->angle != tag) - continue; - - P_KillMobj(mo2, NULL, mo, 0); - } - - if (!(line->flags & ML_NOCLIMB)) - { - INT32 i; - - // Mark all players with the time to exit thingy! - for (i = 0; i < MAXPLAYERS; i++) - { - if (!playeringame[i]) - continue; - P_DoPlayerExit(&players[i]); - } - } - } - break; - - case 465: // Set linedef executor delay - { - INT32 linenum; - - if (!udmf) - break; - - TAG_ITER_LINES(line->args[0], linenum) - { - if (line->args[2]) - lines[linenum].executordelay += line->args[1]; - else - lines[linenum].executordelay = line->args[1]; - } - } - break; - - case 466: // Set level failure state - { - if (line->flags & ML_NOCLIMB) - { - stagefailed = false; - CONS_Debug(DBG_GAMELOGIC, "Stage can be completed successfully!\n"); - } - else - { - stagefailed = true; - CONS_Debug(DBG_GAMELOGIC, "Stage will end in failure...\n"); - } - } - break; - - case 480: // Polyobj_DoorSlide - case 481: // Polyobj_DoorSwing - PolyDoor(line); - break; - case 482: // Polyobj_Move - case 483: // Polyobj_OR_Move - PolyMove(line); - break; - case 484: // Polyobj_RotateRight - case 485: // Polyobj_OR_RotateRight - case 486: // Polyobj_RotateLeft - case 487: // Polyobj_OR_RotateLeft - PolyRotate(line); - break; - case 488: // Polyobj_Waypoint - PolyWaypoint(line); - break; - case 489: - PolyInvisible(line); - break; - case 490: - PolyVisible(line); - break; - case 491: - PolyTranslucency(line); - break; - case 492: - PolyFade(line); - break; - - default: - break; - } -} - -// -// P_SetupSignExit -// -// Finds the exit sign in the current sector and -// sets its target to the player who passed the map. -// -void P_SetupSignExit(player_t *player) -{ - mobj_t *thing; - msecnode_t *node = player->mo->subsector->sector->touching_thinglist; // things touching this sector - thinker_t *think; - INT32 numfound = 0; - - for (; node; node = node->m_thinglist_next) - { - thing = node->m_thing; - if (thing->type != MT_SIGN) - continue; - - if (!numfound - && !(player->mo->target && player->mo->target->type == MT_SIGN) - && !((gametyperules & GTR_FRIENDLY) && (netgame || multiplayer) && cv_exitmove.value)) - P_SetTarget(&player->mo->target, thing); - - if (thing->state != &states[thing->info->spawnstate]) - continue; - - P_SetTarget(&thing->target, player->mo); - P_SetObjectMomZ(thing, 12*FRACUNIT, false); - P_SetMobjState(thing, S_SIGNSPIN1); - if (thing->info->seesound) - S_StartSound(thing, thing->info->seesound); - - ++numfound; - } - - if (numfound) - return; - - // didn't find any signposts in the exit sector. - // spin all signposts in the level then. - for (think = thlist[THINK_MOBJ].next; think != &thlist[THINK_MOBJ]; think = think->next) - { - if (think->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) - continue; - - thing = (mobj_t *)think; - if (thing->type != MT_SIGN) - continue; - - if (!numfound - && !(player->mo->target && player->mo->target->type == MT_SIGN) - && !((gametyperules & GTR_FRIENDLY) && (netgame || multiplayer) && cv_exitmove.value)) - P_SetTarget(&player->mo->target, thing); - - if (thing->state != &states[thing->info->spawnstate]) - continue; - - P_SetTarget(&thing->target, player->mo); - P_SetObjectMomZ(thing, 12*FRACUNIT, false); - P_SetMobjState(thing, S_SIGNSPIN1); - if (thing->info->seesound) - S_StartSound(thing, thing->info->seesound); - - ++numfound; - } -} - -// -// P_IsFlagAtBase -// -// Checks to see if a flag is at its base. -// -boolean P_IsFlagAtBase(mobjtype_t flag) -{ - thinker_t *think; - mobj_t *mo; - INT32 specialnum = (flag == MT_REDFLAG) ? 3 : 4; - - for (think = thlist[THINK_MOBJ].next; think != &thlist[THINK_MOBJ]; think = think->next) - { - if (think->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) - continue; - - mo = (mobj_t *)think; - - if (mo->type != flag) - continue; - - if (GETSECSPECIAL(mo->subsector->sector->special, 4) == specialnum) - return true; - else if (mo->subsector->sector->ffloors) // Check the 3D floors - { - ffloor_t *rover; - - for (rover = mo->subsector->sector->ffloors; rover; rover = rover->next) - { - if (!(rover->flags & FF_EXISTS)) - continue; - - if (GETSECSPECIAL(rover->master->frontsector->special, 4) != specialnum) - continue; - - if (!(mo->z <= P_GetSpecialTopZ(mo, sectors + rover->secnum, mo->subsector->sector) - && mo->z >= P_GetSpecialBottomZ(mo, sectors + rover->secnum, mo->subsector->sector))) - continue; - - return true; - } - } - } - return false; -} - -// -// P_PlayerTouchingSectorSpecial -// -// Replaces the old player->specialsector. -// This allows a player to touch more than -// one sector at a time, if necessary. -// -// Returns a pointer to the first sector of -// the particular type that it finds. -// Returns NULL if it doesn't find it. -// -sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 number) -{ - msecnode_t *node; - ffloor_t *rover; - - if (!player->mo) - return NULL; - - // Check default case first - if (GETSECSPECIAL(player->mo->subsector->sector->special, section) == number) - return player->mo->subsector->sector; - - // Hmm.. maybe there's a FOF that has it... - for (rover = player->mo->subsector->sector->ffloors; rover; rover = rover->next) - { - fixed_t topheight, bottomheight; - - if (GETSECSPECIAL(rover->master->frontsector->special, section) != number) - continue; - - if (!(rover->flags & FF_EXISTS)) - continue; - - topheight = P_GetSpecialTopZ(player->mo, sectors + rover->secnum, player->mo->subsector->sector); - bottomheight = P_GetSpecialBottomZ(player->mo, sectors + rover->secnum, player->mo->subsector->sector); - - // Check the 3D floor's type... - if (rover->flags & FF_BLOCKPLAYER) - { - boolean floorallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_FLOOR) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z == topheight)); - boolean ceilingallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_CEILING) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z + player->mo->height == bottomheight)); - // Thing must be on top of the floor to be affected... - if (!(floorallowed || ceilingallowed)) - continue; - } - else - { - // Water and DEATH FOG!!! heh - if (player->mo->z > topheight || (player->mo->z + player->mo->height) < bottomheight) - continue; - } - - // This FOF has the special we're looking for! - return rover->master->frontsector; - } - - for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) - { - if (GETSECSPECIAL(node->m_sector->special, section) == number) - { - // This sector has the special we're looking for, but - // are we allowed to touch it? - if (node->m_sector == player->mo->subsector->sector - || (node->m_sector->flags & SF_TRIGGERSPECIAL_TOUCH)) - return node->m_sector; - } - - // Hmm.. maybe there's a FOF that has it... - for (rover = node->m_sector->ffloors; rover; rover = rover->next) - { - fixed_t topheight, bottomheight; - - if (GETSECSPECIAL(rover->master->frontsector->special, section) != number) - continue; - - if (!(rover->flags & FF_EXISTS)) - continue; - - topheight = P_GetSpecialTopZ(player->mo, sectors + rover->secnum, player->mo->subsector->sector); - bottomheight = P_GetSpecialBottomZ(player->mo, sectors + rover->secnum, player->mo->subsector->sector); - - // Check the 3D floor's type... - if (rover->flags & FF_BLOCKPLAYER) - { - boolean floorallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_FLOOR) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z == topheight)); - boolean ceilingallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_CEILING) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z + player->mo->height == bottomheight)); - // Thing must be on top of the floor to be affected... - if (!(floorallowed || ceilingallowed)) - continue; - } - else - { - // Water and DEATH FOG!!! heh - if (player->mo->z > topheight || (player->mo->z + player->mo->height) < bottomheight) - continue; - } - - // This FOF has the special we're looking for, but are we allowed to touch it? - if (node->m_sector == player->mo->subsector->sector - || (rover->master->frontsector->flags & SF_TRIGGERSPECIAL_TOUCH)) - return rover->master->frontsector; - } - } - - return NULL; -} - -// -// P_ThingIsOnThe3DFloor -// -// This checks whether the mobj is on/in the FOF we want it to be at -// Needed for the "All players" trigger sector specials only -// -static boolean P_ThingIsOnThe3DFloor(mobj_t *mo, sector_t *sector, sector_t *targetsec) -{ - ffloor_t *rover; - fixed_t top, bottom; - - if (!mo->player) // should NEVER happen - return false; - - if (!targetsec->ffloors) // also should NEVER happen - return false; - - for (rover = targetsec->ffloors; rover; rover = rover->next) - { - if (rover->master->frontsector != sector) - continue; - - // we're assuming the FOF existed when the first player touched it - //if (!(rover->flags & FF_EXISTS)) - // return false; - - top = P_GetSpecialTopZ(mo, sector, targetsec); - bottom = P_GetSpecialBottomZ(mo, sector, targetsec); - - // Check the 3D floor's type... - if (rover->flags & FF_BLOCKPLAYER) - { - boolean floorallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_FLOOR) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(mo->eflags & MFE_VERTICALFLIP)) && (mo->z == top)); - boolean ceilingallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_CEILING) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (mo->eflags & MFE_VERTICALFLIP)) && (mo->z + mo->height == bottom)); - // Thing must be on top of the floor to be affected... - if (!(floorallowed || ceilingallowed)) - continue; - } - else - { - // Water and intangible FOFs - if (mo->z > top || (mo->z + mo->height) < bottom) - return false; - } - - return true; - } - - return false; -} - -// -// P_MobjReadyToTrigger -// -// Is player standing on the sector's "ground"? -// -static boolean P_MobjReadyToTrigger(mobj_t *mo, sector_t *sec) -{ - boolean floorallowed = ((sec->flags & SF_FLIPSPECIAL_FLOOR) && ((sec->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(mo->eflags & MFE_VERTICALFLIP)) && (mo->z == P_GetSpecialBottomZ(mo, sec, sec))); - boolean ceilingallowed = ((sec->flags & SF_FLIPSPECIAL_CEILING) && ((sec->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (mo->eflags & MFE_VERTICALFLIP)) && (mo->z + mo->height == P_GetSpecialTopZ(mo, sec, sec))); - // Thing must be on top of the floor to be affected... - return (floorallowed || ceilingallowed); -} - -/** Applies a sector special to a player. - * - * \param player Player in the sector. - * \param sector Sector with the special. - * \param roversector If !NULL, sector is actually an FOF; otherwise, sector - * is being physically contacted by the player. - * \todo Split up into multiple functions. - * \sa P_PlayerInSpecialSector, P_PlayerOnSpecial3DFloor - */ -void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *roversector) -{ - INT32 i = 0; - INT32 section1, section2, section3, section4; - INT32 special; - mtag_t sectag = Tag_FGet(§or->tags); - - section1 = GETSECSPECIAL(sector->special, 1); - section2 = GETSECSPECIAL(sector->special, 2); - section3 = GETSECSPECIAL(sector->special, 3); - section4 = GETSECSPECIAL(sector->special, 4); - - // Ignore spectators - if (player->spectator) - return; - - // Ignore dead players. - // If this strange phenomenon could be potentially used in levels, - // TODO: modify this to accommodate for it. - if (player->playerstate != PST_LIVE) - return; - - // Conveyor stuff - if (section3 == 2 || section3 == 4) - player->onconveyor = section3; - - special = section1; - - // Process Section 1 - switch (special) - { - case 1: // Damage (Generic) - if (roversector || P_MobjReadyToTrigger(player->mo, sector)) - P_DamageMobj(player->mo, NULL, NULL, 1, 0); - break; - case 2: // Damage (Water) - if ((roversector || P_MobjReadyToTrigger(player->mo, sector)) && (player->powers[pw_underwater] || player->powers[pw_carry] == CR_NIGHTSMODE)) - P_DamageMobj(player->mo, NULL, NULL, 1, DMG_WATER); - break; - case 3: // Damage (Fire) - if (roversector || P_MobjReadyToTrigger(player->mo, sector)) - P_DamageMobj(player->mo, NULL, NULL, 1, DMG_FIRE); - break; - case 4: // Damage (Electrical) - if (roversector || P_MobjReadyToTrigger(player->mo, sector)) - P_DamageMobj(player->mo, NULL, NULL, 1, DMG_ELECTRIC); - break; - case 5: // Spikes - if (roversector || P_MobjReadyToTrigger(player->mo, sector)) - P_DamageMobj(player->mo, NULL, NULL, 1, DMG_SPIKE); - break; - case 6: // Death Pit (Camera Mod) - case 7: // Death Pit (No Camera Mod) - if (roversector || P_MobjReadyToTrigger(player->mo, sector)) - { - if (player->quittime) - G_MovePlayerToSpawnOrStarpost(player - players); - else - P_DamageMobj(player->mo, NULL, NULL, 1, DMG_DEATHPIT); - } - break; - case 8: // Instant Kill - if (player->quittime) - G_MovePlayerToSpawnOrStarpost(player - players); - else - P_DamageMobj(player->mo, NULL, NULL, 1, DMG_INSTAKILL); - break; - case 9: // Ring Drainer (Floor Touch) - case 10: // Ring Drainer (No Floor Touch) - if (leveltime % (TICRATE/2) == 0 && player->rings > 0) - { - player->rings--; - S_StartSound(player->mo, sfx_antiri); - } - break; - case 11: // Special Stage Damage - if (player->exiting || player->bot) // Don't do anything for bots or players who have just finished - break; - - if (!(player->powers[pw_shield] || player->spheres > 0)) // Don't do anything if no shield or spheres anyway - break; - - P_SpecialStageDamage(player, NULL, NULL); - break; - case 12: // Space Countdown - if (!(player->powers[pw_shield] & SH_PROTECTWATER) && !player->powers[pw_spacetime]) - player->powers[pw_spacetime] = spacetimetics + 1; - break; - case 13: // Ramp Sector (Increase step-up/down) - case 14: // Non-Ramp Sector (Don't step-down) - case 15: // Unused - break; - } - - special = section2; - - // Process Section 2 - switch (special) - { - case 1: // Trigger Linedef Exec (Pushable Objects) - break; - case 2: // Linedef executor requires all players present+doesn't require touching floor - case 3: // Linedef executor requires all players present - /// \todo check continues for proper splitscreen support? - for (i = 0; i < MAXPLAYERS; i++) - { - if (!playeringame[i]) - continue; - if (!players[i].mo) - continue; - if (players[i].spectator) - continue; - if (players[i].bot) - continue; - if (G_CoopGametype() && players[i].lives <= 0) - continue; - if (roversector) - { - if (sector->flags & SF_TRIGGERSPECIAL_TOUCH) - { - msecnode_t *node; - for (node = players[i].mo->touching_sectorlist; node; node = node->m_sectorlist_next) - { - if (P_ThingIsOnThe3DFloor(players[i].mo, sector, node->m_sector)) - break; - } - if (!node) - goto DoneSection2; - } - else if (players[i].mo->subsector && !P_ThingIsOnThe3DFloor(players[i].mo, sector, players[i].mo->subsector->sector)) // this function handles basically everything for us lmao - goto DoneSection2; - } - else - { - if (players[i].mo->subsector->sector == sector) - ; - else if (sector->flags & SF_TRIGGERSPECIAL_TOUCH) - { - msecnode_t *node; - for (node = players[i].mo->touching_sectorlist; node; node = node->m_sectorlist_next) - { - if (node->m_sector == sector) - break; - } - if (!node) - goto DoneSection2; - } - else - goto DoneSection2; - - if (special == 3 && !P_MobjReadyToTrigger(players[i].mo, sector)) - goto DoneSection2; - } - } - /* FALLTHRU */ - case 4: // Linedef executor that doesn't require touching floor - case 5: // Linedef executor - case 6: // Linedef executor (7 Emeralds) - case 7: // Linedef executor (NiGHTS Mare) - if (!player->bot) - P_LinedefExecute(sectag, player->mo, sector); - break; - case 8: // Tells pushable things to check FOFs - break; - case 9: // Egg trap capsule - { - thinker_t *th; - mobj_t *mo2; - line_t junk; - - if (player->bot || sector->ceilingdata || sector->floordata) - return; - - // Find the center of the Eggtrap and release all the pretty animals! - // The chimps are my friends.. heeheeheheehehee..... - LouisJM - for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) - { - if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) - continue; - mo2 = (mobj_t *)th; - if (mo2->type != MT_EGGTRAP) - continue; - P_KillMobj(mo2, NULL, player->mo, 0); - } - - // clear the special so you can't push the button twice. - sector->special = 0; - - // Initialize my junk - junk.tags.tags = NULL; - junk.tags.count = 0; - - // Move the button down - Tag_FSet(&junk.tags, LE_CAPSULE0); - EV_DoElevator(&junk, elevateDown, false); - - // Open the top FOF - Tag_FSet(&junk.tags, LE_CAPSULE1); - EV_DoFloor(&junk, raiseFloorToNearestFast); - // Open the bottom FOF - Tag_FSet(&junk.tags, LE_CAPSULE2); - EV_DoCeiling(&junk, lowerToLowestFast); - - // Mark all players with the time to exit thingy! - for (i = 0; i < MAXPLAYERS; i++) - { - if (!playeringame[i]) - continue; - P_DoPlayerExit(&players[i]); - } - break; - } - case 10: // Special Stage Time/Rings - case 11: // Custom Gravity - break; - case 12: // Lua sector special - break; - } -DoneSection2: - - special = section3; - - // Process Section 3 - switch (special) - { - case 1: // Unused - case 2: // Wind/Current - case 3: // Unused - case 4: // Conveyor Belt - break; - - case 5: // Speed pad - if (player->powers[pw_flashing] != 0 && player->powers[pw_flashing] < TICRATE/2) - break; - - i = Tag_FindLineSpecial(4, sectag); - - if (i != -1) - { - angle_t lineangle; - fixed_t linespeed; - fixed_t sfxnum; - - lineangle = R_PointToAngle2(lines[i].v1->x, lines[i].v1->y, lines[i].v2->x, lines[i].v2->y); - linespeed = sides[lines[i].sidenum[0]].textureoffset; - - if (linespeed == 0) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: Speed pad (tag %d) at zero speed.\n", sectag); - break; - } - - player->mo->angle = player->drawangle = lineangle; - - if (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG) - P_SetPlayerAngle(player, player->mo->angle); - - if (!(lines[i].flags & ML_EFFECT4)) - { - P_UnsetThingPosition(player->mo); - if (roversector) // make FOF speed pads work - { - player->mo->x = roversector->soundorg.x; - player->mo->y = roversector->soundorg.y; - } - else - { - player->mo->x = sector->soundorg.x; - player->mo->y = sector->soundorg.y; - } - P_SetThingPosition(player->mo); - } - - P_InstaThrust(player->mo, player->mo->angle, linespeed); - - if (lines[i].flags & ML_EFFECT5) // Roll! - { - if (!(player->pflags & PF_SPINNING)) - player->pflags |= PF_SPINNING; - - P_SetPlayerMobjState(player->mo, S_PLAY_ROLL); - } - - player->powers[pw_flashing] = TICRATE/3; - - sfxnum = sides[lines[i].sidenum[0]].toptexture; - - if (!sfxnum) - sfxnum = sfx_spdpad; - - S_StartSound(player->mo, sfxnum); - } - break; - - case 6: // Unused - case 7: // Unused - case 8: // Unused - case 9: // Unused - case 10: // Unused - case 11: // Unused - case 12: // Unused - case 13: // Unused - case 14: // Unused - case 15: // Unused - break; - } - - special = section4; - - // Process Section 4 - switch (special) - { - case 1: // Starpost Activator - { - mobj_t *post = P_GetObjectTypeInSectorNum(MT_STARPOST, sector - sectors); - - if (!post) - break; - - P_TouchStarPost(post, player, false); - break; - } - - case 2: // Special stage GOAL sector / Exit Sector / CTF Flag Return - if (player->bot || !(gametyperules & GTR_ALLOWEXIT)) - break; - if (!(maptol & TOL_NIGHTS) && G_IsSpecialStage(gamemap) && player->nightstime > 6) - { - player->nightstime = 6; // Just let P_Ticker take care of the rest. - return; - } - - // Exit (for FOF exits; others are handled in P_PlayerThink in p_user.c) - { - INT32 lineindex; - - P_DoPlayerFinish(player); - - P_SetupSignExit(player); - // important: use sector->tag on next line instead of player->mo->subsector->tag - // this part is different from in P_PlayerThink, this is what was causing - // FOF custom exits not to work. - lineindex = Tag_FindLineSpecial(2, sectag); - - if (G_CoopGametype() && lineindex != -1) // Custom exit! - { - // Special goodies with the block monsters flag depending on emeralds collected - if ((lines[lineindex].flags & ML_BLOCKMONSTERS) && ALL7EMERALDS(emeralds)) - nextmapoverride = (INT16)(lines[lineindex].frontsector->ceilingheight>>FRACBITS); - else - nextmapoverride = (INT16)(lines[lineindex].frontsector->floorheight>>FRACBITS); - - if (lines[lineindex].flags & ML_NOCLIMB) - skipstats = 1; - } - } - break; - - case 3: // Red Team's Base - if ((gametyperules & GTR_TEAMFLAGS) && P_IsObjectOnGround(player->mo)) - { - if (player->ctfteam == 1 && (player->gotflag & GF_BLUEFLAG)) - { - mobj_t *mo; - - // Make sure the red team still has their own - // flag at their base so they can score. - if (!P_IsFlagAtBase(MT_REDFLAG)) - break; - - HU_SetCEchoFlags(V_AUTOFADEOUT|V_ALLOWLOWERCASE); - HU_SetCEchoDuration(5); - HU_DoCEcho(va(M_GetText("\205%s\200\\CAPTURED THE \204BLUE FLAG\200.\\\\\\\\"), player_names[player-players])); - - if (splitscreen || players[consoleplayer].ctfteam == 1) - S_StartSound(NULL, sfx_flgcap); - else if (players[consoleplayer].ctfteam == 2) - S_StartSound(NULL, sfx_lose); - - mo = P_SpawnMobj(player->mo->x,player->mo->y,player->mo->z,MT_BLUEFLAG); - player->gotflag &= ~GF_BLUEFLAG; - mo->flags &= ~MF_SPECIAL; - mo->fuse = TICRATE; - mo->spawnpoint = bflagpoint; - mo->flags2 |= MF2_JUSTATTACKED; - redscore += 1; - P_AddPlayerScore(player, 250); - } - } - break; - - case 4: // Blue Team's Base - if ((gametyperules & GTR_TEAMFLAGS) && P_IsObjectOnGround(player->mo)) - { - if (player->ctfteam == 2 && (player->gotflag & GF_REDFLAG)) - { - mobj_t *mo; - - // Make sure the blue team still has their own - // flag at their base so they can score. - if (!P_IsFlagAtBase(MT_BLUEFLAG)) - break; - - HU_SetCEchoFlags(V_AUTOFADEOUT|V_ALLOWLOWERCASE); - HU_SetCEchoDuration(5); - HU_DoCEcho(va(M_GetText("\204%s\200\\CAPTURED THE \205RED FLAG\200.\\\\\\\\"), player_names[player-players])); - - if (splitscreen || players[consoleplayer].ctfteam == 2) - S_StartSound(NULL, sfx_flgcap); - else if (players[consoleplayer].ctfteam == 1) - S_StartSound(NULL, sfx_lose); - - mo = P_SpawnMobj(player->mo->x,player->mo->y,player->mo->z,MT_REDFLAG); - player->gotflag &= ~GF_REDFLAG; - mo->flags &= ~MF_SPECIAL; - mo->fuse = TICRATE; - mo->spawnpoint = rflagpoint; - mo->flags2 |= MF2_JUSTATTACKED; - bluescore += 1; - P_AddPlayerScore(player, 250); - } - } - break; - - case 5: // Fan sector - player->mo->momz += mobjinfo[MT_FAN].mass/4; - - if (player->mo->momz > mobjinfo[MT_FAN].mass) - player->mo->momz = mobjinfo[MT_FAN].mass; - - P_ResetPlayer(player); - if (player->panim != PA_FALL) - P_SetPlayerMobjState(player->mo, S_PLAY_FALL); - break; - - case 6: // Super Sonic transformer - if (player->mo->health > 0 && !player->bot && (player->charflags & SF_SUPER) && !player->powers[pw_super] && ALL7EMERALDS(emeralds)) - P_DoSuperTransformation(player, true); - break; - - case 7: // Make player spin - if (!(player->pflags & PF_SPINNING)) - { - player->pflags |= PF_SPINNING; - P_SetPlayerMobjState(player->mo, S_PLAY_ROLL); - S_StartAttackSound(player->mo, sfx_spin); - - if (abs(player->rmomx) < FixedMul(5*FRACUNIT, player->mo->scale) - && abs(player->rmomy) < FixedMul(5*FRACUNIT, player->mo->scale)) - P_InstaThrust(player->mo, player->mo->angle, FixedMul(10*FRACUNIT, player->mo->scale)); - } - break; - - case 8: // Zoom Tube Start - { - INT32 sequence; - fixed_t speed; - INT32 lineindex; - mobj_t *waypoint = NULL; - angle_t an; - - if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT && player->powers[pw_carry] == CR_ZOOMTUBE) - break; - - if (player->powers[pw_ignorelatch] & (1<<15)) - break; - - // Find line #3 tagged to this sector - lineindex = Tag_FindLineSpecial(3, sectag); - - if (lineindex == -1) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: Sector special %d missing line special #3.\n", sector->special); - break; - } - - // Grab speed and sequence values - speed = abs(sides[lines[lineindex].sidenum[0]].textureoffset)/8; - sequence = abs(sides[lines[lineindex].sidenum[0]].rowoffset)>>FRACBITS; - - if (speed == 0) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: Waypoint sequence %d at zero speed.\n", sequence); - break; - } - - waypoint = P_GetFirstWaypoint(sequence); - - if (!waypoint) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: FIRST WAYPOINT IN SEQUENCE %d NOT FOUND.\n", sequence); - break; - } - else - { - CONS_Debug(DBG_GAMELOGIC, "Waypoint %d found in sequence %d - speed = %d\n", waypoint->health, sequence, speed); - } - - an = R_PointToAngle2(player->mo->x, player->mo->y, waypoint->x, waypoint->y) - player->mo->angle; - - if (an > ANGLE_90 && an < ANGLE_270 && !(lines[lineindex].flags & ML_EFFECT4)) - break; // behind back - - P_SetTarget(&player->mo->tracer, waypoint); - player->powers[pw_carry] = CR_ZOOMTUBE; - player->speed = speed; - player->pflags |= PF_SPINNING; - player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE|PF_GLIDING|PF_BOUNCING|PF_SLIDING|PF_CANCARRY); - player->climbing = 0; - - if (player->mo->state-states != S_PLAY_ROLL) - { - P_SetPlayerMobjState(player->mo, S_PLAY_ROLL); - S_StartSound(player->mo, sfx_spin); - } - } - break; - - case 9: // Zoom Tube End - { - INT32 sequence; - fixed_t speed; - INT32 lineindex; - mobj_t *waypoint = NULL; - angle_t an; - - if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT && player->powers[pw_carry] == CR_ZOOMTUBE) - break; - - if (player->powers[pw_ignorelatch] & (1<<15)) - break; - - // Find line #3 tagged to this sector - lineindex = Tag_FindLineSpecial(3, sectag); - - if (lineindex == -1) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: Sector special %d missing line special #3.\n", sector->special); - break; - } - - // Grab speed and sequence values - speed = -abs(sides[lines[lineindex].sidenum[0]].textureoffset)/8; // Negative means reverse - sequence = abs(sides[lines[lineindex].sidenum[0]].rowoffset)>>FRACBITS; - - if (speed == 0) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: Waypoint sequence %d at zero speed.\n", sequence); - break; - } - - waypoint = P_GetLastWaypoint(sequence); - - if (!waypoint) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: LAST WAYPOINT IN SEQUENCE %d NOT FOUND.\n", sequence); - break; - } - else - { - CONS_Debug(DBG_GAMELOGIC, "Waypoint %d found in sequence %d - speed = %d\n", waypoint->health, sequence, speed); - } - - an = R_PointToAngle2(player->mo->x, player->mo->y, waypoint->x, waypoint->y) - player->mo->angle; - - if (an > ANGLE_90 && an < ANGLE_270 && !(lines[lineindex].flags & ML_EFFECT4)) - break; // behind back - - P_SetTarget(&player->mo->tracer, waypoint); - player->powers[pw_carry] = CR_ZOOMTUBE; - player->speed = speed; - player->pflags |= PF_SPINNING; - player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE|PF_GLIDING|PF_BOUNCING|PF_SLIDING|PF_CANCARRY); - player->climbing = 0; - - if (player->mo->state-states != S_PLAY_ROLL) - { - P_SetPlayerMobjState(player->mo, S_PLAY_ROLL); - S_StartSound(player->mo, sfx_spin); - } - } - break; - - case 10: // Finish Line - if (((gametyperules & (GTR_RACE|GTR_LIVES)) == GTR_RACE) && !player->exiting) - { - if (player->starpostnum == numstarposts) // Must have touched all the starposts - { - player->laps++; - - if (player->powers[pw_carry] == CR_NIGHTSMODE) - player->drillmeter += 48*20; - - if (player->laps >= (UINT8)cv_numlaps.value) - CONS_Printf(M_GetText("%s has finished the race.\n"), player_names[player-players]); - else if (player->laps == (UINT8)cv_numlaps.value-1) - CONS_Printf(M_GetText("%s started the \205final lap\200!\n"), player_names[player-players]); - else - CONS_Printf(M_GetText("%s started lap %u\n"), player_names[player-players], (UINT32)player->laps+1); - - // Reset starposts (checkpoints) info - player->starpostscale = player->starpostangle = player->starposttime = player->starpostnum = 0; - player->starpostx = player->starposty = player->starpostz = 0; - P_ResetStarposts(); - - // Play the starpost sound for 'consistency' - S_StartSound(player->mo, sfx_strpst); - } - else if (player->starpostnum) - { - // blatant reuse of a variable that's normally unused in circuit - if (!player->tossdelay) - S_StartSound(player->mo, sfx_lose); - player->tossdelay = 3; - } - - if (player->laps >= (unsigned)cv_numlaps.value) - { - if (P_IsLocalPlayer(player)) - { - HU_SetCEchoFlags(0); - HU_SetCEchoDuration(5); - HU_DoCEcho("FINISHED!"); - } - - P_DoPlayerExit(player); - } - } - break; - - case 11: // Rope hang - { - INT32 sequence; - fixed_t speed; - INT32 lineindex; - mobj_t *waypointmid = NULL; - mobj_t *waypointhigh = NULL; - mobj_t *waypointlow = NULL; - mobj_t *closest = NULL; - vector3_t p, line[2], resulthigh, resultlow; - - if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT && player->powers[pw_carry] == CR_ROPEHANG) - break; - - if (player->powers[pw_ignorelatch] & (1<<15)) - break; - - if (player->mo->momz > 0) - break; - - if (player->cmd.buttons & BT_SPIN) - break; - - if (!(player->pflags & PF_SLIDING) && player->mo->state == &states[player->mo->info->painstate]) - break; - - if (player->exiting) - break; - - //initialize resulthigh and resultlow with 0 - memset(&resultlow, 0x00, sizeof(resultlow)); - memset(&resulthigh, 0x00, sizeof(resulthigh)); - - // Find line #11 tagged to this sector - lineindex = Tag_FindLineSpecial(11, sectag); - - if (lineindex == -1) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: Sector special %d missing line special #11.\n", sector->special); - break; - } - - // Grab speed and sequence values - speed = abs(sides[lines[lineindex].sidenum[0]].textureoffset)/8; - sequence = abs(sides[lines[lineindex].sidenum[0]].rowoffset)>>FRACBITS; - - if (speed == 0) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: Waypoint sequence %d at zero speed.\n", sequence); - break; - } - - // Find the closest waypoint - // Find the preceding waypoint - // Find the proceeding waypoint - // Determine the closest spot on the line between the three waypoints - // Put player at that location. - - waypointmid = P_GetClosestWaypoint(sequence, player->mo); - - if (!waypointmid) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: WAYPOINT(S) IN SEQUENCE %d NOT FOUND.\n", sequence); - break; - } - - waypointlow = P_GetPreviousWaypoint(waypointmid, true); - waypointhigh = P_GetNextWaypoint(waypointmid, true); - - CONS_Debug(DBG_GAMELOGIC, "WaypointMid: %d; WaypointLow: %d; WaypointHigh: %d\n", - waypointmid->health, waypointlow ? waypointlow->health : -1, waypointhigh ? waypointhigh->health : -1); - - // Now we have three waypoints... the closest one we're near, and the one that comes before, and after. - // Next, we need to find the closest point on the line between each set, and determine which one we're - // closest to. - - p.x = player->mo->x; - p.y = player->mo->y; - p.z = player->mo->z; - - // Waypointmid and Waypointlow: - if (waypointlow) - { - line[0].x = waypointmid->x; - line[0].y = waypointmid->y; - line[0].z = waypointmid->z; - line[1].x = waypointlow->x; - line[1].y = waypointlow->y; - line[1].z = waypointlow->z; - - P_ClosestPointOnLine3D(&p, line, &resultlow); - } - - // Waypointmid and Waypointhigh: - if (waypointhigh) - { - line[0].x = waypointmid->x; - line[0].y = waypointmid->y; - line[0].z = waypointmid->z; - line[1].x = waypointhigh->x; - line[1].y = waypointhigh->y; - line[1].z = waypointhigh->z; - - P_ClosestPointOnLine3D(&p, line, &resulthigh); - } - - // 3D support now available. Disregard the previous notice here. -Red - - P_UnsetThingPosition(player->mo); - P_ResetPlayer(player); - player->mo->momx = player->mo->momy = player->mo->momz = 0; - - if (lines[lineindex].flags & ML_EFFECT1) // Don't wrap - { - mobj_t *highest = P_GetLastWaypoint(sequence); - highest->flags |= MF_SLIDEME; - } - - // Changing the conditions on these ifs to fix issues with snapping to the wrong spot -Red - if ((lines[lineindex].flags & ML_EFFECT1) && waypointmid->health == 0) - { - closest = waypointhigh; - player->mo->x = resulthigh.x; - player->mo->y = resulthigh.y; - player->mo->z = resulthigh.z - P_GetPlayerHeight(player); - } - else if ((lines[lineindex].flags & ML_EFFECT1) && waypointmid->health == numwaypoints[sequence] - 1) - { - closest = waypointmid; - player->mo->x = resultlow.x; - player->mo->y = resultlow.y; - player->mo->z = resultlow.z - P_GetPlayerHeight(player); - } - else - { - if (P_AproxDistance(P_AproxDistance(player->mo->x-resultlow.x, player->mo->y-resultlow.y), - player->mo->z-resultlow.z) < P_AproxDistance(P_AproxDistance(player->mo->x-resulthigh.x, - player->mo->y-resulthigh.y), player->mo->z-resulthigh.z)) - { - // Line between Mid and Low is closer - closest = waypointmid; - player->mo->x = resultlow.x; - player->mo->y = resultlow.y; - player->mo->z = resultlow.z - P_GetPlayerHeight(player); - } - else - { - // Line between Mid and High is closer - closest = waypointhigh; - player->mo->x = resulthigh.x; - player->mo->y = resulthigh.y; - player->mo->z = resulthigh.z - P_GetPlayerHeight(player); - } - } - - P_SetTarget(&player->mo->tracer, closest); - player->powers[pw_carry] = CR_ROPEHANG; - - // Option for static ropes. - if (lines[lineindex].flags & ML_NOCLIMB) - player->speed = 0; - else - player->speed = speed; - - S_StartSound(player->mo, sfx_s3k4a); - - player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE|PF_GLIDING|PF_BOUNCING|PF_SLIDING|PF_CANCARRY); - player->climbing = 0; - P_SetThingPosition(player->mo); - P_SetPlayerMobjState(player->mo, S_PLAY_RIDE); - } - break; - case 12: // Camera noclip - case 13: // Unused - case 14: // Unused - case 15: // Unused - break; - } -} - -/** Checks if an object is standing on or is inside a special 3D floor. - * If so, the sector is returned. - * - * \param mo Object to check. - * \return Pointer to the sector with a special type, or NULL if no special 3D - * floors are being contacted. - * \sa P_PlayerOnSpecial3DFloor - */ -sector_t *P_ThingOnSpecial3DFloor(mobj_t *mo) -{ - sector_t *sector; - ffloor_t *rover; - fixed_t topheight, bottomheight; - - sector = mo->subsector->sector; - if (!sector->ffloors) - return NULL; - - for (rover = sector->ffloors; rover; rover = rover->next) - { - if (!rover->master->frontsector->special) - continue; - - if (!(rover->flags & FF_EXISTS)) - continue; - - topheight = P_GetSpecialTopZ(mo, sectors + rover->secnum, sector); - bottomheight = P_GetSpecialBottomZ(mo, sectors + rover->secnum, sector); - - // Check the 3D floor's type... - if (((rover->flags & FF_BLOCKPLAYER) && mo->player) - || ((rover->flags & FF_BLOCKOTHERS) && !mo->player)) - { - boolean floorallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_FLOOR) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(mo->eflags & MFE_VERTICALFLIP)) && (mo->z == topheight)); - boolean ceilingallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_CEILING) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (mo->eflags & MFE_VERTICALFLIP)) && (mo->z + mo->height == bottomheight)); - // Thing must be on top of the floor to be affected... - if (!(floorallowed || ceilingallowed)) - continue; - } - else - { - // Water and intangible FOFs - if (mo->z > topheight || (mo->z + mo->height) < bottomheight) - continue; - } - - return rover->master->frontsector; - } - - return NULL; -} - -#define TELEPORTED (player->mo->subsector->sector != originalsector) - -/** Checks if a player is standing on or is inside a 3D floor (e.g. water) and - * applies any specials. - * - * \param player Player to check. - * \sa P_ThingOnSpecial3DFloor, P_PlayerInSpecialSector - */ -static void P_PlayerOnSpecial3DFloor(player_t *player, sector_t *sector) -{ - sector_t *originalsector = player->mo->subsector->sector; - ffloor_t *rover; - fixed_t topheight, bottomheight; - - for (rover = sector->ffloors; rover; rover = rover->next) - { - if (!rover->master->frontsector->special) - continue; - - if (!(rover->flags & FF_EXISTS)) - continue; - - topheight = P_GetSpecialTopZ(player->mo, sectors + rover->secnum, sector); - bottomheight = P_GetSpecialBottomZ(player->mo, sectors + rover->secnum, sector); - - // Check the 3D floor's type... - if (rover->flags & FF_BLOCKPLAYER) - { - boolean floorallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_FLOOR) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z == topheight)); - boolean ceilingallowed = ((rover->master->frontsector->flags & SF_FLIPSPECIAL_CEILING) && ((rover->master->frontsector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z + player->mo->height == bottomheight)); - // Thing must be on top of the floor to be affected... - if (!(floorallowed || ceilingallowed)) - continue; - } - else - { - // Water and DEATH FOG!!! heh - if (player->mo->z > topheight || (player->mo->z + player->mo->height) < bottomheight) - continue; - } - - // This FOF has the special we're looking for, but are we allowed to touch it? - if (sector == player->mo->subsector->sector - || (rover->master->frontsector->flags & SF_TRIGGERSPECIAL_TOUCH)) - { - P_ProcessSpecialSector(player, rover->master->frontsector, sector); - if TELEPORTED return; - } - } - - // Allow sector specials to be applied to polyobjects! - if (player->mo->subsector->polyList) - { - polyobj_t *po = player->mo->subsector->polyList; - sector_t *polysec; - boolean touching = false; - boolean inside = false; - - while (po) - { - if (po->flags & POF_NOSPECIALS) - { - po = (polyobj_t *)(po->link.next); - continue; - } - - polysec = po->lines[0]->backsector; - - if ((polysec->flags & SF_TRIGGERSPECIAL_TOUCH)) - touching = P_MobjTouchingPolyobj(po, player->mo); - else - touching = false; - - inside = P_MobjInsidePolyobj(po, player->mo); - - if (!(inside || touching)) - { - po = (polyobj_t *)(po->link.next); - continue; - } - - // We're inside it! Yess... - if (!polysec->special) - { - po = (polyobj_t *)(po->link.next); - continue; - } - - if (!(po->flags & POF_TESTHEIGHT)) // Don't do height checking - ; - else if (po->flags & POF_SOLID) - { - boolean floorallowed = ((polysec->flags & SF_FLIPSPECIAL_FLOOR) && ((polysec->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z == polysec->ceilingheight)); - boolean ceilingallowed = ((polysec->flags & SF_FLIPSPECIAL_CEILING) && ((polysec->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z + player->mo->height == polysec->floorheight)); - // Thing must be on top of the floor to be affected... - if (!(floorallowed || ceilingallowed)) - { - po = (polyobj_t *)(po->link.next); - continue; - } - } - else - { - // Water and DEATH FOG!!! heh - if (player->mo->z > polysec->ceilingheight || (player->mo->z + player->mo->height) < polysec->floorheight) - { - po = (polyobj_t *)(po->link.next); - continue; - } - } - - P_ProcessSpecialSector(player, polysec, sector); - if TELEPORTED return; - - po = (polyobj_t *)(po->link.next); - } - } -} - -#define VDOORSPEED (FRACUNIT*2) - -// -// P_RunSpecialSectorCheck -// -// Helper function to P_PlayerInSpecialSector -// -static void P_RunSpecialSectorCheck(player_t *player, sector_t *sector) -{ - boolean nofloorneeded = false; - fixed_t f_affectpoint, c_affectpoint; - - if (!sector->special) // nothing special, exit - return; - - if (GETSECSPECIAL(sector->special, 2) == 9) // Egg trap capsule -- should only be for 3dFloors! - return; - - // The list of specials that activate without floor touch - // Check Section 1 - switch(GETSECSPECIAL(sector->special, 1)) - { - case 2: // Damage (water) - case 8: // Instant kill - case 10: // Ring drainer that doesn't require floor touch - case 12: // Space countdown - nofloorneeded = true; - break; - } - - // Check Section 2 - switch(GETSECSPECIAL(sector->special, 2)) - { - case 2: // Linedef executor (All players needed) - case 4: // Linedef executor - case 6: // Linedef executor (7 Emeralds) - case 7: // Linedef executor (NiGHTS Mare) - nofloorneeded = true; - break; - } - - // Check Section 3 -/* switch(GETSECSPECIAL(sector->special, 3)) - { - - }*/ - - // Check Section 4 - switch(GETSECSPECIAL(sector->special, 4)) - { - case 2: // Level Exit / GOAL Sector / Flag Return - if (!(maptol & TOL_NIGHTS) && G_IsSpecialStage(gamemap)) - { - // Special stage GOAL sector - // requires touching floor. - break; - } - /* FALLTHRU */ - - case 1: // Starpost activator - case 5: // Fan sector - case 6: // Super Sonic Transform - case 8: // Zoom Tube Start - case 9: // Zoom Tube End - case 10: // Finish line - nofloorneeded = true; - break; - } - - if (nofloorneeded) - { - P_ProcessSpecialSector(player, sector, NULL); - return; - } - - f_affectpoint = P_GetSpecialBottomZ(player->mo, sector, sector); - c_affectpoint = P_GetSpecialTopZ(player->mo, sector, sector); - - { - boolean floorallowed = ((sector->flags & SF_FLIPSPECIAL_FLOOR) && ((sector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z == f_affectpoint)); - boolean ceilingallowed = ((sector->flags & SF_FLIPSPECIAL_CEILING) && ((sector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (player->mo->eflags & MFE_VERTICALFLIP)) && (player->mo->z + player->mo->height == c_affectpoint)); - // Thing must be on top of the floor to be affected... - if (!(floorallowed || ceilingallowed)) - return; - } - - P_ProcessSpecialSector(player, sector, NULL); -} - -/** Checks if the player is in a special sector or FOF and apply any specials. - * - * \param player Player to check. - * \sa P_PlayerOnSpecial3DFloor, P_ProcessSpecialSector - */ -void P_PlayerInSpecialSector(player_t *player) -{ - sector_t *originalsector; - sector_t *loopsector; - msecnode_t *node; - - if (!player->mo) - return; - - originalsector = player->mo->subsector->sector; - - P_PlayerOnSpecial3DFloor(player, originalsector); // Handle FOFs first. - if TELEPORTED return; - - P_RunSpecialSectorCheck(player, originalsector); - if TELEPORTED return; - - // Iterate through touching_sectorlist for SF_TRIGGERSPECIAL_TOUCH - for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) - { - loopsector = node->m_sector; - - if (loopsector == originalsector) // Don't duplicate - continue; - - // Check 3D floors... - P_PlayerOnSpecial3DFloor(player, loopsector); - if TELEPORTED return; - - if (!(loopsector->flags & SF_TRIGGERSPECIAL_TOUCH)) - continue; - - P_RunSpecialSectorCheck(player, loopsector); - if TELEPORTED return; - } -} - -#undef TELEPORTED - -/** Animate planes, scroll walls, etc. and keeps track of level timelimit and exits if time is up. - * - * \sa P_CheckTimeLimit, P_CheckPointLimit - */ -void P_UpdateSpecials(void) -{ - anim_t *anim; - INT32 i; - INT32 pic; - size_t j; - - levelflat_t *foundflats; // for flat animation - - // LEVEL TIMER - P_CheckTimeLimit(); - - // POINT LIMIT - P_CheckPointLimit(); - - // ANIMATE TEXTURES - for (anim = anims; anim < lastanim; anim++) - { - for (i = 0; i < anim->numpics; i++) - { - pic = anim->basepic + ((leveltime/anim->speed + i) % anim->numpics); - if (anim->istexture) - texturetranslation[anim->basepic+i] = pic; - } - } - - // ANIMATE FLATS - /// \todo do not check the non-animate flat.. link the animated ones? - /// \note its faster than the original anywaysince it animates only - /// flats used in the level, and there's usually very few of them - foundflats = levelflats; - for (j = 0; j < numlevelflats; j++, foundflats++) - { - if (foundflats->speed) // it is an animated flat - { - // update the levelflat texture number - if ((foundflats->type == LEVELFLAT_TEXTURE) && (foundflats->u.texture.basenum != -1)) - foundflats->u.texture.num = foundflats->u.texture.basenum + ((leveltime/foundflats->speed + foundflats->animseq) % foundflats->numpics); - // update the levelflat lump number - else if ((foundflats->type == LEVELFLAT_FLAT) && (foundflats->u.flat.baselumpnum != LUMPERROR)) - foundflats->u.flat.lumpnum = foundflats->u.flat.baselumpnum + ((leveltime/foundflats->speed + foundflats->animseq) % foundflats->numpics); - } - } -} - -// -// Floor over floors (FOFs), 3Dfloors, 3Dblocks, fake floors (ffloors), rovers, or whatever you want to call them -// - -/** Gets the ID number for a 3Dfloor in its target sector. - * - * \param fflr The 3Dfloor we want an ID for. - * \return ID of 3Dfloor in target sector. Note that the first FOF's ID is 0. UINT16_MAX is given if invalid. - * \sa P_GetFFloorByID - */ -UINT16 P_GetFFloorID(ffloor_t *fflr) -{ - ffloor_t *rover; - sector_t *sec; - UINT16 i = 0; - - if (!fflr) - return UINT16_MAX; - - sec = fflr->target; - - if (!sec->ffloors) - return UINT16_MAX; - for (rover = sec->ffloors; rover; rover = rover->next, i++) - if (rover == fflr) - return i; - return UINT16_MAX; -} - -/** Gets a 3Dfloor by control sector. - * - * \param sec Target sector. - * \param sec2 Control sector. - * \return Pointer to found 3Dfloor, or NULL. - * \sa P_GetFFloorByID - */ -static inline ffloor_t *P_GetFFloorBySec(sector_t *sec, sector_t *sec2) -{ - ffloor_t *rover; - - if (!sec->ffloors) - return NULL; - for (rover = sec->ffloors; rover; rover = rover->next) - if (rover->secnum == (size_t)(sec2 - sectors)) - return rover; - return NULL; -} - -/** Gets a 3Dfloor by ID number. - * - * \param sec Target sector. - * \param id ID of 3Dfloor in target sector. Note that the first FOF's ID is 0. - * \return Pointer to found 3Dfloor, or NULL. - * \sa P_GetFFloorBySec, P_GetFFloorID - */ -ffloor_t *P_GetFFloorByID(sector_t *sec, UINT16 id) -{ - ffloor_t *rover; - UINT16 i = 0; - - if (!sec->ffloors) - return NULL; - for (rover = sec->ffloors; rover; rover = rover->next) - if (i++ == id) - return rover; - return NULL; -} - -/** Adds a newly formed 3Dfloor structure to a sector's ffloors list. - * - * \param sec Target sector. - * \param fflr Newly formed 3Dfloor structure. - * \sa P_AddFakeFloor - */ -static inline void P_AddFFloorToList(sector_t *sec, ffloor_t *fflr) -{ - ffloor_t *rover; - - if (!sec->ffloors) - { - sec->ffloors = fflr; - fflr->next = 0; - fflr->prev = 0; - return; - } - - for (rover = sec->ffloors; rover->next; rover = rover->next); - - rover->next = fflr; - fflr->prev = rover; - fflr->next = 0; -} - -/** Adds a 3Dfloor. - * - * \param sec Target sector. - * \param sec2 Control sector. - * \param master Control linedef. - * \param alpha Alpha value (0-255). - * \param flags Options affecting this 3Dfloor. - * \param secthinkers List of relevant thinkers sorted by sector. May be NULL. - * \return Pointer to the new 3Dfloor. - * \sa P_AddFFloor, P_AddFakeFloorsByLine, P_SpawnSpecials - */ -static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, INT32 alpha, ffloortype_e flags, thinkerlist_t *secthinkers) -{ - ffloor_t *fflr; - thinker_t *th; - friction_t *f; - pusher_t *p; - size_t sec2num; - size_t i; - - if (sec == sec2) - return NULL; //Don't need a fake floor on a control sector. - if ((fflr = (P_GetFFloorBySec(sec, sec2)))) - return fflr; // If this ffloor already exists, return it - - if (sec2->ceilingheight < sec2->floorheight) - { - fixed_t tempceiling = sec2->ceilingheight; - //flip the sector around and print an error instead of crashing 12.1.08 -Inuyasha - CONS_Alert(CONS_ERROR, M_GetText("A FOF tagged %d has a top height below its bottom.\n"), master->args[0]); - sec2->ceilingheight = sec2->floorheight; - sec2->floorheight = tempceiling; - } - - if (sec2->numattached == 0) - { - sec2->attached = Z_Malloc(sizeof (*sec2->attached) * sec2->maxattached, PU_STATIC, NULL); - sec2->attachedsolid = Z_Malloc(sizeof (*sec2->attachedsolid) * sec2->maxattached, PU_STATIC, NULL); - sec2->attached[0] = sec - sectors; - sec2->numattached = 1; - sec2->attachedsolid[0] = (flags & FF_SOLID); - } - else - { - for (i = 0; i < sec2->numattached; i++) - if (sec2->attached[i] == (size_t)(sec - sectors)) - return NULL; - - if (sec2->numattached >= sec2->maxattached) - { - sec2->maxattached *= 2; - sec2->attached = Z_Realloc(sec2->attached, sizeof (*sec2->attached) * sec2->maxattached, PU_STATIC, NULL); - sec2->attachedsolid = Z_Realloc(sec2->attachedsolid, sizeof (*sec2->attachedsolid) * sec2->maxattached, PU_STATIC, NULL); - } - sec2->attached[sec2->numattached] = sec - sectors; - sec2->attachedsolid[sec2->numattached] = (flags & FF_SOLID); - sec2->numattached++; - } - - // Add the floor - fflr = Z_Calloc(sizeof (*fflr), PU_LEVEL, NULL); - fflr->secnum = sec2 - sectors; - fflr->target = sec; - fflr->bottomheight = &sec2->floorheight; - fflr->bottompic = &sec2->floorpic; - fflr->bottomxoffs = &sec2->floor_xoffs; - fflr->bottomyoffs = &sec2->floor_yoffs; - fflr->bottomangle = &sec2->floorpic_angle; - - // Add the ceiling - fflr->topheight = &sec2->ceilingheight; - fflr->toppic = &sec2->ceilingpic; - fflr->toplightlevel = &sec2->lightlevel; - fflr->topxoffs = &sec2->ceiling_xoffs; - fflr->topyoffs = &sec2->ceiling_yoffs; - fflr->topangle = &sec2->ceilingpic_angle; - - // Add slopes - fflr->t_slope = &sec2->c_slope; - fflr->b_slope = &sec2->f_slope; - // mark the target sector as having slopes, if the FOF has any of its own - // (this fixes FOF slopes glitching initially at level load in software mode) - if (sec2->hasslope) - sec->hasslope = true; - - fflr->spawnflags = fflr->flags = flags; - fflr->master = master; - fflr->norender = INFTICS; - fflr->fadingdata = NULL; - - // Scan the thinkers to check for special conditions applying to this FOF. - // If we have thinkers sorted by sector, just check the relevant ones; - // otherwise, check them all. Apologies for the ugly loop... - - sec2num = sec2 - sectors; - - // Just initialise both of these to placate the compiler. - i = 0; - th = thlist[THINK_MAIN].next; - - for(;;) - { - if(secthinkers) - { - if(i < secthinkers[sec2num].count) - th = secthinkers[sec2num].thinkers[i]; - else break; - } - else if (th == &thlist[THINK_MAIN]) - break; - - // Should this FOF have friction? - if(th->function.acp1 == (actionf_p1)T_Friction) - { - f = (friction_t *)th; - - if (f->affectee == (INT32)sec2num) - Add_Friction(f->friction, f->movefactor, (INT32)(sec-sectors), f->affectee); - } - // Should this FOF have wind/current/pusher? - else if(th->function.acp1 == (actionf_p1)T_Pusher) - { - p = (pusher_t *)th; - - if (p->affectee == (INT32)sec2num) - Add_Pusher(p->type, p->x_mag<y_mag<source, (INT32)(sec-sectors), p->affectee, p->exclusive, p->slider); - } - - if(secthinkers) i++; - else th = th->next; - } - - fflr->alpha = max(0, min(0xff, alpha)); - if (fflr->alpha < 0xff) - { - fflr->flags |= FF_TRANSLUCENT; - fflr->spawnflags = fflr->flags; - } - fflr->spawnalpha = fflr->alpha; // save for netgames - - if (flags & FF_QUICKSAND) - CheckForQuicksand = true; - - if (flags & FF_BUSTUP) - CheckForBustableBlocks = true; - - if ((flags & FF_MARIO)) - { - if (!(flags & FF_GOOWATER)) // Don't change the textures of a brick block, just a question block - P_AddBlockThinker(sec2, master); - CheckForMarioBlocks = true; - } - - if ((flags & FF_CRUMBLE)) - sec2->crumblestate = CRUMBLE_WAIT; - - if ((flags & FF_FLOATBOB)) - { - P_AddFloatThinker(sec2, Tag_FGet(&master->tags), master); - CheckForFloatBob = true; - } - - P_AddFFloorToList(sec, fflr); - - return fflr; -} - -// -// SPECIAL SPAWNING -// - -/** Adds a float thinker. - * Float thinkers cause solid 3Dfloors to float on water. - * - * \param sec Control sector. - * \param actionsector Target sector. - * \sa P_SpawnSpecials, T_FloatSector - * \author SSNTails - */ -static void P_AddFloatThinker(sector_t *sec, UINT16 tag, line_t *sourceline) -{ - floatthink_t *floater; - - // create and initialize new thinker - floater = Z_Calloc(sizeof (*floater), PU_LEVSPEC, NULL); - P_AddThinker(THINK_MAIN, &floater->thinker); - - floater->thinker.function.acp1 = (actionf_p1)T_FloatSector; - - floater->sector = sec; - floater->tag = (INT16)tag; - floater->sourceline = sourceline; -} - -/** - * Adds a plane displacement thinker. - * Whenever the "control" sector moves, - * the "affectee" sector's floor or ceiling plane moves too! - * - * \param speed Rate of movement relative to control sector - * \param control Control sector. - * \param affectee Target sector. - * \param reverse Reverse direction? - * \sa P_SpawnSpecials, T_PlaneDisplace - * \author Monster Iestyn - */ -static void P_AddPlaneDisplaceThinker(INT32 type, fixed_t speed, INT32 control, INT32 affectee, UINT8 reverse) -{ - planedisplace_t *displace; - - // create and initialize new displacement thinker - displace = Z_Calloc(sizeof (*displace), PU_LEVSPEC, NULL); - P_AddThinker(THINK_MAIN, &displace->thinker); - - displace->thinker.function.acp1 = (actionf_p1)T_PlaneDisplace; - displace->affectee = affectee; - displace->control = control; - displace->last_height = sectors[control].floorheight; - displace->speed = speed; - displace->type = type; - displace->reverse = reverse; -} - -/** Adds a Mario block thinker, which changes the block's texture between blank - * and ? depending on whether it has contents. - * Needed in case objects respawn inside. - * - * \param sec Control sector. - * \param actionsector Target sector. - * \param sourceline Control linedef. - * \sa P_SpawnSpecials, T_MarioBlockChecker - * \author SSNTails - */ -static void P_AddBlockThinker(sector_t *sec, line_t *sourceline) -{ - mariocheck_t *block; - - // create and initialize new elevator thinker - block = Z_Calloc(sizeof (*block), PU_LEVSPEC, NULL); - P_AddThinker(THINK_MAIN, &block->thinker); - - block->thinker.function.acp1 = (actionf_p1)T_MarioBlockChecker; - block->sourceline = sourceline; - - block->sector = sec; -} - -/** Adds a raise thinker. - * A raise thinker checks to see if the - * player is standing on its 3D Floor, - * and if so, raises the platform towards - * it's destination. Otherwise, it lowers - * to the lowest nearby height if not - * there already. - * - * \param sec Control sector. - * \sa P_SpawnSpecials, T_RaiseSector - * \author SSNTails - */ -static void P_AddRaiseThinker(sector_t *sec, INT16 tag, fixed_t speed, fixed_t ceilingtop, fixed_t ceilingbottom, boolean lower, boolean spindash) -{ - raise_t *raise; - - raise = Z_Calloc(sizeof (*raise), PU_LEVSPEC, NULL); - P_AddThinker(THINK_MAIN, &raise->thinker); - - raise->thinker.function.acp1 = (actionf_p1)T_RaiseSector; - - raise->tag = tag; - raise->sector = sec; - - raise->ceilingtop = ceilingtop; - raise->ceilingbottom = ceilingbottom; - - raise->basespeed = speed >> 2; - - if (lower) - raise->flags |= RF_REVERSE; - if (spindash) - raise->flags |= RF_SPINDASH; -} - -static void P_AddAirbob(sector_t *sec, INT16 tag, fixed_t dist, boolean raise, boolean spindash, boolean dynamic) -{ - raise_t *airbob; - - airbob = Z_Calloc(sizeof (*airbob), PU_LEVSPEC, NULL); - P_AddThinker(THINK_MAIN, &airbob->thinker); - - airbob->thinker.function.acp1 = (actionf_p1)T_RaiseSector; - - airbob->tag = tag; - airbob->sector = sec; - - airbob->ceilingtop = sec->ceilingheight; - airbob->ceilingbottom = sec->ceilingheight - dist; - - airbob->basespeed = FRACUNIT; - - if (!raise) - airbob->flags |= RF_REVERSE; - if (spindash) - airbob->flags |= RF_SPINDASH; - if (dynamic) - airbob->flags |= RF_DYNAMIC; -} - -/** Adds a thwomp thinker. - * Even thwomps need to think! - * - * \param sec Control sector. - * \sa P_SpawnSpecials, T_ThwompSector - * \author SSNTails - */ -static inline void P_AddThwompThinker(sector_t *sec, line_t *sourceline, fixed_t crushspeed, fixed_t retractspeed, UINT16 sound) -{ - thwomp_t *thwomp; - - // You *probably* already have a thwomp in this sector. If you've combined it with something - // else that uses the floordata/ceilingdata, you must be weird. - if (sec->floordata || sec->ceilingdata) - return; - - // create and initialize new elevator thinker - thwomp = Z_Calloc(sizeof (*thwomp), PU_LEVSPEC, NULL); - P_AddThinker(THINK_MAIN, &thwomp->thinker); - - thwomp->thinker.function.acp1 = (actionf_p1)T_ThwompSector; - - // set up the fields according to the type of elevator action - thwomp->sourceline = sourceline; - thwomp->sector = sec; - thwomp->crushspeed = crushspeed; - thwomp->retractspeed = retractspeed; - thwomp->direction = 0; - thwomp->floorstartheight = sec->floorheight; - thwomp->ceilingstartheight = sec->ceilingheight; - thwomp->delay = 1; - thwomp->tag = Tag_FGet(&sourceline->tags); - thwomp->sound = sound; - - sec->floordata = thwomp; - sec->ceilingdata = thwomp; - // Start with 'resting' texture - sides[sourceline->sidenum[0]].midtexture = sides[sourceline->sidenum[0]].bottomtexture; -} - -/** Adds a thinker which checks if any MF_ENEMY objects with health are in the defined area. - * If not, a linedef executor is run once. - * - * \param sourceline Control linedef. - * \sa P_SpawnSpecials, T_NoEnemiesSector - * \author SSNTails - */ -static inline void P_AddNoEnemiesThinker(line_t *sourceline) -{ - noenemies_t *nobaddies; - - // create and initialize new thinker - nobaddies = Z_Calloc(sizeof (*nobaddies), PU_LEVSPEC, NULL); - P_AddThinker(THINK_MAIN, &nobaddies->thinker); - - nobaddies->thinker.function.acp1 = (actionf_p1)T_NoEnemiesSector; - - nobaddies->sourceline = sourceline; -} - -/** Adds a thinker for Each-Time linedef executors. A linedef executor is run - * only when a player enters the area and doesn't run again until they re-enter. - * - * \param sourceline Control linedef. - * \sa P_SpawnSpecials, T_EachTimeThinker - * \author SSNTails - */ -static void P_AddEachTimeThinker(line_t *sourceline) -{ - eachtime_t *eachtime; - - // create and initialize new thinker - eachtime = Z_Calloc(sizeof (*eachtime), PU_LEVSPEC, NULL); - P_AddThinker(THINK_MAIN, &eachtime->thinker); - - eachtime->thinker.function.acp1 = (actionf_p1)T_EachTimeThinker; - - eachtime->sourceline = sourceline; - eachtime->triggerOnExit = !!(sourceline->flags & ML_BOUNCY); -} - -/** Adds a camera scanner. - * - * \param sourcesec Control sector. - * \param actionsector Target sector. - * \param angle Angle of the source line. - * \sa P_SpawnSpecials, T_CameraScanner - * \author SSNTails - */ -static inline void P_AddCameraScanner(sector_t *sourcesec, sector_t *actionsector, angle_t angle) -{ - elevator_t *elevator; // Why not? LOL - - CONS_Alert(CONS_WARNING, M_GetText("Detected a camera scanner effect (linedef type 5). This effect is deprecated and will be removed in the future!\n")); - - // create and initialize new elevator thinker - elevator = Z_Calloc(sizeof (*elevator), PU_LEVSPEC, NULL); - P_AddThinker(THINK_MAIN, &elevator->thinker); - - elevator->thinker.function.acp1 = (actionf_p1)T_CameraScanner; - elevator->type = elevateBounce; - - // set up the fields according to the type of elevator action - elevator->sector = sourcesec; - elevator->actionsector = actionsector; - elevator->distance = FixedInt(AngleFixed(angle)); -} - -/** Flashes a laser block. - * - * \param flash Thinker structure for this laser. - * \sa P_AddLaserThinker - * \author SSNTails - */ -void T_LaserFlash(laserthink_t *flash) -{ - msecnode_t *node; - mobj_t *thing; - INT32 s; - ffloor_t *fflr; - sector_t *sector; - sector_t *sourcesec = flash->sourceline->frontsector; - fixed_t top, bottom; - - TAG_ITER_SECTORS(flash->tag, s) - { - sector = §ors[s]; - for (fflr = sector->ffloors; fflr; fflr = fflr->next) - { - if (fflr->master != flash->sourceline) - continue; - - if (!(fflr->flags & FF_EXISTS)) - break; - - if (leveltime & 2) - //fflr->flags |= FF_RENDERALL; - fflr->alpha = 0xB0; - else - //fflr->flags &= ~FF_RENDERALL; - fflr->alpha = 0x90; - - top = P_GetFFloorTopZAt (fflr, sector->soundorg.x, sector->soundorg.y); - bottom = P_GetFFloorBottomZAt(fflr, sector->soundorg.x, sector->soundorg.y); - sector->soundorg.z = (top + bottom)/2; - S_StartSound(§or->soundorg, sfx_laser); - - // Seek out objects to DESTROY! MUAHAHHAHAHAA!!!*cough* - for (node = sector->touching_thinglist; node && node->m_thing; node = node->m_thinglist_next) - { - thing = node->m_thing; - - if (flash->nobosses && thing->flags & MF_BOSS) - continue; // Don't hurt bosses - - // Don't endlessly kill egg guard shields (or anything else for that matter) - if (thing->health <= 0) - continue; - - top = P_GetSpecialTopZ(thing, sourcesec, sector); - bottom = P_GetSpecialBottomZ(thing, sourcesec, sector); - - if (thing->z >= top - || thing->z + thing->height <= bottom) - continue; - - if (thing->flags & MF_SHOOTABLE) - P_DamageMobj(thing, NULL, NULL, 1, 0); - else if (thing->type == MT_EGGSHIELD) - P_KillMobj(thing, NULL, NULL, 0); - } - - break; - } - } -} - -static inline void P_AddLaserThinker(INT16 tag, line_t *line, boolean nobosses) -{ - laserthink_t *flash = Z_Calloc(sizeof (*flash), PU_LEVSPEC, NULL); - - P_AddThinker(THINK_MAIN, &flash->thinker); - - flash->thinker.function.acp1 = (actionf_p1)T_LaserFlash; - flash->tag = tag; - flash->sourceline = line; - flash->nobosses = nobosses; -} - -// -// P_RunLevelLoadExecutors -// -// After loading/spawning all other specials -// and items, execute these. -// -static void P_RunLevelLoadExecutors(void) -{ - size_t i; - - for (i = 0; i < numlines; i++) - { - if (lines[i].special == 399) - P_RunTriggerLinedef(&lines[i], NULL, NULL); - } -} - -/** Before things are loaded, initialises certain stuff in case they're needed - * by P_SpawnSlopes or P_LoadThings. This was split off from - * P_SpawnSpecials, in case you couldn't tell. - * - * \sa P_SpawnSpecials - * \author Monster Iestyn - */ -void P_InitSpecials(void) -{ - // Set the default gravity. Custom gravity overrides this setting. - gravity = mapheaderinfo[gamemap-1]->gravity; - - // Defaults in case levels don't have them set. - sstimer = mapheaderinfo[gamemap-1]->sstimer*TICRATE + 6; - ssspheres = mapheaderinfo[gamemap-1]->ssspheres; - - CheckForBustableBlocks = CheckForBouncySector = CheckForQuicksand = CheckForMarioBlocks = CheckForFloatBob = CheckForReverseGravity = false; - - // Set curWeather - switch (mapheaderinfo[gamemap-1]->weather) - { - case PRECIP_SNOW: // snow - case PRECIP_RAIN: // rain - case PRECIP_STORM: // storm - case PRECIP_STORM_NORAIN: // storm w/o rain - case PRECIP_STORM_NOSTRIKES: // storm w/o lightning - curWeather = mapheaderinfo[gamemap-1]->weather; - break; - default: // blank/none - curWeather = PRECIP_NONE; - break; - } - - // Set globalweather - globalweather = mapheaderinfo[gamemap-1]->weather; -} - -static void P_ApplyFlatAlignment(line_t *master, sector_t *sector, angle_t flatangle, fixed_t xoffs, fixed_t yoffs) -{ - if (!(master->flags & ML_NETONLY)) // Modify floor flat alignment unless ML_NETONLY flag is set - { - sector->floorpic_angle = flatangle; - sector->floor_xoffs += xoffs; - sector->floor_yoffs += yoffs; - } - - if (!(master->flags & ML_NONET)) // Modify ceiling flat alignment unless ML_NONET flag is set - { - sector->ceilingpic_angle = flatangle; - sector->ceiling_xoffs += xoffs; - sector->ceiling_yoffs += yoffs; - } - -} - -static void P_MakeFOFBouncy(line_t *paramline, line_t *masterline) -{ - INT32 s; - TAG_ITER_DECLARECOUNTER(0); - - if (masterline->special < 100 || masterline->special >= 300) - return; - - TAG_ITER_SECTORS(0, masterline->args[0], s) - { - ffloor_t *rover; - - for (rover = sectors[s].ffloors; rover; rover = rover->next) - { - if (rover->master != masterline) - continue; - - rover->flags |= FF_BOUNCY; - rover->spawnflags |= FF_BOUNCY; - rover->bouncestrength = (paramline->args[1]<< FRACBITS)/100; - if (paramline->args[2]) - rover->specialflags |= FS_DAMPEN; - else - rover->specialflags &= ~FS_DAMPEN; - CheckForBouncySector = true; - break; - } - } - -} - -/** After the map has loaded, scans for specials that spawn 3Dfloors and - * thinkers. - * - * \todo Split up into multiple functions. - * \todo Get rid of all the magic numbers. - * \todo Potentially use 'fromnetsave' to stop any new thinkers from being created - * as they'll just be erased by UnArchiveThinkers. - * \sa P_SpawnPrecipitation, P_SpawnFriction, P_SpawnPushers, P_SpawnScrollers - */ -void P_SpawnSpecials(boolean fromnetsave) -{ - sector_t *sector; - size_t i; - INT32 j; - thinkerlist_t *secthinkers; - thinker_t *th; - TAG_ITER_DECLARECOUNTER(0); - // This used to be used, and *should* be used in the future, - // but currently isn't. - (void)fromnetsave; - - // yep, we do this here - "bossdisabled" is considered an apparatus of specials. - bossdisabled = 0; - stoppedclock = false; - - // Init special SECTORs. - sector = sectors; - for (i = 0; i < numsectors; i++, sector++) - { - if (!sector->special) - continue; - - // Process Section 1 - switch(GETSECSPECIAL(sector->special, 1)) - { - case 5: // Spikes - //Terrible hack to replace an even worse hack: - //Spike damage automatically sets SF_TRIGGERSPECIAL_TOUCH. - //Yes, this also affects other specials on the same sector. Sorry. - sector->flags |= SF_TRIGGERSPECIAL_TOUCH; - break; - } - - // Process Section 2 - switch(GETSECSPECIAL(sector->special, 2)) - { - case 10: // Time for special stage - sstimer = (sector->floorheight>>FRACBITS) * TICRATE + 6; // Time to finish - ssspheres = sector->ceilingheight>>FRACBITS; // Ring count for special stage - break; - - case 11: // Custom global gravity! - gravity = sector->floorheight/1000; - break; - } - - // Process Section 3 -/* switch(GETSECSPECIAL(player->specialsector, 3)) - { - - }*/ - - // Process Section 4 - switch(GETSECSPECIAL(sector->special, 4)) - { - case 10: // Circuit finish line - if ((gametyperules & (GTR_RACE|GTR_LIVES)) == GTR_RACE) - circuitmap = true; - break; - } - } - - P_SpawnScrollers(); // Add generalized scrollers - P_SpawnFriction(); // Friction model using linedefs - P_SpawnPushers(); // Pusher model using linedefs - - // Look for thinkers that affect FOFs, and sort them by sector - - secthinkers = Z_Calloc(numsectors * sizeof(thinkerlist_t), PU_STATIC, NULL); - - // Firstly, find out how many there are in each sector - for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next) - { - if (th->function.acp1 == (actionf_p1)T_Friction) - secthinkers[((friction_t *)th)->affectee].count++; - else if (th->function.acp1 == (actionf_p1)T_Pusher) - secthinkers[((pusher_t *)th)->affectee].count++; - } - - // Allocate each list, and then zero the count so we can use it to track - // the end of the list as we add the thinkers - for (i = 0; i < numsectors; i++) - if(secthinkers[i].count > 0) - { - secthinkers[i].thinkers = Z_Malloc(secthinkers[i].count * sizeof(thinker_t *), PU_STATIC, NULL); - secthinkers[i].count = 0; - } - - // Finally, populate the lists. - for (th = thlist[THINK_MAIN].next; th != &thlist[THINK_MAIN]; th = th->next) - { - size_t secnum = (size_t)-1; - - if (th->function.acp1 == (actionf_p1)T_Friction) - secnum = ((friction_t *)th)->affectee; - else if (th->function.acp1 == (actionf_p1)T_Pusher) - secnum = ((pusher_t *)th)->affectee; - - if (secnum != (size_t)-1) - secthinkers[secnum].thinkers[secthinkers[secnum].count++] = th; - } - - - // Init line EFFECTs - for (i = 0; i < numlines; i++) - { - mtag_t tag = Tag_FGet(&lines[i].tags); - - if (lines[i].special != 7) // This is a hack. I can at least hope nobody wants to prevent flat alignment in netgames... - { - // set line specials to 0 here too, same reason as above - if (netgame || multiplayer) - { - if (lines[i].flags & ML_NONET) - { - lines[i].special = 0; - continue; - } - } - else if (lines[i].flags & ML_NETONLY) - { - lines[i].special = 0; - continue; - } - } - - switch (lines[i].special) - { - INT32 s; - INT32 l; - size_t sec; - ffloortype_e ffloorflags; - - case 1: // Definable gravity per sector - sec = sides[*lines[i].sidenum].sector - sectors; - TAG_ITER_SECTORS(tag, s) - { - sectors[s].gravity = §ors[sec].floorheight; // This allows it to change in realtime! - - if (lines[i].flags & ML_NOCLIMB) - sectors[s].verticalflip = true; - else - sectors[s].verticalflip = false; - - CheckForReverseGravity = sectors[s].verticalflip; - } - break; - - case 2: // Custom exit - break; - - case 3: // Zoom Tube Parameters - break; - - case 4: // Speed pad (combines with sector special Section3:5 or Section3:6) - break; - - case 5: // Change camera info - sec = sides[*lines[i].sidenum].sector - sectors; - TAG_ITER_SECTORS(tag, s) - P_AddCameraScanner(§ors[sec], §ors[s], R_PointToAngle2(lines[i].v2->x, lines[i].v2->y, lines[i].v1->x, lines[i].v1->y)); - break; - - case 7: // Flat alignment - redone by toast - if ((lines[i].flags & (ML_NETONLY|ML_NONET)) != (ML_NETONLY|ML_NONET)) // If you can do something... - { - angle_t flatangle = InvAngle(R_PointToAngle2(lines[i].v1->x, lines[i].v1->y, lines[i].v2->x, lines[i].v2->y)); - fixed_t xoffs; - fixed_t yoffs; - - if (lines[i].flags & ML_EFFECT6) // Set offset through x and y texture offsets if ML_EFFECT6 flag is set - { - xoffs = sides[lines[i].sidenum[0]].textureoffset; - yoffs = sides[lines[i].sidenum[0]].rowoffset; - } - else // Otherwise, set calculated offsets such that line's v1 is the apparent origin - { - xoffs = -lines[i].v1->x; - yoffs = lines[i].v1->y; - } - - //If no tag is given, apply to front sector - if (tag == 0) - P_ApplyFlatAlignment(lines + i, lines[i].frontsector, flatangle, xoffs, yoffs); - else - { - TAG_ITER_SECTORS(tag, s) - P_ApplyFlatAlignment(lines + i, sectors + s, flatangle, xoffs, yoffs); - } - } - else // Otherwise, print a helpful warning. Can I do no less? - CONS_Alert(CONS_WARNING, - M_GetText("Flat alignment linedef (tag %d) doesn't have anything to do.\nConsider changing the linedef's flag configuration or removing it entirely.\n"), - tag); - break; - - case 8: // Sector Parameters - TAG_ITER_SECTORS(tag, s) - { - if (lines[i].flags & ML_NOCLIMB) - { - sectors[s].flags &= ~SF_FLIPSPECIAL_FLOOR; - sectors[s].flags |= SF_FLIPSPECIAL_CEILING; - } - else if (lines[i].flags & ML_EFFECT4) - sectors[s].flags |= SF_FLIPSPECIAL_BOTH; - - if (lines[i].flags & ML_EFFECT3) - sectors[s].flags |= SF_TRIGGERSPECIAL_TOUCH; - if (lines[i].flags & ML_EFFECT2) - sectors[s].flags |= SF_TRIGGERSPECIAL_HEADBUMP; - - if (lines[i].flags & ML_EFFECT1) - sectors[s].flags |= SF_INVERTPRECIP; - - if (lines[i].frontsector && GETSECSPECIAL(lines[i].frontsector->special, 4) == 12) - sectors[s].camsec = sides[*lines[i].sidenum].sector-sectors; - } - break; - - case 9: // Chain Parameters - break; - - case 10: // Vertical culling plane for sprites and FOFs - TAG_ITER_SECTORS(tag, s) - sectors[s].cullheight = &lines[i]; // This allows it to change in realtime! - break; - - case 50: // Insta-Lower Sector - EV_DoFloor(&lines[i], instantLower); - break; - - case 51: // Instant raise for ceilings - EV_DoCeiling(&lines[i], instantRaise); - break; - - case 52: // Continuously Falling sector - EV_DoContinuousFall(lines[i].frontsector, lines[i].backsector, P_AproxDistance(lines[i].dx, lines[i].dy), (lines[i].flags & ML_NOCLIMB)); - break; - - case 53: // New super cool and awesome moving floor and ceiling type - case 54: // New super cool and awesome moving floor type - if (lines[i].backsector) - EV_DoFloor(&lines[i], bounceFloor); - if (lines[i].special == 54) - break; - /* FALLTHRU */ - - case 55: // New super cool and awesome moving ceiling type - if (lines[i].backsector) - EV_DoCeiling(&lines[i], bounceCeiling); - break; - - case 56: // New super cool and awesome moving floor and ceiling crush type - case 57: // New super cool and awesome moving floor crush type - if (lines[i].backsector) - EV_DoFloor(&lines[i], bounceFloorCrush); - - if (lines[i].special == 57) - break; //only move the floor - /* FALLTHRU */ - - case 58: // New super cool and awesome moving ceiling crush type - if (lines[i].backsector) - EV_DoCeiling(&lines[i], bounceCeilingCrush); - break; - - case 59: // Activate floating platform - EV_DoElevator(&lines[i], elevateContinuous, false); - break; - - case 60: // Floating platform with adjustable speed - EV_DoElevator(&lines[i], elevateContinuous, true); - break; - - case 61: // Crusher! - EV_DoCrush(&lines[i], crushAndRaise); - break; - - case 62: // Crusher (up and then down)! - EV_DoCrush(&lines[i], fastCrushAndRaise); - break; - - case 63: // support for drawn heights coming from different sector - sec = sides[*lines[i].sidenum].sector-sectors; - TAG_ITER_SECTORS(tag, s) - sectors[s].heightsec = (INT32)sec; - break; - - case 64: // Appearing/Disappearing FOF option - if (lines[i].flags & ML_BLOCKMONSTERS) { // Find FOFs by control sector tag - TAG_ITER_SECTORS(tag, s) - for (j = 0; (unsigned)j < sectors[s].linecount; j++) - if (sectors[s].lines[j]->special >= 100 && sectors[s].lines[j]->special < 300) - Add_MasterDisappearer(abs(lines[i].dx>>FRACBITS), abs(lines[i].dy>>FRACBITS), abs(sides[lines[i].sidenum[0]].sector->floorheight>>FRACBITS), (INT32)(sectors[s].lines[j]-lines), (INT32)i); - } else // Find FOFs by effect sector tag - { - TAG_ITER_LINES(tag, s) - { - if ((size_t)s == i) - continue; - if (Tag_Find(&sides[lines[s].sidenum[0]].sector->tags, Tag_FGet(&sides[lines[i].sidenum[0]].sector->tags))) - Add_MasterDisappearer(abs(lines[i].dx>>FRACBITS), abs(lines[i].dy>>FRACBITS), abs(sides[lines[i].sidenum[0]].sector->floorheight>>FRACBITS), s, (INT32)i); - } - } - break; - - case 66: // Displace floor by front sector - TAG_ITER_SECTORS(tag, s) - P_AddPlaneDisplaceThinker(pd_floor, P_AproxDistance(lines[i].dx, lines[i].dy)>>8, sides[lines[i].sidenum[0]].sector-sectors, s, !!(lines[i].flags & ML_NOCLIMB)); - break; - case 67: // Displace ceiling by front sector - TAG_ITER_SECTORS(tag, s) - P_AddPlaneDisplaceThinker(pd_ceiling, P_AproxDistance(lines[i].dx, lines[i].dy)>>8, sides[lines[i].sidenum[0]].sector-sectors, s, !!(lines[i].flags & ML_NOCLIMB)); - break; - case 68: // Displace both floor AND ceiling by front sector - TAG_ITER_SECTORS(tag, s) - P_AddPlaneDisplaceThinker(pd_both, P_AproxDistance(lines[i].dx, lines[i].dy)>>8, sides[lines[i].sidenum[0]].sector-sectors, s, !!(lines[i].flags & ML_NOCLIMB)); - break; - - case 70: // Add raise thinker to FOF - if (udmf) - { - fixed_t destheight = lines[i].args[2] << FRACBITS; - fixed_t startheight, topheight, bottomheight; - - TAG_ITER_LINES(0, lines[i].args[0], l) - { - if (lines[l].special < 100 || lines[l].special >= 300) - continue; - - startheight = lines[l].frontsector->ceilingheight; - topheight = max(startheight, destheight); - bottomheight = min(startheight, destheight); - - P_AddRaiseThinker(lines[l].frontsector, lines[l].args[0], lines[i].args[1] << FRACBITS, topheight, bottomheight, (destheight < startheight), !!(lines[i].args[3])); - } - } - break; - - case 71: // Add air bob thinker to FOF - if (udmf) - { - TAG_ITER_LINES(0, lines[i].args[0], l) - { - if (lines[l].special < 100 || lines[l].special >= 300) - continue; - - P_AddAirbob(lines[l].frontsector, lines[l].args[0], lines[i].args[1] << FRACBITS, !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); - } - } - break; - - case 72: // Add thwomp thinker to FOF - if (udmf) - { - UINT16 sound = (lines[i].stringargs[0]) ? get_number(lines[i].stringargs[0]) : sfx_thwomp; - - TAG_ITER_LINES(0, lines[i].args[0], l) - { - if (lines[l].special < 100 || lines[l].special >= 300) - continue; - - P_AddThwompThinker(lines[l].frontsector, &lines[l], lines[i].args[1] << FRACBITS, lines[i].args[2] << FRACBITS, sound); - } - } - break; - - case 73: // Add laser thinker to FOF - if (udmf) - { - TAG_ITER_LINES(0, lines[i].args[0], l) - { - if (lines[l].special < 100 || lines[l].special >= 300) - continue; - - P_AddLaserThinker(lines[l].args[0], lines + l, !!(lines[i].args[1])); - } - } - break; - - case 100: // FOF (solid) - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; - - //Appearance settings - if (lines[i].args[2] & TMFA_NOPLANES) - ffloorflags &= ~FF_RENDERPLANES; - if (lines[i].args[2] & TMFA_NOSIDES) - ffloorflags &= ~FF_RENDERSIDES; - if (lines[i].args[2] & TMFA_INSIDES) - { - if (ffloorflags & FF_RENDERPLANES) - ffloorflags |= FF_BOTHPLANES; - if (ffloorflags & FF_RENDERSIDES) - ffloorflags |= FF_ALLSIDES; - } - if (lines[i].args[2] & TMFA_ONLYINSIDES) - { - if (ffloorflags & FF_RENDERPLANES) - ffloorflags |= FF_INVERTPLANES; - if (ffloorflags & FF_RENDERSIDES) - ffloorflags |= FF_INVERTSIDES; - } - if (lines[i].args[2] & TMFA_NOSHADE) - ffloorflags |= FF_NOSHADE; - if (lines[i].args[2] & TMFA_SPLAT) - ffloorflags |= FF_SPLAT; - - //Tangibility settings - if (lines[i].args[3] & TMFT_INTANGIBLETOP) - ffloorflags |= FF_REVERSEPLATFORM; - if (lines[i].args[3] & TMFT_INTANGIBLEBOTTOM) - ffloorflags |= FF_PLATFORM; - if (lines[i].args[3] & TMFT_DONTBLOCKPLAYER) - ffloorflags &= ~FF_BLOCKPLAYER; - if (lines[i].args[3] & TMFT_DONTBLOCKOTHERS) - ffloorflags &= ~FF_BLOCKOTHERS; - - //Cutting options - if (ffloorflags & FF_RENDERALL) - { - //If translucent or player can enter it, cut inner walls - if ((lines[i].args[1] < 255) || (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE)) - ffloorflags |= FF_CUTEXTRA|FF_EXTRA; - else - ffloorflags |= FF_CUTLEVEL; - } - - P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); - break; - - case 120: // FOF (water) - ffloorflags = FF_EXISTS|FF_RENDERPLANES|FF_SWIMMABLE|FF_BOTHPLANES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; - if (!(lines[i].args[2] & TMFW_NOSIDES)) - ffloorflags |= FF_RENDERSIDES|FF_ALLSIDES; - if (lines[i].args[2] & TMFW_DOUBLESHADOW) - ffloorflags |= FF_DOUBLESHADOW; - if (lines[i].args[2] & TMFW_COLORMAPONLY) - ffloorflags |= FF_COLORMAPONLY; - if (!(lines[i].args[2] & TMFW_NORIPPLE)) - ffloorflags |= FF_RIPPLE; - if (lines[i].args[2] & TMFW_GOOWATER) - ffloorflags |= FF_GOOWATER; - if (lines[i].args[2] & TMFW_SPLAT) - ffloorflags |= FF_SPLAT; - P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); - break; - - case 150: // FOF (Air bobbing) - P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_SOLID|FF_RENDERALL, secthinkers); - P_AddAirbob(lines[i].frontsector, lines[i].args[0], lines[i].args[1] << FRACBITS, !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); - break; - - case 160: // FOF (Water bobbing) - P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_FLOATBOB, secthinkers); - break; - - case 170: // FOF (Crumbling) - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CRUMBLE; - - //Tangibility settings - if (lines[i].args[2] & TMFT_INTANGIBLETOP) - ffloorflags |= FF_REVERSEPLATFORM; - if (lines[i].args[2] & TMFT_INTANGIBLEBOTTOM) - ffloorflags |= FF_PLATFORM; - if (lines[i].args[2] & TMFT_DONTBLOCKPLAYER) - ffloorflags &= ~FF_BLOCKPLAYER; - if (lines[i].args[2] & TMFT_DONTBLOCKOTHERS) - ffloorflags &= ~FF_BLOCKOTHERS; - - //Flags - if (lines[i].args[3] & TMFC_NOSHADE) - ffloorflags |= FF_NOSHADE; - if (lines[i].args[3] & TMFC_NORETURN) - ffloorflags |= FF_NORETURN; - if (lines[i].args[3] & TMFC_FLOATBOB) - ffloorflags |= FF_FLOATBOB; - if (lines[i].args[3] & TMFC_SPLAT) - ffloorflags |= FF_SPLAT; - - //If translucent or player can enter it, cut inner walls - if (lines[i].args[1] < 0xff || (lines[i].args[2] & TMFT_VISIBLEFROMINSIDE)) - ffloorflags |= FF_CUTEXTRA|FF_EXTRA; - else - ffloorflags |= FF_CUTLEVEL; - - //If player can enter it, render insides - if (lines[i].args[2] & TMFT_VISIBLEFROMINSIDE) - { - if (ffloorflags & FF_RENDERPLANES) - ffloorflags |= FF_BOTHPLANES; - if (ffloorflags & FF_RENDERSIDES) - ffloorflags |= FF_ALLSIDES; - } - - P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); - if (lines[i].args[3] & TMFC_AIRBOB) - P_AddAirbob(lines[i].frontsector, lines[i].args[0], 16*FRACUNIT, false, false, false); - break; - - case 190: // FOF (Rising) - { - fixed_t ceilingtop = P_FindHighestCeilingSurrounding(lines[i].frontsector); - fixed_t ceilingbottom = P_FindLowestCeilingSurrounding(lines[i].frontsector); - - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; - - //Appearance settings - if (lines[i].args[2] & TMFA_NOPLANES) - ffloorflags &= ~FF_RENDERPLANES; - if (lines[i].args[2] & TMFA_NOSIDES) - ffloorflags &= ~FF_RENDERSIDES; - if (lines[i].args[2] & TMFA_INSIDES) - { - if (ffloorflags & FF_RENDERPLANES) - ffloorflags |= FF_BOTHPLANES; - if (ffloorflags & FF_RENDERSIDES) - ffloorflags |= FF_ALLSIDES; - } - if (lines[i].args[2] & TMFA_ONLYINSIDES) - { - if (ffloorflags & FF_RENDERPLANES) - ffloorflags |= FF_INVERTPLANES; - if (ffloorflags & FF_RENDERSIDES) - ffloorflags |= FF_INVERTSIDES; - } - if (lines[i].args[2] & TMFA_NOSHADE) - ffloorflags |= FF_NOSHADE; - if (lines[i].args[2] & TMFA_SPLAT) - ffloorflags |= FF_SPLAT; - - //Tangibility settings - if (lines[i].args[3] & TMFT_INTANGIBLETOP) - ffloorflags |= FF_REVERSEPLATFORM; - if (lines[i].args[3] & TMFT_INTANGIBLEBOTTOM) - ffloorflags |= FF_PLATFORM; - if (lines[i].args[3] & TMFT_DONTBLOCKPLAYER) - ffloorflags &= ~FF_BLOCKPLAYER; - if (lines[i].args[3] & TMFT_DONTBLOCKOTHERS) - ffloorflags &= ~FF_BLOCKOTHERS; - - //Cutting options - if (ffloorflags & FF_RENDERALL) - { - //If translucent or player can enter it, cut inner walls - if ((lines[i].args[1] < 255) || (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE)) - ffloorflags |= FF_CUTEXTRA|FF_EXTRA; - else - ffloorflags |= FF_CUTLEVEL; - } - - P_AddFakeFloorsByLine(i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers); - P_AddRaiseThinker(lines[i].frontsector, lines[i].args[0], lines[i].args[4] << FRACBITS, ceilingtop, ceilingbottom, !!(lines[i].args[5] & TMFR_REVERSE), !!(lines[i].args[5] & TMFR_SPINDASH)); - break; - } - case 200: // Light block - ffloorflags = FF_EXISTS|FF_CUTSPRITES; - if (!lines[i].args[1]) - ffloorflags |= FF_DOUBLESHADOW; - P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); - break; - - case 202: // Fog - ffloorflags = FF_EXISTS|FF_RENDERALL|FF_FOG|FF_INVERTPLANES|FF_INVERTSIDES|FF_CUTEXTRA|FF_EXTRA|FF_DOUBLESHADOW|FF_CUTSPRITES; - sec = sides[*lines[i].sidenum].sector - sectors; - // SoM: Because it's fog, check for an extra colormap and set the fog flag... - if (sectors[sec].extra_colormap) - sectors[sec].extra_colormap->flags = CMF_FOG; - P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); - break; - - case 220: //Intangible - ffloorflags = FF_EXISTS|FF_RENDERALL|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; - - //Appearance settings - if (lines[i].args[2] & TMFA_NOPLANES) - ffloorflags &= ~FF_RENDERPLANES; - if (lines[i].args[2] & TMFA_NOSIDES) - ffloorflags &= ~FF_RENDERSIDES; - if (!(lines[i].args[2] & TMFA_INSIDES)) - { - if (ffloorflags & FF_RENDERPLANES) - ffloorflags |= FF_BOTHPLANES; - if (ffloorflags & FF_RENDERSIDES) - ffloorflags |= FF_ALLSIDES; - } - if (lines[i].args[2] & TMFA_ONLYINSIDES) - { - if (ffloorflags & FF_RENDERPLANES) - ffloorflags |= FF_INVERTPLANES; - if (ffloorflags & FF_RENDERSIDES) - ffloorflags |= FF_INVERTSIDES; - } - if (lines[i].args[2] & TMFA_NOSHADE) - ffloorflags |= FF_NOSHADE; - if (lines[i].args[2] & TMFA_SPLAT) - ffloorflags |= FF_SPLAT; - - P_AddFakeFloorsByLine(i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers); - break; - - case 223: // FOF (intangible, invisible) - for combining specials in a sector - P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_NOSHADE, secthinkers); - break; - - case 250: // Mario Block - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_MARIO; - if (lines[i].args[1] & TMFM_BRICK) - ffloorflags |= FF_GOOWATER; - if (lines[i].args[1] & TMFM_INVISIBLE) - ffloorflags &= ~(FF_SOLID|FF_RENDERALL|FF_CUTLEVEL); - - P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); - break; - - case 251: // A THWOMP! - { - UINT16 sound = (lines[i].stringargs[0]) ? get_number(lines[i].stringargs[0]) : sfx_thwomp; - P_AddThwompThinker(lines[i].frontsector, &lines[i], lines[i].args[1] << FRACBITS, lines[i].args[2] << FRACBITS, sound); - P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); - break; - } - - case 254: // Bustable block - { - UINT8 busttype = BT_REGULAR; - ffloorspecialflags_e bustflags = 0; - - ffloorflags = FF_EXISTS|FF_BLOCKOTHERS|FF_RENDERALL|FF_BUSTUP; - - //Bustable type - switch (lines[i].args[2]) - { - case TMFB_TOUCH: - busttype = BT_TOUCH; - break; - case TMFB_SPIN: - busttype = BT_SPINBUST; - break; - case TMFB_REGULAR: - busttype = BT_REGULAR; - break; - case TMFB_STRONG: - busttype = BT_STRONG; - break; - } - - //Flags - if (lines[i].args[3] & TMFB_PUSHABLES) - bustflags |= FS_PUSHABLES; - if (lines[i].args[3] & TMFB_EXECUTOR) - bustflags |= FS_EXECUTOR; - if (lines[i].args[3] & TMFB_ONLYBOTTOM) - bustflags |= FS_ONLYBOTTOM; - if (lines[i].args[3] & TMFB_SPLAT) - ffloorflags |= FF_SPLAT; - - if (busttype != BT_TOUCH || bustflags & FS_ONLYBOTTOM) - ffloorflags |= FF_BLOCKPLAYER; - - TAG_ITER_SECTORS(0, lines[i].args[0], s) - { - ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], ffloorflags, secthinkers); - fflr->busttype = busttype; - fflr->specialflags = bustflags; - fflr->busttag = lines[i].args[4]; - } - break; - } - case 257: // Quicksand - ffloorflags = FF_EXISTS|FF_QUICKSAND|FF_RENDERALL|FF_ALLSIDES|FF_CUTSPRITES; - if (!(lines[i].args[1])) - ffloorflags |= FF_RIPPLE; - - TAG_ITER_SECTORS(0, lines[i].args[0], s) - { - ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, 0xff, ffloorflags, secthinkers); - fflr->sinkspeed = abs(lines[i].args[2]) << (FRACBITS - 1); - fflr->friction = abs(lines[i].args[3]) << (FRACBITS - 6); - } - break; - - case 258: // Laser block - ffloorflags = FF_EXISTS|FF_RENDERALL|FF_NOSHADE|FF_EXTRA|FF_CUTEXTRA|FF_TRANSLUCENT; - P_AddLaserThinker(lines[i].args[0], lines + i, !!(lines[i].args[2] & TMFL_NOBOSSES)); - if (lines[i].args[2] & TMFL_SPLAT) - ffloorflags |= FF_SPLAT; - P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); - break; - - case 259: // Custom FOF - TAG_ITER_SECTORS(0, lines[i].args[0], s) - { - ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], lines[i].args[2], secthinkers); - if (!udmf) // Ugly backwards compatibility stuff - { - if (lines[i].args[2] & FF_QUICKSAND) - { - fflr->sinkspeed = abs(lines[i].dx) >> 1; - fflr->friction = abs(lines[i].dy) >> 6; - } - if (lines[i].args[2] & FF_BUSTUP) - { - switch (lines[i].args[3] % TMFB_ONLYBOTTOM) - { - case TMFB_TOUCH: - fflr->busttype = BT_TOUCH; - break; - case TMFB_SPIN: - fflr->busttype = BT_SPINBUST; - break; - case TMFB_REGULAR: - fflr->busttype = BT_REGULAR; - break; - case TMFB_STRONG: - fflr->busttype = BT_STRONG; - break; - } - - if (lines[i].args[3] & TMFB_ONLYBOTTOM) - fflr->specialflags |= FS_ONLYBOTTOM; - if (lines[i].flags & ML_EFFECT4) - fflr->specialflags |= FS_PUSHABLES; - if (lines[i].flags & ML_EFFECT5) - { - fflr->specialflags |= FS_EXECUTOR; - fflr->busttag = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; - } - } - } - } - break; - - case 260: // GZDoom-like 3D Floor. - { - UINT8 dtype = lines[i].args[1] & 3; - UINT8 dflags1 = lines[i].args[1] - dtype; - UINT8 dflags2 = lines[i].args[2]; - UINT8 dopacity = lines[i].args[3]; - boolean isfog = false; - - if (dtype == 0) - dtype = 1; - - ffloorflags = FF_EXISTS; - - if (dflags2 & 1) ffloorflags |= FF_NOSHADE; // Disable light effects (Means no shadowcast) - if (dflags2 & 2) ffloorflags |= FF_DOUBLESHADOW; // Restrict light inside (Means doubleshadow) - if (dflags2 & 4) isfog = true; // Fog effect (Explicitly render like a fog block) - - if (dflags1 & 4) ffloorflags |= FF_BOTHPLANES|FF_ALLSIDES; // Render-inside - if (dflags1 & 16) ffloorflags |= FF_INVERTSIDES|FF_INVERTPLANES; // Invert visibility rules - - // Fog block - if (isfog) - ffloorflags |= FF_RENDERALL|FF_CUTEXTRA|FF_CUTSPRITES|FF_BOTHPLANES|FF_EXTRA|FF_FOG|FF_INVERTPLANES|FF_ALLSIDES|FF_INVERTSIDES; - else - { - ffloorflags |= FF_RENDERALL; - - // Solid - if (dtype == 1) - ffloorflags |= FF_SOLID|FF_CUTLEVEL; - // Water - else if (dtype == 2) - ffloorflags |= FF_SWIMMABLE|FF_CUTEXTRA|FF_CUTSPRITES|FF_EXTRA|FF_RIPPLE; - // Intangible - else if (dtype == 3) - ffloorflags |= FF_CUTEXTRA|FF_CUTSPRITES|FF_EXTRA; - } - - // Non-opaque - if (dopacity < 255) - { - // Invisible - if (dopacity == 0) - { - // True invisible - if (ffloorflags & FF_NOSHADE) - ffloorflags &= ~(FF_RENDERALL|FF_CUTEXTRA|FF_CUTSPRITES|FF_EXTRA|FF_BOTHPLANES|FF_ALLSIDES|FF_CUTLEVEL); - // Shadow block - else - { - ffloorflags |= FF_CUTSPRITES; - ffloorflags &= ~(FF_RENDERALL|FF_CUTEXTRA|FF_EXTRA|FF_BOTHPLANES|FF_ALLSIDES|FF_CUTLEVEL); - } - } - else - { - ffloorflags |= FF_TRANSLUCENT|FF_CUTEXTRA|FF_EXTRA; - ffloorflags &= ~FF_CUTLEVEL; - } - } - - P_AddFakeFloorsByLine(i, dopacity, ffloorflags, secthinkers); - } - break; - - case 300: // Linedef executor (combines with sector special 974/975) and commands - case 302: - case 303: - case 304: - - // Charability linedef executors - case 305: - case 307: - break; - - case 308: // Race-only linedef executor. Triggers once. - if (!(gametyperules & GTR_RACE)) - lines[i].special = 0; - break; - - // Linedef executor triggers for CTF teams. - case 309: - case 311: - if (!(gametyperules & GTR_TEAMFLAGS)) - lines[i].special = 0; - break; - - // Each time executors - case 306: - case 301: - case 310: - case 312: - case 332: - case 335: - P_AddEachTimeThinker(&lines[i]); - break; - - // No More Enemies Linedef Exec - case 313: - P_AddNoEnemiesThinker(&lines[i]); - break; - - // Pushable linedef executors (count # of pushables) - case 314: - case 315: - break; - - // Unlock trigger executors - case 317: - case 318: - break; - case 319: - case 320: - break; - - // Trigger on X calls - case 321: - case 322: - if (lines[i].flags & ML_NOCLIMB && sides[lines[i].sidenum[0]].rowoffset > 0) // optional "starting" count - lines[i].callcount = sides[lines[i].sidenum[0]].rowoffset>>FRACBITS; - else - lines[i].callcount = sides[lines[i].sidenum[0]].textureoffset>>FRACBITS; - if (lines[i].special == 322) // Each time - P_AddEachTimeThinker(&lines[i]); - break; - - // NiGHTS trigger executors - case 323: - case 324: - case 325: - case 326: - case 327: - case 328: - case 329: - case 330: - break; - - // Skin trigger executors - case 331: - case 333: - break; - - // Object dye executors - case 334: - case 336: - break; - - case 399: // Linedef execute on map load - // This is handled in P_RunLevelLoadExecutors. - break; - - case 400: - case 401: - case 402: - case 403: - case 404: - case 405: - case 406: - case 407: - case 408: - case 409: - case 410: - case 411: - case 412: - case 413: - case 414: - case 415: - case 416: - case 417: - case 418: - case 419: - case 420: - case 421: - case 422: - case 423: - case 424: - case 425: - case 426: - case 427: - case 428: - case 429: - case 430: - case 431: - break; - - case 449: // Enable bosses with parameter - { - INT32 bossid = sides[*lines[i].sidenum].textureoffset>>FRACBITS; - if (bossid & ~15) // if any bits other than first 16 are set - { - CONS_Alert(CONS_WARNING, - M_GetText("Boss enable linedef (tag %d) has an invalid texture x offset.\nConsider changing it or removing it entirely.\n"), - tag); - break; - } - if (!(lines[i].flags & ML_NOCLIMB)) - { - bossdisabled |= (1<>FRACBITS); - break; - - case 603: // Adjustable flickering light - sec = sides[*lines[i].sidenum].sector - sectors; - TAG_ITER_SECTORS(tag, s) - P_SpawnAdjustableFireFlicker(§ors[sec], §ors[s], - P_AproxDistance(lines[i].dx, lines[i].dy)>>FRACBITS); - break; - - case 604: // Adjustable Blinking Light (unsynchronized) - sec = sides[*lines[i].sidenum].sector - sectors; - TAG_ITER_SECTORS(tag, s) - P_SpawnAdjustableStrobeFlash(§ors[sec], §ors[s], - abs(lines[i].dx)>>FRACBITS, abs(lines[i].dy)>>FRACBITS, false); - break; - - case 605: // Adjustable Blinking Light (synchronized) - sec = sides[*lines[i].sidenum].sector - sectors; - TAG_ITER_SECTORS(tag, s) - P_SpawnAdjustableStrobeFlash(§ors[sec], §ors[s], - abs(lines[i].dx)>>FRACBITS, abs(lines[i].dy)>>FRACBITS, true); - break; - - case 606: // HACK! Copy colormaps. Just plain colormaps. - TAG_ITER_SECTORS(lines[i].args[0], s) - { - extracolormap_t *exc; - - if (sectors[s].colormap_protected) - continue; - - if (!udmf) - exc = sides[lines[i].sidenum[0]].colormap_data; - else - { - if (!lines[i].args[1]) - exc = lines[i].frontsector->extra_colormap; - else - { - INT32 sourcesec = Tag_Iterate_Sectors(lines[i].args[1], 0); - if (sourcesec == -1) - { - CONS_Debug(DBG_GAMELOGIC, "Line type 606: Can't find sector with source colormap (tag %d)!\n", lines[i].args[1]); - return; - } - exc = sectors[sourcesec].extra_colormap; - } - } - sectors[s].extra_colormap = sectors[s].spawn_extra_colormap = exc; - } - break; - - default: - break; - } - } - - // And another round, this time with all FOFs already created - for (i = 0; i < numlines; i++) - { - switch (lines[i].special) - { - INT32 s; - INT32 l; - - case 74: // Make FOF bustable - { - UINT8 busttype = BT_REGULAR; - ffloorspecialflags_e bustflags = 0; - - if (!udmf) - break; - - switch (lines[i].args[1]) - { - case TMFB_TOUCH: - busttype = BT_TOUCH; - break; - case TMFB_SPIN: - busttype = BT_SPINBUST; - break; - case TMFB_REGULAR: - busttype = BT_REGULAR; - break; - case TMFB_STRONG: - busttype = BT_STRONG; - break; - } - - if (lines[i].args[2] & TMFB_PUSHABLES) - bustflags |= FS_PUSHABLES; - if (lines[i].args[2] & TMFB_EXECUTOR) - bustflags |= FS_EXECUTOR; - if (lines[i].args[2] & TMFB_ONLYBOTTOM) - bustflags |= FS_ONLYBOTTOM; - - TAG_ITER_LINES(0, lines[i].args[0], l) - { - TAG_ITER_DECLARECOUNTER(1); - if (lines[l].special < 100 || lines[l].special >= 300) - continue; - - TAG_ITER_SECTORS(1, lines[l].args[0], s) - { - ffloor_t *rover; - - for (rover = sectors[s].ffloors; rover; rover = rover->next) - { - if (rover->master != lines + l) - continue; - - rover->flags |= FF_BUSTUP; - rover->spawnflags |= FF_BUSTUP; - rover->busttype = busttype; - rover->specialflags &= ~FS_BUSTMASK; - rover->specialflags |= bustflags; - rover->busttag = lines[i].args[3]; - CheckForBustableBlocks = true; - break; - } - } - } - break; - } - - case 75: // Make FOF quicksand - { - if (!udmf) - break; - TAG_ITER_LINES(0, lines[i].args[0], l) - { - TAG_ITER_DECLARECOUNTER(1); - if (lines[l].special < 100 || lines[l].special >= 300) - continue; - - TAG_ITER_SECTORS(1, lines[l].args[0], s) - { - ffloor_t *rover; - - for (rover = sectors[s].ffloors; rover; rover = rover->next) - { - if (rover->master != lines + l) - continue; - - rover->flags |= FF_QUICKSAND; - rover->spawnflags |= FF_QUICKSAND; - rover->sinkspeed = abs(lines[i].args[1]) << (FRACBITS - 1); - rover->friction = abs(lines[i].args[2]) << (FRACBITS - 6); - CheckForQuicksand = true; - break; - } - } - } - break; - } - - case 76: // Make FOF bouncy - { - if (udmf) - { - TAG_ITER_LINES(0, lines[i].args[0], l) - P_MakeFOFBouncy(lines + i, lines + l); - } - else - { - TAG_ITER_SECTORS(0, lines[i].args[0], s) - for (j = 0; (unsigned)j < sectors[s].linecount; j++) - P_MakeFOFBouncy(lines + i, sectors[s].lines[j]); - } - break; - } - } - } - - - - - - // Allocate each list - for (i = 0; i < numsectors; i++) - if(secthinkers[i].thinkers) - Z_Free(secthinkers[i].thinkers); - - Z_Free(secthinkers); - - // haleyjd 02/20/06: spawn polyobjects - Polyobj_InitLevel(); - - for (i = 0; i < numlines; i++) - { - switch (lines[i].special) - { - case 30: // Polyobj_Flag - PolyFlag(&lines[i]); - break; - - case 31: // Polyobj_Displace - PolyDisplace(&lines[i]); - break; - - case 32: // Polyobj_RotDisplace - PolyRotDisplace(&lines[i]); - break; - } - } - - P_RunLevelLoadExecutors(); -} - -/** Adds 3Dfloors as appropriate based on a common control linedef. - * - * \param line Control linedef to use. - * \param alpha Alpha value (0-255). - * \param ffloorflags 3Dfloor flags to use. - * \param secthkiners Lists of thinkers sorted by sector. May be NULL. - * \sa P_SpawnSpecials, P_AddFakeFloor - * \author Graue - */ -static void P_AddFakeFloorsByLine(size_t line, INT32 alpha, ffloortype_e ffloorflags, thinkerlist_t *secthinkers) -{ - INT32 s; - mtag_t tag = lines[line].args[0]; - size_t sec = sides[*lines[line].sidenum].sector-sectors; - -<<<<<<< HEAD - TAG_ITER_SECTORS(0, tag, s) - P_AddFakeFloor(§ors[s], §ors[sec], lines+line, alpha, ffloorflags, secthinkers); -======= - line_t* li = lines + line; - TAG_ITER_SECTORS(tag, s) - P_AddFakeFloor(§ors[s], §ors[sec], li, ffloorflags, secthinkers); ->>>>>>> next -} - -/* - SoM: 3/8/2000: General scrolling functions. - T_Scroll, - Add_Scroller, - Add_WallScroller, - P_SpawnScrollers -*/ - -// helper function for T_Scroll -static void P_DoScrollMove(mobj_t *thing, fixed_t dx, fixed_t dy, INT32 exclusive) -{ - fixed_t fuckaj = 0; // Nov 05 14:12:08 <+MonsterIestyn> I've heard of explicitly defined variables but this is ridiculous - if (thing->player) - { - if (!(dx | dy)) - { - thing->player->cmomx = 0; - thing->player->cmomy = 0; - } - else - { - thing->player->cmomx += dx; - thing->player->cmomy += dy; - thing->player->cmomx = FixedMul(thing->player->cmomx, 0xe800); - thing->player->cmomy = FixedMul(thing->player->cmomy, 0xe800); - } - } - - if (thing->player && (thing->player->pflags & PF_SPINNING) && (thing->player->rmomx || thing->player->rmomy) && !(thing->player->pflags & PF_STARTDASH)) - fuckaj = FixedDiv(549*ORIG_FRICTION,500*FRACUNIT); - else if (thing->friction != ORIG_FRICTION) - fuckaj = thing->friction; - - if (fuckaj) { - // refactor thrust for new friction - dx = FixedDiv(dx, CARRYFACTOR); - dy = FixedDiv(dy, CARRYFACTOR); - - dx = FixedMul(dx, FRACUNIT-fuckaj); - dy = FixedMul(dy, FRACUNIT-fuckaj); - } - - thing->momx += dx; - thing->momy += dy; - - if (exclusive) - thing->eflags |= MFE_PUSHED; -} - -/** Processes an active scroller. - * This function, with the help of r_plane.c and r_bsp.c, supports generalized - * scrolling floors and walls, with optional mobj-carrying properties, e.g. - * conveyor belts, rivers, etc. A linedef with a special type affects all - * tagged sectors the same way, by creating scrolling and/or object-carrying - * properties. Multiple linedefs may be used on the same sector and are - * cumulative, although the special case of scrolling a floor and carrying - * things on it requires only one linedef. - * - * The linedef's direction determines the scrolling direction, and the - * linedef's length determines the scrolling speed. This was designed so an - * edge around a sector can be used to control the direction of the sector's - * scrolling, which is usually what is desired. - * - * \param s Thinker for the scroller to process. - * \todo Split up into multiple functions. - * \todo Use attached lists to make ::sc_carry_ceiling case faster and - * cleaner. - * \sa Add_Scroller, Add_WallScroller, P_SpawnScrollers - * \author Steven McGranahan - * \author Graue - */ -void T_Scroll(scroll_t *s) -{ - fixed_t dx = s->dx, dy = s->dy; - boolean is3dblock = false; - - if (s->control != -1) - { // compute scroll amounts based on a sector's height changes - fixed_t height = sectors[s->control].floorheight + - sectors[s->control].ceilingheight; - fixed_t delta = height - s->last_height; - s->last_height = height; - dx = FixedMul(dx, delta); - dy = FixedMul(dy, delta); - } - - if (s->accel) - { - s->vdx = dx += s->vdx; - s->vdy = dy += s->vdy; - } - -// if (!(dx | dy)) // no-op if both (x,y) offsets 0 -// return; - - switch (s->type) - { - side_t *side; - sector_t *sec; - fixed_t height; - msecnode_t *node; - mobj_t *thing; - line_t *line; - size_t i; - INT32 sect; - ffloor_t *rover; - - case sc_side: // scroll wall texture - side = sides + s->affectee; - side->textureoffset += dx; - side->rowoffset += dy; - break; - - case sc_floor: // scroll floor texture - sec = sectors + s->affectee; - sec->floor_xoffs += dx; - sec->floor_yoffs += dy; - break; - - case sc_ceiling: // scroll ceiling texture - sec = sectors + s->affectee; - sec->ceiling_xoffs += dx; - sec->ceiling_yoffs += dy; - break; - - case sc_carry: - sec = sectors + s->affectee; - height = sec->floorheight; - - // sec is the control sector, find the real sector(s) to use - for (i = 0; i < sec->linecount; i++) - { - line = sec->lines[i]; - - if (line->special < 100 || line->special >= 300) - is3dblock = false; - else - is3dblock = true; - - if (!is3dblock) - continue; - - TAG_ITER_SECTORS(Tag_FGet(&line->tags), sect) - { - sector_t *psec; - psec = sectors + sect; - - // Find the FOF corresponding to the control linedef - for (rover = psec->ffloors; rover; rover = rover->next) - { - if (rover->master == sec->lines[i]) - break; - } - - if (!rover) // This should be impossible, but don't complain if it is the case somehow - continue; - - if (!(rover->flags & FF_EXISTS)) // If the FOF does not "exist", we pretend that nobody's there - continue; - - for (node = psec->touching_thinglist; node; node = node->m_thinglist_next) - { - thing = node->m_thing; - - if (thing->eflags & MFE_PUSHED) // Already pushed this tic by an exclusive pusher. - continue; - - height = P_GetSpecialBottomZ(thing, sec, psec); - - if (!(thing->flags & MF_NOCLIP)) // Thing must be clipped - if (!(thing->flags & MF_NOGRAVITY || thing->z+thing->height != height)) // Thing must a) be non-floating and have z+height == height - { - // Move objects only if on floor - // non-floating, and clipped. - P_DoScrollMove(thing, dx, dy, s->exclusive); - } - } // end of for loop through touching_thinglist - } // end of loop through sectors - } - - if (!is3dblock) - { - for (node = sec->touching_thinglist; node; node = node->m_thinglist_next) - { - thing = node->m_thing; - - if (thing->eflags & MFE_PUSHED) - continue; - - height = P_GetSpecialBottomZ(thing, sec, sec); - - if (!(thing->flags & MF_NOCLIP) && - (!(thing->flags & MF_NOGRAVITY || thing->z > height))) - { - // Move objects only if on floor or underwater, - // non-floating, and clipped. - P_DoScrollMove(thing, dx, dy, s->exclusive); - } - } - } - break; - - case sc_carry_ceiling: // carry on ceiling (FOF scrolling) - sec = sectors + s->affectee; - height = sec->ceilingheight; - - // sec is the control sector, find the real sector(s) to use - for (i = 0; i < sec->linecount; i++) - { - line = sec->lines[i]; - if (line->special < 100 || line->special >= 300) - is3dblock = false; - else - is3dblock = true; - - if (!is3dblock) - continue; - TAG_ITER_SECTORS(Tag_FGet(&line->tags), sect) - { - sector_t *psec; - psec = sectors + sect; - - // Find the FOF corresponding to the control linedef - for (rover = psec->ffloors; rover; rover = rover->next) - { - if (rover->master == sec->lines[i]) - break; - } - - if (!rover) // This should be impossible, but don't complain if it is the case somehow - continue; - - if (!(rover->flags & FF_EXISTS)) // If the FOF does not "exist", we pretend that nobody's there - continue; - - for (node = psec->touching_thinglist; node; node = node->m_thinglist_next) - { - thing = node->m_thing; - - if (thing->eflags & MFE_PUSHED) - continue; - - height = P_GetSpecialTopZ(thing, sec, psec); - - if (!(thing->flags & MF_NOCLIP)) // Thing must be clipped - if (!(thing->flags & MF_NOGRAVITY || thing->z != height))// Thing must a) be non-floating and have z == height - { - // Move objects only if on floor or underwater, - // non-floating, and clipped. - P_DoScrollMove(thing, dx, dy, s->exclusive); - } - } // end of for loop through touching_thinglist - } // end of loop through sectors - } - - if (!is3dblock) - { - for (node = sec->touching_thinglist; node; node = node->m_thinglist_next) - { - thing = node->m_thing; - - if (thing->eflags & MFE_PUSHED) - continue; - - height = P_GetSpecialTopZ(thing, sec, sec); - - if (!(thing->flags & MF_NOCLIP) && - (!(thing->flags & MF_NOGRAVITY || thing->z+thing->height < height))) - { - // Move objects only if on floor or underwater, - // non-floating, and clipped. - P_DoScrollMove(thing, dx, dy, s->exclusive); - } - } - } - break; // end of sc_carry_ceiling - } // end of switch -} - -/** Adds a generalized scroller to the thinker list. - * - * \param type The enumerated type of scrolling. - * \param dx x speed of scrolling or its acceleration. - * \param dy y speed of scrolling or its acceleration. - * \param control Sector whose heights control this scroller's effect - * remotely, or -1 if there is no control sector. - * \param affectee Index of the affected object, sector or sidedef. - * \param accel Nonzero for an accelerative effect. - * \sa Add_WallScroller, P_SpawnScrollers, T_Scroll - */ -static void Add_Scroller(INT32 type, fixed_t dx, fixed_t dy, INT32 control, INT32 affectee, INT32 accel, INT32 exclusive) -{ - scroll_t *s = Z_Calloc(sizeof *s, PU_LEVSPEC, NULL); - s->thinker.function.acp1 = (actionf_p1)T_Scroll; - s->type = type; - s->dx = dx; - s->dy = dy; - s->accel = accel; - s->exclusive = exclusive; - s->vdx = s->vdy = 0; - if ((s->control = control) != -1) - s->last_height = sectors[control].floorheight + sectors[control].ceilingheight; - s->affectee = affectee; - P_AddThinker(THINK_MAIN, &s->thinker); -} - -/** Initializes the scrollers. - * - * \todo Get rid of all the magic numbers. - * \sa P_SpawnSpecials, Add_Scroller, Add_WallScroller - */ -static void P_SpawnScrollers(void) -{ - size_t i; - line_t *l = lines; - mtag_t tag; - - for (i = 0; i < numlines; i++, l++) - { - fixed_t dx = l->dx >> SCROLL_SHIFT; // direction and speed of scrolling - fixed_t dy = l->dy >> SCROLL_SHIFT; - INT32 control = -1, accel = 0; // no control sector or acceleration - INT32 special = l->special; - - tag = Tag_FGet(&l->tags); - - // These types are same as the ones they get set to except that the - // first side's sector's heights cause scrolling when they change, and - // this linedef controls the direction and speed of the scrolling. The - // most complicated linedef since donuts, but powerful :) - - if (special == 515 || special == 512 || special == 522 || special == 532 || special == 504) // displacement scrollers - { - special -= 2; - control = (INT32)(sides[*l->sidenum].sector - sectors); - } - else if (special == 514 || special == 511 || special == 521 || special == 531 || special == 503) // accelerative scrollers - { - special--; - accel = 1; - control = (INT32)(sides[*l->sidenum].sector - sectors); - } - else if (special == 535 || special == 525) // displacement scrollers - { - special -= 2; - control = (INT32)(sides[*l->sidenum].sector - sectors); - } - else if (special == 534 || special == 524) // accelerative scrollers - { - accel = 1; - special--; - control = (INT32)(sides[*l->sidenum].sector - sectors); - } - - switch (special) - { - register INT32 s; - - case 513: // scroll effect ceiling - case 533: // scroll and carry objects on ceiling - TAG_ITER_SECTORS(tag, s) - Add_Scroller(sc_ceiling, -dx, dy, control, s, accel, l->flags & ML_NOCLIMB); - if (special != 533) - break; - /* FALLTHRU */ - - case 523: // carry objects on ceiling - dx = FixedMul(dx, CARRYFACTOR); - dy = FixedMul(dy, CARRYFACTOR); - TAG_ITER_SECTORS(tag, s) - Add_Scroller(sc_carry_ceiling, dx, dy, control, s, accel, l->flags & ML_NOCLIMB); - break; - - case 510: // scroll effect floor - case 530: // scroll and carry objects on floor - TAG_ITER_SECTORS(tag, s) - Add_Scroller(sc_floor, -dx, dy, control, s, accel, l->flags & ML_NOCLIMB); - if (special != 530) - break; - /* FALLTHRU */ - - case 520: // carry objects on floor - dx = FixedMul(dx, CARRYFACTOR); - dy = FixedMul(dy, CARRYFACTOR); - TAG_ITER_SECTORS(tag, s) - Add_Scroller(sc_carry, dx, dy, control, s, accel, l->flags & ML_NOCLIMB); - break; - - // scroll wall according to linedef - // (same direction and speed as scrolling floors) - case 502: - { - TAG_ITER_LINES(tag, s) - if (s != (INT32)i) - { - if (l->flags & ML_EFFECT2) // use texture offsets instead - { - dx = sides[l->sidenum[0]].textureoffset; - dy = sides[l->sidenum[0]].rowoffset; - } - if (l->flags & ML_EFFECT3) - { - if (lines[s].sidenum[1] != 0xffff) - Add_Scroller(sc_side, dx, dy, control, lines[s].sidenum[1], accel, 0); - } - else - Add_Scroller(sc_side, dx, dy, control, lines[s].sidenum[0], accel, 0); - } - break; - } - - case 505: - s = lines[i].sidenum[0]; - Add_Scroller(sc_side, -sides[s].textureoffset, sides[s].rowoffset, -1, s, accel, 0); - break; - - case 506: - s = lines[i].sidenum[1]; - - if (s != 0xffff) - Add_Scroller(sc_side, -sides[s].textureoffset, sides[s].rowoffset, -1, lines[i].sidenum[0], accel, 0); - else - CONS_Debug(DBG_GAMELOGIC, "Line special 506 (line #%s) missing back side!\n", sizeu1(i)); - break; - - case 507: - s = lines[i].sidenum[0]; - - if (lines[i].sidenum[1] != 0xffff) - Add_Scroller(sc_side, -sides[s].textureoffset, sides[s].rowoffset, -1, lines[i].sidenum[1], accel, 0); - else - CONS_Debug(DBG_GAMELOGIC, "Line special 507 (line #%s) missing back side!\n", sizeu1(i)); - break; - - case 508: - s = lines[i].sidenum[1]; - - if (s != 0xffff) - Add_Scroller(sc_side, -sides[s].textureoffset, sides[s].rowoffset, -1, s, accel, 0); - else - CONS_Debug(DBG_GAMELOGIC, "Line special 508 (line #%s) missing back side!\n", sizeu1(i)); - break; - - case 500: // scroll first side - Add_Scroller(sc_side, FRACUNIT, 0, -1, lines[i].sidenum[0], accel, 0); - break; - - case 501: // jff 1/30/98 2-way scroll - Add_Scroller(sc_side, -FRACUNIT, 0, -1, lines[i].sidenum[0], accel, 0); - break; - } - } -} - -/** Adds master appear/disappear thinker. - * - * \param appeartime tics to be existent - * \param disappeartime tics to be nonexistent - * \param sector pointer to control sector - */ -static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline) -{ - disappear_t *d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); - - d->thinker.function.acp1 = (actionf_p1)T_Disappear; - d->appeartime = appeartime; - d->disappeartime = disappeartime; - d->offset = offset; - d->affectee = line; - d->sourceline = sourceline; - d->exists = true; - d->timer = 1; - - P_AddThinker(THINK_MAIN, &d->thinker); -} - -/** Makes a FOF appear/disappear - * - * \param d Disappear thinker. - * \sa Add_MasterDisappearer - */ -void T_Disappear(disappear_t *d) -{ - if (d->offset && !d->exists) - { - d->offset--; - return; - } - - if (--d->timer <= 0) - { - ffloor_t *rover; - register INT32 s; - mtag_t afftag = Tag_FGet(&lines[d->affectee].tags); - - TAG_ITER_SECTORS(afftag, s) - { - for (rover = sectors[s].ffloors; rover; rover = rover->next) - { - if (rover->master != &lines[d->affectee]) - continue; - - if (d->exists) - rover->flags &= ~FF_EXISTS; - else - { - rover->flags |= FF_EXISTS; - - if (!(lines[d->sourceline].flags & ML_NOCLIMB)) - { - sectors[s].soundorg.z = P_GetFFloorTopZAt(rover, sectors[s].soundorg.x, sectors[s].soundorg.y); - S_StartSound(§ors[s].soundorg, sfx_appear); - } - } - } - sectors[s].moved = true; - P_RecalcPrecipInSector(§ors[s]); - } - - if (d->exists) - { - d->timer = d->disappeartime; - d->exists = false; - } - else - { - d->timer = d->appeartime; - d->exists = true; - } - } -} - -/** Removes fadingdata from FOF control sector - * - * \param line line to search for target faders - * \param data pointer to set new fadingdata to. Can be NULL to erase. - */ -static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finalize) -{ - fade_t *fadingdata = (fade_t *)rover->fadingdata; - // find any existing thinkers and remove them, then replace with new data - if (fadingdata != data) - { - if (fadingdata) - { - if (finalize) - P_FadeFakeFloor(rover, - fadingdata->sourcevalue, - fadingdata->alpha >= fadingdata->destvalue ? - fadingdata->alpha - 1 : // trigger fade-out finish - fadingdata->alpha + 1, // trigger fade-in finish - 0, - fadingdata->ticbased, - &fadingdata->timer, - fadingdata->doexists, - fadingdata->dotranslucent, - fadingdata->dolighting, - fadingdata->docolormap, - fadingdata->docollision, - fadingdata->doghostfade, - fadingdata->exactalpha); - rover->alpha = fadingdata->alpha; - - if (fadingdata->dolighting) - P_RemoveLighting(§ors[rover->secnum]); - - if (fadingdata->docolormap) - P_ResetColormapFader(§ors[rover->secnum]); - - P_RemoveThinker(&fadingdata->thinker); - } - - rover->fadingdata = data; - } -} - -static boolean P_FadeFakeFloor(ffloor_t *rover, INT16 sourcevalue, INT16 destvalue, INT16 speed, boolean ticbased, INT32 *timer, - boolean doexists, boolean dotranslucent, boolean dolighting, boolean docolormap, - boolean docollision, boolean doghostfade, boolean exactalpha) -{ - boolean stillfading = false; - INT32 alpha; - fade_t *fadingdata = (fade_t *)rover->fadingdata; - (void)docolormap; // *shrug* maybe we can use this in the future. For now, let's be consistent with our other function params - - if (rover->master->special == 258) // Laser block - return false; - - // If fading an invisible FOF whose render flags we did not yet set, - // initialize its alpha to 1 - if (dotranslucent && - (rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE - !(rover->flags & FF_FOG) && // do not include fog - !(rover->spawnflags & FF_RENDERSIDES) && - !(rover->spawnflags & FF_RENDERPLANES) && - !(rover->flags & FF_RENDERALL)) - rover->alpha = 1; - - if (fadingdata) - alpha = fadingdata->alpha; - else - alpha = rover->alpha; - - // routines specific to fade in and fade out - if (!ticbased && alpha == destvalue) - return stillfading; - else if (alpha > destvalue) // fade out - { - // finish fading out - if (speed < 1 || (!ticbased && alpha - speed <= destvalue + speed) || - (ticbased && (--(*timer) <= 0 || alpha <= destvalue))) - { - alpha = destvalue; - - if (docollision) - { - if (rover->spawnflags & FF_SOLID) - rover->flags &= ~FF_SOLID; - if (rover->spawnflags & FF_SWIMMABLE) - rover->flags &= ~FF_SWIMMABLE; - if (rover->spawnflags & FF_QUICKSAND) - rover->flags &= ~FF_QUICKSAND; - if (rover->spawnflags & FF_BUSTUP) - rover->flags &= ~FF_BUSTUP; - if (rover->spawnflags & FF_MARIO) - rover->flags &= ~FF_MARIO; - } - } - else // continue fading out - { - if (!ticbased) - alpha -= speed; - else - { - INT16 delta = abs(destvalue - sourcevalue); - fixed_t factor = min(FixedDiv(speed - (*timer), speed), 1*FRACUNIT); - alpha = max(min(alpha, sourcevalue - (INT16)FixedMul(delta, factor)), destvalue); - } - stillfading = true; - } - } - else // fade in - { - // finish fading in - if (speed < 1 || (!ticbased && alpha + speed >= destvalue - speed) || - (ticbased && (--(*timer) <= 0 || alpha >= destvalue))) - { - alpha = destvalue; - - if (docollision) - { - if (rover->spawnflags & FF_SOLID) - rover->flags |= FF_SOLID; - if (rover->spawnflags & FF_SWIMMABLE) - rover->flags |= FF_SWIMMABLE; - if (rover->spawnflags & FF_QUICKSAND) - rover->flags |= FF_QUICKSAND; - if (rover->spawnflags & FF_BUSTUP) - rover->flags |= FF_BUSTUP; - if (rover->spawnflags & FF_MARIO) - rover->flags |= FF_MARIO; - } - } - else // continue fading in - { - if (!ticbased) - alpha += speed; - else - { - INT16 delta = abs(destvalue - sourcevalue); - fixed_t factor = min(FixedDiv(speed - (*timer), speed), 1*FRACUNIT); - alpha = min(max(alpha, sourcevalue + (INT16)FixedMul(delta, factor)), destvalue); - } - stillfading = true; - } - } - - // routines common to both fade in and fade out - if (!stillfading) - { - if (doexists && !(rover->spawnflags & FF_BUSTUP)) - { - if (alpha <= 1) - rover->flags &= ~FF_EXISTS; - else - rover->flags |= FF_EXISTS; - - // Re-render lighting at end of fade - if (dolighting && !(rover->spawnflags & FF_NOSHADE) && !(rover->flags & FF_EXISTS)) - rover->target->moved = true; - } - - if (dotranslucent && !(rover->flags & FF_FOG)) - { - if (alpha >= 256) - { - if (!(rover->flags & FF_CUTSOLIDS) && - (rover->spawnflags & FF_CUTSOLIDS)) - { - rover->flags |= FF_CUTSOLIDS; - rover->target->moved = true; - } - - rover->flags &= ~FF_TRANSLUCENT; - } - else - { - rover->flags |= FF_TRANSLUCENT; - - if ((rover->flags & FF_CUTSOLIDS) && - (rover->spawnflags & FF_CUTSOLIDS)) - { - rover->flags &= ~FF_CUTSOLIDS; - rover->target->moved = true; - } - } - - if ((rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE - !(rover->spawnflags & FF_RENDERSIDES) && - !(rover->spawnflags & FF_RENDERPLANES)) - { - if (rover->alpha > 1) - rover->flags |= FF_RENDERALL; - else - rover->flags &= ~FF_RENDERALL; - } - } - } - else - { - if (doexists && !(rover->spawnflags & FF_BUSTUP)) - { - // Re-render lighting if we haven't yet set FF_EXISTS (beginning of fade) - if (dolighting && !(rover->spawnflags & FF_NOSHADE) && !(rover->flags & FF_EXISTS)) - rover->target->moved = true; - - rover->flags |= FF_EXISTS; - } - - if (dotranslucent && !(rover->flags & FF_FOG)) - { - rover->flags |= FF_TRANSLUCENT; - - if ((rover->flags & FF_CUTSOLIDS) && - (rover->spawnflags & FF_CUTSOLIDS)) - { - rover->flags &= ~FF_CUTSOLIDS; - rover->target->moved = true; - } - - if ((rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE - !(rover->spawnflags & FF_RENDERSIDES) && - !(rover->spawnflags & FF_RENDERPLANES)) - rover->flags |= FF_RENDERALL; - } - - if (docollision) - { - if (doghostfade) // remove collision flags during fade - { - if (rover->spawnflags & FF_SOLID) - rover->flags &= ~FF_SOLID; - if (rover->spawnflags & FF_SWIMMABLE) - rover->flags &= ~FF_SWIMMABLE; - if (rover->spawnflags & FF_QUICKSAND) - rover->flags &= ~FF_QUICKSAND; - if (rover->spawnflags & FF_BUSTUP) - rover->flags &= ~FF_BUSTUP; - if (rover->spawnflags & FF_MARIO) - rover->flags &= ~FF_MARIO; - } - else // keep collision during fade - { - if (rover->spawnflags & FF_SOLID) - rover->flags |= FF_SOLID; - if (rover->spawnflags & FF_SWIMMABLE) - rover->flags |= FF_SWIMMABLE; - if (rover->spawnflags & FF_QUICKSAND) - rover->flags |= FF_QUICKSAND; - if (rover->spawnflags & FF_BUSTUP) - rover->flags |= FF_BUSTUP; - if (rover->spawnflags & FF_MARIO) - rover->flags |= FF_MARIO; - } - } - } - - if (!(rover->flags & FF_FOG)) // don't set FOG alpha - { - if (!stillfading || exactalpha) - rover->alpha = alpha; - else // clamp fadingdata->alpha to software's alpha levels - { - if (alpha < 12) - rover->alpha = destvalue < 12 ? destvalue : 1; // Don't even draw it - else if (alpha < 38) - rover->alpha = destvalue >= 12 && destvalue < 38 ? destvalue : 25; - else if (alpha < 64) - rover->alpha = destvalue >=38 && destvalue < 64 ? destvalue : 51; - else if (alpha < 89) - rover->alpha = destvalue >= 64 && destvalue < 89 ? destvalue : 76; - else if (alpha < 115) - rover->alpha = destvalue >= 89 && destvalue < 115 ? destvalue : 102; - else if (alpha < 140) - rover->alpha = destvalue >= 115 && destvalue < 140 ? destvalue : 128; - else if (alpha < 166) - rover->alpha = destvalue >= 140 && destvalue < 166 ? destvalue : 154; - else if (alpha < 192) - rover->alpha = destvalue >= 166 && destvalue < 192 ? destvalue : 179; - else if (alpha < 217) - rover->alpha = destvalue >= 192 && destvalue < 217 ? destvalue : 204; - else if (alpha < 243) - rover->alpha = destvalue >= 217 && destvalue < 243 ? destvalue : 230; - else // Opaque - rover->alpha = destvalue >= 243 ? destvalue : 256; - } - } - - if (fadingdata) - fadingdata->alpha = alpha; - - return stillfading; -} - -/** Adds fake floor fader thinker. - * - * \param destvalue transparency value to fade to - * \param speed speed to fade by - * \param ticbased tic-based logic, speed = duration - * \param relative Destvalue is relative to rover->alpha - * \param doexists handle FF_EXISTS - * \param dotranslucent handle FF_TRANSLUCENT - * \param dolighting fade FOF light - * \param docollision handle interactive flags - * \param doghostfade no interactive flags during fading - * \param exactalpha use exact alpha values (opengl) - */ -static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloornum, - INT16 destvalue, INT16 speed, boolean ticbased, boolean relative, - boolean doexists, boolean dotranslucent, boolean dolighting, boolean docolormap, - boolean docollision, boolean doghostfade, boolean exactalpha) -{ - fade_t *d; - - // If fading an invisible FOF whose render flags we did not yet set, - // initialize its alpha to 1 - if (dotranslucent && - (rover->spawnflags & FF_NOSHADE) && // do not include light blocks, which don't set FF_NOSHADE - !(rover->spawnflags & FF_RENDERSIDES) && - !(rover->spawnflags & FF_RENDERPLANES) && - !(rover->flags & FF_RENDERALL)) - rover->alpha = 1; - - // already equal, nothing to do - if (rover->alpha == max(1, min(256, relative ? rover->alpha + destvalue : destvalue))) - return; - - d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); - - d->thinker.function.acp1 = (actionf_p1)T_Fade; - d->rover = rover; - d->sectornum = (UINT32)sectornum; - d->ffloornum = (UINT32)ffloornum; - - d->alpha = d->sourcevalue = rover->alpha; - d->destvalue = max(1, min(256, relative ? rover->alpha + destvalue : destvalue)); // rover->alpha is 1-256 - - if (ticbased) - { - d->ticbased = true; - d->timer = d->speed = abs(speed); // use d->speed as total duration - } - else - { - d->ticbased = false; - d->speed = max(1, speed); // minimum speed 1/tic // if speed < 1, alpha is set immediately in thinker - d->timer = -1; - } - - d->doexists = doexists; - d->dotranslucent = dotranslucent; - d->dolighting = dolighting; - d->docolormap = docolormap; - d->docollision = docollision; - d->doghostfade = doghostfade; - d->exactalpha = exactalpha; - - // find any existing thinkers and remove them, then replace with new data - P_ResetFakeFloorFader(rover, d, false); - - // Set a separate thinker for shadow fading - if (dolighting && !(rover->flags & FF_NOSHADE)) - { - UINT16 lightdelta = abs(sectors[rover->secnum].spawn_lightlevel - rover->target->lightlevel); - fixed_t alphapercent = min(FixedDiv(d->destvalue, rover->spawnalpha), 1*FRACUNIT); // don't make darker than spawn_lightlevel - fixed_t adjustedlightdelta = FixedMul(lightdelta, alphapercent); - - if (rover->target->lightlevel >= sectors[rover->secnum].spawn_lightlevel) // fading out, get lighter - d->destlightlevel = rover->target->lightlevel - adjustedlightdelta; - else // fading in, get darker - d->destlightlevel = rover->target->lightlevel + adjustedlightdelta; - - P_FadeLightBySector(§ors[rover->secnum], - d->destlightlevel, - ticbased ? d->timer : - FixedFloor(FixedDiv(abs(d->destvalue - d->alpha), d->speed))/FRACUNIT, - true); - } - else - d->destlightlevel = -1; - - // Set a separate thinker for colormap fading - if (docolormap && !(rover->flags & FF_NOSHADE) && sectors[rover->secnum].spawn_extra_colormap && !sectors[rover->secnum].colormap_protected) - { - extracolormap_t *dest_exc, - *source_exc = sectors[rover->secnum].extra_colormap ? sectors[rover->secnum].extra_colormap : R_GetDefaultColormap(); - - INT32 colordelta = R_GetRgbaA(sectors[rover->secnum].spawn_extra_colormap->rgba); // alpha is from 0 - fixed_t alphapercent = min(FixedDiv(d->destvalue, rover->spawnalpha), 1*FRACUNIT); // don't make darker than spawn_lightlevel - fixed_t adjustedcolordelta = FixedMul(colordelta, alphapercent); - INT32 coloralpha; - - coloralpha = adjustedcolordelta; - - dest_exc = R_CopyColormap(sectors[rover->secnum].spawn_extra_colormap, false); - dest_exc->rgba = R_GetRgbaRGB(dest_exc->rgba) + R_PutRgbaA(coloralpha); - - if (!(d->dest_exc = R_GetColormapFromList(dest_exc))) - { - dest_exc->colormap = R_CreateLightTable(dest_exc); - R_AddColormapToList(dest_exc); - d->dest_exc = dest_exc; - } - else - Z_Free(dest_exc); - - // If fading from 0, set source_exc rgb same to dest_exc - if (!R_CheckDefaultColormap(d->dest_exc, true, false, false) - && R_CheckDefaultColormap(source_exc, true, false, false)) - { - extracolormap_t *exc = R_CopyColormap(source_exc, false); - exc->rgba = R_GetRgbaRGB(d->dest_exc->rgba) + R_PutRgbaA(R_GetRgbaA(source_exc->rgba)); - exc->fadergba = R_GetRgbaRGB(d->dest_exc->rgba) + R_PutRgbaA(R_GetRgbaA(source_exc->fadergba)); - - if (!(source_exc = R_GetColormapFromList(exc))) - { - exc->colormap = R_CreateLightTable(exc); - R_AddColormapToList(exc); - source_exc = exc; - } - else - Z_Free(exc); - } - - Add_ColormapFader(§ors[rover->secnum], source_exc, d->dest_exc, true, - ticbased ? d->timer : - FixedFloor(FixedDiv(abs(d->destvalue - d->alpha), d->speed))/FRACUNIT); - } - - P_AddThinker(THINK_MAIN, &d->thinker); -} - -/** Makes a FOF fade - * - * \param d Fade thinker. - * \sa P_AddFakeFloorFader - */ -void T_Fade(fade_t *d) -{ - if (d->rover && !P_FadeFakeFloor(d->rover, d->sourcevalue, d->destvalue, d->speed, d->ticbased, &d->timer, - d->doexists, d->dotranslucent, d->dolighting, d->docolormap, d->docollision, d->doghostfade, d->exactalpha)) - { - // Finalize lighting, copypasta from P_AddFakeFloorFader - if (d->dolighting && !(d->rover->flags & FF_NOSHADE) && d->destlightlevel > -1) - sectors[d->rover->secnum].lightlevel = d->destlightlevel; - - // Finalize colormap - if (d->docolormap && !(d->rover->flags & FF_NOSHADE) && sectors[d->rover->secnum].spawn_extra_colormap) - sectors[d->rover->secnum].extra_colormap = d->dest_exc; - - P_RemoveFakeFloorFader(d->rover); - } -} - -static void P_ResetColormapFader(sector_t *sector) -{ - if (sector->fadecolormapdata) - { - // The thinker is the first member in all the action structs, - // so just let the thinker get freed, and that will free the whole - // structure. - P_RemoveThinker(&((elevator_t *)sector->fadecolormapdata)->thinker); - sector->fadecolormapdata = NULL; - } -} - -static void Add_ColormapFader(sector_t *sector, extracolormap_t *source_exc, extracolormap_t *dest_exc, - boolean ticbased, INT32 duration) -{ - fadecolormap_t *d; - - P_ResetColormapFader(sector); - - // nothing to do, set immediately - if (!duration || R_CheckEqualColormaps(source_exc, dest_exc, true, true, true)) - { - sector->extra_colormap = dest_exc; - return; - } - - d = Z_Malloc(sizeof *d, PU_LEVSPEC, NULL); - d->thinker.function.acp1 = (actionf_p1)T_FadeColormap; - d->sector = sector; - d->source_exc = source_exc; - d->dest_exc = dest_exc; - - if (ticbased) - { - d->ticbased = true; - d->duration = d->timer = duration; - } - else - { - d->ticbased = false; - d->timer = 256; - d->duration = duration; // use as speed - } - - sector->fadecolormapdata = d; - P_AddThinker(THINK_MAIN, &d->thinker); -} - -void T_FadeColormap(fadecolormap_t *d) -{ - if ((d->ticbased && --d->timer <= 0) - || (!d->ticbased && (d->timer -= d->duration) <= 0)) // d->duration used as speed decrement - { - d->sector->extra_colormap = d->dest_exc; - P_ResetColormapFader(d->sector); - } - else - { - extracolormap_t *exc; - INT32 duration = d->ticbased ? d->duration : 256; - fixed_t factor = min(FixedDiv(duration - d->timer, duration), 1*FRACUNIT); - INT16 cr, cg, cb, ca, fadestart, fadeend, flags; - INT32 rgba, fadergba; - - // NULL failsafes (or intentionally set to signify default) - if (!d->sector->extra_colormap) - d->sector->extra_colormap = R_GetDefaultColormap(); - - if (!d->source_exc) - d->source_exc = R_GetDefaultColormap(); - - if (!d->dest_exc) - d->dest_exc = R_GetDefaultColormap(); - - // For each var (rgba + fadergba + params = 11 vars), we apply - // percentage fading: currentval = sourceval + (delta * percent of duration elapsed) - // delta is negative when fading out (destval is lower) - // max/min are used to ensure progressive calcs don't go backwards and to cap values to dest. - -#define APPLYFADE(dest, src, cur) (\ -(dest-src < 0) ? \ - max(\ - min(cur,\ - src + (INT16)FixedMul(dest-src, factor)),\ - dest)\ -: (dest-src > 0) ? \ - min(\ - max(cur,\ - src + (INT16)FixedMul(dest-src, factor)),\ - dest)\ -: \ - dest\ -) - - cr = APPLYFADE(R_GetRgbaR(d->dest_exc->rgba), R_GetRgbaR(d->source_exc->rgba), R_GetRgbaR(d->sector->extra_colormap->rgba)); - cg = APPLYFADE(R_GetRgbaG(d->dest_exc->rgba), R_GetRgbaG(d->source_exc->rgba), R_GetRgbaG(d->sector->extra_colormap->rgba)); - cb = APPLYFADE(R_GetRgbaB(d->dest_exc->rgba), R_GetRgbaB(d->source_exc->rgba), R_GetRgbaB(d->sector->extra_colormap->rgba)); - ca = APPLYFADE(R_GetRgbaA(d->dest_exc->rgba), R_GetRgbaA(d->source_exc->rgba), R_GetRgbaA(d->sector->extra_colormap->rgba)); - - rgba = R_PutRgbaRGBA(cr, cg, cb, ca); - - cr = APPLYFADE(R_GetRgbaR(d->dest_exc->fadergba), R_GetRgbaR(d->source_exc->fadergba), R_GetRgbaR(d->sector->extra_colormap->fadergba)); - cg = APPLYFADE(R_GetRgbaG(d->dest_exc->fadergba), R_GetRgbaG(d->source_exc->fadergba), R_GetRgbaG(d->sector->extra_colormap->fadergba)); - cb = APPLYFADE(R_GetRgbaB(d->dest_exc->fadergba), R_GetRgbaB(d->source_exc->fadergba), R_GetRgbaB(d->sector->extra_colormap->fadergba)); - ca = APPLYFADE(R_GetRgbaA(d->dest_exc->fadergba), R_GetRgbaA(d->source_exc->fadergba), R_GetRgbaA(d->sector->extra_colormap->fadergba)); - - fadergba = R_PutRgbaRGBA(cr, cg, cb, ca); - - fadestart = APPLYFADE(d->dest_exc->fadestart, d->source_exc->fadestart, d->sector->extra_colormap->fadestart); - fadeend = APPLYFADE(d->dest_exc->fadeend, d->source_exc->fadeend, d->sector->extra_colormap->fadeend); - flags = abs(factor) > FRACUNIT/2 ? d->dest_exc->flags : d->source_exc->flags; // set new flags halfway through fade - -#undef APPLYFADE - - ////////////////// - // setup new colormap - ////////////////// - - if (!(d->sector->extra_colormap = R_GetColormapFromListByValues(rgba, fadergba, fadestart, fadeend, flags))) - { - exc = R_CreateDefaultColormap(false); - exc->fadestart = fadestart; - exc->fadeend = fadeend; - exc->flags = flags; - exc->rgba = rgba; - exc->fadergba = fadergba; - exc->colormap = R_CreateLightTable(exc); - R_AddColormapToList(exc); - d->sector->extra_colormap = exc; - } - } -} - -/* - SoM: 3/8/2000: Friction functions start. - Add_Friction, - T_Friction, - P_SpawnFriction -*/ - -/** Adds friction thinker. - * - * \param friction Friction value, 0xe800 is normal. - * \param affectee Target sector. - * \param roverfriction FOF or not - * \sa T_Friction, P_SpawnFriction - */ -static void Add_Friction(INT32 friction, INT32 movefactor, INT32 affectee, INT32 referrer) -{ - friction_t *f = Z_Calloc(sizeof *f, PU_LEVSPEC, NULL); - - f->thinker.function.acp1 = (actionf_p1)T_Friction; - f->friction = friction; - f->movefactor = movefactor; - f->affectee = affectee; - - if (referrer != -1) - { - f->roverfriction = true; - f->referrer = referrer; - } - else - f->roverfriction = false; - - P_AddThinker(THINK_MAIN, &f->thinker); -} - -/** Applies friction to all things in a sector. - * - * \param f Friction thinker. - * \sa Add_Friction - */ -void T_Friction(friction_t *f) -{ - sector_t *sec, *referrer = NULL; - mobj_t *thing; - msecnode_t *node; - - sec = sectors + f->affectee; - - // Get FOF control sector - if (f->roverfriction) - referrer = sectors + f->referrer; - - // Assign the friction value to players on the floor, non-floating, - // and clipped. Normally the object's friction value is kept at - // ORIG_FRICTION and this thinker changes it for icy or muddy floors. - - // When the object is straddling sectors with the same - // floorheight that have different frictions, use the lowest - // friction value (muddy has precedence over icy). - - node = sec->touching_thinglist; // things touching this sector - while (node) - { - thing = node->m_thing; - // apparently, all I had to do was comment out part of the next line and - // friction works for all mobj's - // (or at least MF_PUSHABLEs, which is all I care about anyway) - if (!(thing->flags & (MF_NOGRAVITY | MF_NOCLIP)) && thing->z == thing->floorz) - { - if (f->roverfriction) - { - if (thing->floorz != P_GetSpecialTopZ(thing, referrer, sec)) - { - node = node->m_thinglist_next; - continue; - } - - if ((thing->friction == ORIG_FRICTION) // normal friction? - || (f->friction < thing->friction)) - { - thing->friction = f->friction; - if (thing->player) - thing->movefactor = f->movefactor; - } - } - else if (P_GetSpecialBottomZ(thing, sec, sec) == thing->floorz && (thing->friction == ORIG_FRICTION // normal friction? - || f->friction < thing->friction)) - { - thing->friction = f->friction; - if (thing->player) - thing->movefactor = f->movefactor; - } - } - node = node->m_thinglist_next; - } -} - -/** Spawns all friction effects. - * - * \sa P_SpawnSpecials, Add_Friction - */ -static void P_SpawnFriction(void) -{ - size_t i; - line_t *l = lines; - mtag_t tag; - register INT32 s; - fixed_t strength; // frontside texture offset controls magnitude - fixed_t friction; // friction value to be applied during movement - INT32 movefactor; // applied to each player move to simulate inertia - - for (i = 0; i < numlines; i++, l++) - if (l->special == 540) - { - tag = Tag_FGet(&l->tags); - strength = sides[l->sidenum[0]].textureoffset>>FRACBITS; - if (strength > 0) // sludge - strength = strength*2; // otherwise, the maximum sludginess value is +967... - - // The following might seem odd. At the time of movement, - // the move distance is multiplied by 'friction/0x10000', so a - // higher friction value actually means 'less friction'. - friction = ORIG_FRICTION - (0x1EB8*strength)/0x80; // ORIG_FRICTION is 0xE800 - - if (friction > FRACUNIT) - friction = FRACUNIT; - if (friction < 0) - friction = 0; - - movefactor = FixedDiv(ORIG_FRICTION, friction); - if (movefactor < FRACUNIT) - movefactor = 8*movefactor - 7*FRACUNIT; - else - movefactor = FRACUNIT; - - TAG_ITER_SECTORS(tag, s) - Add_Friction(friction, movefactor, s, -1); - } -} - -/* - SoM: 3/8/2000: Push/Pull/Wind/Current functions. - Add_Pusher, - PIT_PushThing, - T_Pusher, - P_GetPushThing, - P_SpawnPushers -*/ - -#define PUSH_FACTOR 7 - -/** Adds a pusher. - * - * \param type Type of push/pull effect. - * \param x_mag X magnitude. - * \param y_mag Y magnitude. - * \param source For a point pusher/puller, the source object. - * \param affectee Target sector. - * \param referrer What sector set it - * \sa T_Pusher, P_GetPushThing, P_SpawnPushers - */ -static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t *source, INT32 affectee, INT32 referrer, INT32 exclusive, INT32 slider) -{ - pusher_t *p = Z_Calloc(sizeof *p, PU_LEVSPEC, NULL); - - p->thinker.function.acp1 = (actionf_p1)T_Pusher; - p->source = source; - p->type = type; - p->x_mag = x_mag>>FRACBITS; - p->y_mag = y_mag>>FRACBITS; - p->exclusive = exclusive; - p->slider = slider; - - if (referrer != -1) - { - p->roverpusher = true; - p->referrer = referrer; - } - else - p->roverpusher = false; - - // "The right triangle of the square of the length of the hypotenuse is equal to the sum of the squares of the lengths of the other two sides." - // "Bah! Stupid brains! Don't you know anything besides the Pythagorean Theorem?" - Earthworm Jim - if (type == p_downcurrent || type == p_upcurrent || type == p_upwind || type == p_downwind) - p->magnitude = P_AproxDistance(p->x_mag,p->y_mag)<<(FRACBITS-PUSH_FACTOR); - else - p->magnitude = P_AproxDistance(p->x_mag,p->y_mag); - if (source) // point source exist? - { - // where force goes to zero - if (type == p_push) - p->radius = AngleFixed(source->angle); - else - p->radius = (p->magnitude)<<(FRACBITS+1); - - p->x = p->source->x; - p->y = p->source->y; - p->z = p->source->z; - } - p->affectee = affectee; - P_AddThinker(THINK_MAIN, &p->thinker); -} - - -// PIT_PushThing determines the angle and magnitude of the effect. -// The object's x and y momentum values are changed. -static pusher_t *tmpusher; // pusher structure for blockmap searches - -/** Applies a point pusher/puller to a thing. - * - * \param thing Thing to be pushed. - * \return True if the thing was pushed. - * \todo Make a more robust P_BlockThingsIterator() so the hidden parameter - * ::tmpusher won't need to be used. - * \sa T_Pusher - */ -static inline boolean PIT_PushThing(mobj_t *thing) -{ - if (thing->eflags & MFE_PUSHED) - return false; - - if (thing->player && thing->player->powers[pw_carry] == CR_ROPEHANG) - return false; - - if (!tmpusher->source) - return false; - - // Allow this to affect pushable objects at some point? - if (thing->player && (!(thing->flags & (MF_NOGRAVITY | MF_NOCLIP)) || thing->player->powers[pw_carry] == CR_NIGHTSMODE)) - { - INT32 dist; - INT32 speed; - INT32 sx, sy, sz; - - sx = tmpusher->x; - sy = tmpusher->y; - sz = tmpusher->z; - - // don't fade wrt Z if health & 2 (mapthing has multi flag) - if (tmpusher->source->health & 2) - dist = P_AproxDistance(thing->x - sx,thing->y - sy); - else - { - // Make sure the Z is in range - if (thing->z < sz - tmpusher->radius || thing->z > sz + tmpusher->radius) - return false; - - dist = P_AproxDistance(P_AproxDistance(thing->x - sx, thing->y - sy), - thing->z - sz); - } - - speed = (tmpusher->magnitude - ((dist>>FRACBITS)>>1))<<(FRACBITS - PUSH_FACTOR - 1); - - // If speed <= 0, you're outside the effective radius. You also have - // to be able to see the push/pull source point. - - // Written with bits and pieces of P_HomingAttack - if ((speed > 0) && (P_CheckSight(thing, tmpusher->source))) - { - if (thing->player->powers[pw_carry] != CR_NIGHTSMODE) - { - // only push wrt Z if health & 1 (mapthing has ambush flag) - if (tmpusher->source->health & 1) - { - fixed_t tmpmomx, tmpmomy, tmpmomz; - - tmpmomx = FixedMul(FixedDiv(sx - thing->x, dist), speed); - tmpmomy = FixedMul(FixedDiv(sy - thing->y, dist), speed); - tmpmomz = FixedMul(FixedDiv(sz - thing->z, dist), speed); - if (tmpusher->source->type == MT_PUSH) // away! - { - tmpmomx *= -1; - tmpmomy *= -1; - tmpmomz *= -1; - } - - thing->momx += tmpmomx; - thing->momy += tmpmomy; - thing->momz += tmpmomz; - - if (thing->player) - { - thing->player->cmomx += tmpmomx; - thing->player->cmomy += tmpmomy; - thing->player->cmomx = FixedMul(thing->player->cmomx, 0xe800); - thing->player->cmomy = FixedMul(thing->player->cmomy, 0xe800); - } - } - else - { - angle_t pushangle; - - pushangle = R_PointToAngle2(thing->x, thing->y, sx, sy); - if (tmpusher->source->type == MT_PUSH) - pushangle += ANGLE_180; // away - pushangle >>= ANGLETOFINESHIFT; - thing->momx += FixedMul(speed, FINECOSINE(pushangle)); - thing->momy += FixedMul(speed, FINESINE(pushangle)); - - if (thing->player) - { - thing->player->cmomx += FixedMul(speed, FINECOSINE(pushangle)); - thing->player->cmomy += FixedMul(speed, FINESINE(pushangle)); - thing->player->cmomx = FixedMul(thing->player->cmomx, 0xe800); - thing->player->cmomy = FixedMul(thing->player->cmomy, 0xe800); - } - } - } - else - { - //NiGHTS-specific handling. - //By default, pushes and pulls only affect the Z-axis. - //By having the ambush flag, it affects the X-axis. - //By having the object special flag, it affects the Y-axis. - fixed_t tmpmomx, tmpmomy, tmpmomz; - - if (tmpusher->source->health & 1) - tmpmomx = FixedMul(FixedDiv(sx - thing->x, dist), speed); - else - tmpmomx = 0; - - if (tmpusher->source->health & 2) - tmpmomy = FixedMul(FixedDiv(sy - thing->y, dist), speed); - else - tmpmomy = 0; - - tmpmomz = FixedMul(FixedDiv(sz - thing->z, dist), speed); - - if (tmpusher->source->type == MT_PUSH) // away! - { - tmpmomx *= -1; - tmpmomy *= -1; - tmpmomz *= -1; - } - - thing->momx += tmpmomx; - thing->momy += tmpmomy; - thing->momz += tmpmomz; - - if (thing->player) - { - thing->player->cmomx += tmpmomx; - thing->player->cmomy += tmpmomy; - thing->player->cmomx = FixedMul(thing->player->cmomx, 0xe800); - thing->player->cmomy = FixedMul(thing->player->cmomy, 0xe800); - } - } - } - } - - if (tmpusher->exclusive) - thing->eflags |= MFE_PUSHED; - - return true; -} - -/** Applies a pusher to all affected objects. - * - * \param p Thinker for the pusher effect. - * \todo Split up into multiple functions. - * \sa Add_Pusher, PIT_PushThing - */ -void T_Pusher(pusher_t *p) -{ - sector_t *sec, *referrer = NULL; - mobj_t *thing; - msecnode_t *node; - INT32 xspeed = 0,yspeed = 0; - INT32 xl, xh, yl, yh, bx, by; - INT32 radius; - //INT32 ht = 0; - boolean inFOF; - boolean touching; - boolean moved; - - xspeed = yspeed = 0; - - sec = sectors + p->affectee; - - // Be sure the special sector type is still turned on. If so, proceed. - // Else, bail out; the sector type has been changed on us. - - if (p->roverpusher) - { - referrer = §ors[p->referrer]; - - if (GETSECSPECIAL(referrer->special, 3) != 2) - return; - } - else if (GETSECSPECIAL(sec->special, 3) != 2) - return; - - // For constant pushers (wind/current) there are 3 situations: - // - // 1) Affected Thing is above the floor. - // - // Apply the full force if wind, no force if current. - // - // 2) Affected Thing is on the ground. - // - // Apply half force if wind, full force if current. - // - // 3) Affected Thing is below the ground (underwater effect). - // - // Apply no force if wind, full force if current. - // - // Apply the effect to clipped players only for now. - // - // In Phase II, you can apply these effects to Things other than players. - - if (p->type == p_push) - { - - // Seek out all pushable things within the force radius of this - // point pusher. Crosses sectors, so use blockmap. - - tmpusher = p; // MT_PUSH/MT_PULL point source - radius = p->radius; // where force goes to zero - tmbbox[BOXTOP] = p->y + radius; - tmbbox[BOXBOTTOM] = p->y - radius; - tmbbox[BOXRIGHT] = p->x + radius; - tmbbox[BOXLEFT] = p->x - radius; - - xl = (unsigned)(tmbbox[BOXLEFT] - bmaporgx - MAXRADIUS)>>MAPBLOCKSHIFT; - xh = (unsigned)(tmbbox[BOXRIGHT] - bmaporgx + MAXRADIUS)>>MAPBLOCKSHIFT; - yl = (unsigned)(tmbbox[BOXBOTTOM] - bmaporgy - MAXRADIUS)>>MAPBLOCKSHIFT; - yh = (unsigned)(tmbbox[BOXTOP] - bmaporgy + MAXRADIUS)>>MAPBLOCKSHIFT; - for (bx = xl; bx <= xh; bx++) - for (by = yl; by <= yh; by++) - P_BlockThingsIterator(bx,by, PIT_PushThing); - return; - } - - // constant pushers p_wind and p_current - node = sec->touching_thinglist; // things touching this sector - for (; node; node = node->m_thinglist_next) - { - thing = node->m_thing; - if (thing->flags & (MF_NOGRAVITY | MF_NOCLIP) - && !(thing->type == MT_SMALLBUBBLE - || thing->type == MT_MEDIUMBUBBLE - || thing->type == MT_EXTRALARGEBUBBLE)) - continue; - - if (!((thing->flags & MF_PUSHABLE) || ((thing->info->flags & MF_PUSHABLE) && thing->fuse)) - && !(thing->type == MT_PLAYER - || thing->type == MT_SMALLBUBBLE - || thing->type == MT_MEDIUMBUBBLE - || thing->type == MT_EXTRALARGEBUBBLE - || thing->type == MT_LITTLETUMBLEWEED - || thing->type == MT_BIGTUMBLEWEED)) - continue; - - if (thing->eflags & MFE_PUSHED) - continue; - - if (thing->player && thing->player->powers[pw_carry] == CR_ROPEHANG) - continue; - - if (thing->player && (thing->state == &states[thing->info->painstate]) && (thing->player->powers[pw_flashing] > (flashingtics/4)*3 && thing->player->powers[pw_flashing] <= flashingtics)) - continue; - - inFOF = touching = moved = false; - - // Find the area that the 'thing' is in - if (p->roverpusher) - { - fixed_t top, bottom; - - top = P_GetSpecialTopZ(thing, referrer, sec); - bottom = P_GetSpecialBottomZ(thing, referrer, sec); - - if (thing->eflags & MFE_VERTICALFLIP) - { - if (bottom > thing->z + thing->height - || top < (thing->z + (thing->height >> 1))) - continue; - - if (thing->z < bottom) - touching = true; - - if (thing->z + (thing->height >> 1) > bottom) - inFOF = true; - - } - else - { - if (top < thing->z || bottom > (thing->z + (thing->height >> 1))) - continue; - if (thing->z + thing->height > top) - touching = true; - - if (thing->z + (thing->height >> 1) < top) - inFOF = true; - } - } - else // Treat the entire sector as one big FOF - { - if (thing->z == P_GetSpecialBottomZ(thing, sec, sec)) - touching = true; - else if (p->type != p_current) - inFOF = true; - } - - if (!touching && !inFOF) // Object is out of range of effect - continue; - - if (p->type == p_wind) - { - if (touching) // on ground - { - xspeed = (p->x_mag)>>1; // half force - yspeed = (p->y_mag)>>1; - moved = true; - } - else if (inFOF) - { - xspeed = (p->x_mag); // full force - yspeed = (p->y_mag); - moved = true; - } - } - else if (p->type == p_upwind) - { - if (touching) // on ground - { - thing->momz += (p->magnitude)>>1; - moved = true; - } - else if (inFOF) - { - thing->momz += p->magnitude; - moved = true; - } - } - else if (p->type == p_downwind) - { - if (touching) // on ground - { - thing->momz -= (p->magnitude)>>1; - moved = true; - } - else if (inFOF) - { - thing->momz -= p->magnitude; - moved = true; - } - } - else // p_current - { - if (!touching && !inFOF) // Not in water at all - xspeed = yspeed = 0; // no force - else // underwater / touching water - { - if (p->type == p_upcurrent) - thing->momz += p->magnitude; - else if (p->type == p_downcurrent) - thing->momz -= p->magnitude; - else - { - xspeed = p->x_mag; // full force - yspeed = p->y_mag; - } - moved = true; - } - } - - if (p->type != p_downcurrent && p->type != p_upcurrent - && p->type != p_upwind && p->type != p_downwind) - { - thing->momx += xspeed<<(FRACBITS-PUSH_FACTOR); - thing->momy += yspeed<<(FRACBITS-PUSH_FACTOR); - if (thing->player) - { - thing->player->cmomx += xspeed<<(FRACBITS-PUSH_FACTOR); - thing->player->cmomy += yspeed<<(FRACBITS-PUSH_FACTOR); - thing->player->cmomx = FixedMul(thing->player->cmomx, ORIG_FRICTION); - thing->player->cmomy = FixedMul(thing->player->cmomy, ORIG_FRICTION); - } - - // Tumbleweeds bounce a bit... - if (thing->type == MT_LITTLETUMBLEWEED || thing->type == MT_BIGTUMBLEWEED) - thing->momz += P_AproxDistance(xspeed<<(FRACBITS-PUSH_FACTOR), yspeed<<(FRACBITS-PUSH_FACTOR)) >> 2; - } - - if (moved) - { - if (p->slider && thing->player) - { - pflags_t jumped = (thing->player->pflags & (PF_JUMPED|PF_NOJUMPDAMAGE)); - P_ResetPlayer (thing->player); - - if (jumped) - thing->player->pflags |= jumped; - - thing->player->pflags |= PF_SLIDING; - thing->angle = R_PointToAngle2 (0, 0, xspeed<<(FRACBITS-PUSH_FACTOR), yspeed<<(FRACBITS-PUSH_FACTOR)); - - if (!demoplayback || P_ControlStyle(thing->player) == CS_LMAOGALOG) - { - angle_t angle = thing->player->angleturn << 16; - if (thing->angle - angle > ANGLE_180) - P_SetPlayerAngle(thing->player, angle - (angle - thing->angle) / 8); - else - P_SetPlayerAngle(thing->player, angle + (thing->angle - angle) / 8); - //P_SetPlayerAngle(thing->player, thing->angle); - } - } - - if (p->exclusive) - thing->eflags |= MFE_PUSHED; - } - } -} - - -/** Gets a push/pull object. - * - * \param s Sector number to look in. - * \return Pointer to the first ::MT_PUSH or ::MT_PULL object found in the - * sector. - * \sa P_GetTeleportDestThing, P_GetStarpostThing, P_GetAltViewThing - */ -mobj_t *P_GetPushThing(UINT32 s) -{ - mobj_t *thing; - sector_t *sec; - - sec = sectors + s; - thing = sec->thinglist; - while (thing) - { - switch (thing->type) - { - case MT_PUSH: - case MT_PULL: - return thing; - default: - break; - } - thing = thing->snext; - } - return NULL; -} - -/** Spawns pushers. - * - * \todo Remove magic numbers. - * \sa P_SpawnSpecials, Add_Pusher - */ -static void P_SpawnPushers(void) -{ - size_t i; - line_t *l = lines; - mtag_t tag; - register INT32 s; - mobj_t *thing; - - for (i = 0; i < numlines; i++, l++) - { - tag = Tag_FGet(&l->tags); - switch (l->special) - { - case 541: // wind - TAG_ITER_SECTORS(tag, s) - Add_Pusher(p_wind, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); - break; - case 544: // current - TAG_ITER_SECTORS(tag, s) - Add_Pusher(p_current, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); - break; - case 547: // push/pull - TAG_ITER_SECTORS(tag, s) - { - thing = P_GetPushThing(s); - if (thing) // No MT_P* means no effect - Add_Pusher(p_push, l->dx, l->dy, thing, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); - } - break; - case 545: // current up - TAG_ITER_SECTORS(tag, s) - Add_Pusher(p_upcurrent, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); - break; - case 546: // current down - TAG_ITER_SECTORS(tag, s) - Add_Pusher(p_downcurrent, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); - break; - case 542: // wind up - TAG_ITER_SECTORS(tag, s) - Add_Pusher(p_upwind, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); - break; - case 543: // wind down - TAG_ITER_SECTORS(tag, s) - Add_Pusher(p_downwind, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4); - break; - } - } -} From f714966c8364db3871edd59e82ead563864c641b Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 12 Dec 2021 08:27:27 +0100 Subject: [PATCH 187/377] Remove outdated linedef type check in HWR_ProcessSeg --- src/hardware/hw_main.c | 32 ++++---------------------------- 1 file changed, 4 insertions(+), 28 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 9bade3d6f..d187b0897 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -1434,34 +1434,10 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom // set alpha for transparent walls // ooops ! this do not work at all because render order we should render it in backtofront order - switch (gl_linedef->special) - { - // Translucent - case 102: - case 121: - case 123: - case 124: - case 125: - case 141: - case 142: - case 144: - case 145: - case 174: - case 175: - case 192: - case 195: - case 221: - case 253: - case 256: - blendmode = PF_Translucent; - break; - default: - if (gl_linedef->alpha >= 0 && gl_linedef->alpha < FRACUNIT) - blendmode = HWR_TranstableToAlpha(R_GetLinedefTransTable(gl_linedef->alpha), &Surf); - else - blendmode = PF_Masked; - break; - } + if (gl_linedef->alpha >= 0 && gl_linedef->alpha < FRACUNIT) + blendmode = HWR_TranstableToAlpha(R_GetLinedefTransTable(gl_linedef->alpha), &Surf); + else + blendmode = PF_Masked; if (gl_curline->polyseg && gl_curline->polyseg->translucency > 0) { From 1b023732d034adb1c3f86d1cc8f0a594f9920051 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 13 Dec 2021 08:24:52 +0100 Subject: [PATCH 188/377] Adapt rock spawner to UDMF --- src/p_enemy.c | 43 +++++++++++++++---------------------------- src/p_mobj.c | 4 ---- src/p_setup.c | 26 ++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 32 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index 1216bb095..c02ca38be 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -12,6 +12,7 @@ /// \brief Enemy thinking, AI /// Action Pointer Functions that are associated with states/frames +#include "dehacked.h" #include "doomdef.h" #include "g_game.h" #include "p_local.h" @@ -6182,48 +6183,34 @@ void A_RockSpawn(mobj_t *actor) { mobj_t *mo; mobjtype_t type; - INT32 i = Tag_FindLineSpecial(12, (INT16)actor->threshold); - line_t *line; fixed_t dist; - fixed_t randomoomph; if (LUA_CallAction(A_ROCKSPAWN, actor)) return; - if (i == -1) + if (!actor->spawnpoint) + return; + + type = actor->spawnpoint->stringargs[0] ? get_number(actor->spawnpoint->stringargs[0]) : MT_ROCKCRUMBLE1; + + if (type < MT_NULL || type >= NUMMOBJTYPES) { - CONS_Debug(DBG_GAMELOGIC, "A_RockSpawn: Unable to find parameter line 12 (tag %d)!\n", actor->threshold); + CONS_Debug(DBG_GAMELOGIC, "A_RockSpawn: Invalid mobj type %s!\n", actor->spawnpoint->stringargs[0]); return; } - line = &lines[i]; - - if (!(sides[line->sidenum[0]].textureoffset >> FRACBITS)) - { - CONS_Debug(DBG_GAMELOGIC, "A_RockSpawn: No X-offset detected! (tag %d)!\n", actor->threshold); - return; - } - - dist = P_AproxDistance(line->dx, line->dy)/16; - - if (dist < 1) - dist = 1; - - type = MT_ROCKCRUMBLE1 + (sides[line->sidenum[0]].rowoffset >> FRACBITS); - - if (line->flags & ML_NOCLIMB) - randomoomph = P_RandomByte() * (FRACUNIT/32); - else - randomoomph = 0; + dist = max(actor->spawnpoint->args[0] << (FRACBITS - 4), 1); + if (actor->spawnpoint->args[2]) + dist += actor->spawnpoint->args[2] ? P_RandomByte() * (FRACUNIT/32) : 0; // random oomph mo = P_SpawnMobj(actor->x, actor->y, actor->z, MT_FALLINGROCK); P_SetMobjState(mo, mobjinfo[type].spawnstate); - mo->angle = R_PointToAngle2(line->v2->x, line->v2->y, line->v1->x, line->v1->y); + mo->angle = FixedAngle(actor->spawnpoint->angle << FRACBITS); - P_InstaThrust(mo, mo->angle, dist + randomoomph); - mo->momz = dist + randomoomph; + P_InstaThrust(mo, mo->angle, dist); + mo->momz = dist; - var1 = sides[line->sidenum[0]].textureoffset >> FRACBITS; + var1 = actor->spawnpoint->args[1]; A_SetTics(actor); } diff --git a/src/p_mobj.c b/src/p_mobj.c index d0af3112e..9ce4c70bf 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12722,10 +12722,6 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean if (!P_SetupParticleGen(mthing, mobj)) return false; break; - case MT_ROCKSPAWNER: - mobj->threshold = mthing->angle; - mobj->movecount = mthing->extrainfo; - break; case MT_POPUPTURRET: if (mthing->angle) mobj->threshold = mthing->angle; diff --git a/src/p_setup.c b/src/p_setup.c index aa687bfa2..fc8fff752 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4877,6 +4877,32 @@ static void P_ConvertBinaryMap(void) mapthings[i].type = 761; break; } + case 1202: //Rock spawner + { + mtag_t tag = (mtag_t)mapthings[i].angle; + INT32 j = Tag_FindLineSpecial(12, tag); + INT32 typeoffset; + + if (j == -1) + { + CONS_Debug(DBG_GAMELOGIC, "Rock spawner: Unable to find parameter line 12 (tag %d)!\n", tag); + break; + } + mapthings[i].angle = AngleFixed(R_PointToAngle2(lines[j].v2->x, lines[j].v2->y, lines[j].v1->x, lines[j].v1->y)) >> FRACBITS; + mapthings[i].args[0] = P_AproxDistance(lines[j].dx, lines[j].dy) >> FRACBITS; + mapthings[i].args[1] = sides[lines[j].sidenum[0]].textureoffset >> FRACBITS; + mapthings[i].args[2] = !!(lines[j].flags & ML_NOCLIMB); + typeoffset = sides[lines[j].sidenum[0]].rowoffset >> FRACBITS; + if (typeoffset < 0 || typeoffset > 15) + { + CONS_Debug(DBG_GAMELOGIC, "Rock spawner: Invalid Y offset %d (tag %d)!\n", typeoffset, tag); + break; + } + + mapthings[i].stringargs[0] = Z_Malloc(17, PU_LEVEL, NULL); + sprintf(mapthings[i].stringargs[0], "MT_ROCKCRUMBLE%d", typeoffset + 1); + break; + } default: break; } From c1e22c4bb661ef8e43ecc4adb5427219903d963e Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 14 Dec 2021 06:43:06 +0100 Subject: [PATCH 189/377] Add two more linedef/thing args because the maces need them --- extras/conf/udb/Includes/SRB222_misc.cfg | 10 ++++++++++ src/doomdata.h | 2 +- src/r_defs.h | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index f4a60581a..f27e5408c 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -242,6 +242,16 @@ universalfields type = 0; default = 0; } + arg8 + { + type = 0; + default = 0; + } + arg9 + { + type = 0; + default = 0; + } stringarg0 { type = 2; diff --git a/src/doomdata.h b/src/doomdata.h index 7ba159a7c..630e18615 100644 --- a/src/doomdata.h +++ b/src/doomdata.h @@ -196,7 +196,7 @@ typedef struct #pragma pack() #endif -#define NUMMAPTHINGARGS 8 +#define NUMMAPTHINGARGS 10 #define NUMMAPTHINGSTRINGARGS 2 // Thing definition, position, orientation and type, diff --git a/src/r_defs.h b/src/r_defs.h index 8e17addf5..0609a48a8 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -405,7 +405,7 @@ typedef enum #define HORIZONSPECIAL 41 -#define NUMLINEARGS 8 +#define NUMLINEARGS 10 #define NUMLINESTRINGARGS 2 typedef struct line_s From ed9a562ec4b2c89466d0fc63f81becc2902b9aa3 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 14 Dec 2021 18:50:47 +0100 Subject: [PATCH 190/377] Adapt maces to UDMF --- src/p_mobj.c | 97 +++++++++++++++------------------------------------ src/p_setup.c | 61 ++++++++++++++++++++++++++++++++ src/p_spec.h | 12 +++++++ 3 files changed, 101 insertions(+), 69 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 9ce4c70bf..5b4feb3ca 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -11,6 +11,7 @@ /// \file p_mobj.c /// \brief Moving object handling. Spawn functions +#include "dehacked.h" #include "doomdef.h" #include "g_game.h" #include "g_input.h" @@ -12039,59 +12040,20 @@ static boolean P_SetupMace(mapthing_t *mthing, mobj_t *mobj, boolean *doangle) mobjflag_t mflagsapply; mobjflag2_t mflags2apply; mobjeflag_t meflagsapply; - INT32 line; const size_t mthingi = (size_t)(mthing - mapthings); - // Find the corresponding linedef special, using angle as tag - line = Tag_FindLineSpecial(9, mthing->angle); - - if (line == -1) - { - CONS_Debug(DBG_GAMELOGIC, "Mace chain (mapthing #%s) needs to be tagged to a #9 parameter line (trying to find tag %d).\n", sizeu1(mthingi), mthing->angle); - return false; - } - /* - mapthing - - MTF_AMBUSH : - MT_SPRINGBALLPOINT - upgrade from yellow to red spring - anything else - bigger mace/chain theory - MTF_OBJECTSPECIAL - force silent - MTF_GRAVFLIP - flips objects, doesn't affect chain arrangements - Parameter value : number of "spokes" - - linedef - - ML_NOCLIMB : - MT_CHAINPOINT/MT_CHAINMACEPOINT with ML_EFFECT1 applied - Direction not controllable - anything else - no functionality - ML_EFFECT1 : Swings instead of spins - ML_EFFECT2 : Linktype is replaced with macetype for all spokes not ending in chains (inverted for MT_FIREBARPOINT) - ML_EFFECT3 : Spawn a bonus linktype at the hinge point - ML_EFFECT4 : Don't clip inside the ground - ML_EFFECT5 : Don't stop thinking when too far away - */ - mlength = abs(lines[line].dx >> FRACBITS); - mspeed = abs(lines[line].dy >> (FRACBITS - 4)); - mphase = (sides[lines[line].sidenum[0]].textureoffset >> FRACBITS) % 360; - if ((mminlength = -sides[lines[line].sidenum[0]].rowoffset >> FRACBITS) < 0) - mminlength = 0; - else if (mminlength > mlength - 1) - mminlength = mlength - 1; - mpitch = (lines[line].frontsector->floorheight >> FRACBITS) % 360; - myaw = (lines[line].frontsector->ceilingheight >> FRACBITS) % 360; - - mnumspokes = mthing->extrainfo + 1; + mlength = abs(mthing->args[0]); + mnumspokes = mthing->args[1] + 1; mspokeangle = FixedAngle((360*FRACUNIT)/mnumspokes) >> ANGLETOFINESHIFT; - - if (lines[line].backsector) - { - mpinch = (lines[line].backsector->floorheight >> FRACBITS) % 360; - mroll = (lines[line].backsector->ceilingheight >> FRACBITS) % 360; - mnumnospokes = (sides[lines[line].sidenum[1]].textureoffset >> FRACBITS); - if ((mwidth = sides[lines[line].sidenum[1]].rowoffset >> FRACBITS) < 0) - mwidth = 0; - } - else - mpinch = mroll = mnumnospokes = mwidth = 0; + mwidth = max(0, mthing->args[2]); + mspeed = abs(mthing->args[3] << 4); + mphase = mthing->args[4] % 360; + mpinch = mthing->args[5] % 360; + mnumnospokes = mthing->args[6]; + mminlength = max(0, min(mlength - 1, mthing->args[7])); + mpitch = mthing->pitch % 360; + myaw = mthing->angle % 360; + mroll = mthing->roll % 360; CONS_Debug(DBG_GAMELOGIC, "Mace/Chain (mapthing #%s):\n" "Length is %d (minus %d)\n" @@ -12122,26 +12084,23 @@ static boolean P_SetupMace(mapthing_t *mthing, mobj_t *mobj, boolean *doangle) switch (mobj->type) { case MT_SPRINGBALLPOINT: - macetype = ((mthing->options & MTF_AMBUSH) + macetype = ((mthing->args[8] & TMM_DOUBLESIZE) ? MT_REDSPRINGBALL : MT_YELLOWSPRINGBALL); chainlink = MT_SMALLMACECHAIN; break; case MT_FIREBARPOINT: - macetype = ((mthing->options & MTF_AMBUSH) + macetype = ((mthing->args[8] & TMM_DOUBLESIZE) ? MT_BIGFIREBAR : MT_SMALLFIREBAR); chainlink = MT_NULL; break; case MT_CUSTOMMACEPOINT: - macetype = (mobjtype_t)sides[lines[line].sidenum[0]].toptexture; - if (lines[line].backsector) - chainlink = (mobjtype_t)sides[lines[line].sidenum[1]].toptexture; - else - chainlink = MT_NULL; + macetype = mthing->stringargs[0] ? get_number(mthing->stringargs[0]) : MT_NULL; + chainlink = mthing->stringargs[1] ? get_number(mthing->stringargs[1]) : MT_NULL; break; case MT_CHAINPOINT: - if (mthing->options & MTF_AMBUSH) + if (mthing->args[8] & TMM_DOUBLESIZE) { macetype = MT_BIGGRABCHAIN; chainlink = MT_BIGMACECHAIN; @@ -12154,7 +12113,7 @@ static boolean P_SetupMace(mapthing_t *mthing, mobj_t *mobj, boolean *doangle) mchainlike = true; break; default: - if (mthing->options & MTF_AMBUSH) + if (mthing->args[8] & TMM_DOUBLESIZE) { macetype = MT_BIGMACE; chainlink = MT_BIGMACECHAIN; @@ -12181,11 +12140,11 @@ static boolean P_SetupMace(mapthing_t *mthing, mobj_t *mobj, boolean *doangle) firsttype = macetype; // Adjustable direction - if (lines[line].flags & ML_NOCLIMB) + if (mthing->args[8] & TMM_ALLOWYAWCONTROL) mobj->flags |= MF_SLIDEME; // Swinging - if (lines[line].flags & ML_EFFECT1) + if (mthing->args[8] & TMM_SWING) { mobj->flags2 |= MF2_STRONGBOX; mmin = ((mnumnospokes > 1) ? 1 : 0); @@ -12194,11 +12153,11 @@ static boolean P_SetupMace(mapthing_t *mthing, mobj_t *mobj, boolean *doangle) mmin = mnumspokes; // If over distance away, don't move UNLESS this flag is applied - if (lines[line].flags & ML_EFFECT5) + if (mthing->args[8] & TMM_ALWAYSTHINK) mobj->flags2 |= MF2_BOSSNOTRAP; // Make the links the same type as the end - repeated below - if ((mobj->type != MT_CHAINPOINT) && (((lines[line].flags & ML_EFFECT2) == ML_EFFECT2) != (mobj->type == MT_FIREBARPOINT))) // exclusive or + if ((mobj->type != MT_CHAINPOINT) && (((mthing->args[8] & TMM_MACELINKS) == TMM_MACELINKS) != (mobj->type == MT_FIREBARPOINT))) // exclusive or { linktype = macetype; radiusfactor = 2; // Double the radius. @@ -12210,7 +12169,7 @@ static boolean P_SetupMace(mapthing_t *mthing, mobj_t *mobj, boolean *doangle) mchainlike = (firsttype == chainlink); widthfactor = (mchainlike ? 1 : 2); - mflagsapply = ((lines[line].flags & ML_EFFECT4) ? 0 : (MF_NOCLIP | MF_NOCLIPHEIGHT)); + mflagsapply = (mthing->args[8] & TMM_CLIP) ? 0 : (MF_NOCLIP|MF_NOCLIPHEIGHT); mflags2apply = ((mthing->options & MTF_OBJECTFLIP) ? MF2_OBJECTFLIP : 0); meflagsapply = ((mthing->options & MTF_OBJECTFLIP) ? MFE_VERTICALFLIP : 0); @@ -12236,14 +12195,14 @@ static boolean P_SetupMace(mapthing_t *mthing, mobj_t *mobj, boolean *doangle) hprev = spawnee;\ } - mdosound = (mspeed && !(mthing->options & MTF_OBJECTSPECIAL)); - mdocenter = (macetype && (lines[line].flags & ML_EFFECT3)); + mdosound = (mspeed && !(mthing->args[8] & TMM_SILENT)); + mdocenter = (macetype && (mthing->args[8] & TMM_CENTERLINK)); // The actual spawning of spokes while (mnumspokes-- > 0) { // Offsets - if (lines[line].flags & ML_EFFECT1) // Swinging + if (mthing->args[8] & TMM_SWING) // Swinging mroll = (mroll - mspokeangle) & FINEMASK; else // Spinning mphase = (mphase - mspokeangle) & FINEMASK; @@ -12254,7 +12213,7 @@ static boolean P_SetupMace(mapthing_t *mthing, mobj_t *mobj, boolean *doangle) continue; linktype = chainlink; - firsttype = ((mthing->options & MTF_AMBUSH) ? MT_BIGGRABCHAIN : MT_SMALLGRABCHAIN); + firsttype = ((mthing->args[8] & TMM_DOUBLESIZE) ? MT_BIGGRABCHAIN : MT_SMALLGRABCHAIN); mmaxlength = 1 + (mlength - 1) * radiusfactor; radiusfactor = widthfactor = 1; } @@ -12263,7 +12222,7 @@ static boolean P_SetupMace(mapthing_t *mthing, mobj_t *mobj, boolean *doangle) if (mobj->type == MT_CHAINMACEPOINT) { // Make the links the same type as the end - repeated above - if (lines[line].flags & ML_EFFECT2) + if (mthing->args[8] & TMM_MACELINKS) { linktype = macetype; radiusfactor = 2; diff --git a/src/p_setup.c b/src/p_setup.c index fc8fff752..cfcf0047c 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4877,6 +4877,67 @@ static void P_ConvertBinaryMap(void) mapthings[i].type = 761; break; } + case 1104: //Mace spawnpoint + case 1105: //Chain with maces spawnpoint + case 1106: //Chained spring spawnpoint + case 1107: //Chain spawnpoint + case 1109: //Firebar spawnpoint + case 1110: //Custom mace spawnpoint + { + mtag_t tag = (mtag_t)mapthings[i].angle; + INT32 j = Tag_FindLineSpecial(9, tag); + + if (j == -1) + { + CONS_Debug(DBG_GAMELOGIC, "Chain/mace setup: Unable to find parameter line 9 (tag %d)!\n", tag); + break; + } + + mapthings[i].angle = lines[j].frontsector->ceilingheight >> FRACBITS; + mapthings[i].pitch = lines[j].frontsector->floorheight >> FRACBITS; + mapthings[i].args[0] = lines[j].dx >> FRACBITS; + mapthings[i].args[1] = mapthings[i].extrainfo; + mapthings[i].args[3] = lines[j].dy >> FRACBITS; + mapthings[i].args[4] = sides[lines[j].sidenum[0]].textureoffset >> FRACBITS; + mapthings[i].args[7] = -sides[lines[j].sidenum[0]].rowoffset >> FRACBITS; + if (lines[j].backsector) + { + mapthings[i].roll = lines[j].backsector->ceilingheight >> FRACBITS; + mapthings[i].args[2] = sides[lines[j].sidenum[1]].rowoffset >> FRACBITS; + mapthings[i].args[5] = lines[j].backsector->floorheight >> FRACBITS; + mapthings[i].args[6] = sides[lines[j].sidenum[1]].textureoffset >> FRACBITS; + } + if (mapthings[i].options & MTF_AMBUSH) + mapthings[i].args[8] |= TMM_DOUBLESIZE; + if (mapthings[i].options & MTF_OBJECTSPECIAL) + mapthings[i].args[8] |= TMM_SILENT; + if (lines[j].flags & ML_NOCLIMB) + mapthings[i].args[8] |= TMM_ALLOWYAWCONTROL; + if (lines[j].flags & ML_EFFECT1) + mapthings[i].args[8] |= TMM_SWING; + if (lines[j].flags & ML_EFFECT2) + mapthings[i].args[8] |= TMM_MACELINKS; + if (lines[j].flags & ML_EFFECT3) + mapthings[i].args[8] |= TMM_CENTERLINK; + if (lines[j].flags & ML_EFFECT4) + mapthings[i].args[8] |= TMM_CLIP; + if (lines[j].flags & ML_EFFECT5) + mapthings[i].args[8] |= TMM_ALWAYSTHINK; + if (mapthings[i].type == 1110) + { + mobjtype_t mobjtype = (mobjtype_t)sides[lines[j].sidenum[0]].toptexture; + char buffer[12]; + sprintf(buffer, "%d", mobjtype); + mapthings[i].stringargs[0] = Z_Malloc(strlen(buffer) + 1, PU_LEVEL, NULL); + M_Memcpy(mapthings[i].stringargs[0], buffer, strlen(buffer) + 1); + + mobjtype = (lines[j].backsector) ? (mobjtype_t)sides[lines[j].sidenum[1]].toptexture : MT_NULL; + sprintf(buffer, "%d", mobjtype); + mapthings[i].stringargs[1] = Z_Malloc(strlen(buffer) + 1, PU_LEVEL, NULL); + M_Memcpy(mapthings[i].stringargs[1], buffer, strlen(buffer) + 1); + } + break; + } case 1202: //Rock spawner { mtag_t tag = (mtag_t)mapthings[i].angle; diff --git a/src/p_spec.h b/src/p_spec.h index 054f2daf5..94bd079b6 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -24,6 +24,18 @@ extern mobj_t *skyboxcenterpnts[16]; // array of MT_SKYBOX centerpoint mobjs // Amount (dx, dy) vector linedef is shifted right to get scroll amount #define SCROLL_SHIFT 5 +typedef enum +{ + TMM_DOUBLESIZE = 1, + TMM_SILENT = 1<<1, + TMM_ALLOWYAWCONTROL = 1<<2, + TMM_SWING = 1<<3, + TMM_MACELINKS = 1<<4, + TMM_CENTERLINK = 1<<5, + TMM_CLIP = 1<<6, + TMM_ALWAYSTHINK = 1<<7, +} textmapmaceflags_t; + //FOF flags typedef enum { From fa92ed2a8b6e2ffa598d5ffedfee966e4348ae8b Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 14 Dec 2021 19:08:59 +0100 Subject: [PATCH 191/377] Add a wrapper function for writing a constant into a string arg --- src/p_setup.c | 50 ++++++++++++++------------------------------------ 1 file changed, 14 insertions(+), 36 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index cfcf0047c..aecb4fe4d 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3138,6 +3138,14 @@ static void P_AddBinaryMapTags(void) } } +static void P_WriteConstant(INT32 constant, char **target) +{ + char buffer[12]; + sprintf(buffer, "%d", constant); + *target = Z_Malloc(strlen(buffer) + 1, PU_LEVEL, NULL); + M_Memcpy(*target, buffer, strlen(buffer) + 1); +} + //For maps in binary format, converts setup of specials to UDMF format. static void P_ConvertBinaryMap(void) { @@ -3612,12 +3620,7 @@ static void P_ConvertBinaryMap(void) lines[i].args[2] = 16; } if (lines[i].flags & ML_EFFECT4) - { - char buffer[6]; - sprintf(buffer, "%d", sides[lines[i].sidenum[0]].textureoffset >> FRACBITS); - lines[i].stringargs[0] = Z_Malloc(strlen(buffer) + 1, PU_LEVEL, NULL); - M_Memcpy(lines[i].stringargs[0], buffer, strlen(buffer) + 1); - } + P_WriteConstant(sides[lines[i].sidenum[0]].textureoffset >> FRACBITS, &lines[i].stringargs[0]); break; case 252: //FOF: Shatter block case 253: //FOF: Shatter block, translucent @@ -4237,16 +4240,8 @@ static void P_ConvertBinaryMap(void) lines[i].stringargs[1] = Z_Malloc(strlen(sides[lines[i].sidenum[1]].text) + 1, PU_LEVEL, NULL); M_Memcpy(lines[i].stringargs[1], sides[lines[i].sidenum[1]].text, strlen(sides[lines[i].sidenum[1]].text) + 1); } - else if (lines[i].flags & ML_NOCLIMB) // 'Infinite' - { - lines[i].stringargs[1] = Z_Malloc(3, PU_LEVEL, NULL); - M_Memcpy(lines[i].stringargs[1], "-1", 3); - } else - { - lines[i].stringargs[1] = Z_Malloc(7, PU_LEVEL, NULL); - snprintf(lines[i].stringargs[1], 7, "%d", sides[lines[i].sidenum[0]].textureoffset >> FRACBITS); - } + P_WriteConstant((lines[i].flags & ML_NOCLIMB) ? -1 : (sides[lines[i].sidenum[0]].textureoffset >> FRACBITS), &lines[i].stringargs[1]); break; case 435: //Change plane scroller direction lines[i].args[0] = tag; @@ -4856,7 +4851,7 @@ static void P_ConvertBinaryMap(void) { switch (mapthings[i].type) { - case 762: + case 762: //PolyObject spawn point (crush) { INT32 check = -1; INT32 firstline = -1; @@ -4925,16 +4920,8 @@ static void P_ConvertBinaryMap(void) mapthings[i].args[8] |= TMM_ALWAYSTHINK; if (mapthings[i].type == 1110) { - mobjtype_t mobjtype = (mobjtype_t)sides[lines[j].sidenum[0]].toptexture; - char buffer[12]; - sprintf(buffer, "%d", mobjtype); - mapthings[i].stringargs[0] = Z_Malloc(strlen(buffer) + 1, PU_LEVEL, NULL); - M_Memcpy(mapthings[i].stringargs[0], buffer, strlen(buffer) + 1); - - mobjtype = (lines[j].backsector) ? (mobjtype_t)sides[lines[j].sidenum[1]].toptexture : MT_NULL; - sprintf(buffer, "%d", mobjtype); - mapthings[i].stringargs[1] = Z_Malloc(strlen(buffer) + 1, PU_LEVEL, NULL); - M_Memcpy(mapthings[i].stringargs[1], buffer, strlen(buffer) + 1); + P_WriteConstant(sides[lines[j].sidenum[0]].toptexture, &mapthings[i].stringargs[0]); + P_WriteConstant(lines[j].backsector ? sides[lines[j].sidenum[1]].toptexture : MT_NULL, &mapthings[i].stringargs[1]); } break; } @@ -4942,7 +4929,6 @@ static void P_ConvertBinaryMap(void) { mtag_t tag = (mtag_t)mapthings[i].angle; INT32 j = Tag_FindLineSpecial(12, tag); - INT32 typeoffset; if (j == -1) { @@ -4953,15 +4939,7 @@ static void P_ConvertBinaryMap(void) mapthings[i].args[0] = P_AproxDistance(lines[j].dx, lines[j].dy) >> FRACBITS; mapthings[i].args[1] = sides[lines[j].sidenum[0]].textureoffset >> FRACBITS; mapthings[i].args[2] = !!(lines[j].flags & ML_NOCLIMB); - typeoffset = sides[lines[j].sidenum[0]].rowoffset >> FRACBITS; - if (typeoffset < 0 || typeoffset > 15) - { - CONS_Debug(DBG_GAMELOGIC, "Rock spawner: Invalid Y offset %d (tag %d)!\n", typeoffset, tag); - break; - } - - mapthings[i].stringargs[0] = Z_Malloc(17, PU_LEVEL, NULL); - sprintf(mapthings[i].stringargs[0], "MT_ROCKCRUMBLE%d", typeoffset + 1); + P_WriteConstant(MT_ROCKCRUMBLE1 + (sides[lines[j].sidenum[0]].rowoffset >> FRACBITS), &mapthings[i].stringargs[0]); break; } default: From add371a1ce2fecb1a273aad00c849ab0b17c1e74 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 14 Dec 2021 19:48:05 +0100 Subject: [PATCH 192/377] Add UDMF thing types to UDB config --- extras/conf/udb/Includes/SRB222_common.cfg | 12 + extras/conf/udb/Includes/SRB222_misc.cfg | 47 + extras/conf/udb/Includes/SRB222_things.cfg | 9384 +++++++++++++------- extras/conf/udb/SRB2_22Doom.cfg | 6 - extras/conf/udb/SRB2_22UDMF.cfg | 6 - 5 files changed, 6463 insertions(+), 2992 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_common.cfg b/extras/conf/udb/Includes/SRB222_common.cfg index d67835aeb..d5cf5a405 100644 --- a/extras/conf/udb/Includes/SRB222_common.cfg +++ b/extras/conf/udb/Includes/SRB222_common.cfg @@ -191,6 +191,12 @@ mapformat_doom // that make the same thing appear in the same modes thingflagsmask1 = 7; // 1 + 2 + 4 thingflagsmask2 = 0; + + // THING TYPES + thingtypes + { + include("SRB222_things.cfg", "doom"); + } } mapformat_udmf @@ -289,6 +295,12 @@ mapformat_udmf include("UDMF_misc.cfg", "thingflagscompare"); } + // THING TYPES + thingtypes + { + include("SRB222_things.cfg", "udmf"); + } + // LINEDEF TYPES linedeftypes { diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index f27e5408c..2111c198b 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -280,6 +280,41 @@ universalfields thing { + arg5 + { + type = 0; + default = 0; + } + arg6 + { + type = 0; + default = 0; + } + arg7 + { + type = 0; + default = 0; + } + arg8 + { + type = 0; + default = 0; + } + arg9 + { + type = 0; + default = 0; + } + stringarg0 + { + type = 2; + default = ""; + } + stringarg1 + { + type = 2; + default = ""; + } } } @@ -535,6 +570,18 @@ enums 3 = "Doesn't have all"; 4 = "Doesn't have any"; } + + maceflags + { + 1 = "Double size"; + 2 = "No sounds"; + 4 = "Player-turnable chain"; + 8 = "Swing instead of spin"; + 16 = "Make chain from end item"; + 32 = "Spawn link at origin"; + 64 = "Clip inside ground"; + 128 = "No distance check"; + } } //Default things filters diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 113c1a4c2..007196959 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -3,3140 +3,6564 @@ // 8-Dark_Gray 9-Blue 10-Green 11-Cyan 12-Red 13-Magenta // 14-Yellow 15-White 16-Pink 17-Orange 18-Gold 19-Cream -editor +doom { - color = 15; // White - arrow = 1; - title = ""; - error = -1; - width = 8; - height = 16; - sort = 1; - - 3328 = "3D Mode Start"; -} - -starts -{ - color = 1; // Blue - arrow = 1; - title = "Player Starts"; - width = 16; - height = 48; - sprite = "PLAYA0"; - - 1 + editor { - title = "Player 01 Start"; - sprite = "PLAYA0"; - } - 2 - { - title = "Player 02 Start"; - sprite = "PLAYA0"; - } - 3 - { - title = "Player 03 Start"; - sprite = "PLAYA0"; - } - 4 - { - title = "Player 04 Start"; - sprite = "PLAYA0"; - } - 5 - { - title = "Player 05 Start"; - sprite = "PLAYA0"; - } - 6 - { - title = "Player 06 Start"; - sprite = "PLAYA0"; - } - 7 - { - title = "Player 07 Start"; - sprite = "PLAYA0"; - } - 8 - { - title = "Player 08 Start"; - sprite = "PLAYA0"; - } - 9 - { - title = "Player 09 Start"; - sprite = "PLAYA0"; - } - 10 - { - title = "Player 10 Start"; - sprite = "PLAYA0"; - } - 11 - { - title = "Player 11 Start"; - sprite = "PLAYA0"; - } - 12 - { - title = "Player 12 Start"; - sprite = "PLAYA0"; - } - 13 - { - title = "Player 13 Start"; - sprite = "PLAYA0"; - } - 14 - { - title = "Player 14 Start"; - sprite = "PLAYA0"; - } - 15 - { - title = "Player 15 Start"; - sprite = "PLAYA0"; - } - 16 - { - title = "Player 16 Start"; - sprite = "PLAYA0"; - } - 17 - { - title = "Player 17 Start"; - sprite = "PLAYA0"; - } - 18 - { - title = "Player 18 Start"; - sprite = "PLAYA0"; - } - 19 - { - title = "Player 19 Start"; - sprite = "PLAYA0"; - } - 20 - { - title = "Player 20 Start"; - sprite = "PLAYA0"; - } - 21 - { - title = "Player 21 Start"; - sprite = "PLAYA0"; - } - 22 - { - title = "Player 22 Start"; - sprite = "PLAYA0"; - } - 23 - { - title = "Player 23 Start"; - sprite = "PLAYA0"; - } - 24 - { - title = "Player 24 Start"; - sprite = "PLAYA0"; - } - 25 - { - title = "Player 25 Start"; - sprite = "PLAYA0"; - } - 26 - { - title = "Player 26 Start"; - sprite = "PLAYA0"; - } - 27 - { - title = "Player 27 Start"; - sprite = "PLAYA0"; - } - 28 - { - title = "Player 28 Start"; - sprite = "PLAYA0"; - } - 29 - { - title = "Player 29 Start"; - sprite = "PLAYA0"; - } - 30 - { - title = "Player 30 Start"; - sprite = "PLAYA0"; - } - 31 - { - title = "Player 31 Start"; - sprite = "PLAYA0"; - } - 32 - { - title = "Player 32 Start"; - sprite = "PLAYA0"; - } - 33 - { - title = "Match Start"; - sprite = "NDRNA2A8"; - } - 34 - { - title = "CTF Red Team Start"; - sprite = "SIGNG0"; - } - 35 - { - title = "CTF Blue Team Start"; - sprite = "SIGNE0"; - } -} - -enemies -{ - color = 9; // Light_Blue - arrow = 1; - title = "Enemies"; - - 100 - { - title = "Crawla (Blue)"; - sprite = "POSSA1"; - width = 24; - height = 32; - } - 101 - { - title = "Crawla (Red)"; - sprite = "SPOSA1"; - width = 24; - height = 32; - } - 102 - { - title = "Stupid Dumb Unnamed RoboFish"; - sprite = "FISHA0"; + color = 15; // White + arrow = 1; + title = ""; + error = -1; width = 8; - height = 28; + height = 16; + sort = 1; + + 3328 = "3D Mode Start"; } - 103 + + starts { - title = "Buzz (Gold)"; - sprite = "BUZZA1"; - width = 28; - height = 40; - } - 104 - { - title = "Buzz (Red)"; - sprite = "RBUZA1"; - width = 28; - height = 40; - } - 108 - { - title = "Deton"; - sprite = "DETNA1"; - width = 20; - height = 32; - } - 110 - { - title = "Turret"; - sprite = "TRETA1"; - width = 16; - height = 32; - } - 111 - { - title = "Pop-up Turret"; - sprite = "TURRI1"; - width = 12; - height = 64; - } - 122 - { - title = "Spring Shell (Green)"; - sprite = "SSHLA1"; - width = 24; - height = 40; - } - 125 - { - title = "Spring Shell (Yellow)"; - sprite = "SSHLI1"; - width = 24; - height = 40; - } - 109 - { - title = "Skim"; - sprite = "SKIMA1"; - width = 16; - height = 24; - } - 113 - { - title = "Jet Jaw"; - sprite = "JJAWA3A7"; - width = 12; - height = 20; - } - 126 - { - title = "Crushstacean"; - sprite = "CRABA0"; - width = 24; - height = 32; - } - 138 - { - title = "Banpyura"; - sprite = "CR2BA0"; - width = 24; - height = 32; - } - 117 - { - title = "Robo-Hood"; - sprite = "ARCHA1"; - width = 24; - height = 32; - } - 118 - { - title = "Lance-a-Bot"; - sprite = "CBFSA1"; - width = 32; - height = 72; - } - 1113 - { - title = "Suspicious Lance-a-Bot Statue"; - sprite = "CBBSA1"; - width = 32; - height = 72; - } - 119 - { - title = "Egg Guard"; - sprite = "ESHIA1"; + color = 1; // Blue + arrow = 1; + title = "Player Starts"; width = 16; height = 48; - } - 115 - { - title = "Bird Aircraft Strike Hazard"; - sprite = "VLTRF1"; - width = 12; - height = 24; - } - 120 - { - title = "Green Snapper"; - sprite = "GSNPA1"; - width = 24; - height = 24; - } - 121 - { - title = "Minus"; - sprite = "MNUSA0"; - width = 24; - height = 32; - } - 134 - { - title = "Canarivore"; - sprite = "CANAA0"; - width = 12; - height = 80; - hangs = 1; - } - 123 - { - title = "Unidus"; - sprite = "UNIDA1"; - width = 18; - height = 36; - } - 135 - { - title = "Pterabyte Spawner"; - sprite = "PTERA2A8"; - width = 16; - height = 16; - } - 136 - { - title = "Pyre Fly"; - sprite = "PYREA0"; - width = 24; - height = 34; - } - 137 - { - title = "Dragonbomber"; - sprite = "DRABA1"; - width = 28; - height = 48; - } - 105 - { - title = "Jetty-Syn Bomber"; - sprite = "JETBB1"; - width = 20; - height = 50; - } - 106 - { - title = "Jetty-Syn Gunner"; - sprite = "JETGB1"; - width = 20; - height = 48; - } - 112 - { - title = "Spincushion"; - sprite = "SHRPA1"; - width = 16; - height = 24; - } - 114 - { - title = "Snailer"; - sprite = "SNLRA3A7"; - width = 24; - height = 48; - } - 129 - { - title = "Penguinator"; - sprite = "PENGA1"; - width = 24; - height = 32; - } - 130 - { - title = "Pophat"; - sprite = "POPHA1"; - width = 24; - height = 32; - } - 107 - { - title = "Crawla Commander"; - sprite = "CCOMA1"; - width = 16; - height = 32; - } - 131 - { - title = "Spinbobert"; - sprite = "SBOBB0"; - width = 32; - height = 32; - } - 132 - { - title = "Cacolantern"; - sprite = "CACOA0"; - width = 32; - height = 32; - } - 133 - { - title = "Hangster"; - sprite = "HBATC1"; - width = 24; - height = 24; - hangs = 1; - } - 127 - { - title = "Hive Elemental"; - sprite = "HIVEA0"; - width = 32; - height = 80; - } - 128 - { - title = "Bumblebore"; - sprite = "BUMBA1"; - width = 16; - height = 32; - } - 124 - { - title = "Buggle"; - sprite = "BBUZA1"; - width = 20; - height = 24; - } - 116 - { - title = "Pointy"; - sprite = "PNTYA1"; - width = 8; - height = 16; - } -} + sprite = "PLAYA0"; -bosses -{ - color = 8; // Dark_Gray - arrow = 1; - title = "Bosses"; + 1 + { + title = "Player 01 Start"; + sprite = "PLAYA0"; + } + 2 + { + title = "Player 02 Start"; + sprite = "PLAYA0"; + } + 3 + { + title = "Player 03 Start"; + sprite = "PLAYA0"; + } + 4 + { + title = "Player 04 Start"; + sprite = "PLAYA0"; + } + 5 + { + title = "Player 05 Start"; + sprite = "PLAYA0"; + } + 6 + { + title = "Player 06 Start"; + sprite = "PLAYA0"; + } + 7 + { + title = "Player 07 Start"; + sprite = "PLAYA0"; + } + 8 + { + title = "Player 08 Start"; + sprite = "PLAYA0"; + } + 9 + { + title = "Player 09 Start"; + sprite = "PLAYA0"; + } + 10 + { + title = "Player 10 Start"; + sprite = "PLAYA0"; + } + 11 + { + title = "Player 11 Start"; + sprite = "PLAYA0"; + } + 12 + { + title = "Player 12 Start"; + sprite = "PLAYA0"; + } + 13 + { + title = "Player 13 Start"; + sprite = "PLAYA0"; + } + 14 + { + title = "Player 14 Start"; + sprite = "PLAYA0"; + } + 15 + { + title = "Player 15 Start"; + sprite = "PLAYA0"; + } + 16 + { + title = "Player 16 Start"; + sprite = "PLAYA0"; + } + 17 + { + title = "Player 17 Start"; + sprite = "PLAYA0"; + } + 18 + { + title = "Player 18 Start"; + sprite = "PLAYA0"; + } + 19 + { + title = "Player 19 Start"; + sprite = "PLAYA0"; + } + 20 + { + title = "Player 20 Start"; + sprite = "PLAYA0"; + } + 21 + { + title = "Player 21 Start"; + sprite = "PLAYA0"; + } + 22 + { + title = "Player 22 Start"; + sprite = "PLAYA0"; + } + 23 + { + title = "Player 23 Start"; + sprite = "PLAYA0"; + } + 24 + { + title = "Player 24 Start"; + sprite = "PLAYA0"; + } + 25 + { + title = "Player 25 Start"; + sprite = "PLAYA0"; + } + 26 + { + title = "Player 26 Start"; + sprite = "PLAYA0"; + } + 27 + { + title = "Player 27 Start"; + sprite = "PLAYA0"; + } + 28 + { + title = "Player 28 Start"; + sprite = "PLAYA0"; + } + 29 + { + title = "Player 29 Start"; + sprite = "PLAYA0"; + } + 30 + { + title = "Player 30 Start"; + sprite = "PLAYA0"; + } + 31 + { + title = "Player 31 Start"; + sprite = "PLAYA0"; + } + 32 + { + title = "Player 32 Start"; + sprite = "PLAYA0"; + } + 33 + { + title = "Match Start"; + sprite = "NDRNA2A8"; + } + 34 + { + title = "CTF Red Team Start"; + sprite = "SIGNG0"; + } + 35 + { + title = "CTF Blue Team Start"; + sprite = "SIGNE0"; + } + } - 200 + enemies { - title = "Egg Mobile"; - sprite = "EGGMA1"; - width = 24; - height = 76; - } - 201 - { - title = "Egg Slimer"; - sprite = "EGGNA1"; - width = 24; - height = 76; - } - 202 - { - title = "Sea Egg"; - sprite = "EGGOA1"; - width = 32; - height = 116; - } - 203 - { - title = "Egg Colosseum"; - sprite = "EGGPA1"; - width = 24; - height = 76; - } - 204 - { - title = "Fang"; - sprite = "FANGA1"; - width = 24; - height = 60; - } - 206 - { - title = "Brak Eggman (Old)"; - sprite = "BRAKB1"; - width = 48; - height = 160; - } - 207 - { - title = "Metal Sonic (Race)"; - sprite = "METLI1"; - width = 16; - height = 48; - } - 208 - { - title = "Metal Sonic (Battle)"; - sprite = "METLC1"; - width = 16; - height = 48; - } - 209 - { - title = "Brak Eggman"; - sprite = "BRAK01"; - width = 48; - height = 160; - } - 290 - { - arrow = 0; - title = "Boss Escape Point"; - width = 8; - height = 16; - sprite = "internal:eggmanend"; - } - 291 - { - arrow = 0; - title = "Egg Capsule Center"; - width = 8; - height = 16; - sprite = "internal:capsule"; - } - 292 - { - arrow = 0; - title = "Boss Waypoint"; - width = 8; - height = 16; - sprite = "internal:eggmanway"; - } - 293 - { - title = "Metal Sonic Gather Point"; - sprite = "internal:metal"; - width = 8; - height = 16; - } - 294 - { - title = "Fang Waypoint"; - sprite = "internal:eggmanway"; - width = 8; - height = 16; - } -} + color = 9; // Light_Blue + arrow = 1; + title = "Enemies"; -rings -{ - color = 14; // Yellow - title = "Rings and Weapon Panels"; - width = 24; - height = 24; - sprite = "RINGA0"; + 100 + { + title = "Crawla (Blue)"; + sprite = "POSSA1"; + width = 24; + height = 32; + } + 101 + { + title = "Crawla (Red)"; + sprite = "SPOSA1"; + width = 24; + height = 32; + } + 102 + { + title = "Stupid Dumb Unnamed RoboFish"; + sprite = "FISHA0"; + width = 8; + height = 28; + } + 103 + { + title = "Buzz (Gold)"; + sprite = "BUZZA1"; + width = 28; + height = 40; + } + 104 + { + title = "Buzz (Red)"; + sprite = "RBUZA1"; + width = 28; + height = 40; + } + 108 + { + title = "Deton"; + sprite = "DETNA1"; + width = 20; + height = 32; + } + 110 + { + title = "Turret"; + sprite = "TRETA1"; + width = 16; + height = 32; + } + 111 + { + title = "Pop-up Turret"; + sprite = "TURRI1"; + width = 12; + height = 64; + } + 122 + { + title = "Spring Shell (Green)"; + sprite = "SSHLA1"; + width = 24; + height = 40; + } + 125 + { + title = "Spring Shell (Yellow)"; + sprite = "SSHLI1"; + width = 24; + height = 40; + } + 109 + { + title = "Skim"; + sprite = "SKIMA1"; + width = 16; + height = 24; + } + 113 + { + title = "Jet Jaw"; + sprite = "JJAWA3A7"; + width = 12; + height = 20; + } + 126 + { + title = "Crushstacean"; + sprite = "CRABA0"; + width = 24; + height = 32; + } + 138 + { + title = "Banpyura"; + sprite = "CR2BA0"; + width = 24; + height = 32; + } + 117 + { + title = "Robo-Hood"; + sprite = "ARCHA1"; + width = 24; + height = 32; + } + 118 + { + title = "Lance-a-Bot"; + sprite = "CBFSA1"; + width = 32; + height = 72; + } + 1113 + { + title = "Suspicious Lance-a-Bot Statue"; + sprite = "CBBSA1"; + width = 32; + height = 72; + } + 119 + { + title = "Egg Guard"; + sprite = "ESHIA1"; + width = 16; + height = 48; + } + 115 + { + title = "Bird Aircraft Strike Hazard"; + sprite = "VLTRF1"; + width = 12; + height = 24; + } + 120 + { + title = "Green Snapper"; + sprite = "GSNPA1"; + width = 24; + height = 24; + } + 121 + { + title = "Minus"; + sprite = "MNUSA0"; + width = 24; + height = 32; + } + 134 + { + title = "Canarivore"; + sprite = "CANAA0"; + width = 12; + height = 80; + hangs = 1; + } + 123 + { + title = "Unidus"; + sprite = "UNIDA1"; + width = 18; + height = 36; + } + 135 + { + title = "Pterabyte Spawner"; + sprite = "PTERA2A8"; + width = 16; + height = 16; + } + 136 + { + title = "Pyre Fly"; + sprite = "PYREA0"; + width = 24; + height = 34; + } + 137 + { + title = "Dragonbomber"; + sprite = "DRABA1"; + width = 28; + height = 48; + } + 105 + { + title = "Jetty-Syn Bomber"; + sprite = "JETBB1"; + width = 20; + height = 50; + } + 106 + { + title = "Jetty-Syn Gunner"; + sprite = "JETGB1"; + width = 20; + height = 48; + } + 112 + { + title = "Spincushion"; + sprite = "SHRPA1"; + width = 16; + height = 24; + } + 114 + { + title = "Snailer"; + sprite = "SNLRA3A7"; + width = 24; + height = 48; + } + 129 + { + title = "Penguinator"; + sprite = "PENGA1"; + width = 24; + height = 32; + } + 130 + { + title = "Pophat"; + sprite = "POPHA1"; + width = 24; + height = 32; + } + 107 + { + title = "Crawla Commander"; + sprite = "CCOMA1"; + width = 16; + height = 32; + } + 131 + { + title = "Spinbobert"; + sprite = "SBOBB0"; + width = 32; + height = 32; + } + 132 + { + title = "Cacolantern"; + sprite = "CACOA0"; + width = 32; + height = 32; + } + 133 + { + title = "Hangster"; + sprite = "HBATC1"; + width = 24; + height = 24; + hangs = 1; + } + 127 + { + title = "Hive Elemental"; + sprite = "HIVEA0"; + width = 32; + height = 80; + } + 128 + { + title = "Bumblebore"; + sprite = "BUMBA1"; + width = 16; + height = 32; + } + 124 + { + title = "Buggle"; + sprite = "BBUZA1"; + width = 20; + height = 24; + } + 116 + { + title = "Pointy"; + sprite = "PNTYA1"; + width = 8; + height = 16; + } + } - 300 + bosses { - title = "Ring"; + color = 8; // Dark_Gray + arrow = 1; + title = "Bosses"; + + 200 + { + title = "Egg Mobile"; + sprite = "EGGMA1"; + width = 24; + height = 76; + } + 201 + { + title = "Egg Slimer"; + sprite = "EGGNA1"; + width = 24; + height = 76; + } + 202 + { + title = "Sea Egg"; + sprite = "EGGOA1"; + width = 32; + height = 116; + } + 203 + { + title = "Egg Colosseum"; + sprite = "EGGPA1"; + width = 24; + height = 76; + } + 204 + { + title = "Fang"; + sprite = "FANGA1"; + width = 24; + height = 60; + } + 206 + { + title = "Brak Eggman (Old)"; + sprite = "BRAKB1"; + width = 48; + height = 160; + } + 207 + { + title = "Metal Sonic (Race)"; + sprite = "METLI1"; + width = 16; + height = 48; + } + 208 + { + title = "Metal Sonic (Battle)"; + sprite = "METLC1"; + width = 16; + height = 48; + } + 209 + { + title = "Brak Eggman"; + sprite = "BRAK01"; + width = 48; + height = 160; + } + 290 + { + arrow = 0; + title = "Boss Escape Point"; + width = 8; + height = 16; + sprite = "internal:eggmanend"; + } + 291 + { + arrow = 0; + title = "Egg Capsule Center"; + width = 8; + height = 16; + sprite = "internal:capsule"; + } + 292 + { + arrow = 0; + title = "Boss Waypoint"; + width = 8; + height = 16; + sprite = "internal:eggmanway"; + } + 293 + { + title = "Metal Sonic Gather Point"; + sprite = "internal:metal"; + width = 8; + height = 16; + } + 294 + { + title = "Fang Waypoint"; + sprite = "internal:eggmanway"; + width = 8; + height = 16; + } + } + + rings + { + color = 14; // Yellow + title = "Rings and Weapon Panels"; + width = 24; + height = 24; sprite = "RINGA0"; - width = 16; - } - 301 - { - title = "Bounce Ring"; - sprite = "internal:RNGBA0"; - } - 302 - { - title = "Rail Ring"; - sprite = "internal:RNGRA0"; - } - 303 - { - title = "Infinity Ring"; - sprite = "internal:RNGIA0"; - } - 304 - { - title = "Automatic Ring"; - sprite = "internal:RNGAA0"; - } - 305 - { - title = "Explosion Ring"; - sprite = "internal:RNGEA0"; - } - 306 - { - title = "Scatter Ring"; - sprite = "internal:RNGSA0"; - } - 307 - { - title = "Grenade Ring"; - sprite = "internal:RNGGA0"; - } - 308 - { - title = "CTF Team Ring (Red)"; - sprite = "internal:RRNGA0"; - width = 16; - } - 309 - { - title = "CTF Team Ring (Blue)"; - sprite = "internal:BRNGA0"; - width = 16; - } - 330 - { - title = "Bounce Ring Panel"; - sprite = "internal:PIKBA0"; - } - 331 - { - title = "Rail Ring Panel"; - sprite = "internal:PIKRA0"; - } - 332 - { - title = "Automatic Ring Panel"; - sprite = "internal:PIKAA0"; - } - 333 - { - title = "Explosion Ring Panel"; - sprite = "internal:PIKEA0"; - } - 334 - { - title = "Scatter Ring Panel"; - sprite = "internal:PIKSA0"; - } - 335 - { - title = "Grenade Ring Panel"; - sprite = "internal:PIKGA0"; - } -} -collectibles -{ - color = 10; // Light_Green - title = "Other Collectibles"; - width = 16; - height = 32; - sort = 1; - sprite = "CEMGA0"; + 300 + { + title = "Ring"; + sprite = "RINGA0"; + width = 16; + } + 301 + { + title = "Bounce Ring"; + sprite = "internal:RNGBA0"; + } + 302 + { + title = "Rail Ring"; + sprite = "internal:RNGRA0"; + } + 303 + { + title = "Infinity Ring"; + sprite = "internal:RNGIA0"; + } + 304 + { + title = "Automatic Ring"; + sprite = "internal:RNGAA0"; + } + 305 + { + title = "Explosion Ring"; + sprite = "internal:RNGEA0"; + } + 306 + { + title = "Scatter Ring"; + sprite = "internal:RNGSA0"; + } + 307 + { + title = "Grenade Ring"; + sprite = "internal:RNGGA0"; + } + 308 + { + title = "CTF Team Ring (Red)"; + sprite = "internal:RRNGA0"; + width = 16; + } + 309 + { + title = "CTF Team Ring (Blue)"; + sprite = "internal:BRNGA0"; + width = 16; + } + 330 + { + title = "Bounce Ring Panel"; + sprite = "internal:PIKBA0"; + } + 331 + { + title = "Rail Ring Panel"; + sprite = "internal:PIKRA0"; + } + 332 + { + title = "Automatic Ring Panel"; + sprite = "internal:PIKAA0"; + } + 333 + { + title = "Explosion Ring Panel"; + sprite = "internal:PIKEA0"; + } + 334 + { + title = "Scatter Ring Panel"; + sprite = "internal:PIKSA0"; + } + 335 + { + title = "Grenade Ring Panel"; + sprite = "internal:PIKGA0"; + } + } - 310 + collectibles { - title = "CTF Red Flag"; - sprite = "RFLGA0"; - width = 24; - height = 64; - } - 311 - { - title = "CTF Blue Flag"; - sprite = "BFLGA0"; - width = 24; - height = 64; - } - 312 - { - title = "Emerald Token"; - sprite = "TOKEA0"; + color = 10; // Light_Green + title = "Other Collectibles"; width = 16; height = 32; - } - 313 - { - title = "Chaos Emerald 1 (Green)"; + sort = 1; sprite = "CEMGA0"; - } - 314 - { - title = "Chaos Emerald 2 (Purple)"; - sprite = "CEMGB0"; - } - 315 - { - title = "Chaos Emerald 3 (Blue)"; - sprite = "CEMGC0"; - } - 316 - { - title = "Chaos Emerald 4 (Cyan)"; - sprite = "CEMGD0"; - } - 317 - { - title = "Chaos Emerald 5 (Orange)"; - sprite = "CEMGE0"; - } - 318 - { - title = "Chaos Emerald 6 (Red)"; - sprite = "CEMGF0"; - } - 319 - { - title = "Chaos Emerald 7 (Gray)"; - sprite = "CEMGG0"; - } - 320 - { - title = "Emerald Hunt Location"; - sprite = "SHRDA0"; - } - 321 - { - title = "Match Chaos Emerald Spawn"; - sprite = "CEMGA0"; - } - 322 - { - title = "Emblem"; - sprite = "EMBMA0"; - width = 16; - height = 30; - } -} -boxes -{ - color = 7; // Gray - blocking = 2; - title = "Monitors"; - width = 18; - height = 40; + 310 + { + title = "CTF Red Flag"; + sprite = "RFLGA0"; + width = 24; + height = 64; + } + 311 + { + title = "CTF Blue Flag"; + sprite = "BFLGA0"; + width = 24; + height = 64; + } + 312 + { + title = "Emerald Token"; + sprite = "TOKEA0"; + width = 16; + height = 32; + } + 313 + { + title = "Chaos Emerald 1 (Green)"; + sprite = "CEMGA0"; + } + 314 + { + title = "Chaos Emerald 2 (Purple)"; + sprite = "CEMGB0"; + } + 315 + { + title = "Chaos Emerald 3 (Blue)"; + sprite = "CEMGC0"; + } + 316 + { + title = "Chaos Emerald 4 (Cyan)"; + sprite = "CEMGD0"; + } + 317 + { + title = "Chaos Emerald 5 (Orange)"; + sprite = "CEMGE0"; + } + 318 + { + title = "Chaos Emerald 6 (Red)"; + sprite = "CEMGF0"; + } + 319 + { + title = "Chaos Emerald 7 (Gray)"; + sprite = "CEMGG0"; + } + 320 + { + title = "Emerald Hunt Location"; + sprite = "SHRDA0"; + } + 321 + { + title = "Match Chaos Emerald Spawn"; + sprite = "CEMGA0"; + } + 322 + { + title = "Emblem"; + sprite = "EMBMA0"; + width = 16; + height = 30; + } + } - 400 + boxes { - title = "Super Ring (10 Rings)"; - sprite = "TVRIA0"; - } - 401 - { - title = "Pity Shield"; - sprite = "TVPIA0"; - } - 402 - { - title = "Attraction Shield"; - sprite = "TVATA0"; - } - 403 - { - title = "Force Shield"; - sprite = "TVFOA0"; - } - 404 - { - title = "Armageddon Shield"; - sprite = "TVARA0"; - } - 405 - { - title = "Whirlwind Shield"; - sprite = "TVWWA0"; - } - 406 - { - title = "Elemental Shield"; - sprite = "TVELA0"; - } - 407 - { - title = "Super Sneakers"; - sprite = "TVSSA0"; - } - 408 - { - title = "Invincibility"; - sprite = "TVIVA0"; - } - 409 - { - title = "Extra Life"; - sprite = "TV1UA0"; - } - 410 - { - title = "Eggman"; - sprite = "TVEGA0"; - } - 411 - { - title = "Teleporter"; - sprite = "TVMXA0"; - } - 413 - { - title = "Gravity Boots"; - sprite = "TVGVA0"; - } - 414 - { - title = "CTF Team Ring Monitor (Red)"; - sprite = "TRRIA0"; - } - 415 - { - title = "CTF Team Ring Monitor (Blue)"; - sprite = "TBRIA0"; - } - 416 - { - title = "Recycler"; - sprite = "TVRCA0"; - } - 418 - { - title = "Score (1,000 Points)"; - sprite = "TV1KA0"; - } - 419 - { - title = "Score (10,000 Points)"; - sprite = "TVTKA0"; - } - 420 - { - title = "Flame Shield"; - sprite = "TVFLA0"; - } - 421 - { - title = "Water Shield"; - sprite = "TVBBA0"; - } - 422 - { - title = "Lightning Shield"; - sprite = "TVZPA0"; - } -} + color = 7; // Gray + blocking = 2; + title = "Monitors"; + width = 18; + height = 40; -boxes2 -{ - color = 18; // Gold - blocking = 2; - title = "Monitors (Respawning)"; - width = 20; - height = 44; + 400 + { + title = "Super Ring (10 Rings)"; + sprite = "TVRIA0"; + } + 401 + { + title = "Pity Shield"; + sprite = "TVPIA0"; + } + 402 + { + title = "Attraction Shield"; + sprite = "TVATA0"; + } + 403 + { + title = "Force Shield"; + sprite = "TVFOA0"; + } + 404 + { + title = "Armageddon Shield"; + sprite = "TVARA0"; + } + 405 + { + title = "Whirlwind Shield"; + sprite = "TVWWA0"; + } + 406 + { + title = "Elemental Shield"; + sprite = "TVELA0"; + } + 407 + { + title = "Super Sneakers"; + sprite = "TVSSA0"; + } + 408 + { + title = "Invincibility"; + sprite = "TVIVA0"; + } + 409 + { + title = "Extra Life"; + sprite = "TV1UA0"; + } + 410 + { + title = "Eggman"; + sprite = "TVEGA0"; + } + 411 + { + title = "Teleporter"; + sprite = "TVMXA0"; + } + 413 + { + title = "Gravity Boots"; + sprite = "TVGVA0"; + } + 414 + { + title = "CTF Team Ring Monitor (Red)"; + sprite = "TRRIA0"; + } + 415 + { + title = "CTF Team Ring Monitor (Blue)"; + sprite = "TBRIA0"; + } + 416 + { + title = "Recycler"; + sprite = "TVRCA0"; + } + 418 + { + title = "Score (1,000 Points)"; + sprite = "TV1KA0"; + } + 419 + { + title = "Score (10,000 Points)"; + sprite = "TVTKA0"; + } + 420 + { + title = "Flame Shield"; + sprite = "TVFLA0"; + } + 421 + { + title = "Water Shield"; + sprite = "TVBBA0"; + } + 422 + { + title = "Lightning Shield"; + sprite = "TVZPA0"; + } + } - 431 + boxes2 { - title = "Pity Shield (Respawn)"; - sprite = "TVPIB0"; - } - 432 - { - title = "Attraction Shield (Respawn)"; - sprite = "TVATB0"; - } - 433 - { - title = "Force Shield (Respawn)"; - sprite = "TVFOB0"; - } - 434 - { - title = "Armageddon Shield (Respawn)"; - sprite = "TVARB0"; - } - 435 - { - title = "Whirlwind Shield (Respawn)"; - sprite = "TVWWB0"; - } - 436 - { - title = "Elemental Shield (Respawn)"; - sprite = "TVELB0"; - } - 437 - { - title = "Super Sneakers (Respawn)"; - sprite = "TVSSB0"; - } - 438 - { - title = "Invincibility (Respawn)"; - sprite = "TVIVB0"; - } - 440 - { - title = "Eggman (Respawn)"; - sprite = "TVEGB0"; - } - 443 - { - title = "Gravity Boots (Respawn)"; - sprite = "TVGVB0"; - } - 450 - { - title = "Flame Shield (Respawn)"; - sprite = "TVFLB0"; - } - 451 - { - title = "Water Shield (Respawn)"; - sprite = "TVBBB0"; - } - 452 - { - title = "Lightning Shield (Respawn)"; - sprite = "TVZPB0"; - } -} + color = 18; // Gold + blocking = 2; + title = "Monitors (Respawning)"; + width = 20; + height = 44; -generic -{ - color = 11; // Light_Cyan - title = "Generic Items & Hazards"; + 431 + { + title = "Pity Shield (Respawn)"; + sprite = "TVPIB0"; + } + 432 + { + title = "Attraction Shield (Respawn)"; + sprite = "TVATB0"; + } + 433 + { + title = "Force Shield (Respawn)"; + sprite = "TVFOB0"; + } + 434 + { + title = "Armageddon Shield (Respawn)"; + sprite = "TVARB0"; + } + 435 + { + title = "Whirlwind Shield (Respawn)"; + sprite = "TVWWB0"; + } + 436 + { + title = "Elemental Shield (Respawn)"; + sprite = "TVELB0"; + } + 437 + { + title = "Super Sneakers (Respawn)"; + sprite = "TVSSB0"; + } + 438 + { + title = "Invincibility (Respawn)"; + sprite = "TVIVB0"; + } + 440 + { + title = "Eggman (Respawn)"; + sprite = "TVEGB0"; + } + 443 + { + title = "Gravity Boots (Respawn)"; + sprite = "TVGVB0"; + } + 450 + { + title = "Flame Shield (Respawn)"; + sprite = "TVFLB0"; + } + 451 + { + title = "Water Shield (Respawn)"; + sprite = "TVBBB0"; + } + 452 + { + title = "Lightning Shield (Respawn)"; + sprite = "TVZPB0"; + } + } - 500 + generic { - title = "Air Bubble Patch"; - sprite = "BUBLE0"; - width = 8; + color = 11; // Light_Cyan + title = "Generic Items & Hazards"; + + 500 + { + title = "Air Bubble Patch"; + sprite = "BUBLE0"; + width = 8; + height = 16; + } + 501 + { + title = "Signpost"; + sprite = "SIGND0"; + width = 8; + height = 32; + } + 502 + { + arrow = 1; + title = "Star Post"; + sprite = "STPTA0M0"; + width = 64; + height = 128; + } + 520 + { + title = "Bomb Sphere"; + sprite = "SPHRD0"; + width = 16; + height = 24; + } + 521 + { + title = "Spikeball"; + sprite = "SPIKA0"; + width = 12; + height = 8; + } + 522 + { + title = "Wall Spike"; + sprite = "WSPKALAR"; + width = 16; + height = 14; + arrow = 1; + } + 523 + { + title = "Spike"; + sprite = "USPKA0"; + width = 8; + height = 32; + } + 1130 + { + title = "Small Mace"; + sprite = "SMCEA0"; + width = 17; + height = 34; + } + 1131 + { + title = "Big Mace"; + sprite = "BMCEA0"; + width = 34; + height = 68; + } + 1136 + { + title = "Small Fireball"; + sprite = "SFBRA0"; + width = 17; + height = 34; + } + 1137 + { + title = "Large Fireball"; + sprite = "BFBRA0"; + width = 34; + height = 68; + } + } + + springs + { + color = 12; // Light_Red + title = "Springs and Fans"; + width = 20; height = 16; - } - 501 - { - title = "Signpost"; - sprite = "SIGND0"; - width = 8; - height = 32; - } - 502 - { - arrow = 1; - title = "Star Post"; - sprite = "STPTA0M0"; - width = 64; - height = 128; - } - 520 - { - title = "Bomb Sphere"; - sprite = "SPHRD0"; - width = 16; - height = 24; - } - 521 - { - title = "Spikeball"; - sprite = "SPIKA0"; - width = 12; - height = 8; - } - 522 - { - title = "Wall Spike"; - sprite = "WSPKALAR"; - width = 16; - height = 14; - arrow = 1; - } - 523 - { - title = "Spike"; - sprite = "USPKA0"; - width = 8; - height = 32; - } - 1130 - { - title = "Small Mace"; - sprite = "SMCEA0"; - width = 17; - height = 34; - } - 1131 - { - title = "Big Mace"; - sprite = "BMCEA0"; - width = 34; - height = 68; - } - 1136 - { - title = "Small Fireball"; - sprite = "SFBRA0"; - width = 17; - height = 34; - } - 1137 - { - title = "Large Fireball"; - sprite = "BFBRA0"; - width = 34; - height = 68; - } -} - -springs -{ - color = 12; // Light_Red - title = "Springs and Fans"; - width = 20; - height = 16; - sprite = "RSPRD2"; - - 540 - { - title = "Fan"; - sprite = "FANSA0D0"; - width = 16; - height = 8; - } - 541 - { - title = "Gas Jet"; - sprite = "STEMD0"; - width = 32; - } - 542 - { - title = "Bumper"; - sprite = "BUMPA0"; - width = 32; - height = 64; - } - 543 - { - title = "Balloon"; - sprite = "BLONA0"; - width = 32; - height = 64; - } - 550 - { - title = "Yellow Spring"; - sprite = "SPRYA0"; - } - 551 - { - title = "Red Spring"; - sprite = "SPRRA0"; - } - 552 - { - title = "Blue Spring"; - sprite = "SPRBA0"; - } - 555 - { - arrow = 1; - title = "Diagonal Yellow Spring"; - sprite = "YSPRD2"; - width = 16; - } - 556 - { - arrow = 1; - title = "Diagonal Red Spring"; sprite = "RSPRD2"; - width = 16; - } - 557 - { - arrow = 1; - title = "Diagonal Blue Spring"; - sprite = "BSPRD2"; - width = 16; - } - 558 - { - arrow = 1; - title = "Horizontal Yellow Spring"; - sprite = "SSWYD2D8"; - width = 16; - height = 32; - } - 559 - { - arrow = 1; - title = "Horizontal Red Spring"; - sprite = "SSWRD2D8"; - width = 16; - height = 32; - } - 560 - { - arrow = 1; - title = "Horizontal Blue Spring"; - sprite = "SSWBD2D8"; - width = 16; - height = 32; - } - 1134 - { - title = "Yellow Spring Ball"; - sprite = "YSPBA0"; - width = 17; - height = 34; - } - 1135 - { - title = "Red Spring Ball"; - sprite = "RSPBA0"; - width = 17; - height = 34; - } - 544 - { - arrow = 1; - title = "Yellow Boost Panel"; - sprite = "BSTYA0"; - width = 28; - height = 2; - } - 545 - { - arrow = 1; - title = "Red Boost Panel"; - sprite = "BSTRA0"; - width = 28; - height = 2; - } -} -patterns -{ - color = 5; // Magenta - arrow = 1; - title = "Special Placement Patterns"; - width = 16; - height = 384; - sprite = "RINGA0"; + 540 + { + title = "Fan"; + sprite = "FANSA0D0"; + width = 16; + height = 8; + } + 541 + { + title = "Gas Jet"; + sprite = "STEMD0"; + width = 32; + } + 542 + { + title = "Bumper"; + sprite = "BUMPA0"; + width = 32; + height = 64; + } + 543 + { + title = "Balloon"; + sprite = "BLONA0"; + width = 32; + height = 64; + } + 550 + { + title = "Yellow Spring"; + sprite = "SPRYA0"; + } + 551 + { + title = "Red Spring"; + sprite = "SPRRA0"; + } + 552 + { + title = "Blue Spring"; + sprite = "SPRBA0"; + } + 555 + { + arrow = 1; + title = "Diagonal Yellow Spring"; + sprite = "YSPRD2"; + width = 16; + } + 556 + { + arrow = 1; + title = "Diagonal Red Spring"; + sprite = "RSPRD2"; + width = 16; + } + 557 + { + arrow = 1; + title = "Diagonal Blue Spring"; + sprite = "BSPRD2"; + width = 16; + } + 558 + { + arrow = 1; + title = "Horizontal Yellow Spring"; + sprite = "SSWYD2D8"; + width = 16; + height = 32; + } + 559 + { + arrow = 1; + title = "Horizontal Red Spring"; + sprite = "SSWRD2D8"; + width = 16; + height = 32; + } + 560 + { + arrow = 1; + title = "Horizontal Blue Spring"; + sprite = "SSWBD2D8"; + width = 16; + height = 32; + } + 1134 + { + title = "Yellow Spring Ball"; + sprite = "YSPBA0"; + width = 17; + height = 34; + } + 1135 + { + title = "Red Spring Ball"; + sprite = "RSPBA0"; + width = 17; + height = 34; + } + 544 + { + arrow = 1; + title = "Yellow Boost Panel"; + sprite = "BSTYA0"; + width = 28; + height = 2; + } + 545 + { + arrow = 1; + title = "Red Boost Panel"; + sprite = "BSTRA0"; + width = 28; + height = 2; + } + } - 600 + patterns { - arrow = 0; - title = "5 Vertical Rings (Yellow Spring)"; + color = 5; // Magenta + arrow = 1; + title = "Special Placement Patterns"; + width = 16; + height = 384; sprite = "RINGA0"; - } - 601 - { - arrow = 0; - title = "5 Vertical Rings (Red Spring)"; - sprite = "RINGA0"; - height = 1024; - } - 602 - { - title = "5 Diagonal Rings (Yellow Spring)"; - sprite = "RINGA0"; - height = 32; - } - 603 - { - title = "10 Diagonal Rings (Red Spring)"; - sprite = "RINGA0"; - height = 32; - } - 604 - { - title = "Circle of Rings"; - sprite = "RINGA0"; - width = 96; - height = 192; - } - 605 - { - title = "Circle of Rings (Big)"; - sprite = "RINGA0"; - width = 192; - } - 606 - { - title = "Circle of Blue Spheres"; - sprite = "SPHRA0"; - width = 96; - height = 192; - } - 607 - { - title = "Circle of Blue Spheres (Big)"; - sprite = "SPHRA0"; - width = 192; - } - 608 - { - title = "Circle of Rings and Spheres"; - sprite = "SPHRA0"; - width = 96; - height = 192; - } - 609 - { - title = "Circle of Rings and Spheres (Big)"; - sprite = "SPHRA0"; - width = 192; - } -} -invisible -{ - color = 15; // White - title = "Misc. Invisible"; - width = 0; - height = 0; - sprite = "UNKNA0"; - sort = 1; - fixedsize = true; - blocking = 0; - - 700 - { - title = "Water Ambience A (Large)"; - sprite = "internal:ambiance"; + 600 + { + arrow = 0; + title = "5 Vertical Rings (Yellow Spring)"; + sprite = "RINGA0"; + } + 601 + { + arrow = 0; + title = "5 Vertical Rings (Red Spring)"; + sprite = "RINGA0"; + height = 1024; + } + 602 + { + title = "5 Diagonal Rings (Yellow Spring)"; + sprite = "RINGA0"; + height = 32; + } + 603 + { + title = "10 Diagonal Rings (Red Spring)"; + sprite = "RINGA0"; + height = 32; + } + 604 + { + title = "Circle of Rings"; + sprite = "RINGA0"; + width = 96; + height = 192; + } + 605 + { + title = "Circle of Rings (Big)"; + sprite = "RINGA0"; + width = 192; + } + 606 + { + title = "Circle of Blue Spheres"; + sprite = "SPHRA0"; + width = 96; + height = 192; + } + 607 + { + title = "Circle of Blue Spheres (Big)"; + sprite = "SPHRA0"; + width = 192; + } + 608 + { + title = "Circle of Rings and Spheres"; + sprite = "SPHRA0"; + width = 96; + height = 192; + } + 609 + { + title = "Circle of Rings and Spheres (Big)"; + sprite = "SPHRA0"; + width = 192; + } } - 701 + invisible { - title = "Water Ambience B (Large)"; - sprite = "internal:ambiance"; + color = 15; // White + title = "Misc. Invisible"; + width = 0; + height = 0; + sprite = "UNKNA0"; + sort = 1; + fixedsize = true; + blocking = 0; + + 700 + { + title = "Water Ambience A (Large)"; + sprite = "internal:ambiance"; + } + + 701 + { + title = "Water Ambience B (Large)"; + sprite = "internal:ambiance"; + } + + 702 + { + title = "Water Ambience C (Medium)"; + sprite = "internal:ambiance"; + } + + 703 + { + title = "Water Ambience D (Medium)"; + sprite = "internal:ambiance"; + } + + 704 + { + title = "Water Ambience E (Small)"; + sprite = "internal:ambiance"; + } + + 705 + { + title = "Water Ambience F (Small)"; + sprite = "internal:ambiance"; + } + + 706 + { + title = "Water Ambience G (Extra Large)"; + sprite = "internal:ambiance"; + } + + 707 + { + title = "Water Ambience H (Extra Large)"; + sprite = "internal:ambiance"; + } + + 708 + { + title = "Disco Ambience"; + sprite = "internal:ambiance"; + } + + 709 + { + title = "Volcano Ambience"; + sprite = "internal:ambiance"; + } + + 710 + { + title = "Machine Ambience"; + sprite = "internal:ambiance"; + } + + 750 + { + title = "Slope Vertex"; + sprite = "internal:vertexslope"; + } + + 751 + { + arrow = 1; + title = "Teleport Destination"; + sprite = "internal:tele"; + } + + 752 + { + arrow = 1; + title = "Alternate View Point"; + sprite = "internal:view"; + } + + 753 + { + title = "Zoom Tube Waypoint"; + sprite = "internal:zoom"; + } + + 754 + { + title = "Push Point"; + sprite = "GWLGA0"; + } + 755 + { + title = "Pull Point"; + sprite = "GWLRA0"; + } + 756 + { + title = "Blast Linedef Executor"; + sprite = "TOADA0"; + width = 32; + height = 16; + } + 757 + { + title = "Fan Particle Generator"; + sprite = "PRTLA0"; + width = 8; + height = 16; + } + 758 + { + title = "Object Angle Anchor"; + sprite = "internal:view"; + } + 760 + { + title = "PolyObject Anchor"; + sprite = "internal:polyanchor"; + } + 761 + { + title = "PolyObject Spawn Point"; + sprite = "internal:polycenter"; + } + 762 + { + title = "PolyObject Spawn Point (Crush)"; + sprite = "internal:polycentercrush"; + } + 780 + { + title = "Skybox View Point"; + sprite = "internal:skyb"; + } } - 702 + greenflower { - title = "Water Ambience C (Medium)"; - sprite = "internal:ambiance"; + color = 10; // Green + title = "Greenflower"; + + 800 + { + title = "GFZ Flower"; + sprite = "FWR1A0"; + width = 16; + height = 40; + } + 801 + { + title = "Sunflower"; + sprite = "FWR2A0"; + width = 16; + height = 96; + } + 802 + { + title = "Budding Flower"; + sprite = "FWR3A0"; + width = 8; + height = 32; + } + 803 + { + title = "Blueberry Bush"; + sprite = "BUS3A0"; + width = 16; + height = 32; + } + 804 + { + title = "Berry Bush"; + sprite = "BUS1A0"; + width = 16; + height = 32; + } + 805 + { + title = "Bush"; + sprite = "BUS2A0"; + width = 16; + height = 32; + } + 806 + { + title = "GFZ Tree"; + sprite = "TRE1A0"; + width = 20; + height = 128; + } + 807 + { + title = "GFZ Berry Tree"; + sprite = "TRE1B0"; + width = 20; + height = 128; + } + 808 + { + title = "GFZ Cherry Tree"; + sprite = "TRE1C0"; + width = 20; + height = 128; + } + 809 + { + title = "Checkered Tree"; + sprite = "TRE2A0"; + width = 20; + height = 200; + } + 810 + { + title = "Checkered Tree (Sunset)"; + sprite = "TRE2B0"; + width = 20; + height = 200; + } + 811 + { + title = "Polygon Tree"; + sprite = "TRE4A0"; + width = 20; + height = 200; + } + 812 + { + title = "Bush Tree"; + sprite = "TRE5A0"; + width = 20; + height = 200; + } + 813 + { + title = "Red Bush Tree"; + sprite = "TRE5B0"; + width = 20; + height = 200; + } } - 703 + technohill { - title = "Water Ambience D (Medium)"; - sprite = "internal:ambiance"; + color = 10; // Green + title = "Techno Hill"; + + 900 + { + title = "THZ Steam Flower"; + sprite = "THZPA0"; + width = 8; + height = 32; + } + 901 + { + title = "Alarm"; + sprite = "ALRMA0"; + width = 8; + height = 16; + hangs = 1; + } + 902 + { + title = "THZ Spin Flower (Red)"; + sprite = "FWR5A0"; + width = 16; + height = 64; + } + 903 + { + title = "THZ Spin Flower (Yellow)"; + sprite = "FWR6A0"; + width = 16; + height = 64; + } + 904 + { + arrow = 1; + title = "Whistlebush"; + sprite = "THZTA0"; + width = 16; + height = 64; + } } - 704 + deepsea { - title = "Water Ambience E (Small)"; - sprite = "internal:ambiance"; + color = 10; // Green + title = "Deep Sea"; + + 1000 + { + arrow = 1; + blocking = 2; + title = "Gargoyle"; + sprite = "GARGA1"; + width = 16; + height = 40; + } + 1009 + { + arrow = 1; + blocking = 2; + title = "Gargoyle (Big)"; + sprite = "GARGB1"; + width = 32; + height = 80; + } + 1001 + { + title = "Seaweed"; + sprite = "SEWEA0"; + width = 24; + height = 56; + } + 1002 + { + title = "Dripping Water"; + sprite = "DRIPD0"; + width = 8; + height = 16; + hangs = 1; + } + 1003 + { + title = "Coral (Green)"; + sprite = "CORLA0"; + width = 29; + height = 40; + } + 1004 + { + title = "Coral (Red)"; + sprite = "CORLB0"; + width = 30; + height = 53; + } + 1005 + { + title = "Coral (Orange)"; + sprite = "CORLC0"; + width = 28; + height = 41; + } + 1006 + { + title = "Blue Crystal"; + sprite = "BCRYA1"; + width = 8; + height = 16; + } + 1007 + { + title = "Kelp"; + sprite = "KELPA0"; + width = 16; + height = 292; + } + 1008 + { + title = "Stalagmite (DSZ1)"; + sprite = "DSTGA0"; + width = 8; + height = 116; + } + 1010 + { + arrow = 1; + title = "Light Beam"; + sprite = "LIBEARAL"; + width = 16; + height = 16; + } + 1011 + { + title = "Stalagmite (DSZ2)"; + sprite = "DSTGA0"; + width = 8; + height = 116; + } + 1012 + { + arrow = 1; + title = "Big Floating Mine"; + width = 28; + height = 56; + sprite = "BMNEA1"; + } + 1013 + { + title = "Animated Kelp"; + sprite = "ALGAA0"; + width = 48; + height = 120; + } + 1014 + { + title = "Large Coral (Brown)"; + sprite = "CORLD0"; + width = 56; + height = 112; + } + 1015 + { + title = "Large Coral (Beige)"; + sprite = "CORLE0"; + width = 56; + height = 112; + } } - 705 + castleeggman { - title = "Water Ambience F (Small)"; - sprite = "internal:ambiance"; + color = 10; // Green + title = "Castle Eggman"; + + 1100 + { + title = "Chain (Decorative)"; + sprite = "CHANA0"; + width = 4; + height = 128; + hangs = 1; + } + 1101 + { + title = "Torch"; + sprite = "FLAMA0E0"; + width = 8; + height = 32; + } + 1102 + { + arrow = 1; + blocking = 2; + title = "Eggman Statue"; + sprite = "ESTAA1"; + width = 32; + height = 240; + } + 1103 + { + title = "CEZ Flower"; + sprite = "FWR4A0"; + width = 16; + height = 40; + } + 1104 + { + title = "Mace Spawnpoint"; + sprite = "SMCEA0"; + width = 17; + height = 34; + } + 1105 + { + title = "Chain with Maces Spawnpoint"; + sprite = "SMCEA0"; + width = 17; + height = 34; + } + 1106 + { + title = "Chained Spring Spawnpoint"; + sprite = "YSPBA0"; + width = 17; + height = 34; + } + 1107 + { + title = "Chain Spawnpoint"; + sprite = "BMCHA0"; + width = 17; + height = 34; + } + 1108 + { + arrow = 1; + title = "Hidden Chain Spawnpoint"; + sprite = "internal:chain3"; + width = 17; + height = 34; + } + 1109 + { + title = "Firebar Spawnpoint"; + sprite = "BFBRA0"; + width = 17; + height = 34; + } + 1110 + { + title = "Custom Mace Spawnpoint"; + sprite = "SMCEA0"; + width = 17; + height = 34; + } + 1111 + { + arrow = 1; + blocking = 2; + title = "Crawla Statue"; + sprite = "CSTAA1"; + width = 16; + height = 40; + } + 1112 + { + arrow = 1; + blocking = 2; + title = "Lance-a-Bot Statue"; + sprite = "CBBSA1"; + width = 32; + height = 72; + } + 1114 + { + title = "Pine Tree"; + sprite = "PINEA0"; + width = 16; + height = 628; + } + 1115 + { + title = "CEZ Shrub (Small)"; + sprite = "CEZBA0"; + width = 16; + height = 24; + } + 1116 + { + title = "CEZ Shrub (Large)"; + sprite = "CEZBB0"; + width = 32; + height = 48; + } + 1117 + { + arrow = 1; + title = "Pole Banner (Red)"; + sprite = "BANRA0"; + width = 40; + height = 224; + } + 1118 + { + arrow = 1; + title = "Pole Banner (Blue)"; + sprite = "BANRA0"; + width = 40; + height = 224; + } + 1119 + { + title = "Candle"; + sprite = "CNDLA0"; + width = 8; + height = 48; + } + 1120 + { + title = "Candle Pricket"; + sprite = "CNDLB0"; + width = 8; + height = 176; + } + 1121 + { + title = "Flame Holder"; + sprite = "FLMHA0"; + width = 24; + height = 80; + } + 1122 + { + title = "Fire Torch"; + sprite = "CTRCA0"; + width = 16; + height = 80; + } + 1123 + { + title = "Cannonball Launcher"; + sprite = "internal:cannonball"; + width = 8; + height = 16; + } + 1124 + { + blocking = 2; + title = "Cannonball"; + sprite = "CBLLA0"; + width = 20; + height = 40; + } + 1125 + { + title = "Brambles"; + sprite = "CABRALAR"; + width = 48; + height = 32; + } + 1126 + { + title = "Invisible Lockon Object"; + sprite = "LCKNC0"; + width = 16; + height = 32; + } + 1127 + { + title = "Spectator Eggrobo"; + sprite = "EGR1A1"; + width = 20; + height = 72; + } + 1128 + { + arrow = 1; + title = "Waving Flag (Red)"; + sprite = "CFLGA0"; + width = 8; + height = 208; + } + 1129 + { + arrow = 1; + title = "Waving Flag (Blue)"; + sprite = "CFLGA0"; + width = 8; + height = 208; + } } - 706 + aridcanyon { - title = "Water Ambience G (Extra Large)"; - sprite = "internal:ambiance"; + color = 10; // Green + title = "Arid Canyon"; + + 1200 + { + title = "Tumbleweed (Big)"; + sprite = "BTBLA0"; + width = 24; + height = 48; + } + 1201 + { + title = "Tumbleweed (Small)"; + sprite = "STBLA0"; + width = 12; + height = 24; + } + 1202 + { + arrow = 1; + title = "Rock Spawner"; + sprite = "ROIAA0"; + width = 8; + height = 16; + } + 1203 + { + title = "Tiny Red Flower Cactus"; + sprite = "CACTA0"; + width = 13; + height = 24; + } + 1204 + { + title = "Small Red Flower Cactus"; + sprite = "CACTB0"; + width = 15; + height = 52; + } + 1205 + { + title = "Tiny Blue Flower Cactus"; + sprite = "CACTC0"; + width = 13; + height = 24; + } + 1206 + { + title = "Small Blue Flower Cactus"; + sprite = "CACTD0"; + width = 15; + height = 52; + } + 1207 + { + title = "Prickly Pear"; + sprite = "CACTE0"; + width = 32; + height = 96; + } + 1208 + { + title = "Barrel Cactus"; + sprite = "CACTF0"; + width = 20; + height = 128; + } + 1209 + { + title = "Tall Barrel Cactus"; + sprite = "CACTG0"; + width = 24; + height = 224; + } + 1210 + { + title = "Armed Cactus"; + sprite = "CACTH0"; + width = 24; + height = 256; + } + 1211 + { + title = "Ball Cactus"; + sprite = "CACTI0"; + width = 48; + height = 96; + } + 1212 + { + title = "Caution Sign"; + sprite = "WWSGAR"; + width = 22; + height = 64; + } + 1213 + { + title = "Cacti Sign"; + sprite = "WWS2AR"; + width = 22; + height = 64; + } + 1214 + { + title = "Sharp Turn Sign"; + sprite = "WWS3ALAR"; + width = 16; + height = 192; + } + 1215 + { + title = "Mine Oil Lamp"; + sprite = "OILLA0"; + width = 22; + height = 64; + hangs = 1; + } + 1216 + { + title = "TNT Barrel"; + sprite = "BARRA1"; + width = 24; + height = 63; + } + 1217 + { + title = "TNT Proximity Shell"; + sprite = "REMTA0"; + width = 64; + height = 40; + } + 1218 + { + title = "Dust Devil"; + sprite = "TAZDCR"; + width = 80; + height = 416; + } + 1219 + { + title = "Minecart Spawner"; + sprite = "MCRTCLFR"; + width = 22; + height = 32; + } + 1220 + { + title = "Minecart Stopper"; + sprite = "MCRTIR"; + width = 32; + height = 32; + } + 1221 + { + title = "Minecart Saloon Door"; + sprite = "SALDARAL"; + width = 96; + height = 160; + } + 1222 + { + title = "Train Cameo Spawner"; + sprite = "TRAEBRBL"; + width = 28; + height = 32; + } + 1223 + { + title = "Train Dust Spawner"; + sprite = "ADSTA0"; + width = 4; + height = 4; + } + 1224 + { + title = "Train Steam Spawner"; + sprite = "STEAA0"; + width = 4; + height = 4; + } + 1229 + { + title = "Minecart Switch Point"; + sprite = "internal:zoom"; + width = 8; + height = 16; + } + 1230 + { + title = "Tiny Cactus"; + sprite = "CACTJ0"; + width = 13; + height = 28; + } + 1231 + { + title = "Small Cactus"; + sprite = "CACTK0"; + width = 15; + height = 60; + } } - 707 + redvolcano { - title = "Water Ambience H (Extra Large)"; - sprite = "internal:ambiance"; + color = 10; // Green + title = "Red Volcano"; + + 1300 + { + arrow = 1; + title = "Flame Jet (Horizontal)"; + sprite = "internal:flameh"; + width = 16; + height = 40; + } + 1301 + { + title = "Flame Jet (Vertical)"; + sprite = "internal:flamev"; + width = 16; + height = 40; + } + 1302 + { + title = "Spinning Flame Jet (Counter-Clockwise)"; + sprite = "internal:flame2"; + width = 16; + height = 24; + } + 1303 + { + title = "Spinning Flame Jet (Clockwise)"; + sprite = "internal:flame1"; + width = 16; + height = 24; + } + 1304 + { + title = "Lavafall"; + sprite = "LFALF0"; + width = 30; + height = 32; + } + 1305 + { + title = "Rollout Rock"; + sprite = "PUMIA1A5"; + width = 30; + height = 60; + } + 1306 + { + title = "Big Fern"; + sprite = "JPLAB0"; + width = 32; + height = 48; + } + 1307 + { + title = "Jungle Palm"; + sprite = "JPLAC0"; + width = 32; + height = 48; + } + 1308 + { + title = "Torch Flower"; + sprite = "TFLOA0"; + width = 14; + height = 110; + } + 1309 + { + title = "RVZ1 Wall Vine (Long)"; + sprite = "WVINALAR"; + width = 1; + height = 288; + } + 1310 + { + title = "RVZ1 Wall Vine (Short)"; + sprite = "WVINBLBR"; + width = 1; + height = 288; + } } - 708 + botanicserenity { - title = "Disco Ambience"; - sprite = "internal:ambiance"; - } - - 709 - { - title = "Volcano Ambience"; - sprite = "internal:ambiance"; - } - - 710 - { - title = "Machine Ambience"; - sprite = "internal:ambiance"; - } - - 750 - { - title = "Slope Vertex"; - sprite = "internal:vertexslope"; - } - - 751 - { - arrow = 1; - title = "Teleport Destination"; - sprite = "internal:tele"; - } - - 752 - { - arrow = 1; - title = "Alternate View Point"; - sprite = "internal:view"; - } - - 753 - { - title = "Zoom Tube Waypoint"; - sprite = "internal:zoom"; - } - - 754 - { - title = "Push Point"; - sprite = "GWLGA0"; - } - 755 - { - title = "Pull Point"; - sprite = "GWLRA0"; - } - 756 - { - title = "Blast Linedef Executor"; - sprite = "TOADA0"; - width = 32; - height = 16; - } - 757 - { - title = "Fan Particle Generator"; - sprite = "PRTLA0"; - width = 8; - height = 16; - } - 758 - { - title = "Object Angle Anchor"; - sprite = "internal:view"; - } - 760 - { - title = "PolyObject Anchor"; - sprite = "internal:polyanchor"; - } - 761 - { - title = "PolyObject Spawn Point"; - sprite = "internal:polycenter"; - } - 762 - { - title = "PolyObject Spawn Point (Crush)"; - sprite = "internal:polycentercrush"; - } - 780 - { - title = "Skybox View Point"; - sprite = "internal:skyb"; - } -} - -greenflower -{ - color = 10; // Green - title = "Greenflower"; - - 800 - { - title = "GFZ Flower"; - sprite = "FWR1A0"; - width = 16; - height = 40; - } - 801 - { - title = "Sunflower"; - sprite = "FWR2A0"; - width = 16; - height = 96; - } - 802 - { - title = "Budding Flower"; - sprite = "FWR3A0"; - width = 8; - height = 32; - } - 803 - { - title = "Blueberry Bush"; - sprite = "BUS3A0"; + color = 10; // Green + title = "Botanic Serenity"; width = 16; height = 32; - } - 804 - { - title = "Berry Bush"; - sprite = "BUS1A0"; - width = 16; - height = 32; - } - 805 - { - title = "Bush"; - sprite = "BUS2A0"; - width = 16; - height = 32; - } - 806 - { - title = "GFZ Tree"; - sprite = "TRE1A0"; - width = 20; - height = 128; - } - 807 - { - title = "GFZ Berry Tree"; - sprite = "TRE1B0"; - width = 20; - height = 128; - } - 808 - { - title = "GFZ Cherry Tree"; - sprite = "TRE1C0"; - width = 20; - height = 128; - } - 809 - { - title = "Checkered Tree"; - sprite = "TRE2A0"; - width = 20; - height = 200; - } - 810 - { - title = "Checkered Tree (Sunset)"; - sprite = "TRE2B0"; - width = 20; - height = 200; - } - 811 - { - title = "Polygon Tree"; - sprite = "TRE4A0"; - width = 20; - height = 200; - } - 812 - { - title = "Bush Tree"; - sprite = "TRE5A0"; - width = 20; - height = 200; - } - 813 - { - title = "Red Bush Tree"; - sprite = "TRE5B0"; - width = 20; - height = 200; - } -} - -technohill -{ - color = 10; // Green - title = "Techno Hill"; - - 900 - { - title = "THZ Steam Flower"; - sprite = "THZPA0"; - width = 8; - height = 32; - } - 901 - { - title = "Alarm"; - sprite = "ALRMA0"; - width = 8; - height = 16; - hangs = 1; - } - 902 - { - title = "THZ Spin Flower (Red)"; - sprite = "FWR5A0"; - width = 16; - height = 64; - } - 903 - { - title = "THZ Spin Flower (Yellow)"; - sprite = "FWR6A0"; - width = 16; - height = 64; - } - 904 - { - arrow = 1; - title = "Whistlebush"; - sprite = "THZTA0"; - width = 16; - height = 64; - } -} - -deepsea -{ - color = 10; // Green - title = "Deep Sea"; - - 1000 - { - arrow = 1; - blocking = 2; - title = "Gargoyle"; - sprite = "GARGA1"; - width = 16; - height = 40; - } - 1009 - { - arrow = 1; - blocking = 2; - title = "Gargoyle (Big)"; - sprite = "GARGB1"; - width = 32; - height = 80; - } - 1001 - { - title = "Seaweed"; - sprite = "SEWEA0"; - width = 24; - height = 56; - } - 1002 - { - title = "Dripping Water"; - sprite = "DRIPD0"; - width = 8; - height = 16; - hangs = 1; - } - 1003 - { - title = "Coral (Green)"; - sprite = "CORLA0"; - width = 29; - height = 40; - } - 1004 - { - title = "Coral (Red)"; - sprite = "CORLB0"; - width = 30; - height = 53; - } - 1005 - { - title = "Coral (Orange)"; - sprite = "CORLC0"; - width = 28; - height = 41; - } - 1006 - { - title = "Blue Crystal"; - sprite = "BCRYA1"; - width = 8; - height = 16; - } - 1007 - { - title = "Kelp"; - sprite = "KELPA0"; - width = 16; - height = 292; - } - 1008 - { - title = "Stalagmite (DSZ1)"; - sprite = "DSTGA0"; - width = 8; - height = 116; - } - 1010 - { - arrow = 1; - title = "Light Beam"; - sprite = "LIBEARAL"; - width = 16; - height = 16; - } - 1011 - { - title = "Stalagmite (DSZ2)"; - sprite = "DSTGA0"; - width = 8; - height = 116; - } - 1012 - { - arrow = 1; - title = "Big Floating Mine"; - width = 28; - height = 56; - sprite = "BMNEA1"; - } - 1013 - { - title = "Animated Kelp"; - sprite = "ALGAA0"; - width = 48; - height = 120; - } - 1014 - { - title = "Large Coral (Brown)"; - sprite = "CORLD0"; - width = 56; - height = 112; - } - 1015 - { - title = "Large Coral (Beige)"; - sprite = "CORLE0"; - width = 56; - height = 112; - } -} - -castleeggman -{ - color = 10; // Green - title = "Castle Eggman"; - - 1100 - { - title = "Chain (Decorative)"; - sprite = "CHANA0"; - width = 4; - height = 128; - hangs = 1; - } - 1101 - { - title = "Torch"; - sprite = "FLAMA0E0"; - width = 8; - height = 32; - } - 1102 - { - arrow = 1; - blocking = 2; - title = "Eggman Statue"; - sprite = "ESTAA1"; - width = 32; - height = 240; - } - 1103 - { - title = "CEZ Flower"; - sprite = "FWR4A0"; - width = 16; - height = 40; - } - 1104 - { - title = "Mace Spawnpoint"; - sprite = "SMCEA0"; - width = 17; - height = 34; - } - 1105 - { - title = "Chain with Maces Spawnpoint"; - sprite = "SMCEA0"; - width = 17; - height = 34; - } - 1106 - { - title = "Chained Spring Spawnpoint"; - sprite = "YSPBA0"; - width = 17; - height = 34; - } - 1107 - { - title = "Chain Spawnpoint"; - sprite = "BMCHA0"; - width = 17; - height = 34; - } - 1108 - { - arrow = 1; - title = "Hidden Chain Spawnpoint"; - sprite = "internal:chain3"; - width = 17; - height = 34; - } - 1109 - { - title = "Firebar Spawnpoint"; - sprite = "BFBRA0"; - width = 17; - height = 34; - } - 1110 - { - title = "Custom Mace Spawnpoint"; - sprite = "SMCEA0"; - width = 17; - height = 34; - } - 1111 - { - arrow = 1; - blocking = 2; - title = "Crawla Statue"; - sprite = "CSTAA1"; - width = 16; - height = 40; - } - 1112 - { - arrow = 1; - blocking = 2; - title = "Lance-a-Bot Statue"; - sprite = "CBBSA1"; - width = 32; - height = 72; - } - 1114 - { - title = "Pine Tree"; - sprite = "PINEA0"; - width = 16; - height = 628; - } - 1115 - { - title = "CEZ Shrub (Small)"; - sprite = "CEZBA0"; - width = 16; - height = 24; - } - 1116 - { - title = "CEZ Shrub (Large)"; - sprite = "CEZBB0"; - width = 32; - height = 48; - } - 1117 - { - arrow = 1; - title = "Pole Banner (Red)"; - sprite = "BANRA0"; - width = 40; - height = 224; - } - 1118 - { - arrow = 1; - title = "Pole Banner (Blue)"; - sprite = "BANRA0"; - width = 40; - height = 224; - } - 1119 - { - title = "Candle"; - sprite = "CNDLA0"; - width = 8; - height = 48; - } - 1120 - { - title = "Candle Pricket"; - sprite = "CNDLB0"; - width = 8; - height = 176; - } - 1121 - { - title = "Flame Holder"; - sprite = "FLMHA0"; - width = 24; - height = 80; - } - 1122 - { - title = "Fire Torch"; - sprite = "CTRCA0"; - width = 16; - height = 80; - } - 1123 - { - title = "Cannonball Launcher"; - sprite = "internal:cannonball"; - width = 8; - height = 16; - } - 1124 - { - blocking = 2; - title = "Cannonball"; - sprite = "CBLLA0"; - width = 20; - height = 40; - } - 1125 - { - title = "Brambles"; - sprite = "CABRALAR"; - width = 48; - height = 32; - } - 1126 - { - title = "Invisible Lockon Object"; - sprite = "LCKNC0"; - width = 16; - height = 32; - } - 1127 - { - title = "Spectator Eggrobo"; - sprite = "EGR1A1"; - width = 20; - height = 72; - } - 1128 - { - arrow = 1; - title = "Waving Flag (Red)"; - sprite = "CFLGA0"; - width = 8; - height = 208; - } - 1129 - { - arrow = 1; - title = "Waving Flag (Blue)"; - sprite = "CFLGA0"; - width = 8; - height = 208; - } -} - -aridcanyon -{ - color = 10; // Green - title = "Arid Canyon"; - - 1200 - { - title = "Tumbleweed (Big)"; - sprite = "BTBLA0"; - width = 24; - height = 48; - } - 1201 - { - title = "Tumbleweed (Small)"; - sprite = "STBLA0"; - width = 12; - height = 24; - } - 1202 - { - arrow = 1; - title = "Rock Spawner"; - sprite = "ROIAA0"; - width = 8; - height = 16; - } - 1203 - { - title = "Tiny Red Flower Cactus"; - sprite = "CACTA0"; - width = 13; - height = 24; - } - 1204 - { - title = "Small Red Flower Cactus"; - sprite = "CACTB0"; - width = 15; - height = 52; - } - 1205 - { - title = "Tiny Blue Flower Cactus"; - sprite = "CACTC0"; - width = 13; - height = 24; - } - 1206 - { - title = "Small Blue Flower Cactus"; - sprite = "CACTD0"; - width = 15; - height = 52; - } - 1207 - { - title = "Prickly Pear"; - sprite = "CACTE0"; - width = 32; - height = 96; - } - 1208 - { - title = "Barrel Cactus"; - sprite = "CACTF0"; - width = 20; - height = 128; - } - 1209 - { - title = "Tall Barrel Cactus"; - sprite = "CACTG0"; - width = 24; - height = 224; - } - 1210 - { - title = "Armed Cactus"; - sprite = "CACTH0"; - width = 24; - height = 256; - } - 1211 - { - title = "Ball Cactus"; - sprite = "CACTI0"; - width = 48; - height = 96; - } - 1212 - { - title = "Caution Sign"; - sprite = "WWSGAR"; - width = 22; - height = 64; - } - 1213 - { - title = "Cacti Sign"; - sprite = "WWS2AR"; - width = 22; - height = 64; - } - 1214 - { - title = "Sharp Turn Sign"; - sprite = "WWS3ALAR"; - width = 16; - height = 192; - } - 1215 - { - title = "Mine Oil Lamp"; - sprite = "OILLA0"; - width = 22; - height = 64; - hangs = 1; - } - 1216 - { - title = "TNT Barrel"; - sprite = "BARRA1"; - width = 24; - height = 63; - } - 1217 - { - title = "TNT Proximity Shell"; - sprite = "REMTA0"; - width = 64; - height = 40; - } - 1218 - { - title = "Dust Devil"; - sprite = "TAZDCR"; - width = 80; - height = 416; - } - 1219 - { - title = "Minecart Spawner"; - sprite = "MCRTCLFR"; - width = 22; - height = 32; - } - 1220 - { - title = "Minecart Stopper"; - sprite = "MCRTIR"; - width = 32; - height = 32; - } - 1221 - { - title = "Minecart Saloon Door"; - sprite = "SALDARAL"; - width = 96; - height = 160; - } - 1222 - { - title = "Train Cameo Spawner"; - sprite = "TRAEBRBL"; - width = 28; - height = 32; - } - 1223 - { - title = "Train Dust Spawner"; - sprite = "ADSTA0"; - width = 4; - height = 4; - } - 1224 - { - title = "Train Steam Spawner"; - sprite = "STEAA0"; - width = 4; - height = 4; - } - 1229 - { - title = "Minecart Switch Point"; - sprite = "internal:zoom"; - width = 8; - height = 16; - } - 1230 - { - title = "Tiny Cactus"; - sprite = "CACTJ0"; - width = 13; - height = 28; - } - 1231 - { - title = "Small Cactus"; - sprite = "CACTK0"; - width = 15; - height = 60; - } -} - -redvolcano -{ - color = 10; // Green - title = "Red Volcano"; - - 1300 - { - arrow = 1; - title = "Flame Jet (Horizontal)"; - sprite = "internal:flameh"; - width = 16; - height = 40; - } - 1301 - { - title = "Flame Jet (Vertical)"; - sprite = "internal:flamev"; - width = 16; - height = 40; - } - 1302 - { - title = "Spinning Flame Jet (Counter-Clockwise)"; - sprite = "internal:flame2"; - width = 16; - height = 24; - } - 1303 - { - title = "Spinning Flame Jet (Clockwise)"; - sprite = "internal:flame1"; - width = 16; - height = 24; - } - 1304 - { - title = "Lavafall"; - sprite = "LFALF0"; - width = 30; - height = 32; - } - 1305 - { - title = "Rollout Rock"; - sprite = "PUMIA1A5"; - width = 30; - height = 60; - } - 1306 - { - title = "Big Fern"; - sprite = "JPLAB0"; - width = 32; - height = 48; - } - 1307 - { - title = "Jungle Palm"; - sprite = "JPLAC0"; - width = 32; - height = 48; - } - 1308 - { - title = "Torch Flower"; - sprite = "TFLOA0"; - width = 14; - height = 110; - } - 1309 - { - title = "RVZ1 Wall Vine (Long)"; - sprite = "WVINALAR"; - width = 1; - height = 288; - } - 1310 - { - title = "RVZ1 Wall Vine (Short)"; - sprite = "WVINBLBR"; - width = 1; - height = 288; - } -} - -botanicserenity -{ - color = 10; // Green - title = "Botanic Serenity"; - width = 16; - height = 32; - sprite = "BSZ1A0"; - 1400 - { - title = "Tall Flower (Red)"; sprite = "BSZ1A0"; + 1400 + { + title = "Tall Flower (Red)"; + sprite = "BSZ1A0"; + } + 1401 + { + title = "Tall Flower (Purple)"; + sprite = "BSZ1B0"; + } + 1402 + { + title = "Tall Flower (Blue)"; + sprite = "BSZ1C0"; + } + 1403 + { + title = "Tall Flower (Cyan)"; + sprite = "BSZ1D0"; + } + 1404 + { + title = "Tall Flower (Yellow)"; + sprite = "BSZ1E0"; + } + 1405 + { + title = "Tall Flower (Orange)"; + sprite = "BSZ1F0"; + } + 1410 + { + title = "Medium Flower (Red)"; + sprite = "BSZ2A0"; + } + 1411 + { + title = "Medium Flower (Purple)"; + sprite = "BSZ2B0"; + } + 1412 + { + title = "Medium Flower (Blue)"; + sprite = "BSZ2C0"; + } + 1413 + { + title = "Medium Flower (Cyan)"; + sprite = "BSZ2D0"; + } + 1414 + { + title = "Medium Flower (Yellow)"; + sprite = "BSZ2E0"; + } + 1415 + { + title = "Medium Flower (Orange)"; + sprite = "BSZ2F0"; + } + 1420 + { + title = "Short Flower (Red)"; + sprite = "BSZ3A0"; + } + 1421 + { + title = "Short Flower (Purple)"; + sprite = "BSZ3B0"; + } + 1422 + { + title = "Short Flower (Blue)"; + sprite = "BSZ3C0"; + } + 1423 + { + title = "Short Flower (Cyan)"; + sprite = "BSZ3D0"; + } + 1424 + { + title = "Short Flower (Yellow)"; + sprite = "BSZ3E0"; + } + 1425 + { + title = "Short Flower (Orange)"; + sprite = "BSZ3F0"; + } + 1430 + { + title = "Tulip (Red)"; + sprite = "BST1A0"; + } + 1431 + { + title = "Tulip (Purple)"; + sprite = "BST2A0"; + } + 1432 + { + title = "Tulip (Blue)"; + sprite = "BST3A0"; + } + 1433 + { + title = "Tulip (Cyan)"; + sprite = "BST4A0"; + } + 1434 + { + title = "Tulip (Yellow)"; + sprite = "BST5A0"; + } + 1435 + { + title = "Tulip (Orange)"; + sprite = "BST6A0"; + } + 1440 + { + title = "Cluster (Red)"; + sprite = "BSZ5A0"; + } + 1441 + { + title = "Cluster (Purple)"; + sprite = "BSZ5B0"; + } + 1442 + { + title = "Cluster (Blue)"; + sprite = "BSZ5C0"; + } + 1443 + { + title = "Cluster (Cyan)"; + sprite = "BSZ5D0"; + } + 1444 + { + title = "Cluster (Yellow)"; + sprite = "BSZ5E0"; + } + 1445 + { + title = "Cluster (Orange)"; + sprite = "BSZ5F0"; + } + 1450 + { + title = "Bush (Red)"; + sprite = "BSZ6A0"; + } + 1451 + { + title = "Bush (Purple)"; + sprite = "BSZ6B0"; + } + 1452 + { + title = "Bush (Blue)"; + sprite = "BSZ6C0"; + } + 1453 + { + title = "Bush (Cyan)"; + sprite = "BSZ6D0"; + } + 1454 + { + title = "Bush (Yellow)"; + sprite = "BSZ6E0"; + } + 1455 + { + title = "Bush (Orange)"; + sprite = "BSZ6F0"; + } + 1460 + { + title = "Vine (Red)"; + sprite = "BSZ7A0"; + } + 1461 + { + title = "Vine (Purple)"; + sprite = "BSZ7B0"; + } + 1462 + { + title = "Vine (Blue)"; + sprite = "BSZ7C0"; + } + 1463 + { + title = "Vine (Cyan)"; + sprite = "BSZ7D0"; + } + 1464 + { + title = "Vine (Yellow)"; + sprite = "BSZ7E0"; + } + 1465 + { + title = "Vine (Orange)"; + sprite = "BSZ7F0"; + } + 1470 + { + title = "BSZ Shrub"; + sprite = "BSZ8A0"; + } + 1471 + { + title = "BSZ Clover"; + sprite = "BSZ8B0"; + } + 1473 + { + title = "Palm Tree (Big)"; + width = 16; + height = 160; + sprite = "BSZ8D0"; + } + 1475 + { + title = "Palm Tree (Small)"; + width = 16; + height = 80; + sprite = "BSZ8F0"; + } } - 1401 - { - title = "Tall Flower (Purple)"; - sprite = "BSZ1B0"; - } - 1402 - { - title = "Tall Flower (Blue)"; - sprite = "BSZ1C0"; - } - 1403 - { - title = "Tall Flower (Cyan)"; - sprite = "BSZ1D0"; - } - 1404 - { - title = "Tall Flower (Yellow)"; - sprite = "BSZ1E0"; - } - 1405 - { - title = "Tall Flower (Orange)"; - sprite = "BSZ1F0"; - } - 1410 - { - title = "Medium Flower (Red)"; - sprite = "BSZ2A0"; - } - 1411 - { - title = "Medium Flower (Purple)"; - sprite = "BSZ2B0"; - } - 1412 - { - title = "Medium Flower (Blue)"; - sprite = "BSZ2C0"; - } - 1413 - { - title = "Medium Flower (Cyan)"; - sprite = "BSZ2D0"; - } - 1414 - { - title = "Medium Flower (Yellow)"; - sprite = "BSZ2E0"; - } - 1415 - { - title = "Medium Flower (Orange)"; - sprite = "BSZ2F0"; - } - 1420 - { - title = "Short Flower (Red)"; - sprite = "BSZ3A0"; - } - 1421 - { - title = "Short Flower (Purple)"; - sprite = "BSZ3B0"; - } - 1422 - { - title = "Short Flower (Blue)"; - sprite = "BSZ3C0"; - } - 1423 - { - title = "Short Flower (Cyan)"; - sprite = "BSZ3D0"; - } - 1424 - { - title = "Short Flower (Yellow)"; - sprite = "BSZ3E0"; - } - 1425 - { - title = "Short Flower (Orange)"; - sprite = "BSZ3F0"; - } - 1430 - { - title = "Tulip (Red)"; - sprite = "BST1A0"; - } - 1431 - { - title = "Tulip (Purple)"; - sprite = "BST2A0"; - } - 1432 - { - title = "Tulip (Blue)"; - sprite = "BST3A0"; - } - 1433 - { - title = "Tulip (Cyan)"; - sprite = "BST4A0"; - } - 1434 - { - title = "Tulip (Yellow)"; - sprite = "BST5A0"; - } - 1435 - { - title = "Tulip (Orange)"; - sprite = "BST6A0"; - } - 1440 - { - title = "Cluster (Red)"; - sprite = "BSZ5A0"; - } - 1441 - { - title = "Cluster (Purple)"; - sprite = "BSZ5B0"; - } - 1442 - { - title = "Cluster (Blue)"; - sprite = "BSZ5C0"; - } - 1443 - { - title = "Cluster (Cyan)"; - sprite = "BSZ5D0"; - } - 1444 - { - title = "Cluster (Yellow)"; - sprite = "BSZ5E0"; - } - 1445 - { - title = "Cluster (Orange)"; - sprite = "BSZ5F0"; - } - 1450 - { - title = "Bush (Red)"; - sprite = "BSZ6A0"; - } - 1451 - { - title = "Bush (Purple)"; - sprite = "BSZ6B0"; - } - 1452 - { - title = "Bush (Blue)"; - sprite = "BSZ6C0"; - } - 1453 - { - title = "Bush (Cyan)"; - sprite = "BSZ6D0"; - } - 1454 - { - title = "Bush (Yellow)"; - sprite = "BSZ6E0"; - } - 1455 - { - title = "Bush (Orange)"; - sprite = "BSZ6F0"; - } - 1460 - { - title = "Vine (Red)"; - sprite = "BSZ7A0"; - } - 1461 - { - title = "Vine (Purple)"; - sprite = "BSZ7B0"; - } - 1462 - { - title = "Vine (Blue)"; - sprite = "BSZ7C0"; - } - 1463 - { - title = "Vine (Cyan)"; - sprite = "BSZ7D0"; - } - 1464 - { - title = "Vine (Yellow)"; - sprite = "BSZ7E0"; - } - 1465 - { - title = "Vine (Orange)"; - sprite = "BSZ7F0"; - } - 1470 - { - title = "BSZ Shrub"; - sprite = "BSZ8A0"; - } - 1471 - { - title = "BSZ Clover"; - sprite = "BSZ8B0"; - } - 1473 - { - title = "Palm Tree (Big)"; - width = 16; - height = 160; - sprite = "BSZ8D0"; - } - 1475 - { - title = "Palm Tree (Small)"; - width = 16; - height = 80; - sprite = "BSZ8F0"; - } -} -azuretemple -{ - color = 10; // Green - title = "Azure Temple"; + azuretemple + { + color = 10; // Green + title = "Azure Temple"; - 1500 - { - arrow = 1; - blocking = 2; - title = "Glaregoyle"; - sprite = "BGARA1"; - width = 16; - height = 40; + 1500 + { + arrow = 1; + blocking = 2; + title = "Glaregoyle"; + sprite = "BGARA1"; + width = 16; + height = 40; + } + 1501 + { + arrow = 1; + blocking = 2; + title = "Glaregoyle (Up)"; + sprite = "BGARA1"; + width = 16; + height = 40; + } + 1502 + { + arrow = 1; + blocking = 2; + title = "Glaregoyle (Down)"; + sprite = "BGARA1"; + width = 16; + height = 40; + } + 1503 + { + arrow = 1; + blocking = 2; + title = "Glaregoyle (Long)"; + sprite = "BGARA1"; + width = 16; + height = 40; + } + 1504 + { + title = "ATZ Target"; + sprite = "RCRYB0"; + width = 24; + height = 32; + } + 1505 + { + title = "Green Flame"; + sprite = "CFLMA0E0"; + width = 8; + height = 32; + } + 1506 + { + arrow = 1; + blocking = 2; + title = "Blue Gargoyle"; + sprite = "BGARD1"; + width = 16; + height = 40; + } } - 1501 + + dreamhill { - arrow = 1; - blocking = 2; - title = "Glaregoyle (Up)"; - sprite = "BGARA1"; - width = 16; - height = 40; + color = 10; // Green + title = "Dream Hill"; + + 1600 + { + title = "Spring Tree"; + sprite = "TRE6A0"; + width = 16; + height = 32; + } + 1601 + { + title = "Shleep"; + sprite = "SHLPA0"; + width = 24; + height = 32; + } + 1602 + { + title = "Pian"; + sprite = "NTPNALAR"; + width = 16; + height = 32; + } } - 1502 + + nightstrk { - arrow = 1; - blocking = 2; - title = "Glaregoyle (Down)"; - sprite = "BGARA1"; - width = 16; - height = 40; - } - 1503 - { - arrow = 1; - blocking = 2; - title = "Glaregoyle (Long)"; - sprite = "BGARA1"; - width = 16; - height = 40; - } - 1504 - { - title = "ATZ Target"; - sprite = "RCRYB0"; - width = 24; - height = 32; - } - 1505 - { - title = "Green Flame"; - sprite = "CFLMA0E0"; + color = 13; // Pink + title = "NiGHTS Track"; width = 8; - height = 32; + height = 4096; + sprite = "UNKNA0"; + + 1700 + { + title = "Axis"; + sprite = "internal:axis1"; + circle = 1; + } + 1701 + { + title = "Axis Transfer"; + sprite = "internal:axis2"; + } + 1702 + { + title = "Axis Transfer Line"; + sprite = "internal:axis3"; + } + 1710 + { + title = "Ideya Capture"; + sprite = "CAPSA0"; + width = 72; + height = 144; + } } - 1506 + + nights { - arrow = 1; - blocking = 2; - title = "Blue Gargoyle"; - sprite = "BGARD1"; + color = 13; // Pink + title = "NiGHTS Items"; + width = 16; + height = 32; + + 1703 + { + title = "Ideya Drone"; + sprite = "NDRNA1"; + width = 16; + height = 56; + } + 1704 + { + arrow = 1; + title = "NiGHTS Bumper"; + sprite = "NBMPG3G7"; + width = 32; + height = 64; + } + 1705 + { + arrow = 1; + title = "Hoop (Generic)"; + sprite = "HOOPA0"; + width = 80; + height = 160; + } + 1706 + { + title = "Blue Sphere"; + sprite = "SPHRA0"; + width = 16; + height = 24; + } + 1707 + { + title = "Super Paraloop"; + sprite = "NPRUA0"; + } + 1708 + { + title = "Drill Refill"; + sprite = "NPRUB0"; + } + 1709 + { + title = "Nightopian Helper"; + sprite = "NPRUC0"; + } + 1711 + { + title = "Extra Time"; + sprite = "NPRUD0"; + } + 1712 + { + title = "Link Freeze"; + sprite = "NPRUE0"; + } + 1713 + { + arrow = 1; + title = "Hoop (Customizable)"; + sprite = "HOOPA0"; + width = 80; + height = 160; + } + 1714 + { + title = "Ideya Anchor Point"; + sprite = "internal:axis1"; + width = 8; + height = 16; + } + } + + mario + { + color = 6; // Brown + title = "Mario"; + + 1800 + { + title = "Coin"; + sprite = "COINA0"; + width = 16; + height = 24; + } + 1801 + { + arrow = 1; + title = "Goomba"; + sprite = "GOOMA0"; + width = 24; + height = 32; + } + 1802 + { + arrow = 1; + title = "Goomba (Blue)"; + sprite = "BGOMA0"; + width = 24; + height = 32; + } + 1803 + { + title = "Fire Flower"; + sprite = "FFWRB0"; + width = 16; + height = 32; + } + 1804 + { + title = "Koopa Shell"; + sprite = "SHLLA1"; + width = 16; + height = 20; + } + 1805 + { + title = "Puma (Jumping Fireball)"; + sprite = "PUMAA0"; + width = 8; + height = 16; + } + 1806 + { + title = "King Bowser"; + sprite = "KOOPA0"; + width = 16; + height = 48; + } + 1807 + { + title = "Axe"; + sprite = "MAXEA0"; + width = 8; + height = 16; + } + 1808 + { + title = "Bush (Short)"; + sprite = "MUS1A0"; + width = 16; + height = 32; + } + 1809 + { + title = "Bush (Tall)"; + sprite = "MUS2A0"; + width = 16; + height = 32; + } + 1810 + { + title = "Toad"; + sprite = "TOADA0"; + width = 8; + height = 32; + } + } + + christmasdisco + { + color = 10; // Green + title = "Christmas & Disco"; + + 1850 + { + title = "Christmas Pole"; + sprite = "XMS1A0"; + width = 16; + height = 40; + } + 1851 + { + title = "Candy Cane"; + sprite = "XMS2A0"; + width = 8; + height = 32; + } + 1852 + { + blocking = 2; + title = "Snowman"; + sprite = "XMS3A0"; + width = 16; + height = 64; + } + 1853 + { + blocking = 2; + title = "Snowman (With Hat)"; + sprite = "XMS3B0"; + width = 16; + height = 80; + } + 1854 + { + title = "Lamp Post"; + sprite = "XMS4A0"; + width = 8; + height = 120; + } + 1855 + { + title = "Lamp Post (Snow)"; + sprite = "XMS4B0"; + width = 8; + height = 120; + } + 1856 + { + title = "Hanging Star"; + sprite = "XMS5A0"; + width = 4; + height = 80; + hangs = 1; + } + 1857 + { + title = "Berry Bush (Snow)"; + sprite = "BUS1B0"; + width = 16; + height = 32; + } + 1858 + { + title = "Bush (Snow)"; + sprite = "BUS2B0"; + width = 16; + height = 32; + } + 1859 + { + title = "Blueberry Bush (Snow)"; + sprite = "BUS3B0"; + width = 16; + height = 32; + } + 1875 + { + title = "Disco Ball"; + sprite = "DBALA0"; + width = 16; + height = 54; + hangs = 1; + } + 1876 + { + arrow = 1; + blocking = 2; + title = "Eggman Disco Statue"; + sprite = "ESTAB1"; + width = 20; + height = 96; + } + } + + stalagmites + { + color = 10; // Green + title = "Stalagmites"; width = 16; height = 40; - } -} -dreamhill -{ - color = 10; // Green - title = "Dream Hill"; + 1900 + { + title = "Brown Stalagmite (Tall)"; + sprite = "STLGA0"; + width = 16; + height = 40; + } + 1901 + { + title = "Brown Stalagmite"; + sprite = "STLGB0"; + width = 16; + height = 40; + } + 1902 + { + title = "Orange Stalagmite (Tall)"; + sprite = "STLGC0"; + width = 16; + height = 40; + } + 1903 + { + title = "Orange Stalagmite"; + sprite = "STLGD0"; + width = 16; + height = 40; + } + 1904 + { + title = "Red Stalagmite (Tall)"; + sprite = "STLGE0"; + width = 16; + height = 40; + } + 1905 + { + title = "Red Stalagmite"; + sprite = "STLGF0"; + width = 16; + height = 40; + } + 1906 + { + title = "Gray Stalagmite (Tall)"; + sprite = "STLGG0"; + width = 24; + height = 96; + } + 1907 + { + title = "Gray Stalagmite"; + sprite = "STLGH0"; + width = 16; + height = 40; + } + 1908 + { + title = "Blue Stalagmite (Tall)"; + sprite = "STLGI0"; + width = 16; + height = 40; + } + 1909 + { + title = "Blue Stalagmite"; + sprite = "STLGJ0"; + width = 16; + height = 40; + } + } - 1600 + hauntedheights { - title = "Spring Tree"; - sprite = "TRE6A0"; - width = 16; - height = 32; - } - 1601 - { - title = "Shleep"; - sprite = "SHLPA0"; - width = 24; - height = 32; - } - 1602 - { - title = "Pian"; - sprite = "NTPNALAR"; - width = 16; - height = 32; - } -} + color = 10; // Green + title = "Haunted Heights"; -nightstrk -{ - color = 13; // Pink - title = "NiGHTS Track"; - width = 8; - height = 4096; - sprite = "UNKNA0"; + 2000 + { + title = "Smashing Spikeball"; + sprite = "FMCEA0"; + width = 18; + height = 28; + } + 2001 + { + title = "HHZ Grass"; + sprite = "HHZMA0"; + width = 16; + height = 40; + } + 2002 + { + title = "HHZ Tentacle 1"; + sprite = "HHZMB0"; + width = 16; + height = 40; + } + 2003 + { + title = "HHZ Tentacle 2"; + sprite = "HHZMC0"; + width = 16; + height = 40; + } + 2004 + { + title = "HHZ Stalagmite (Tall)"; + sprite = "HHZME0"; + width = 16; + height = 40; + } + 2005 + { + title = "HHZ Stalagmite (Short)"; + sprite = "HHZMF0"; + width = 16; + height = 40; + } + 2006 + { + title = "Jack-o'-lantern 1"; + sprite = "PUMKA0"; + width = 16; + height = 40; + } + 2007 + { + title = "Jack-o'-lantern 2"; + sprite = "PUMKB0"; + width = 16; + height = 40; + } + 2008 + { + title = "Jack-o'-lantern 3"; + sprite = "PUMKC0"; + width = 16; + height = 40; + } + 2009 + { + title = "Purple Mushroom"; + sprite = "SHRMD0"; + width = 16; + height = 48; + } + 2010 + { + title = "HHZ Tree"; + sprite = "HHPLC0"; + width = 12; + height = 40; + } + } - 1700 + frozenhillside { - title = "Axis"; - sprite = "internal:axis1"; - circle = 1; - } - 1701 - { - title = "Axis Transfer"; - sprite = "internal:axis2"; - } - 1702 - { - title = "Axis Transfer Line"; - sprite = "internal:axis3"; - } - 1710 - { - title = "Ideya Capture"; - sprite = "CAPSA0"; - width = 72; - height = 144; - } -} + color = 10; // Green + title = "Frozen Hillside"; -nights -{ - color = 13; // Pink - title = "NiGHTS Items"; - width = 16; - height = 32; + 2100 + { + title = "Ice Shard (Small)"; + sprite = "FHZIA0"; + width = 8; + height = 32; + } + 2101 + { + title = "Ice Shard (Large)"; + sprite = "FHZIB0"; + width = 8; + height = 32; + } + 2102 + { + title = "Crystal Tree (Aqua)"; + sprite = "TRE3A0"; + width = 20; + height = 200; + } + 2103 + { + title = "Crystal Tree (Pink)"; + sprite = "TRE3B0"; + width = 20; + height = 200; + } + 2104 + { + title = "Amy Cameo"; + sprite = "ROSYA1"; + width = 16; + height = 48; + } + 2105 + { + title = "Mistletoe"; + sprite = "XMS6A0"; + width = 52; + height = 106; + } + } - 1703 + flickies { - title = "Ideya Drone"; - sprite = "NDRNA1"; - width = 16; - height = 56; - } - 1704 - { - arrow = 1; - title = "NiGHTS Bumper"; - sprite = "NBMPG3G7"; - width = 32; - height = 64; - } - 1705 - { - arrow = 1; - title = "Hoop (Generic)"; - sprite = "HOOPA0"; - width = 80; - height = 160; - } - 1706 - { - title = "Blue Sphere"; - sprite = "SPHRA0"; - width = 16; - height = 24; - } - 1707 - { - title = "Super Paraloop"; - sprite = "NPRUA0"; - } - 1708 - { - title = "Drill Refill"; - sprite = "NPRUB0"; - } - 1709 - { - title = "Nightopian Helper"; - sprite = "NPRUC0"; - } - 1711 - { - title = "Extra Time"; - sprite = "NPRUD0"; - } - 1712 - { - title = "Link Freeze"; - sprite = "NPRUE0"; - } - 1713 - { - arrow = 1; - title = "Hoop (Customizable)"; - sprite = "HOOPA0"; - width = 80; - height = 160; - } - 1714 - { - title = "Ideya Anchor Point"; - sprite = "internal:axis1"; + color = 10; // Green + title = "Flickies"; width = 8; - height = 16; - } -} - -mario -{ - color = 6; // Brown - title = "Mario"; - - 1800 - { - title = "Coin"; - sprite = "COINA0"; - width = 16; - height = 24; - } - 1801 - { - arrow = 1; - title = "Goomba"; - sprite = "GOOMA0"; - width = 24; - height = 32; - } - 1802 - { - arrow = 1; - title = "Goomba (Blue)"; - sprite = "BGOMA0"; - width = 24; - height = 32; - } - 1803 - { - title = "Fire Flower"; - sprite = "FFWRB0"; - width = 16; - height = 32; - } - 1804 - { - title = "Koopa Shell"; - sprite = "SHLLA1"; - width = 16; height = 20; - } - 1805 - { - title = "Puma (Jumping Fireball)"; - sprite = "PUMAA0"; - width = 8; - height = 16; - } - 1806 - { - title = "King Bowser"; - sprite = "KOOPA0"; - width = 16; - height = 48; - } - 1807 - { - title = "Axe"; - sprite = "MAXEA0"; - width = 8; - height = 16; - } - 1808 - { - title = "Bush (Short)"; - sprite = "MUS1A0"; - width = 16; - height = 32; - } - 1809 - { - title = "Bush (Tall)"; - sprite = "MUS2A0"; - width = 16; - height = 32; - } - 1810 - { - title = "Toad"; - sprite = "TOADA0"; - width = 8; - height = 32; + + 2200 + { + title = "Bluebird"; + sprite = "FL01A1"; + } + 2201 + { + title = "Rabbit"; + sprite = "FL02A1"; + } + 2202 + { + title = "Chicken"; + sprite = "FL03A1"; + } + 2203 + { + title = "Seal"; + sprite = "FL04A1"; + } + 2204 + { + title = "Pig"; + sprite = "FL05A1"; + } + 2205 + { + title = "Chipmunk"; + sprite = "FL06A1"; + } + 2206 + { + title = "Penguin"; + sprite = "FL07A1"; + } + 2207 + { + title = "Fish"; + sprite = "FL08A1"; + } + 2208 + { + title = "Ram"; + sprite = "FL09A1"; + } + 2209 + { + title = "Puffin"; + sprite = "FL10A1"; + } + 2210 + { + title = "Cow"; + sprite = "FL11A1"; + } + 2211 + { + title = "Rat"; + sprite = "FL12A1"; + } + 2212 + { + title = "Bear"; + sprite = "FL13A1"; + } + 2213 + { + title = "Dove"; + sprite = "FL14A1"; + } + 2214 + { + title = "Cat"; + sprite = "FL15A1"; + } + 2215 + { + title = "Canary"; + sprite = "FL16A1"; + } + 2216 + { + title = "Spider"; + sprite = "FS01A1"; + } + 2217 + { + title = "Bat"; + sprite = "FS02A0"; + } } } -christmasdisco +udmf { - color = 10; // Green - title = "Christmas & Disco"; - - 1850 - { - title = "Christmas Pole"; - sprite = "XMS1A0"; - width = 16; - height = 40; - } - 1851 - { - title = "Candy Cane"; - sprite = "XMS2A0"; - width = 8; - height = 32; - } - 1852 - { - blocking = 2; - title = "Snowman"; - sprite = "XMS3A0"; - width = 16; - height = 64; - } - 1853 - { - blocking = 2; - title = "Snowman (With Hat)"; - sprite = "XMS3B0"; - width = 16; - height = 80; - } - 1854 - { - title = "Lamp Post"; - sprite = "XMS4A0"; - width = 8; - height = 120; - } - 1855 - { - title = "Lamp Post (Snow)"; - sprite = "XMS4B0"; - width = 8; - height = 120; - } - 1856 - { - title = "Hanging Star"; - sprite = "XMS5A0"; - width = 4; - height = 80; - hangs = 1; - } - 1857 - { - title = "Berry Bush (Snow)"; - sprite = "BUS1B0"; - width = 16; - height = 32; - } - 1858 - { - title = "Bush (Snow)"; - sprite = "BUS2B0"; - width = 16; - height = 32; - } - 1859 - { - title = "Blueberry Bush (Snow)"; - sprite = "BUS3B0"; - width = 16; - height = 32; - } - 1875 - { - title = "Disco Ball"; - sprite = "DBALA0"; - width = 16; - height = 54; - hangs = 1; - } - 1876 + editor { + color = 15; // White arrow = 1; - blocking = 2; - title = "Eggman Disco Statue"; - sprite = "ESTAB1"; - width = 20; - height = 96; - } -} + title = ""; + error = -1; + width = 8; + height = 16; + sort = 1; -stalagmites -{ - color = 10; // Green - title = "Stalagmites"; - width = 16; - height = 40; + 3328 = "3D Mode Start"; + } - 1900 + starts { - title = "Brown Stalagmite (Tall)"; - sprite = "STLGA0"; + color = 1; // Blue + arrow = 1; + title = "Player Starts"; width = 16; - height = 40; + height = 48; + sprite = "PLAYA0"; + + 1 + { + title = "Player 01 Start"; + sprite = "PLAYA0"; + } + 2 + { + title = "Player 02 Start"; + sprite = "PLAYA0"; + } + 3 + { + title = "Player 03 Start"; + sprite = "PLAYA0"; + } + 4 + { + title = "Player 04 Start"; + sprite = "PLAYA0"; + } + 5 + { + title = "Player 05 Start"; + sprite = "PLAYA0"; + } + 6 + { + title = "Player 06 Start"; + sprite = "PLAYA0"; + } + 7 + { + title = "Player 07 Start"; + sprite = "PLAYA0"; + } + 8 + { + title = "Player 08 Start"; + sprite = "PLAYA0"; + } + 9 + { + title = "Player 09 Start"; + sprite = "PLAYA0"; + } + 10 + { + title = "Player 10 Start"; + sprite = "PLAYA0"; + } + 11 + { + title = "Player 11 Start"; + sprite = "PLAYA0"; + } + 12 + { + title = "Player 12 Start"; + sprite = "PLAYA0"; + } + 13 + { + title = "Player 13 Start"; + sprite = "PLAYA0"; + } + 14 + { + title = "Player 14 Start"; + sprite = "PLAYA0"; + } + 15 + { + title = "Player 15 Start"; + sprite = "PLAYA0"; + } + 16 + { + title = "Player 16 Start"; + sprite = "PLAYA0"; + } + 17 + { + title = "Player 17 Start"; + sprite = "PLAYA0"; + } + 18 + { + title = "Player 18 Start"; + sprite = "PLAYA0"; + } + 19 + { + title = "Player 19 Start"; + sprite = "PLAYA0"; + } + 20 + { + title = "Player 20 Start"; + sprite = "PLAYA0"; + } + 21 + { + title = "Player 21 Start"; + sprite = "PLAYA0"; + } + 22 + { + title = "Player 22 Start"; + sprite = "PLAYA0"; + } + 23 + { + title = "Player 23 Start"; + sprite = "PLAYA0"; + } + 24 + { + title = "Player 24 Start"; + sprite = "PLAYA0"; + } + 25 + { + title = "Player 25 Start"; + sprite = "PLAYA0"; + } + 26 + { + title = "Player 26 Start"; + sprite = "PLAYA0"; + } + 27 + { + title = "Player 27 Start"; + sprite = "PLAYA0"; + } + 28 + { + title = "Player 28 Start"; + sprite = "PLAYA0"; + } + 29 + { + title = "Player 29 Start"; + sprite = "PLAYA0"; + } + 30 + { + title = "Player 30 Start"; + sprite = "PLAYA0"; + } + 31 + { + title = "Player 31 Start"; + sprite = "PLAYA0"; + } + 32 + { + title = "Player 32 Start"; + sprite = "PLAYA0"; + } + 33 + { + title = "Match Start"; + sprite = "NDRNA2A8"; + } + 34 + { + title = "CTF Red Team Start"; + sprite = "SIGNG0"; + } + 35 + { + title = "CTF Blue Team Start"; + sprite = "SIGNE0"; + } } - 1901 + + enemies { - title = "Brown Stalagmite"; - sprite = "STLGB0"; - width = 16; - height = 40; + color = 9; // Light_Blue + arrow = 1; + title = "Enemies"; + + 100 + { + title = "Crawla (Blue)"; + sprite = "POSSA1"; + width = 24; + height = 32; + } + 101 + { + title = "Crawla (Red)"; + sprite = "SPOSA1"; + width = 24; + height = 32; + } + 102 + { + title = "Stupid Dumb Unnamed RoboFish"; + sprite = "FISHA0"; + width = 8; + height = 28; + } + 103 + { + title = "Buzz (Gold)"; + sprite = "BUZZA1"; + width = 28; + height = 40; + } + 104 + { + title = "Buzz (Red)"; + sprite = "RBUZA1"; + width = 28; + height = 40; + } + 108 + { + title = "Deton"; + sprite = "DETNA1"; + width = 20; + height = 32; + } + 110 + { + title = "Turret"; + sprite = "TRETA1"; + width = 16; + height = 32; + } + 111 + { + title = "Pop-up Turret"; + sprite = "TURRI1"; + width = 12; + height = 64; + } + 122 + { + title = "Spring Shell (Green)"; + sprite = "SSHLA1"; + width = 24; + height = 40; + } + 125 + { + title = "Spring Shell (Yellow)"; + sprite = "SSHLI1"; + width = 24; + height = 40; + } + 109 + { + title = "Skim"; + sprite = "SKIMA1"; + width = 16; + height = 24; + } + 113 + { + title = "Jet Jaw"; + sprite = "JJAWA3A7"; + width = 12; + height = 20; + } + 126 + { + title = "Crushstacean"; + sprite = "CRABA0"; + width = 24; + height = 32; + } + 138 + { + title = "Banpyura"; + sprite = "CR2BA0"; + width = 24; + height = 32; + } + 117 + { + title = "Robo-Hood"; + sprite = "ARCHA1"; + width = 24; + height = 32; + } + 118 + { + title = "Lance-a-Bot"; + sprite = "CBFSA1"; + width = 32; + height = 72; + } + 1113 + { + title = "Suspicious Lance-a-Bot Statue"; + sprite = "CBBSA1"; + width = 32; + height = 72; + } + 119 + { + title = "Egg Guard"; + sprite = "ESHIA1"; + width = 16; + height = 48; + } + 115 + { + title = "Bird Aircraft Strike Hazard"; + sprite = "VLTRF1"; + width = 12; + height = 24; + } + 120 + { + title = "Green Snapper"; + sprite = "GSNPA1"; + width = 24; + height = 24; + } + 121 + { + title = "Minus"; + sprite = "MNUSA0"; + width = 24; + height = 32; + } + 134 + { + title = "Canarivore"; + sprite = "CANAA0"; + width = 12; + height = 80; + hangs = 1; + } + 123 + { + title = "Unidus"; + sprite = "UNIDA1"; + width = 18; + height = 36; + } + 135 + { + title = "Pterabyte Spawner"; + sprite = "PTERA2A8"; + width = 16; + height = 16; + } + 136 + { + title = "Pyre Fly"; + sprite = "PYREA0"; + width = 24; + height = 34; + } + 137 + { + title = "Dragonbomber"; + sprite = "DRABA1"; + width = 28; + height = 48; + } + 105 + { + title = "Jetty-Syn Bomber"; + sprite = "JETBB1"; + width = 20; + height = 50; + } + 106 + { + title = "Jetty-Syn Gunner"; + sprite = "JETGB1"; + width = 20; + height = 48; + } + 112 + { + title = "Spincushion"; + sprite = "SHRPA1"; + width = 16; + height = 24; + } + 114 + { + title = "Snailer"; + sprite = "SNLRA3A7"; + width = 24; + height = 48; + } + 129 + { + title = "Penguinator"; + sprite = "PENGA1"; + width = 24; + height = 32; + } + 130 + { + title = "Pophat"; + sprite = "POPHA1"; + width = 24; + height = 32; + } + 107 + { + title = "Crawla Commander"; + sprite = "CCOMA1"; + width = 16; + height = 32; + } + 131 + { + title = "Spinbobert"; + sprite = "SBOBB0"; + width = 32; + height = 32; + } + 132 + { + title = "Cacolantern"; + sprite = "CACOA0"; + width = 32; + height = 32; + } + 133 + { + title = "Hangster"; + sprite = "HBATC1"; + width = 24; + height = 24; + hangs = 1; + } + 127 + { + title = "Hive Elemental"; + sprite = "HIVEA0"; + width = 32; + height = 80; + } + 128 + { + title = "Bumblebore"; + sprite = "BUMBA1"; + width = 16; + height = 32; + } + 124 + { + title = "Buggle"; + sprite = "BBUZA1"; + width = 20; + height = 24; + } + 116 + { + title = "Pointy"; + sprite = "PNTYA1"; + width = 8; + height = 16; + } } - 1902 + + bosses { - title = "Orange Stalagmite (Tall)"; - sprite = "STLGC0"; - width = 16; - height = 40; + color = 8; // Dark_Gray + arrow = 1; + title = "Bosses"; + + 200 + { + title = "Egg Mobile"; + sprite = "EGGMA1"; + width = 24; + height = 76; + } + 201 + { + title = "Egg Slimer"; + sprite = "EGGNA1"; + width = 24; + height = 76; + } + 202 + { + title = "Sea Egg"; + sprite = "EGGOA1"; + width = 32; + height = 116; + } + 203 + { + title = "Egg Colosseum"; + sprite = "EGGPA1"; + width = 24; + height = 76; + } + 204 + { + title = "Fang"; + sprite = "FANGA1"; + width = 24; + height = 60; + } + 206 + { + title = "Brak Eggman (Old)"; + sprite = "BRAKB1"; + width = 48; + height = 160; + } + 207 + { + title = "Metal Sonic (Race)"; + sprite = "METLI1"; + width = 16; + height = 48; + } + 208 + { + title = "Metal Sonic (Battle)"; + sprite = "METLC1"; + width = 16; + height = 48; + } + 209 + { + title = "Brak Eggman"; + sprite = "BRAK01"; + width = 48; + height = 160; + } + 290 + { + arrow = 0; + title = "Boss Escape Point"; + width = 8; + height = 16; + sprite = "internal:eggmanend"; + } + 291 + { + arrow = 0; + title = "Egg Capsule Center"; + width = 8; + height = 16; + sprite = "internal:capsule"; + } + 292 + { + arrow = 0; + title = "Boss Waypoint"; + width = 8; + height = 16; + sprite = "internal:eggmanway"; + } + 293 + { + title = "Metal Sonic Gather Point"; + sprite = "internal:metal"; + width = 8; + height = 16; + } + 294 + { + title = "Fang Waypoint"; + sprite = "internal:eggmanway"; + width = 8; + height = 16; + } } - 1903 + + rings { - title = "Orange Stalagmite"; - sprite = "STLGD0"; - width = 16; - height = 40; - } - 1904 - { - title = "Red Stalagmite (Tall)"; - sprite = "STLGE0"; - width = 16; - height = 40; - } - 1905 - { - title = "Red Stalagmite"; - sprite = "STLGF0"; - width = 16; - height = 40; - } - 1906 - { - title = "Gray Stalagmite (Tall)"; - sprite = "STLGG0"; + color = 14; // Yellow + title = "Rings and Weapon Panels"; width = 24; - height = 96; - } - 1907 - { - title = "Gray Stalagmite"; - sprite = "STLGH0"; - width = 16; - height = 40; - } - 1908 - { - title = "Blue Stalagmite (Tall)"; - sprite = "STLGI0"; - width = 16; - height = 40; - } - 1909 - { - title = "Blue Stalagmite"; - sprite = "STLGJ0"; - width = 16; - height = 40; - } -} + height = 24; + sprite = "RINGA0"; -hauntedheights -{ - color = 10; // Green - title = "Haunted Heights"; + 300 + { + title = "Ring"; + sprite = "RINGA0"; + width = 16; + } + 301 + { + title = "Bounce Ring"; + sprite = "internal:RNGBA0"; + } + 302 + { + title = "Rail Ring"; + sprite = "internal:RNGRA0"; + } + 303 + { + title = "Infinity Ring"; + sprite = "internal:RNGIA0"; + } + 304 + { + title = "Automatic Ring"; + sprite = "internal:RNGAA0"; + } + 305 + { + title = "Explosion Ring"; + sprite = "internal:RNGEA0"; + } + 306 + { + title = "Scatter Ring"; + sprite = "internal:RNGSA0"; + } + 307 + { + title = "Grenade Ring"; + sprite = "internal:RNGGA0"; + } + 308 + { + title = "CTF Team Ring (Red)"; + sprite = "internal:RRNGA0"; + width = 16; + } + 309 + { + title = "CTF Team Ring (Blue)"; + sprite = "internal:BRNGA0"; + width = 16; + } + 330 + { + title = "Bounce Ring Panel"; + sprite = "internal:PIKBA0"; + } + 331 + { + title = "Rail Ring Panel"; + sprite = "internal:PIKRA0"; + } + 332 + { + title = "Automatic Ring Panel"; + sprite = "internal:PIKAA0"; + } + 333 + { + title = "Explosion Ring Panel"; + sprite = "internal:PIKEA0"; + } + 334 + { + title = "Scatter Ring Panel"; + sprite = "internal:PIKSA0"; + } + 335 + { + title = "Grenade Ring Panel"; + sprite = "internal:PIKGA0"; + } + } - 2000 + collectibles { - title = "Smashing Spikeball"; - sprite = "FMCEA0"; + color = 10; // Light_Green + title = "Other Collectibles"; + width = 16; + height = 32; + sort = 1; + sprite = "CEMGA0"; + + 310 + { + title = "CTF Red Flag"; + sprite = "RFLGA0"; + width = 24; + height = 64; + } + 311 + { + title = "CTF Blue Flag"; + sprite = "BFLGA0"; + width = 24; + height = 64; + } + 312 + { + title = "Emerald Token"; + sprite = "TOKEA0"; + width = 16; + height = 32; + } + 313 + { + title = "Chaos Emerald 1 (Green)"; + sprite = "CEMGA0"; + } + 314 + { + title = "Chaos Emerald 2 (Purple)"; + sprite = "CEMGB0"; + } + 315 + { + title = "Chaos Emerald 3 (Blue)"; + sprite = "CEMGC0"; + } + 316 + { + title = "Chaos Emerald 4 (Cyan)"; + sprite = "CEMGD0"; + } + 317 + { + title = "Chaos Emerald 5 (Orange)"; + sprite = "CEMGE0"; + } + 318 + { + title = "Chaos Emerald 6 (Red)"; + sprite = "CEMGF0"; + } + 319 + { + title = "Chaos Emerald 7 (Gray)"; + sprite = "CEMGG0"; + } + 320 + { + title = "Emerald Hunt Location"; + sprite = "SHRDA0"; + } + 321 + { + title = "Match Chaos Emerald Spawn"; + sprite = "CEMGA0"; + } + 322 + { + title = "Emblem"; + sprite = "EMBMA0"; + width = 16; + height = 30; + } + } + + boxes + { + color = 7; // Gray + blocking = 2; + title = "Monitors"; width = 18; - height = 28; - } - 2001 - { - title = "HHZ Grass"; - sprite = "HHZMA0"; - width = 16; height = 40; - } - 2002 - { - title = "HHZ Tentacle 1"; - sprite = "HHZMB0"; - width = 16; - height = 40; - } - 2003 - { - title = "HHZ Tentacle 2"; - sprite = "HHZMC0"; - width = 16; - height = 40; - } - 2004 - { - title = "HHZ Stalagmite (Tall)"; - sprite = "HHZME0"; - width = 16; - height = 40; - } - 2005 - { - title = "HHZ Stalagmite (Short)"; - sprite = "HHZMF0"; - width = 16; - height = 40; - } - 2006 - { - title = "Jack-o'-lantern 1"; - sprite = "PUMKA0"; - width = 16; - height = 40; - } - 2007 - { - title = "Jack-o'-lantern 2"; - sprite = "PUMKB0"; - width = 16; - height = 40; - } - 2008 - { - title = "Jack-o'-lantern 3"; - sprite = "PUMKC0"; - width = 16; - height = 40; - } - 2009 - { - title = "Purple Mushroom"; - sprite = "SHRMD0"; - width = 16; - height = 48; - } - 2010 - { - title = "HHZ Tree"; - sprite = "HHPLC0"; - width = 12; - height = 40; - } -} -frozenhillside -{ - color = 10; // Green - title = "Frozen Hillside"; + 400 + { + title = "Super Ring (10 Rings)"; + sprite = "TVRIA0"; + } + 401 + { + title = "Pity Shield"; + sprite = "TVPIA0"; + } + 402 + { + title = "Attraction Shield"; + sprite = "TVATA0"; + } + 403 + { + title = "Force Shield"; + sprite = "TVFOA0"; + } + 404 + { + title = "Armageddon Shield"; + sprite = "TVARA0"; + } + 405 + { + title = "Whirlwind Shield"; + sprite = "TVWWA0"; + } + 406 + { + title = "Elemental Shield"; + sprite = "TVELA0"; + } + 407 + { + title = "Super Sneakers"; + sprite = "TVSSA0"; + } + 408 + { + title = "Invincibility"; + sprite = "TVIVA0"; + } + 409 + { + title = "Extra Life"; + sprite = "TV1UA0"; + } + 410 + { + title = "Eggman"; + sprite = "TVEGA0"; + } + 411 + { + title = "Teleporter"; + sprite = "TVMXA0"; + } + 413 + { + title = "Gravity Boots"; + sprite = "TVGVA0"; + } + 414 + { + title = "CTF Team Ring Monitor (Red)"; + sprite = "TRRIA0"; + } + 415 + { + title = "CTF Team Ring Monitor (Blue)"; + sprite = "TBRIA0"; + } + 416 + { + title = "Recycler"; + sprite = "TVRCA0"; + } + 418 + { + title = "Score (1,000 Points)"; + sprite = "TV1KA0"; + } + 419 + { + title = "Score (10,000 Points)"; + sprite = "TVTKA0"; + } + 420 + { + title = "Flame Shield"; + sprite = "TVFLA0"; + } + 421 + { + title = "Water Shield"; + sprite = "TVBBA0"; + } + 422 + { + title = "Lightning Shield"; + sprite = "TVZPA0"; + } + } - 2100 + boxes2 { - title = "Ice Shard (Small)"; - sprite = "FHZIA0"; - width = 8; - height = 32; - } - 2101 - { - title = "Ice Shard (Large)"; - sprite = "FHZIB0"; - width = 8; - height = 32; - } - 2102 - { - title = "Crystal Tree (Aqua)"; - sprite = "TRE3A0"; + color = 18; // Gold + blocking = 2; + title = "Monitors (Respawning)"; width = 20; - height = 200; + height = 44; + + 431 + { + title = "Pity Shield (Respawn)"; + sprite = "TVPIB0"; + } + 432 + { + title = "Attraction Shield (Respawn)"; + sprite = "TVATB0"; + } + 433 + { + title = "Force Shield (Respawn)"; + sprite = "TVFOB0"; + } + 434 + { + title = "Armageddon Shield (Respawn)"; + sprite = "TVARB0"; + } + 435 + { + title = "Whirlwind Shield (Respawn)"; + sprite = "TVWWB0"; + } + 436 + { + title = "Elemental Shield (Respawn)"; + sprite = "TVELB0"; + } + 437 + { + title = "Super Sneakers (Respawn)"; + sprite = "TVSSB0"; + } + 438 + { + title = "Invincibility (Respawn)"; + sprite = "TVIVB0"; + } + 440 + { + title = "Eggman (Respawn)"; + sprite = "TVEGB0"; + } + 443 + { + title = "Gravity Boots (Respawn)"; + sprite = "TVGVB0"; + } + 450 + { + title = "Flame Shield (Respawn)"; + sprite = "TVFLB0"; + } + 451 + { + title = "Water Shield (Respawn)"; + sprite = "TVBBB0"; + } + 452 + { + title = "Lightning Shield (Respawn)"; + sprite = "TVZPB0"; + } } - 2103 + + generic { - title = "Crystal Tree (Pink)"; - sprite = "TRE3B0"; + color = 11; // Light_Cyan + title = "Generic Items & Hazards"; + + 500 + { + title = "Air Bubble Patch"; + sprite = "BUBLE0"; + width = 8; + height = 16; + } + 501 + { + title = "Signpost"; + sprite = "SIGND0"; + width = 8; + height = 32; + } + 502 + { + arrow = 1; + title = "Star Post"; + sprite = "STPTA0M0"; + width = 64; + height = 128; + } + 520 + { + title = "Bomb Sphere"; + sprite = "SPHRD0"; + width = 16; + height = 24; + } + 521 + { + title = "Spikeball"; + sprite = "SPIKA0"; + width = 12; + height = 8; + } + 522 + { + title = "Wall Spike"; + sprite = "WSPKALAR"; + width = 16; + height = 14; + arrow = 1; + } + 523 + { + title = "Spike"; + sprite = "USPKA0"; + width = 8; + height = 32; + } + 1130 + { + title = "Small Mace"; + sprite = "SMCEA0"; + width = 17; + height = 34; + } + 1131 + { + title = "Big Mace"; + sprite = "BMCEA0"; + width = 34; + height = 68; + } + 1136 + { + title = "Small Fireball"; + sprite = "SFBRA0"; + width = 17; + height = 34; + } + 1137 + { + title = "Large Fireball"; + sprite = "BFBRA0"; + width = 34; + height = 68; + } + } + + springs + { + color = 12; // Light_Red + title = "Springs and Fans"; width = 20; - height = 200; + height = 16; + sprite = "RSPRD2"; + + 540 + { + title = "Fan"; + sprite = "FANSA0D0"; + width = 16; + height = 8; + } + 541 + { + title = "Gas Jet"; + sprite = "STEMD0"; + width = 32; + } + 542 + { + title = "Bumper"; + sprite = "BUMPA0"; + width = 32; + height = 64; + } + 543 + { + title = "Balloon"; + sprite = "BLONA0"; + width = 32; + height = 64; + } + 550 + { + title = "Yellow Spring"; + sprite = "SPRYA0"; + } + 551 + { + title = "Red Spring"; + sprite = "SPRRA0"; + } + 552 + { + title = "Blue Spring"; + sprite = "SPRBA0"; + } + 555 + { + arrow = 1; + title = "Diagonal Yellow Spring"; + sprite = "YSPRD2"; + width = 16; + } + 556 + { + arrow = 1; + title = "Diagonal Red Spring"; + sprite = "RSPRD2"; + width = 16; + } + 557 + { + arrow = 1; + title = "Diagonal Blue Spring"; + sprite = "BSPRD2"; + width = 16; + } + 558 + { + arrow = 1; + title = "Horizontal Yellow Spring"; + sprite = "SSWYD2D8"; + width = 16; + height = 32; + } + 559 + { + arrow = 1; + title = "Horizontal Red Spring"; + sprite = "SSWRD2D8"; + width = 16; + height = 32; + } + 560 + { + arrow = 1; + title = "Horizontal Blue Spring"; + sprite = "SSWBD2D8"; + width = 16; + height = 32; + } + 1134 + { + title = "Yellow Spring Ball"; + sprite = "YSPBA0"; + width = 17; + height = 34; + } + 1135 + { + title = "Red Spring Ball"; + sprite = "RSPBA0"; + width = 17; + height = 34; + } + 544 + { + arrow = 1; + title = "Yellow Boost Panel"; + sprite = "BSTYA0"; + width = 28; + height = 2; + } + 545 + { + arrow = 1; + title = "Red Boost Panel"; + sprite = "BSTRA0"; + width = 28; + height = 2; + } } - 2104 + + patterns { - title = "Amy Cameo"; - sprite = "ROSYA1"; + color = 5; // Magenta + arrow = 1; + title = "Special Placement Patterns"; width = 16; - height = 48; - } - 2105 - { - title = "Mistletoe"; - sprite = "XMS6A0"; - width = 52; - height = 106; - } -} + height = 384; + sprite = "RINGA0"; -flickies -{ - color = 10; // Green - title = "Flickies"; - width = 8; - height = 20; + 600 + { + arrow = 0; + title = "5 Vertical Rings (Yellow Spring)"; + sprite = "RINGA0"; + } + 601 + { + arrow = 0; + title = "5 Vertical Rings (Red Spring)"; + sprite = "RINGA0"; + height = 1024; + } + 602 + { + title = "5 Diagonal Rings (Yellow Spring)"; + sprite = "RINGA0"; + height = 32; + } + 603 + { + title = "10 Diagonal Rings (Red Spring)"; + sprite = "RINGA0"; + height = 32; + } + 604 + { + title = "Circle of Rings"; + sprite = "RINGA0"; + width = 96; + height = 192; + } + 605 + { + title = "Circle of Rings (Big)"; + sprite = "RINGA0"; + width = 192; + } + 606 + { + title = "Circle of Blue Spheres"; + sprite = "SPHRA0"; + width = 96; + height = 192; + } + 607 + { + title = "Circle of Blue Spheres (Big)"; + sprite = "SPHRA0"; + width = 192; + } + 608 + { + title = "Circle of Rings and Spheres"; + sprite = "SPHRA0"; + width = 96; + height = 192; + } + 609 + { + title = "Circle of Rings and Spheres (Big)"; + sprite = "SPHRA0"; + width = 192; + } + } - 2200 + invisible { - title = "Bluebird"; - sprite = "FL01A1"; + color = 15; // White + title = "Misc. Invisible"; + width = 0; + height = 0; + sprite = "UNKNA0"; + sort = 1; + fixedsize = true; + blocking = 0; + + 700 + { + title = "Water Ambience A (Large)"; + sprite = "internal:ambiance"; + } + + 701 + { + title = "Water Ambience B (Large)"; + sprite = "internal:ambiance"; + } + + 702 + { + title = "Water Ambience C (Medium)"; + sprite = "internal:ambiance"; + } + + 703 + { + title = "Water Ambience D (Medium)"; + sprite = "internal:ambiance"; + } + + 704 + { + title = "Water Ambience E (Small)"; + sprite = "internal:ambiance"; + } + + 705 + { + title = "Water Ambience F (Small)"; + sprite = "internal:ambiance"; + } + + 706 + { + title = "Water Ambience G (Extra Large)"; + sprite = "internal:ambiance"; + } + + 707 + { + title = "Water Ambience H (Extra Large)"; + sprite = "internal:ambiance"; + } + + 708 + { + title = "Disco Ambience"; + sprite = "internal:ambiance"; + } + + 709 + { + title = "Volcano Ambience"; + sprite = "internal:ambiance"; + } + + 710 + { + title = "Machine Ambience"; + sprite = "internal:ambiance"; + } + + 750 + { + title = "Slope Vertex"; + sprite = "internal:vertexslope"; + } + + 751 + { + arrow = 1; + title = "Teleport Destination"; + sprite = "internal:tele"; + } + + 752 + { + arrow = 1; + title = "Alternate View Point"; + sprite = "internal:view"; + } + + 753 + { + title = "Zoom Tube Waypoint"; + sprite = "internal:zoom"; + } + + 754 + { + title = "Push Point"; + sprite = "GWLGA0"; + } + 755 + { + title = "Pull Point"; + sprite = "GWLRA0"; + } + 756 + { + title = "Blast Linedef Executor"; + sprite = "TOADA0"; + width = 32; + height = 16; + } + 757 + { + title = "Fan Particle Generator"; + sprite = "PRTLA0"; + width = 8; + height = 16; + } + 758 + { + title = "Object Angle Anchor"; + sprite = "internal:view"; + } + 760 + { + title = "PolyObject Anchor"; + sprite = "internal:polyanchor"; + } + 761 + { + title = "PolyObject Spawn Point"; + sprite = "internal:polycenter"; + } + 762 + { + title = "PolyObject Spawn Point (Crush)"; + sprite = "internal:polycentercrush"; + } + 780 + { + title = "Skybox View Point"; + sprite = "internal:skyb"; + } } - 2201 + + greenflower { - title = "Rabbit"; - sprite = "FL02A1"; + color = 10; // Green + title = "Greenflower"; + + 800 + { + title = "GFZ Flower"; + sprite = "FWR1A0"; + width = 16; + height = 40; + } + 801 + { + title = "Sunflower"; + sprite = "FWR2A0"; + width = 16; + height = 96; + } + 802 + { + title = "Budding Flower"; + sprite = "FWR3A0"; + width = 8; + height = 32; + } + 803 + { + title = "Blueberry Bush"; + sprite = "BUS3A0"; + width = 16; + height = 32; + } + 804 + { + title = "Berry Bush"; + sprite = "BUS1A0"; + width = 16; + height = 32; + } + 805 + { + title = "Bush"; + sprite = "BUS2A0"; + width = 16; + height = 32; + } + 806 + { + title = "GFZ Tree"; + sprite = "TRE1A0"; + width = 20; + height = 128; + } + 807 + { + title = "GFZ Berry Tree"; + sprite = "TRE1B0"; + width = 20; + height = 128; + } + 808 + { + title = "GFZ Cherry Tree"; + sprite = "TRE1C0"; + width = 20; + height = 128; + } + 809 + { + title = "Checkered Tree"; + sprite = "TRE2A0"; + width = 20; + height = 200; + } + 810 + { + title = "Checkered Tree (Sunset)"; + sprite = "TRE2B0"; + width = 20; + height = 200; + } + 811 + { + title = "Polygon Tree"; + sprite = "TRE4A0"; + width = 20; + height = 200; + } + 812 + { + title = "Bush Tree"; + sprite = "TRE5A0"; + width = 20; + height = 200; + } + 813 + { + title = "Red Bush Tree"; + sprite = "TRE5B0"; + width = 20; + height = 200; + } } - 2202 + + technohill { - title = "Chicken"; - sprite = "FL03A1"; + color = 10; // Green + title = "Techno Hill"; + + 900 + { + title = "THZ Steam Flower"; + sprite = "THZPA0"; + width = 8; + height = 32; + } + 901 + { + title = "Alarm"; + sprite = "ALRMA0"; + width = 8; + height = 16; + hangs = 1; + } + 902 + { + title = "THZ Spin Flower (Red)"; + sprite = "FWR5A0"; + width = 16; + height = 64; + } + 903 + { + title = "THZ Spin Flower (Yellow)"; + sprite = "FWR6A0"; + width = 16; + height = 64; + } + 904 + { + arrow = 1; + title = "Whistlebush"; + sprite = "THZTA0"; + width = 16; + height = 64; + } } - 2203 + + deepsea { - title = "Seal"; - sprite = "FL04A1"; + color = 10; // Green + title = "Deep Sea"; + + 1000 + { + arrow = 1; + blocking = 2; + title = "Gargoyle"; + sprite = "GARGA1"; + width = 16; + height = 40; + } + 1009 + { + arrow = 1; + blocking = 2; + title = "Gargoyle (Big)"; + sprite = "GARGB1"; + width = 32; + height = 80; + } + 1001 + { + title = "Seaweed"; + sprite = "SEWEA0"; + width = 24; + height = 56; + } + 1002 + { + title = "Dripping Water"; + sprite = "DRIPD0"; + width = 8; + height = 16; + hangs = 1; + } + 1003 + { + title = "Coral (Green)"; + sprite = "CORLA0"; + width = 29; + height = 40; + } + 1004 + { + title = "Coral (Red)"; + sprite = "CORLB0"; + width = 30; + height = 53; + } + 1005 + { + title = "Coral (Orange)"; + sprite = "CORLC0"; + width = 28; + height = 41; + } + 1006 + { + title = "Blue Crystal"; + sprite = "BCRYA1"; + width = 8; + height = 16; + } + 1007 + { + title = "Kelp"; + sprite = "KELPA0"; + width = 16; + height = 292; + } + 1008 + { + title = "Stalagmite (DSZ1)"; + sprite = "DSTGA0"; + width = 8; + height = 116; + } + 1010 + { + arrow = 1; + title = "Light Beam"; + sprite = "LIBEARAL"; + width = 16; + height = 16; + } + 1011 + { + title = "Stalagmite (DSZ2)"; + sprite = "DSTGA0"; + width = 8; + height = 116; + } + 1012 + { + arrow = 1; + title = "Big Floating Mine"; + width = 28; + height = 56; + sprite = "BMNEA1"; + } + 1013 + { + title = "Animated Kelp"; + sprite = "ALGAA0"; + width = 48; + height = 120; + } + 1014 + { + title = "Large Coral (Brown)"; + sprite = "CORLD0"; + width = 56; + height = 112; + } + 1015 + { + title = "Large Coral (Beige)"; + sprite = "CORLE0"; + width = 56; + height = 112; + } } - 2204 + + castleeggman { - title = "Pig"; - sprite = "FL05A1"; + color = 10; // Green + title = "Castle Eggman"; + + 1100 + { + title = "Chain (Decorative)"; + sprite = "CHANA0"; + width = 4; + height = 128; + hangs = 1; + } + 1101 + { + title = "Torch"; + sprite = "FLAMA0E0"; + width = 8; + height = 32; + } + 1102 + { + arrow = 1; + blocking = 2; + title = "Eggman Statue"; + sprite = "ESTAA1"; + width = 32; + height = 240; + } + 1103 + { + title = "CEZ Flower"; + sprite = "FWR4A0"; + width = 16; + height = 40; + } + 1104 + { + title = "Mace Spawnpoint"; + sprite = "SMCEA0"; + width = 17; + height = 34; + arg0 + { + title = "Number of links"; + } + arg1 + { + title = "Number of spokes"; + } + arg2 + { + title = "Width"; + } + arg3 + { + title = "Speed"; + } + arg4 + { + title = "Phase"; + type = 8; + } + arg5 + { + title = "Pinch"; + type = 8; + } + arg6 + { + title = "Omitted spokes"; + } + arg7 + { + title = "Omitted links"; + } + arg8 + { + title = "Flags"; + type = 12; + enum = "maceflags"; + } + } + 1105 + { + title = "Chain with Maces Spawnpoint"; + sprite = "SMCEA0"; + width = 17; + height = 34; + arg0 + { + title = "Number of links"; + } + arg1 + { + title = "Number of spokes"; + } + arg2 + { + title = "Width"; + } + arg3 + { + title = "Speed"; + } + arg4 + { + title = "Phase"; + type = 8; + } + arg5 + { + title = "Pinch"; + type = 8; + } + arg6 + { + title = "Omitted spokes"; + } + arg7 + { + title = "Omitted links"; + } + arg8 + { + title = "Flags"; + type = 12; + enum = "maceflags"; + } + } + 1106 + { + title = "Chained Spring Spawnpoint"; + sprite = "YSPBA0"; + width = 17; + height = 34; + arg0 + { + title = "Number of links"; + } + arg1 + { + title = "Number of spokes"; + } + arg2 + { + title = "Width"; + } + arg3 + { + title = "Speed"; + } + arg4 + { + title = "Phase"; + type = 8; + } + arg5 + { + title = "Pinch"; + type = 8; + } + arg6 + { + title = "Omitted spokes"; + } + arg7 + { + title = "Omitted links"; + } + arg8 + { + title = "Flags"; + type = 12; + enum = "maceflags"; + } + } + 1107 + { + title = "Chain Spawnpoint"; + sprite = "BMCHA0"; + width = 17; + height = 34; + arg0 + { + title = "Number of links"; + } + arg1 + { + title = "Number of spokes"; + } + arg2 + { + title = "Width"; + } + arg3 + { + title = "Speed"; + } + arg4 + { + title = "Phase"; + type = 8; + } + arg5 + { + title = "Pinch"; + type = 8; + } + arg6 + { + title = "Omitted spokes"; + } + arg7 + { + title = "Omitted links"; + } + arg8 + { + title = "Flags"; + type = 12; + enum = "maceflags"; + + } + } + 1108 + { + arrow = 1; + title = "Hidden Chain Spawnpoint"; + sprite = "internal:chain3"; + width = 17; + height = 34; + } + 1109 + { + title = "Firebar Spawnpoint"; + sprite = "BFBRA0"; + width = 17; + height = 34; + arg0 + { + title = "Number of links"; + } + arg1 + { + title = "Number of spokes"; + } + arg2 + { + title = "Width"; + } + arg3 + { + title = "Speed"; + } + arg4 + { + title = "Phase"; + type = 8; + } + arg5 + { + title = "Pinch"; + type = 8; + } + arg6 + { + title = "Omitted spokes"; + } + arg7 + { + title = "Omitted links"; + } + arg8 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Double size"; + 2 = "No sounds"; + 4 = "Player-turnable chain"; + 8 = "Swing instead of spin"; + 16 = "Omit chain links"; + 32 = "Spawn link at origin"; + 64 = "Clip inside ground"; + 128 = "No distance check"; + } + } + } + 1110 + { + title = "Custom Mace Spawnpoint"; + sprite = "SMCEA0"; + width = 17; + height = 34; + arg0 + { + title = "Number of links"; + } + arg1 + { + title = "Number of spokes"; + } + arg2 + { + title = "Width"; + } + arg3 + { + title = "Speed"; + } + arg4 + { + title = "Phase"; + type = 8; + } + arg5 + { + title = "Pinch"; + type = 8; + } + arg6 + { + title = "Omitted spokes"; + } + arg7 + { + title = "Omitted links"; + } + arg8 + { + title = "Flags"; + type = 12; + enum = "maceflags"; + } + stringarg0 + { + title = "Mace object type"; + type = 2; + } + stringarg1 + { + title = "Link object type"; + type = 2; + } + } + 1111 + { + arrow = 1; + blocking = 2; + title = "Crawla Statue"; + sprite = "CSTAA1"; + width = 16; + height = 40; + } + 1112 + { + arrow = 1; + blocking = 2; + title = "Lance-a-Bot Statue"; + sprite = "CBBSA1"; + width = 32; + height = 72; + } + 1114 + { + title = "Pine Tree"; + sprite = "PINEA0"; + width = 16; + height = 628; + } + 1115 + { + title = "CEZ Shrub (Small)"; + sprite = "CEZBA0"; + width = 16; + height = 24; + } + 1116 + { + title = "CEZ Shrub (Large)"; + sprite = "CEZBB0"; + width = 32; + height = 48; + } + 1117 + { + arrow = 1; + title = "Pole Banner (Red)"; + sprite = "BANRA0"; + width = 40; + height = 224; + } + 1118 + { + arrow = 1; + title = "Pole Banner (Blue)"; + sprite = "BANRA0"; + width = 40; + height = 224; + } + 1119 + { + title = "Candle"; + sprite = "CNDLA0"; + width = 8; + height = 48; + } + 1120 + { + title = "Candle Pricket"; + sprite = "CNDLB0"; + width = 8; + height = 176; + } + 1121 + { + title = "Flame Holder"; + sprite = "FLMHA0"; + width = 24; + height = 80; + } + 1122 + { + title = "Fire Torch"; + sprite = "CTRCA0"; + width = 16; + height = 80; + } + 1123 + { + title = "Cannonball Launcher"; + sprite = "internal:cannonball"; + width = 8; + height = 16; + } + 1124 + { + blocking = 2; + title = "Cannonball"; + sprite = "CBLLA0"; + width = 20; + height = 40; + } + 1125 + { + title = "Brambles"; + sprite = "CABRALAR"; + width = 48; + height = 32; + } + 1126 + { + title = "Invisible Lockon Object"; + sprite = "LCKNC0"; + width = 16; + height = 32; + } + 1127 + { + title = "Spectator Eggrobo"; + sprite = "EGR1A1"; + width = 20; + height = 72; + } + 1128 + { + arrow = 1; + title = "Waving Flag (Red)"; + sprite = "CFLGA0"; + width = 8; + height = 208; + } + 1129 + { + arrow = 1; + title = "Waving Flag (Blue)"; + sprite = "CFLGA0"; + width = 8; + height = 208; + } } - 2205 + + aridcanyon { - title = "Chipmunk"; - sprite = "FL06A1"; + color = 10; // Green + title = "Arid Canyon"; + + 1200 + { + title = "Tumbleweed (Big)"; + sprite = "BTBLA0"; + width = 24; + height = 48; + } + 1201 + { + title = "Tumbleweed (Small)"; + sprite = "STBLA0"; + width = 12; + height = 24; + } + 1202 + { + arrow = 1; + title = "Rock Spawner"; + sprite = "ROIAA0"; + width = 8; + height = 16; + arg0 + { + title = "Speed"; + } + arg1 + { + title = "Spawn interval"; + } + arg2 + { + title = "Randomize speed?"; + type = 11; + enum = "noyes"; + } + stringarg0 + { + title = "Object type"; + type = 2; + } + } + 1203 + { + title = "Tiny Red Flower Cactus"; + sprite = "CACTA0"; + width = 13; + height = 24; + } + 1204 + { + title = "Small Red Flower Cactus"; + sprite = "CACTB0"; + width = 15; + height = 52; + } + 1205 + { + title = "Tiny Blue Flower Cactus"; + sprite = "CACTC0"; + width = 13; + height = 24; + } + 1206 + { + title = "Small Blue Flower Cactus"; + sprite = "CACTD0"; + width = 15; + height = 52; + } + 1207 + { + title = "Prickly Pear"; + sprite = "CACTE0"; + width = 32; + height = 96; + } + 1208 + { + title = "Barrel Cactus"; + sprite = "CACTF0"; + width = 20; + height = 128; + } + 1209 + { + title = "Tall Barrel Cactus"; + sprite = "CACTG0"; + width = 24; + height = 224; + } + 1210 + { + title = "Armed Cactus"; + sprite = "CACTH0"; + width = 24; + height = 256; + } + 1211 + { + title = "Ball Cactus"; + sprite = "CACTI0"; + width = 48; + height = 96; + } + 1212 + { + title = "Caution Sign"; + sprite = "WWSGAR"; + width = 22; + height = 64; + } + 1213 + { + title = "Cacti Sign"; + sprite = "WWS2AR"; + width = 22; + height = 64; + } + 1214 + { + title = "Sharp Turn Sign"; + sprite = "WWS3ALAR"; + width = 16; + height = 192; + } + 1215 + { + title = "Mine Oil Lamp"; + sprite = "OILLA0"; + width = 22; + height = 64; + hangs = 1; + } + 1216 + { + title = "TNT Barrel"; + sprite = "BARRA1"; + width = 24; + height = 63; + } + 1217 + { + title = "TNT Proximity Shell"; + sprite = "REMTA0"; + width = 64; + height = 40; + } + 1218 + { + title = "Dust Devil"; + sprite = "TAZDCR"; + width = 80; + height = 416; + } + 1219 + { + title = "Minecart Spawner"; + sprite = "MCRTCLFR"; + width = 22; + height = 32; + } + 1220 + { + title = "Minecart Stopper"; + sprite = "MCRTIR"; + width = 32; + height = 32; + } + 1221 + { + title = "Minecart Saloon Door"; + sprite = "SALDARAL"; + width = 96; + height = 160; + } + 1222 + { + title = "Train Cameo Spawner"; + sprite = "TRAEBRBL"; + width = 28; + height = 32; + } + 1223 + { + title = "Train Dust Spawner"; + sprite = "ADSTA0"; + width = 4; + height = 4; + } + 1224 + { + title = "Train Steam Spawner"; + sprite = "STEAA0"; + width = 4; + height = 4; + } + 1229 + { + title = "Minecart Switch Point"; + sprite = "internal:zoom"; + width = 8; + height = 16; + } + 1230 + { + title = "Tiny Cactus"; + sprite = "CACTJ0"; + width = 13; + height = 28; + } + 1231 + { + title = "Small Cactus"; + sprite = "CACTK0"; + width = 15; + height = 60; + } } - 2206 + + redvolcano { - title = "Penguin"; - sprite = "FL07A1"; + color = 10; // Green + title = "Red Volcano"; + + 1300 + { + arrow = 1; + title = "Flame Jet (Horizontal)"; + sprite = "internal:flameh"; + width = 16; + height = 40; + } + 1301 + { + title = "Flame Jet (Vertical)"; + sprite = "internal:flamev"; + width = 16; + height = 40; + } + 1302 + { + title = "Spinning Flame Jet (Counter-Clockwise)"; + sprite = "internal:flame2"; + width = 16; + height = 24; + } + 1303 + { + title = "Spinning Flame Jet (Clockwise)"; + sprite = "internal:flame1"; + width = 16; + height = 24; + } + 1304 + { + title = "Lavafall"; + sprite = "LFALF0"; + width = 30; + height = 32; + } + 1305 + { + title = "Rollout Rock"; + sprite = "PUMIA1A5"; + width = 30; + height = 60; + } + 1306 + { + title = "Big Fern"; + sprite = "JPLAB0"; + width = 32; + height = 48; + } + 1307 + { + title = "Jungle Palm"; + sprite = "JPLAC0"; + width = 32; + height = 48; + } + 1308 + { + title = "Torch Flower"; + sprite = "TFLOA0"; + width = 14; + height = 110; + } + 1309 + { + title = "RVZ1 Wall Vine (Long)"; + sprite = "WVINALAR"; + width = 1; + height = 288; + } + 1310 + { + title = "RVZ1 Wall Vine (Short)"; + sprite = "WVINBLBR"; + width = 1; + height = 288; + } } - 2207 + + botanicserenity { - title = "Fish"; - sprite = "FL08A1"; + color = 10; // Green + title = "Botanic Serenity"; + width = 16; + height = 32; + sprite = "BSZ1A0"; + 1400 + { + title = "Tall Flower (Red)"; + sprite = "BSZ1A0"; + } + 1401 + { + title = "Tall Flower (Purple)"; + sprite = "BSZ1B0"; + } + 1402 + { + title = "Tall Flower (Blue)"; + sprite = "BSZ1C0"; + } + 1403 + { + title = "Tall Flower (Cyan)"; + sprite = "BSZ1D0"; + } + 1404 + { + title = "Tall Flower (Yellow)"; + sprite = "BSZ1E0"; + } + 1405 + { + title = "Tall Flower (Orange)"; + sprite = "BSZ1F0"; + } + 1410 + { + title = "Medium Flower (Red)"; + sprite = "BSZ2A0"; + } + 1411 + { + title = "Medium Flower (Purple)"; + sprite = "BSZ2B0"; + } + 1412 + { + title = "Medium Flower (Blue)"; + sprite = "BSZ2C0"; + } + 1413 + { + title = "Medium Flower (Cyan)"; + sprite = "BSZ2D0"; + } + 1414 + { + title = "Medium Flower (Yellow)"; + sprite = "BSZ2E0"; + } + 1415 + { + title = "Medium Flower (Orange)"; + sprite = "BSZ2F0"; + } + 1420 + { + title = "Short Flower (Red)"; + sprite = "BSZ3A0"; + } + 1421 + { + title = "Short Flower (Purple)"; + sprite = "BSZ3B0"; + } + 1422 + { + title = "Short Flower (Blue)"; + sprite = "BSZ3C0"; + } + 1423 + { + title = "Short Flower (Cyan)"; + sprite = "BSZ3D0"; + } + 1424 + { + title = "Short Flower (Yellow)"; + sprite = "BSZ3E0"; + } + 1425 + { + title = "Short Flower (Orange)"; + sprite = "BSZ3F0"; + } + 1430 + { + title = "Tulip (Red)"; + sprite = "BST1A0"; + } + 1431 + { + title = "Tulip (Purple)"; + sprite = "BST2A0"; + } + 1432 + { + title = "Tulip (Blue)"; + sprite = "BST3A0"; + } + 1433 + { + title = "Tulip (Cyan)"; + sprite = "BST4A0"; + } + 1434 + { + title = "Tulip (Yellow)"; + sprite = "BST5A0"; + } + 1435 + { + title = "Tulip (Orange)"; + sprite = "BST6A0"; + } + 1440 + { + title = "Cluster (Red)"; + sprite = "BSZ5A0"; + } + 1441 + { + title = "Cluster (Purple)"; + sprite = "BSZ5B0"; + } + 1442 + { + title = "Cluster (Blue)"; + sprite = "BSZ5C0"; + } + 1443 + { + title = "Cluster (Cyan)"; + sprite = "BSZ5D0"; + } + 1444 + { + title = "Cluster (Yellow)"; + sprite = "BSZ5E0"; + } + 1445 + { + title = "Cluster (Orange)"; + sprite = "BSZ5F0"; + } + 1450 + { + title = "Bush (Red)"; + sprite = "BSZ6A0"; + } + 1451 + { + title = "Bush (Purple)"; + sprite = "BSZ6B0"; + } + 1452 + { + title = "Bush (Blue)"; + sprite = "BSZ6C0"; + } + 1453 + { + title = "Bush (Cyan)"; + sprite = "BSZ6D0"; + } + 1454 + { + title = "Bush (Yellow)"; + sprite = "BSZ6E0"; + } + 1455 + { + title = "Bush (Orange)"; + sprite = "BSZ6F0"; + } + 1460 + { + title = "Vine (Red)"; + sprite = "BSZ7A0"; + } + 1461 + { + title = "Vine (Purple)"; + sprite = "BSZ7B0"; + } + 1462 + { + title = "Vine (Blue)"; + sprite = "BSZ7C0"; + } + 1463 + { + title = "Vine (Cyan)"; + sprite = "BSZ7D0"; + } + 1464 + { + title = "Vine (Yellow)"; + sprite = "BSZ7E0"; + } + 1465 + { + title = "Vine (Orange)"; + sprite = "BSZ7F0"; + } + 1470 + { + title = "BSZ Shrub"; + sprite = "BSZ8A0"; + } + 1471 + { + title = "BSZ Clover"; + sprite = "BSZ8B0"; + } + 1473 + { + title = "Palm Tree (Big)"; + width = 16; + height = 160; + sprite = "BSZ8D0"; + } + 1475 + { + title = "Palm Tree (Small)"; + width = 16; + height = 80; + sprite = "BSZ8F0"; + } } - 2208 + + azuretemple { - title = "Ram"; - sprite = "FL09A1"; + color = 10; // Green + title = "Azure Temple"; + + 1500 + { + arrow = 1; + blocking = 2; + title = "Glaregoyle"; + sprite = "BGARA1"; + width = 16; + height = 40; + } + 1501 + { + arrow = 1; + blocking = 2; + title = "Glaregoyle (Up)"; + sprite = "BGARA1"; + width = 16; + height = 40; + } + 1502 + { + arrow = 1; + blocking = 2; + title = "Glaregoyle (Down)"; + sprite = "BGARA1"; + width = 16; + height = 40; + } + 1503 + { + arrow = 1; + blocking = 2; + title = "Glaregoyle (Long)"; + sprite = "BGARA1"; + width = 16; + height = 40; + } + 1504 + { + title = "ATZ Target"; + sprite = "RCRYB0"; + width = 24; + height = 32; + } + 1505 + { + title = "Green Flame"; + sprite = "CFLMA0E0"; + width = 8; + height = 32; + } + 1506 + { + arrow = 1; + blocking = 2; + title = "Blue Gargoyle"; + sprite = "BGARD1"; + width = 16; + height = 40; + } } - 2209 + + dreamhill { - title = "Puffin"; - sprite = "FL10A1"; + color = 10; // Green + title = "Dream Hill"; + + 1600 + { + title = "Spring Tree"; + sprite = "TRE6A0"; + width = 16; + height = 32; + } + 1601 + { + title = "Shleep"; + sprite = "SHLPA0"; + width = 24; + height = 32; + } + 1602 + { + title = "Pian"; + sprite = "NTPNALAR"; + width = 16; + height = 32; + } } - 2210 + + nightstrk { - title = "Cow"; - sprite = "FL11A1"; + color = 13; // Pink + title = "NiGHTS Track"; + width = 8; + height = 4096; + sprite = "UNKNA0"; + + 1700 + { + title = "Axis"; + sprite = "internal:axis1"; + circle = 1; + } + 1701 + { + title = "Axis Transfer"; + sprite = "internal:axis2"; + } + 1702 + { + title = "Axis Transfer Line"; + sprite = "internal:axis3"; + } + 1710 + { + title = "Ideya Capture"; + sprite = "CAPSA0"; + width = 72; + height = 144; + } } - 2211 + + nights { - title = "Rat"; - sprite = "FL12A1"; + color = 13; // Pink + title = "NiGHTS Items"; + width = 16; + height = 32; + + 1703 + { + title = "Ideya Drone"; + sprite = "NDRNA1"; + width = 16; + height = 56; + } + 1704 + { + arrow = 1; + title = "NiGHTS Bumper"; + sprite = "NBMPG3G7"; + width = 32; + height = 64; + } + 1705 + { + arrow = 1; + title = "Hoop (Generic)"; + sprite = "HOOPA0"; + width = 80; + height = 160; + } + 1706 + { + title = "Blue Sphere"; + sprite = "SPHRA0"; + width = 16; + height = 24; + } + 1707 + { + title = "Super Paraloop"; + sprite = "NPRUA0"; + } + 1708 + { + title = "Drill Refill"; + sprite = "NPRUB0"; + } + 1709 + { + title = "Nightopian Helper"; + sprite = "NPRUC0"; + } + 1711 + { + title = "Extra Time"; + sprite = "NPRUD0"; + } + 1712 + { + title = "Link Freeze"; + sprite = "NPRUE0"; + } + 1713 + { + arrow = 1; + title = "Hoop (Customizable)"; + sprite = "HOOPA0"; + width = 80; + height = 160; + } + 1714 + { + title = "Ideya Anchor Point"; + sprite = "internal:axis1"; + width = 8; + height = 16; + } } - 2212 + + mario { - title = "Bear"; - sprite = "FL13A1"; + color = 6; // Brown + title = "Mario"; + + 1800 + { + title = "Coin"; + sprite = "COINA0"; + width = 16; + height = 24; + } + 1801 + { + arrow = 1; + title = "Goomba"; + sprite = "GOOMA0"; + width = 24; + height = 32; + } + 1802 + { + arrow = 1; + title = "Goomba (Blue)"; + sprite = "BGOMA0"; + width = 24; + height = 32; + } + 1803 + { + title = "Fire Flower"; + sprite = "FFWRB0"; + width = 16; + height = 32; + } + 1804 + { + title = "Koopa Shell"; + sprite = "SHLLA1"; + width = 16; + height = 20; + } + 1805 + { + title = "Puma (Jumping Fireball)"; + sprite = "PUMAA0"; + width = 8; + height = 16; + } + 1806 + { + title = "King Bowser"; + sprite = "KOOPA0"; + width = 16; + height = 48; + } + 1807 + { + title = "Axe"; + sprite = "MAXEA0"; + width = 8; + height = 16; + } + 1808 + { + title = "Bush (Short)"; + sprite = "MUS1A0"; + width = 16; + height = 32; + } + 1809 + { + title = "Bush (Tall)"; + sprite = "MUS2A0"; + width = 16; + height = 32; + } + 1810 + { + title = "Toad"; + sprite = "TOADA0"; + width = 8; + height = 32; + } } - 2213 + + christmasdisco { - title = "Dove"; - sprite = "FL14A1"; + color = 10; // Green + title = "Christmas & Disco"; + + 1850 + { + title = "Christmas Pole"; + sprite = "XMS1A0"; + width = 16; + height = 40; + } + 1851 + { + title = "Candy Cane"; + sprite = "XMS2A0"; + width = 8; + height = 32; + } + 1852 + { + blocking = 2; + title = "Snowman"; + sprite = "XMS3A0"; + width = 16; + height = 64; + } + 1853 + { + blocking = 2; + title = "Snowman (With Hat)"; + sprite = "XMS3B0"; + width = 16; + height = 80; + } + 1854 + { + title = "Lamp Post"; + sprite = "XMS4A0"; + width = 8; + height = 120; + } + 1855 + { + title = "Lamp Post (Snow)"; + sprite = "XMS4B0"; + width = 8; + height = 120; + } + 1856 + { + title = "Hanging Star"; + sprite = "XMS5A0"; + width = 4; + height = 80; + hangs = 1; + } + 1857 + { + title = "Berry Bush (Snow)"; + sprite = "BUS1B0"; + width = 16; + height = 32; + } + 1858 + { + title = "Bush (Snow)"; + sprite = "BUS2B0"; + width = 16; + height = 32; + } + 1859 + { + title = "Blueberry Bush (Snow)"; + sprite = "BUS3B0"; + width = 16; + height = 32; + } + 1875 + { + title = "Disco Ball"; + sprite = "DBALA0"; + width = 16; + height = 54; + hangs = 1; + } + 1876 + { + arrow = 1; + blocking = 2; + title = "Eggman Disco Statue"; + sprite = "ESTAB1"; + width = 20; + height = 96; + } } - 2214 + + stalagmites { - title = "Cat"; - sprite = "FL15A1"; + color = 10; // Green + title = "Stalagmites"; + width = 16; + height = 40; + + 1900 + { + title = "Brown Stalagmite (Tall)"; + sprite = "STLGA0"; + width = 16; + height = 40; + } + 1901 + { + title = "Brown Stalagmite"; + sprite = "STLGB0"; + width = 16; + height = 40; + } + 1902 + { + title = "Orange Stalagmite (Tall)"; + sprite = "STLGC0"; + width = 16; + height = 40; + } + 1903 + { + title = "Orange Stalagmite"; + sprite = "STLGD0"; + width = 16; + height = 40; + } + 1904 + { + title = "Red Stalagmite (Tall)"; + sprite = "STLGE0"; + width = 16; + height = 40; + } + 1905 + { + title = "Red Stalagmite"; + sprite = "STLGF0"; + width = 16; + height = 40; + } + 1906 + { + title = "Gray Stalagmite (Tall)"; + sprite = "STLGG0"; + width = 24; + height = 96; + } + 1907 + { + title = "Gray Stalagmite"; + sprite = "STLGH0"; + width = 16; + height = 40; + } + 1908 + { + title = "Blue Stalagmite (Tall)"; + sprite = "STLGI0"; + width = 16; + height = 40; + } + 1909 + { + title = "Blue Stalagmite"; + sprite = "STLGJ0"; + width = 16; + height = 40; + } } - 2215 + + hauntedheights { - title = "Canary"; - sprite = "FL16A1"; + color = 10; // Green + title = "Haunted Heights"; + + 2000 + { + title = "Smashing Spikeball"; + sprite = "FMCEA0"; + width = 18; + height = 28; + } + 2001 + { + title = "HHZ Grass"; + sprite = "HHZMA0"; + width = 16; + height = 40; + } + 2002 + { + title = "HHZ Tentacle 1"; + sprite = "HHZMB0"; + width = 16; + height = 40; + } + 2003 + { + title = "HHZ Tentacle 2"; + sprite = "HHZMC0"; + width = 16; + height = 40; + } + 2004 + { + title = "HHZ Stalagmite (Tall)"; + sprite = "HHZME0"; + width = 16; + height = 40; + } + 2005 + { + title = "HHZ Stalagmite (Short)"; + sprite = "HHZMF0"; + width = 16; + height = 40; + } + 2006 + { + title = "Jack-o'-lantern 1"; + sprite = "PUMKA0"; + width = 16; + height = 40; + } + 2007 + { + title = "Jack-o'-lantern 2"; + sprite = "PUMKB0"; + width = 16; + height = 40; + } + 2008 + { + title = "Jack-o'-lantern 3"; + sprite = "PUMKC0"; + width = 16; + height = 40; + } + 2009 + { + title = "Purple Mushroom"; + sprite = "SHRMD0"; + width = 16; + height = 48; + } + 2010 + { + title = "HHZ Tree"; + sprite = "HHPLC0"; + width = 12; + height = 40; + } } - 2216 + + frozenhillside { - title = "Spider"; - sprite = "FS01A1"; + color = 10; // Green + title = "Frozen Hillside"; + + 2100 + { + title = "Ice Shard (Small)"; + sprite = "FHZIA0"; + width = 8; + height = 32; + } + 2101 + { + title = "Ice Shard (Large)"; + sprite = "FHZIB0"; + width = 8; + height = 32; + } + 2102 + { + title = "Crystal Tree (Aqua)"; + sprite = "TRE3A0"; + width = 20; + height = 200; + } + 2103 + { + title = "Crystal Tree (Pink)"; + sprite = "TRE3B0"; + width = 20; + height = 200; + } + 2104 + { + title = "Amy Cameo"; + sprite = "ROSYA1"; + width = 16; + height = 48; + } + 2105 + { + title = "Mistletoe"; + sprite = "XMS6A0"; + width = 52; + height = 106; + } } - 2217 + + flickies { - title = "Bat"; - sprite = "FS02A0"; + color = 10; // Green + title = "Flickies"; + width = 8; + height = 20; + + 2200 + { + title = "Bluebird"; + sprite = "FL01A1"; + } + 2201 + { + title = "Rabbit"; + sprite = "FL02A1"; + } + 2202 + { + title = "Chicken"; + sprite = "FL03A1"; + } + 2203 + { + title = "Seal"; + sprite = "FL04A1"; + } + 2204 + { + title = "Pig"; + sprite = "FL05A1"; + } + 2205 + { + title = "Chipmunk"; + sprite = "FL06A1"; + } + 2206 + { + title = "Penguin"; + sprite = "FL07A1"; + } + 2207 + { + title = "Fish"; + sprite = "FL08A1"; + } + 2208 + { + title = "Ram"; + sprite = "FL09A1"; + } + 2209 + { + title = "Puffin"; + sprite = "FL10A1"; + } + 2210 + { + title = "Cow"; + sprite = "FL11A1"; + } + 2211 + { + title = "Rat"; + sprite = "FL12A1"; + } + 2212 + { + title = "Bear"; + sprite = "FL13A1"; + } + 2213 + { + title = "Dove"; + sprite = "FL14A1"; + } + 2214 + { + title = "Cat"; + sprite = "FL15A1"; + } + 2215 + { + title = "Canary"; + sprite = "FL16A1"; + } + 2216 + { + title = "Spider"; + sprite = "FS01A1"; + } + 2217 + { + title = "Bat"; + sprite = "FS02A0"; + } } } \ No newline at end of file diff --git a/extras/conf/udb/SRB2_22Doom.cfg b/extras/conf/udb/SRB2_22Doom.cfg index 891b9d507..9e733aa39 100644 --- a/extras/conf/udb/SRB2_22Doom.cfg +++ b/extras/conf/udb/SRB2_22Doom.cfg @@ -25,12 +25,6 @@ scriptlumpnames include("Includes\\SRB222_misc.cfg", "scriptlumpnames"); } -// THING TYPES -thingtypes -{ - include("Includes\\SRB222_things.cfg"); -} - //Default things filters thingsfilters { diff --git a/extras/conf/udb/SRB2_22UDMF.cfg b/extras/conf/udb/SRB2_22UDMF.cfg index 749cf499a..b6bd22478 100644 --- a/extras/conf/udb/SRB2_22UDMF.cfg +++ b/extras/conf/udb/SRB2_22UDMF.cfg @@ -25,12 +25,6 @@ scriptlumpnames include("Includes\\SRB222_misc.cfg", "scriptlumpnames"); } -// THING TYPES -thingtypes -{ - include("Includes\\SRB222_things.cfg"); -} - //Default things filters thingsfilters { From 2a2d70e7cf061446ac379a3e3d9d1f0732a4d64b Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 14 Dec 2021 20:29:14 +0100 Subject: [PATCH 193/377] Refactor some onconveyor stuff --- src/p_user.c | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 4858c6ddd..011a23215 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -5574,6 +5574,22 @@ INT32 P_GetPlayerControlDirection(player_t *player) return 1; // Controls pointing in player's general direction } +static boolean P_ShouldResetConveyorMomentum(player_t *player) +{ + switch (player->onconveyor) + { + case 1: + return false; + case 2: // Wind/Current + return !(player->mo->eflags & (MFE_UNDERWATER|MFE_TOUCHWATER)); + case 3: + default: + return true; + case 4: // Actual conveyor belt + return !P_IsObjectOnGround(player->mo); + } +} + // Control scheme for 2d levels. static void P_2dMovement(player_t *player) { @@ -5608,16 +5624,7 @@ static void P_2dMovement(player_t *player) } } - // cmomx/cmomy stands for the conveyor belt speed. - if (player->onconveyor == 2) // Wind/Current - { - //if (player->mo->z > player->mo->watertop || player->mo->z + player->mo->height < player->mo->waterbottom) - if (!(player->mo->eflags & (MFE_UNDERWATER|MFE_TOUCHWATER))) - player->cmomx = player->cmomy = 0; - } - else if (player->onconveyor == 4 && !P_IsObjectOnGround(player->mo)) // Actual conveyor belt - player->cmomx = player->cmomy = 0; - else if (player->onconveyor != 2 && player->onconveyor != 4 && player->onconveyor != 1) + if (P_ShouldResetConveyorMomentum(player)) player->cmomx = player->cmomy = 0; player->rmomx = player->mo->momx - player->cmomx; @@ -5800,16 +5807,7 @@ static void P_3dMovement(player_t *player) } movepushsideangle = movepushangle-ANGLE_90; - // cmomx/cmomy stands for the conveyor belt speed. - if (player->onconveyor == 2) // Wind/Current - { - //if (player->mo->z > player->mo->watertop || player->mo->z + player->mo->height < player->mo->waterbottom) - if (!(player->mo->eflags & (MFE_UNDERWATER|MFE_TOUCHWATER))) - player->cmomx = player->cmomy = 0; - } - else if (player->onconveyor == 4 && !P_IsObjectOnGround(player->mo)) // Actual conveyor belt - player->cmomx = player->cmomy = 0; - else if (player->onconveyor != 2 && player->onconveyor != 4 && player->onconveyor != 1) + if (P_ShouldResetConveyorMomentum(player)) player->cmomx = player->cmomy = 0; player->rmomx = player->mo->momx - player->cmomx; From ebf692f1432307fd9e79897914fc2d0669586cb0 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 16 Dec 2021 07:00:30 +0100 Subject: [PATCH 194/377] Adapt push/pull point to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 26 +- src/info.c | 28 -- src/info.h | 1 - src/p_mobj.c | 127 ++++++++- src/p_saveg.c | 38 --- src/p_setup.c | 57 ++++ src/p_spec.c | 287 +-------------------- src/p_spec.h | 23 +- src/p_tick.c | 8 +- 9 files changed, 216 insertions(+), 379 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 007196959..dd8e353eb 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -4504,13 +4504,27 @@ udmf 754 { - title = "Push Point"; + title = "Push/Pull Point"; sprite = "GWLGA0"; - } - 755 - { - title = "Pull Point"; - sprite = "GWLRA0"; + arg0 + { + title = "Radius"; + } + arg1 + { + title = "Strength"; + } + arg2 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Fade using XY"; + 2 = "Push using XYZ"; + 4 = "Non-exclusive"; + } + } } 756 { diff --git a/src/info.c b/src/info.c index f56e5d78e..f44659bda 100644 --- a/src/info.c +++ b/src/info.c @@ -20713,34 +20713,6 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, - // for use with wind and current effects - { // MT_PULL - 755, // doomednum - S_INVISIBLE, // spawnstate - 1000, // spawnhealth - S_NULL, // seestate - sfx_None, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 0, // speed - 8, // radius - 8, // height - 0, // display offset - 10, // mass - 0, // damage - sfx_None, // activesound - MF_NOBLOCKMAP|MF_NOGRAVITY, // flags - S_NULL // raisestate - }, - { // MT_GHOST -1, // doomednum S_THOK, // spawnstate diff --git a/src/info.h b/src/info.h index 031a08b43..28965f4b3 100644 --- a/src/info.h +++ b/src/info.h @@ -5046,7 +5046,6 @@ typedef enum mobj_type MT_CRUMBLEOBJ, // Sound generator for crumbling platform MT_TUBEWAYPOINT, MT_PUSH, - MT_PULL, MT_GHOST, MT_OVERLAY, MT_ANGLEMAN, diff --git a/src/p_mobj.c b/src/p_mobj.c index 5b4feb3ca..cf4e2ad6e 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9234,6 +9234,118 @@ static void P_DragonbomberThink(mobj_t *mobj) #undef DRAGONTURNSPEED } +static mobj_t *pushmobj; + +#define PUSH_FACTOR 7 + +static inline boolean PIT_PushThing(mobj_t *thing) +{ + if (thing->eflags & MFE_PUSHED) + return false; + + if (thing->player && thing->player->powers[pw_carry] == CR_ROPEHANG) + return false; + + if (!pushmobj) + return false; + + if (!pushmobj->spawnpoint) + return false; + + // Allow this to affect pushable objects at some point? + if (thing->player && !(thing->flags & (MF_NOGRAVITY|MF_NOCLIP))) + { + INT32 dist; + INT32 speed; + INT32 sx = pushmobj->x; + INT32 sy = pushmobj->y; + INT32 sz = pushmobj->z; + fixed_t radius = pushmobj->spawnpoint->args[0] << FRACBITS; + + if (pushmobj->spawnpoint->args[2] & TMPP_NOZFADE) + dist = P_AproxDistance(thing->x - sx, thing->y - sy); + else + { + // Make sure the Z is in range + if (thing->z < sz - radius || thing->z > sz + radius) + return false; + + dist = P_AproxDistance(P_AproxDistance(thing->x - sx, thing->y - sy), thing->z - sz); + } + + speed = (abs(pushmobj->spawnpoint->args[1]) - ((dist>>FRACBITS)>>1))<<(FRACBITS - PUSH_FACTOR - 1); + + // If speed <= 0, you're outside the effective radius. You also have + // to be able to see the push/pull source point. + + // Written with bits and pieces of P_HomingAttack + if ((speed > 0) && (P_CheckSight(thing, pushmobj))) + { + fixed_t tmpmomx, tmpmomy, tmpmomz; + + if (pushmobj->spawnpoint->args[2] & TMPP_PUSHZ) + { + tmpmomx = FixedMul(FixedDiv(sx - thing->x, dist), speed); + tmpmomy = FixedMul(FixedDiv(sy - thing->y, dist), speed); + tmpmomz = FixedMul(FixedDiv(sz - thing->z, dist), speed); + } + else + { + angle_t pushangle = R_PointToAngle2(thing->x, thing->y, sx, sy) >> ANGLETOFINESHIFT; + tmpmomx = FixedMul(speed, FINECOSINE(pushangle)); + tmpmomy = FixedMul(speed, FINESINE(pushangle)); + tmpmomz = 0; + } + + if (pushmobj->spawnpoint->args[1] > 0) // away! + { + tmpmomx *= -1; + tmpmomy *= -1; + tmpmomz *= -1; + } + + thing->momx += tmpmomx; + thing->momy += tmpmomy; + thing->momz += tmpmomz; + + if (thing->player) + { + thing->player->cmomx += tmpmomx; + thing->player->cmomy += tmpmomy; + thing->player->cmomx = FixedMul(thing->player->cmomx, 0xe800); + thing->player->cmomy = FixedMul(thing->player->cmomy, 0xe800); + } + } + } + + if (!(pushmobj->spawnpoint->args[2] & TMPP_NONEXCLUSIVE)) + thing->eflags |= MFE_PUSHED; + + return true; +} + +static void P_PointPushThink(mobj_t *mobj) +{ + INT32 xl, xh, yl, yh, bx, by; + fixed_t radius; + + if (!mobj->spawnpoint) + return; + + // Seek out all pushable things within the force radius of this + // point pusher. Crosses sectors, so use blockmap. + radius = mobj->spawnpoint->args[0] << FRACBITS; + + pushmobj = mobj; + xl = (unsigned)(mobj->x - radius - bmaporgx - MAXRADIUS)>>MAPBLOCKSHIFT; + xh = (unsigned)(mobj->x + radius - bmaporgx + MAXRADIUS)>>MAPBLOCKSHIFT; + yl = (unsigned)(mobj->y - radius - bmaporgy - MAXRADIUS)>>MAPBLOCKSHIFT; + yh = (unsigned)(mobj->y + radius - bmaporgy + MAXRADIUS)>>MAPBLOCKSHIFT; + for (bx = xl; bx <= xh; bx++) + for (by = yl; by <= yh; by++) + P_BlockThingsIterator(bx, by, PIT_PushThing); +} + static boolean P_MobjRegularThink(mobj_t *mobj) { if ((mobj->flags & MF_ENEMY) && (mobj->state->nextstate == mobj->info->spawnstate && mobj->tics == 1)) @@ -9721,6 +9833,9 @@ static boolean P_MobjRegularThink(mobj_t *mobj) else mobj->rollangle = R_PointToAngle2(0, 0, mobj->momz, (mobj->scale << 1) - min(abs(mobj->momz), mobj->scale << 1)); break; + case MT_PUSH: + P_PointPushThink(mobj); + break; case MT_SPINFIRE: if (mobj->flags & MF_NOGRAVITY) { @@ -12956,18 +13071,6 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean blueflag = mobj; bflagpoint = mobj->spawnpoint; break; - case MT_PUSH: - case MT_PULL: - mobj->health = 0; // Default behaviour: pushing uses XY, fading uses XYZ - - if (mthing->options & MTF_AMBUSH) - mobj->health |= 1; // If ambush is set, push using XYZ - if (mthing->options & MTF_OBJECTSPECIAL) - mobj->health |= 2; // If object special is set, fade using XY - - if (G_IsSpecialStage(gamemap)) - P_SetMobjState(mobj, (mobj->type == MT_PUSH) ? S_GRAVWELLGREEN : S_GRAVWELLRED); - break; case MT_NIGHTSSTAR: if (maptol & TOL_XMAS) P_SetMobjState(mobj, mobj->info->seestate); diff --git a/src/p_saveg.c b/src/p_saveg.c index bc9c31d64..689fa4d95 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1537,7 +1537,6 @@ typedef enum tc_scroll, tc_friction, tc_pusher, - tc_pointpusher, tc_laserflash, tc_lightfade, tc_executor, @@ -2191,19 +2190,6 @@ static inline void SavePusherThinker(const thinker_t *th, const UINT8 type) WRITEINT32(save_p, ht->slider); } -static inline void SavePointPusherThinker(const thinker_t* th, const UINT8 type) -{ - const pointpusher_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->magnitude); - WRITEINT32(save_p, ht->radius); - WRITEINT32(save_p, ht->x); - WRITEINT32(save_p, ht->y); - WRITEINT32(save_p, ht->z); - WRITEINT32(save_p, ht->affectee); - WRITEINT32(save_p, ht->exclusive); -} - static void SaveLaserThinker(const thinker_t *th, const UINT8 type) { const laserthink_t *ht = (const void *)th; @@ -2523,11 +2509,6 @@ static void P_NetArchiveThinkers(void) SavePusherThinker(th, tc_pusher); continue; } - else if (th->function.acp1 == (actionf_p1)T_PointPusher) - { - SavePointPusherThinker(th, tc_pointpusher); - continue; - } else if (th->function.acp1 == (actionf_p1)T_BounceCheese) { SaveBounceCheeseThinker(th, tc_bouncecheese); @@ -3344,21 +3325,6 @@ static thinker_t* LoadPusherThinker(actionf_p1 thinker) return &ht->thinker; } -static thinker_t* LoadPointPusherThinker(actionf_p1 thinker) -{ - pointpusher_t *ht = Z_Malloc(sizeof(*ht), PU_LEVSPEC, NULL); - ht->thinker.function.acp1 = thinker; - ht->magnitude = READINT32(save_p); - ht->radius = READINT32(save_p); - ht->x = READINT32(save_p); - ht->y = READINT32(save_p); - ht->z = READINT32(save_p); - ht->affectee = READINT32(save_p); - ht->exclusive = READINT32(save_p); - ht->source = P_GetPushThing(ht->affectee); - return &ht->thinker; -} - static inline thinker_t* LoadLaserThinker(actionf_p1 thinker) { laserthink_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); @@ -3821,10 +3787,6 @@ static void P_NetUnArchiveThinkers(void) th = LoadPusherThinker((actionf_p1)T_Pusher); break; - case tc_pointpusher: - th = LoadPointPusherThinker((actionf_p1)T_PointPusher); - break; - default: I_Error("P_UnarchiveSpecials: Unknown tclass %d in savegame", tclass); } diff --git a/src/p_setup.c b/src/p_setup.c index aecb4fe4d..ce4c764e4 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3146,6 +3146,28 @@ static void P_WriteConstant(INT32 constant, char **target) M_Memcpy(*target, buffer, strlen(buffer) + 1); } +static line_t *P_FindPointPushLine(taglist_t *list) +{ + INT32 i, l; + + for (i = 0; i < list->count; i++) + { + mtag_t tag = list->tags[i]; + TAG_ITER_LINES(tag, l) + { + if (Tag_FGet(&lines[l].tags) != tag) + continue; + + if (lines[l].special != 547) + continue; + + return &lines[l]; + } + } + + return NULL; +} + //For maps in binary format, converts setup of specials to UDMF format. static void P_ConvertBinaryMap(void) { @@ -4851,6 +4873,41 @@ static void P_ConvertBinaryMap(void) { switch (mapthings[i].type) { + case 754: //Push point + case 755: //Pull point + { + subsector_t *ss = R_PointInSubsector(mapthings[i].x << FRACBITS, mapthings[i].y << FRACBITS); + sector_t *s; + line_t *line; + + if (!ss) + { + CONS_Debug(DBG_GAMELOGIC, "Push/pull point: Placed outside of map bounds!\n"); + break; + } + + s = ss->sector; + line = P_FindPointPushLine(&s->tags); + + if (!line) + { + CONS_Debug(DBG_GAMELOGIC, "Push/pull point: Unable to find line of type 547 tagged to sector %s!\n", sizeu1((size_t)(s - sectors))); + break; + } + + mapthings[i].args[0] = mapthings[i].angle; + mapthings[i].args[1] = P_AproxDistance(line->dx >> FRACBITS, line->dy >> FRACBITS); + if (mapthings[i].type == 755) + mapthings[i].args[1] *= -1; + if (mapthings[i].options & MTF_OBJECTSPECIAL) + mapthings[i].args[2] |= TMPP_NOZFADE; + if (mapthings[i].options & MTF_AMBUSH) + mapthings[i].args[2] |= TMPP_PUSHZ; + if (!(line->flags & ML_NOCLIMB)) + mapthings[i].args[2] |= TMPP_NONEXCLUSIVE; + mapthings[i].type = 754; + break; + } case 762: //PolyObject spawn point (crush) { INT32 check = -1; diff --git a/src/p_spec.c b/src/p_spec.c index a1eb4183c..deb915eeb 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -98,7 +98,6 @@ typedef struct static void P_SpawnScrollers(void); static void P_SpawnFriction(void); static void P_SpawnPushers(void); -static void Add_PointPusher(INT32 magnitude, mobj_t *source, INT32 affectee, INT32 exclusive); static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, fixed_t z_mag, INT32 affectee, INT32 referrer, INT32 exclusive, INT32 slider); //SoM: 3/9/2000 static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); static void P_ResetFakeFloorFader(ffloor_t *rover, fade_t *data, boolean finalize); @@ -5331,7 +5330,6 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, I thinker_t *th; friction_t *f; pusher_t *p; - pointpusher_t *pp; size_t sec2num; size_t i; @@ -5442,13 +5440,6 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, I if (p->affectee == (INT32)sec2num) Add_Pusher(p->type, p->x_mag, p->y_mag, p->z_mag, (INT32)(sec-sectors), p->affectee, p->exclusive, p->slider); } - else if (th->function.acp1 == (actionf_p1)T_PointPusher) - { - pp = (pointpusher_t *)th; - - if (pp->affectee == (INT32)sec2num) - Add_PointPusher(pp->magnitude, pp->source, pp->affectee, pp->exclusive); - } if(secthinkers) i++; else th = th->next; @@ -6024,8 +6015,6 @@ void P_SpawnSpecials(boolean fromnetsave) secthinkers[((friction_t *)th)->affectee].count++; else if (th->function.acp1 == (actionf_p1)T_Pusher) secthinkers[((pusher_t *)th)->affectee].count++; - else if (th->function.acp1 == (actionf_p1)T_PointPusher) - secthinkers[((pointpusher_t *)th)->affectee].count++; } // Allocate each list, and then zero the count so we can use it to track @@ -6046,8 +6035,6 @@ void P_SpawnSpecials(boolean fromnetsave) secnum = ((friction_t *)th)->affectee; else if (th->function.acp1 == (actionf_p1)T_Pusher) secnum = ((pusher_t *)th)->affectee; - else if (th->function.acp1 == (actionf_p1)T_PointPusher) - secnum = ((pointpusher_t *)th)->affectee; if (secnum != (size_t)-1) secthinkers[secnum].thinkers[secthinkers[secnum].count++] = th; @@ -8328,26 +8315,6 @@ static void P_SpawnFriction(void) #define PUSH_FACTOR 7 -static void Add_PointPusher(INT32 magnitude, mobj_t *source, INT32 affectee, INT32 exclusive) -{ - pointpusher_t *p = Z_Calloc(sizeof * p, PU_LEVSPEC, NULL); - - p->thinker.function.acp1 = (actionf_p1)T_PointPusher; - p->source = source; - p->magnitude = magnitude; - p->exclusive = exclusive; - - if (source) // point source exist? - { - p->radius = AngleFixed(source->angle); - p->x = p->source->x; - p->y = p->source->y; - p->z = p->source->z; - } - p->affectee = affectee; - P_AddThinker(THINK_MAIN, &p->thinker); -} - /** Adds a pusher. * * \param type Type of push/pull effect. @@ -8382,187 +8349,6 @@ static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, fixed_t P_AddThinker(THINK_MAIN, &p->thinker); } -// PIT_PushThing determines the angle and magnitude of the effect. -// The object's x and y momentum values are changed. -static pointpusher_t *tmpusher; // pointpusher structure for blockmap searches - -/** Applies a point pusher/puller to a thing. - * - * \param thing Thing to be pushed. - * \return True if the thing was pushed. - * \todo Make a more robust P_BlockThingsIterator() so the hidden parameter - * ::tmpusher won't need to be used. - * \sa T_Pusher - */ -static inline boolean PIT_PushThing(mobj_t *thing) -{ - if (thing->eflags & MFE_PUSHED) - return false; - - if (thing->player && thing->player->powers[pw_carry] == CR_ROPEHANG) - return false; - - if (!tmpusher->source) - return false; - - // Allow this to affect pushable objects at some point? - if (thing->player && (!(thing->flags & (MF_NOGRAVITY | MF_NOCLIP)) || thing->player->powers[pw_carry] == CR_NIGHTSMODE)) - { - INT32 dist; - INT32 speed; - INT32 sx, sy, sz; - - sx = tmpusher->x; - sy = tmpusher->y; - sz = tmpusher->z; - - // don't fade wrt Z if health & 2 (mapthing has multi flag) - if (tmpusher->source->health & 2) - dist = P_AproxDistance(thing->x - sx,thing->y - sy); - else - { - // Make sure the Z is in range - if (thing->z < sz - tmpusher->radius || thing->z > sz + tmpusher->radius) - return false; - - dist = P_AproxDistance(P_AproxDistance(thing->x - sx, thing->y - sy), - thing->z - sz); - } - - speed = (tmpusher->magnitude - ((dist>>FRACBITS)>>1))<<(FRACBITS - PUSH_FACTOR - 1); - - // If speed <= 0, you're outside the effective radius. You also have - // to be able to see the push/pull source point. - - // Written with bits and pieces of P_HomingAttack - if ((speed > 0) && (P_CheckSight(thing, tmpusher->source))) - { - if (thing->player->powers[pw_carry] != CR_NIGHTSMODE) - { - // only push wrt Z if health & 1 (mapthing has ambush flag) - if (tmpusher->source->health & 1) - { - fixed_t tmpmomx, tmpmomy, tmpmomz; - - tmpmomx = FixedMul(FixedDiv(sx - thing->x, dist), speed); - tmpmomy = FixedMul(FixedDiv(sy - thing->y, dist), speed); - tmpmomz = FixedMul(FixedDiv(sz - thing->z, dist), speed); - if (tmpusher->source->type == MT_PUSH) // away! - { - tmpmomx *= -1; - tmpmomy *= -1; - tmpmomz *= -1; - } - - thing->momx += tmpmomx; - thing->momy += tmpmomy; - thing->momz += tmpmomz; - - if (thing->player) - { - thing->player->cmomx += tmpmomx; - thing->player->cmomy += tmpmomy; - thing->player->cmomx = FixedMul(thing->player->cmomx, 0xe800); - thing->player->cmomy = FixedMul(thing->player->cmomy, 0xe800); - } - } - else - { - angle_t pushangle; - - pushangle = R_PointToAngle2(thing->x, thing->y, sx, sy); - if (tmpusher->source->type == MT_PUSH) - pushangle += ANGLE_180; // away - pushangle >>= ANGLETOFINESHIFT; - thing->momx += FixedMul(speed, FINECOSINE(pushangle)); - thing->momy += FixedMul(speed, FINESINE(pushangle)); - - if (thing->player) - { - thing->player->cmomx += FixedMul(speed, FINECOSINE(pushangle)); - thing->player->cmomy += FixedMul(speed, FINESINE(pushangle)); - thing->player->cmomx = FixedMul(thing->player->cmomx, 0xe800); - thing->player->cmomy = FixedMul(thing->player->cmomy, 0xe800); - } - } - } - else - { - //NiGHTS-specific handling. - //By default, pushes and pulls only affect the Z-axis. - //By having the ambush flag, it affects the X-axis. - //By having the object special flag, it affects the Y-axis. - fixed_t tmpmomx, tmpmomy, tmpmomz; - - if (tmpusher->source->health & 1) - tmpmomx = FixedMul(FixedDiv(sx - thing->x, dist), speed); - else - tmpmomx = 0; - - if (tmpusher->source->health & 2) - tmpmomy = FixedMul(FixedDiv(sy - thing->y, dist), speed); - else - tmpmomy = 0; - - tmpmomz = FixedMul(FixedDiv(sz - thing->z, dist), speed); - - if (tmpusher->source->type == MT_PUSH) // away! - { - tmpmomx *= -1; - tmpmomy *= -1; - tmpmomz *= -1; - } - - thing->momx += tmpmomx; - thing->momy += tmpmomy; - thing->momz += tmpmomz; - - if (thing->player) - { - thing->player->cmomx += tmpmomx; - thing->player->cmomy += tmpmomy; - thing->player->cmomx = FixedMul(thing->player->cmomx, 0xe800); - thing->player->cmomy = FixedMul(thing->player->cmomy, 0xe800); - } - } - } - } - - if (tmpusher->exclusive) - thing->eflags |= MFE_PUSHED; - - return true; -} - -void T_PointPusher(pointpusher_t *p) -{ - INT32 xl, xh, yl, yh, bx, by; - sector_t *sec = sectors + p->affectee; - - // Be sure the special sector type is still turned on. If so, proceed. - // Else, bail out; the sector type has been changed on us. - - if (GETSECSPECIAL(sec->special, 3) != 2) - return; - - // Seek out all pushable things within the force radius of this - // point pusher. Crosses sectors, so use blockmap. - - tmpusher = p; // MT_PUSH/MT_PULL point source - tmbbox[BOXTOP] = p->y + p->radius; - tmbbox[BOXBOTTOM] = p->y - p->radius; - tmbbox[BOXRIGHT] = p->x + p->radius; - tmbbox[BOXLEFT] = p->x - p->radius; - - xl = (unsigned)(tmbbox[BOXLEFT] - bmaporgx - MAXRADIUS)>>MAPBLOCKSHIFT; - xh = (unsigned)(tmbbox[BOXRIGHT] - bmaporgx + MAXRADIUS)>>MAPBLOCKSHIFT; - yl = (unsigned)(tmbbox[BOXBOTTOM] - bmaporgy - MAXRADIUS)>>MAPBLOCKSHIFT; - yh = (unsigned)(tmbbox[BOXTOP] - bmaporgy + MAXRADIUS)>>MAPBLOCKSHIFT; - for (bx = xl; bx <= xh; bx++) - for (by = yl; by <= yh; by++) - P_BlockThingsIterator(bx, by, PIT_PushThing); -} - /** Applies a pusher to all affected objects. * * \param p Thinker for the pusher effect. @@ -8751,78 +8537,33 @@ void T_Pusher(pusher_t *p) } } - -/** Gets a push/pull object. - * - * \param s Sector number to look in. - * \return Pointer to the first ::MT_PUSH or ::MT_PULL object found in the - * sector. - * \sa P_GetTeleportDestThing, P_GetStarpostThing, P_GetAltViewThing - */ -mobj_t *P_GetPushThing(UINT32 s) -{ - mobj_t *thing; - sector_t *sec; - - sec = sectors + s; - thing = sec->thinglist; - while (thing) - { - switch (thing->type) - { - case MT_PUSH: - case MT_PULL: - return thing; - default: - break; - } - thing = thing->snext; - } - return NULL; -} - /** Spawns pushers. * - * \todo Remove magic numbers. * \sa P_SpawnSpecials, Add_Pusher */ static void P_SpawnPushers(void) { size_t i; line_t *l = lines; - mtag_t tag; register INT32 s; - mobj_t *thing; + fixed_t length, hspeed, dx, dy; for (i = 0; i < numlines; i++, l++) { - tag = Tag_FGet(&l->tags); - switch (l->special) - { - case 541: // wind/current - { - fixed_t length = R_PointToDist2(l->v2->x, l->v2->y, l->v1->x, l->v1->y); - fixed_t hspeed = l->args[1] << FRACBITS; - fixed_t dx = FixedMul(FixedDiv(l->dx, length), hspeed); - fixed_t dy = FixedMul(FixedDiv(l->dy, length), hspeed); + if (l->special != 541) + continue; - if (l->args[0] == 0) - Add_Pusher(l->args[3], dx, dy, l->args[2] << FRACBITS, (INT32)(l->frontsector - sectors), -1, !(l->args[4] & TMPF_NONEXCLUSIVE), !!(l->args[4] & TMPF_SLIDE)); - else - { - TAG_ITER_SECTORS(l->args[0], s) - Add_Pusher(l->args[3], dx, dy, l->args[2] << FRACBITS, s, -1, !(l->args[4] & TMPF_NONEXCLUSIVE), !!(l->args[4] & TMPF_SLIDE)); - } - break; - } - case 547: // push/pull - TAG_ITER_SECTORS(tag, s) - { - thing = P_GetPushThing(s); - if (thing) // No MT_P* means no effect - Add_PointPusher(P_AproxDistance(l->dx >> FRACBITS, l->dy >> FRACBITS), thing, s, l->flags & ML_NOCLIMB); - } - break; + length = R_PointToDist2(l->v2->x, l->v2->y, l->v1->x, l->v1->y); + hspeed = l->args[1] << FRACBITS; + dx = FixedMul(FixedDiv(l->dx, length), hspeed); + dy = FixedMul(FixedDiv(l->dy, length), hspeed); + + if (l->args[0] == 0) + Add_Pusher(l->args[3], dx, dy, l->args[2] << FRACBITS, (INT32)(l->frontsector - sectors), -1, !(l->args[4] & TMPF_NONEXCLUSIVE), !!(l->args[4] & TMPF_SLIDE)); + else + { + TAG_ITER_SECTORS(l->args[0], s) + Add_Pusher(l->args[3], dx, dy, l->args[2] << FRACBITS, s, -1, !(l->args[4] & TMPF_NONEXCLUSIVE), !!(l->args[4] & TMPF_SLIDE)); } } } diff --git a/src/p_spec.h b/src/p_spec.h index 94bd079b6..8e210b543 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -343,6 +343,14 @@ typedef enum TMPF_NONEXCLUSIVE = 1<<1, } textmappusherflags_t; + +typedef enum +{ + TMPP_NOZFADE = 1, + TMPP_PUSHZ = 1<<1, + TMPP_NONEXCLUSIVE = 1<<2, +} textmappointpushflags_t; + // GETSECSPECIAL (specialval, section) // // Pulls out the special # from a particular section. @@ -874,17 +882,6 @@ typedef struct INT32 slider; /// < Should the player go into an uncontrollable slide? } pusher_t; -typedef struct -{ - thinker_t thinker; ///< Thinker structure for push/pull effect. - mobj_t *source; ///< Point source. - INT32 magnitude; ///< Vector strength. - INT32 radius; ///< Effective radius. - INT32 x, y, z; ///< Point source. - INT32 affectee; ///< Number of affected sector. - INT32 exclusive; /// < Once this affect has been applied to a mobj, no other pushers may affect it. -} pointpusher_t; - // Model for disappearing/reappearing FOFs typedef struct { @@ -941,10 +938,8 @@ typedef struct void T_FadeColormap(fadecolormap_t *d); -// Prototype functions for pushers +// Prototype function for pushers void T_Pusher(pusher_t *p); -void T_PointPusher(pointpusher_t *p); -mobj_t *P_GetPushThing(UINT32 s); // Plane displacement typedef struct diff --git a/src/p_tick.c b/src/p_tick.c index d34272045..55a16fd81 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -66,8 +66,7 @@ void Command_Numthinkers_f(void) "\t2: P_NullPrecipThinker\n" "\t3: T_Friction\n" "\t4: T_Pusher\n" - "\t5: T_PointPusher\n" - "\t6: P_RemoveThinkerDelayed\n"); + "\t5: P_RemoveThinkerDelayed\n"); return; } @@ -104,11 +103,6 @@ void Command_Numthinkers_f(void) CONS_Printf(M_GetText("Number of %s: "), "T_Pusher"); break; case 5: - start = end = THINK_MAIN; - action = (actionf_p1)T_PointPusher; - CONS_Printf(M_GetText("Number of %s: "), "T_PointPusher"); - break; - case 6: action = (actionf_p1)P_RemoveThinkerDelayed; CONS_Printf(M_GetText("Number of %s: "), "P_RemoveThinkerDelayed"); break; From 1a1e5faf08eaa20f006b6c6a162da0890e52b253 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 18 Dec 2021 10:31:42 +0100 Subject: [PATCH 195/377] Adapt fan particle generator to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 11 ++++ extras/conf/udb/Includes/SRB222_things.cfg | 25 +++++++++ src/p_mobj.c | 58 ++++++++++++-------- src/p_setup.c | 18 ++++++ 4 files changed, 90 insertions(+), 22 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index d108821f7..c8b7ccf5f 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1591,6 +1591,17 @@ udmf } } + parameters + { + title = "Parameters"; + + 15 + { + title = "Fan Particle Generator Heights"; + prefix = "(15)"; + } + } + polyobject { title = "PolyObject"; diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index dd8e353eb..4d5bafb05 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -4539,6 +4539,31 @@ udmf sprite = "PRTLA0"; width = 8; height = 16; + arg0 + { + title = "Particles"; + } + arg1 + { + title = "Radius"; + } + arg2 + { + title = "Rising speed"; + } + arg3 + { + title = "Rotation speed"; + type = 8; + } + arg4 + { + title = "Spawn interval"; + } + arg5 + { + title = "Rising distance"; + } } 758 { diff --git a/src/p_mobj.c b/src/p_mobj.c index cf4e2ad6e..a336a5a9e 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7295,8 +7295,22 @@ static boolean P_ParticleGenSceneryThink(mobj_t *mobj) mobj->fuse = (tic_t)mobj->reactiontime; - bottomheight = lines[line].frontsector->floorheight; - topheight = lines[line].frontsector->ceilingheight - mobjinfo[(mobjtype_t)type].height; + if (line != -1) + { + bottomheight = lines[line].frontsector->floorheight; + topheight = lines[line].frontsector->ceilingheight - mobjinfo[(mobjtype_t)type].height; + } + else if (mobj->flags2 & MF2_OBJECTFLIP) + { + bottomheight = mobj->z - mobj->extravalue1; + topheight = mobj->z - mobjinfo[(mobjtype_t)type].height; + } + else + { + bottomheight = mobj->z; + topheight = mobj->z + mobj->extravalue1 - mobjinfo[(mobjtype_t)type].height; + } + if (mobj->waterbottom != bottomheight || mobj->watertop != topheight) { @@ -7305,7 +7319,8 @@ static boolean P_ParticleGenSceneryThink(mobj_t *mobj) else mobj->health = 0; - mobj->z = ((mobj->flags2 & MF2_OBJECTFLIP) ? topheight : bottomheight); + if (line != -1) + mobj->z = ((mobj->flags2 & MF2_OBJECTFLIP) ? topheight : bottomheight); } if (!mobj->health) @@ -12420,7 +12435,7 @@ static boolean P_SetupMace(mapthing_t *mthing, mobj_t *mobj, boolean *doangle) static boolean P_SetupParticleGen(mapthing_t *mthing, mobj_t *mobj) { - fixed_t radius, speed; + fixed_t radius, speed, zdist; INT32 type, numdivisions, anglespeed, ticcount; angle_t angledivision; INT32 line; @@ -12429,41 +12444,34 @@ static boolean P_SetupParticleGen(mapthing_t *mthing, mobj_t *mobj) // Find the corresponding linedef special, using angle as tag line = Tag_FindLineSpecial(15, mthing->angle); - if (line == -1) - { - CONS_Debug(DBG_GAMELOGIC, "Particle generator (mapthing #%s) needs to be tagged to a #15 parameter line (trying to find tag %d).\n", sizeu1(mthingi), mthing->angle); - return false; - } + type = mthing->stringargs[0] ? get_number(mthing->stringargs[0]) : MT_PARTICLE; - if (sides[lines[line].sidenum[0]].toptexture) - type = sides[lines[line].sidenum[0]].toptexture; // Set as object type in p_setup.c... - else - type = (INT32)MT_PARTICLE; - - if (!lines[line].backsector - || (ticcount = (sides[lines[line].sidenum[1]].textureoffset >> FRACBITS)) < 1) + ticcount = mthing->args[4]; + if (ticcount < 1) ticcount = 3; - numdivisions = mthing->z; + numdivisions = mthing->args[0]; if (numdivisions) { - radius = R_PointToDist2(lines[line].v1->x, lines[line].v1->y, lines[line].v2->x, lines[line].v2->y); - anglespeed = (sides[lines[line].sidenum[0]].rowoffset >> FRACBITS) % 360; + radius = mthing->args[1] << FRACBITS; + anglespeed = (mthing->args[3]) % 360; angledivision = 360/numdivisions; } else { - numdivisions = 1; // Simple trick to make A_ParticleSpawn simpler. + numdivisions = 1; // Simple trick to make P_ParticleGenSceneryThink simpler. radius = 0; anglespeed = 0; angledivision = 0; } - speed = abs(sides[lines[line].sidenum[0]].textureoffset); + speed = abs(mthing->args[2]) << FRACBITS; if (mthing->options & MTF_OBJECTFLIP) speed *= -1; + zdist = abs(mthing->args[5]) << FRACBITS; + CONS_Debug(DBG_GAMELOGIC, "Particle Generator (mapthing #%s):\n" "Radius is %d\n" "Speed is %d\n" @@ -12471,9 +12479,14 @@ static boolean P_SetupParticleGen(mapthing_t *mthing, mobj_t *mobj) "Numdivisions is %d\n" "Angledivision is %d\n" "Type is %d\n" - "Tic seperation is %d\n", + "Tic separation is %d\n", sizeu1(mthingi), radius, speed, anglespeed, numdivisions, angledivision, type, ticcount); + if (line == -1) + CONS_Debug(DBG_GAMELOGIC, "Spawn Z is %d\nZ dist is %d\n", mobj->z, zdist); + else + CONS_Debug(DBG_GAMELOGIC, "Heights are taken from control sector\n"); + mobj->angle = 0; mobj->movefactor = speed; mobj->lastlook = numdivisions; @@ -12482,6 +12495,7 @@ static boolean P_SetupParticleGen(mapthing_t *mthing, mobj_t *mobj) mobj->friction = radius; mobj->threshold = type; mobj->reactiontime = ticcount; + mobj->extravalue1 = zdist; mobj->cvmem = line; mobj->watertop = mobj->waterbottom = 0; return true; diff --git a/src/p_setup.c b/src/p_setup.c index ce4c764e4..1b1d9b85d 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4908,6 +4908,24 @@ static void P_ConvertBinaryMap(void) mapthings[i].type = 754; break; } + case 757: //Fan particle generator + { + INT32 j = Tag_FindLineSpecial(15, mapthings[i].angle); + + if (j == -1) + { + CONS_Debug(DBG_GAMELOGIC, "Particle generator (mapthing #%d) needs to be tagged to a #15 parameter line (trying to find tag %d).\n", i, mapthings[i].angle); + break; + } + mapthings[i].args[0] = mapthings[i].z; + mapthings[i].args[1] = R_PointToDist2(lines[j].v1->x, lines[j].v1->y, lines[j].v2->x, lines[j].v2->y) >> FRACBITS; + mapthings[i].args[2] = sides[lines[j].sidenum[0]].textureoffset >> FRACBITS; + mapthings[i].args[3] = sides[lines[j].sidenum[0]].rowoffset >> FRACBITS; + mapthings[i].args[4] = lines[j].backsector ? sides[lines[j].sidenum[1]].textureoffset >> FRACBITS : 0; + if (sides[lines[j].sidenum[0]].toptexture) + P_WriteConstant(sides[lines[j].sidenum[0]].toptexture, &mapthings[i].stringargs[0]); + break; + } case 762: //PolyObject spawn point (crush) { INT32 check = -1; From 482c24a1fb62824d5812852ef07a26f965ec939f Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 18 Dec 2021 10:45:50 +0100 Subject: [PATCH 196/377] Adapt NiGHTS track items to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 46 ++++++++++++++++++++++ src/p_mobj.c | 20 +++++----- src/p_setup.c | 13 ++++++ 3 files changed, 68 insertions(+), 11 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 4d5bafb05..a0bc6f07f 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -6010,16 +6010,54 @@ udmf title = "Axis"; sprite = "internal:axis1"; circle = 1; + arg0 + { + title = "Mare"; + } + arg1 + { + title = "Order"; + } + arg2 + { + title = "Radius"; + } + arg3 + { + title = "Direction"; + type = 11; + enum + { + 0 = "Clockwise"; + 1 = "Counterclockwise"; + } + } } 1701 { title = "Axis Transfer"; sprite = "internal:axis2"; + arg0 + { + title = "Mare"; + } + arg1 + { + title = "Order"; + } } 1702 { title = "Axis Transfer Line"; sprite = "internal:axis3"; + arg0 + { + title = "Mare"; + } + arg1 + { + title = "Order"; + } } 1710 { @@ -6027,6 +6065,14 @@ udmf sprite = "CAPSA0"; width = 72; height = 144; + arg0 + { + title = "Mare"; + } + arg1 + { + title = "Required spheres"; + } } } diff --git a/src/p_mobj.c b/src/p_mobj.c index a336a5a9e..5defc9f2f 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12823,11 +12823,10 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean P_SetMobjState(mobj, mobj->info->spawnstate + mobj->threshold); break; case MT_EGGCAPSULE: - if (mthing->angle <= 0) - mthing->angle = 20; // prevent 0 health - - mobj->health = mthing->angle; - mobj->threshold = min(mthing->extrainfo, 7); + mobj->threshold = min(mthing->args[0], 7); + mobj->health = mthing->args[1]; + if (mobj->health <= 0) + mobj->health = 20; // prevent 0 health break; case MT_TUBEWAYPOINT: { @@ -12940,20 +12939,19 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean return false; break; case MT_AXIS: - // Inverted if uppermost bit is set - if (mthing->angle & 16384) + // Inverted if args[3] is set + if (mthing->args[3]) mobj->flags2 |= MF2_AMBUSH; - if (mthing->angle > 0) - mobj->radius = (mthing->angle & 16383) << FRACBITS; + mobj->radius = abs(mthing->args[2]) << FRACBITS; // FALLTHRU case MT_AXISTRANSFER: case MT_AXISTRANSFERLINE: // Mare it belongs to - mobj->threshold = min(mthing->extrainfo, 7); + mobj->threshold = min(mthing->args[0], 7); // # in the mare - mobj->health = mthing->options; + mobj->health = mthing->args[1]; mobj->flags2 |= MF2_AXIS; break; diff --git a/src/p_setup.c b/src/p_setup.c index 1b1d9b85d..f1f37eb48 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -5017,6 +5017,19 @@ static void P_ConvertBinaryMap(void) P_WriteConstant(MT_ROCKCRUMBLE1 + (sides[lines[j].sidenum[0]].rowoffset >> FRACBITS), &mapthings[i].stringargs[0]); break; } + case 1700: //Axis + mapthings[i].args[2] = mapthings[i].angle & 16383; + mapthings[i].args[3] = !!(mapthings[i].angle & 16384); + /* FALLTHRU */ + case 1701: //Axis transfer + case 1702: //Axis transfer line + mapthings[i].args[0] = mapthings[i].extrainfo; + mapthings[i].args[1] = mapthings[i].options; + break; + case 1710: //Ideya capture + mapthings[i].args[0] = mapthings[i].extrainfo; + mapthings[i].args[1] = mapthings[i].angle; + break; default: break; } From 59c6d59c00bb385789b1f7faebca4a3f787ea27f Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 19 Dec 2021 10:16:03 +0100 Subject: [PATCH 197/377] Adapt NiGHTS things to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 18 +++++----- src/m_cheat.c | 4 +-- src/p_mobj.c | 41 +++++++--------------- src/p_saveg.c | 2 +- src/p_setup.c | 20 ++++++++++- 5 files changed, 44 insertions(+), 41 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index a0bc6f07f..cd9d360c8 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -6098,14 +6098,6 @@ udmf width = 32; height = 64; } - 1705 - { - arrow = 1; - title = "Hoop (Generic)"; - sprite = "HOOPA0"; - width = 80; - height = 160; - } 1706 { title = "Blue Sphere"; @@ -6141,10 +6133,14 @@ udmf 1713 { arrow = 1; - title = "Hoop (Customizable)"; + title = "Hoop"; sprite = "HOOPA0"; width = 80; height = 160; + arg0 + { + title = "Radius"; + } } 1714 { @@ -6152,6 +6148,10 @@ udmf sprite = "internal:axis1"; width = 8; height = 16; + arg0 + { + title = "Mare"; + } } } diff --git a/src/m_cheat.c b/src/m_cheat.c index ef896c991..52202f808 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -1285,7 +1285,7 @@ void OP_NightsObjectplace(player_t *player) if (mt->type >= 600 && mt->type <= 609) // Placement patterns P_SpawnItemPattern(mt, false); - else if (mt->type == 1705 || mt->type == 1713) // NiGHTS Hoops + else if (mt->type == 1713) // NiGHTS Hoops P_SpawnHoop(mt); else P_SpawnMapThing(mt); @@ -1416,7 +1416,7 @@ void OP_ObjectplaceMovement(player_t *player) mt = OP_CreateNewMapThing(player, (UINT16)spawnthing, ceiling); if (mt->type >= 600 && mt->type <= 609) // Placement patterns P_SpawnItemPattern(mt, false); - else if (mt->type == 1705 || mt->type == 1713) // NiGHTS Hoops + else if (mt->type == 1713) // NiGHTS Hoops P_SpawnHoop(mt); else P_SpawnMapThing(mt); diff --git a/src/p_mobj.c b/src/p_mobj.c index 5defc9f2f..4d5784129 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -11769,11 +11769,6 @@ fixed_t P_GetMapThingSpawnHeight(const mobjtype_t mobjtype, const mapthing_t* mt switch (mobjtype) { - // Bumpers never spawn flipped. - case MT_NIGHTSBUMPER: - flip = false; - break; - // Objects with a non-zero default height. case MT_CRAWLACOMMANDER: case MT_DETON: @@ -11883,7 +11878,7 @@ static boolean P_SpawnNonMobjMapThing(mapthing_t *mthing) } else if (mthing->type == 750 // Slope vertex point (formerly chaos spawn) || (mthing->type >= 600 && mthing->type <= 609) // Special placement patterns - || mthing->type == 1705 || mthing->type == 1713) // Hoops + || mthing->type == 1713) // Hoops return true; // These are handled elsewhere. else if (mthing->type == mobjinfo[MT_EMERHUNT].doomednum) { @@ -12817,9 +12812,8 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean mobj->threshold = (TICRATE*2)-1; break; case MT_NIGHTSBUMPER: - // Lower 4 bits specify the angle of - // the bumper in 30 degree increments. - mobj->threshold = (mthing->options & 15) % 12; // It loops over, etc + // Pitch of the bumper is set in 30 degree increments. + mobj->threshold = ((mthing->pitch/30) + 3) % 12; P_SetMobjState(mobj, mobj->info->spawnstate + mobj->threshold); break; case MT_EGGCAPSULE: @@ -12838,7 +12832,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean break; } case MT_IDEYAANCHOR: - mobj->health = mthing->extrainfo; + mobj->health = mthing->args[0]; break; case MT_NIGHTSDRONE: if (!P_SetupNiGHTSDrone(mthing, mobj)) @@ -13258,13 +13252,18 @@ mobj_t *P_SpawnMapThing(mapthing_t *mthing) return P_SpawnMobjFromMapThing(mthing, x, y, z, i); } -static void P_SpawnHoopInternal(mapthing_t *mthing, INT32 hoopsize, fixed_t sizefactor) +void P_SpawnHoop(mapthing_t *mthing) { + if (metalrecording) + return; + mobj_t *mobj = NULL; mobj_t *nextmobj = NULL; mobj_t *hoopcenter; TMatrix *pitchmatrix, *yawmatrix; - fixed_t radius = hoopsize*sizefactor; + fixed_t radius = mthing->args[0] << FRACBITS; + fixed_t sizefactor = 4*FRACUNIT; + fixed_t hoopsize = radius/sizefactor; INT32 i; angle_t fa; TVector v, *res; @@ -13281,10 +13280,9 @@ static void P_SpawnHoopInternal(mapthing_t *mthing, INT32 hoopsize, fixed_t size hoopcenter->y = y; P_SetThingPosition(hoopcenter); - // Scale 0-255 to 0-359 =( - hoopcenter->movedir = ((mthing->angle & 255)*360)/256; // Pitch + hoopcenter->movedir = mthing->pitch; pitchmatrix = RotateXMatrix(FixedAngle(hoopcenter->movedir << FRACBITS)); - hoopcenter->movecount = (((UINT16)mthing->angle >> 8)*360)/256; // Yaw + hoopcenter->movecount = mthing->angle; yawmatrix = RotateZMatrix(FixedAngle(hoopcenter->movecount << FRACBITS)); // For the hoop when it flies away @@ -13364,19 +13362,6 @@ static void P_SpawnHoopInternal(mapthing_t *mthing, INT32 hoopsize, fixed_t size } while (hoopsize >= 8); } -void P_SpawnHoop(mapthing_t *mthing) -{ - if (metalrecording) - return; - - if (mthing->type == 1705) // Generic hoop - P_SpawnHoopInternal(mthing, 24, 4*FRACUNIT); - else // Customizable hoop - // For each flag add 16 fracunits to the size - // Default (0 flags) is 32 fracunits - P_SpawnHoopInternal(mthing, 8 + (4*(mthing->options & 0xF)), 4*FRACUNIT); -} - void P_SetBonusTime(mobj_t *mobj) { if (!mobj) diff --git a/src/p_saveg.c b/src/p_saveg.c index 689fa4d95..b505bdf88 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2736,7 +2736,7 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) { UINT16 spawnpointnum = READUINT16(save_p); - if (mapthings[spawnpointnum].type == 1705 || mapthings[spawnpointnum].type == 1713) // NiGHTS Hoop special case + if (mapthings[spawnpointnum].type == 1713) // NiGHTS Hoop special case { P_SpawnHoop(&mapthings[spawnpointnum]); return NULL; diff --git a/src/p_setup.c b/src/p_setup.c index f1f37eb48..aafe89ab3 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -895,7 +895,7 @@ static void P_SpawnMapThings(boolean spawnemblems) if (mt->type >= 600 && mt->type <= 609) // item patterns P_SpawnItemPattern(mt, false); - else if (mt->type == 1705 || mt->type == 1713) // hoops + else if (mt->type == 1713) // hoops P_SpawnHoop(mt); else // Everything else P_SpawnMapThing(mt); @@ -5026,10 +5026,28 @@ static void P_ConvertBinaryMap(void) mapthings[i].args[0] = mapthings[i].extrainfo; mapthings[i].args[1] = mapthings[i].options; break; + case 1704: //NiGHTS bumper + mapthings[i].pitch = 30 * (((mapthings[i].options & 15) + 9) % 12); + mapthings[i].options &= ~0xF; + break; + case 1705: //Hoop + case 1713: //Hoop (Customizable) + { + UINT16 oldangle = mapthings[i].angle; + mapthings[i].angle = ((oldangle >> 8)*360)/256; + mapthings[i].pitch = ((oldangle & 255)*360)/256; + mapthings[i].args[0] = (mapthings[i].type == 1705) ? 96 : (mapthings[i].options & 0xF)*16 + 32; + mapthings[i].options &= ~0xF; + mapthings[i].type = 1713; + break; + } case 1710: //Ideya capture mapthings[i].args[0] = mapthings[i].extrainfo; mapthings[i].args[1] = mapthings[i].angle; break; + case 1714: //Ideya anchor point + mapthings[i].args[0] = mapthings[i].extrainfo; + break; default: break; } From db1f2153277382861becb8bcda9014ea5842b874 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 20 Dec 2021 21:14:39 +0100 Subject: [PATCH 198/377] Implement generic item rows and circles --- extras/conf/udb/Includes/SRB222_things.cfg | 40 ++++++++++++++++ src/m_cheat.c | 4 +- src/p_mobj.c | 56 ++++++++++++++++++++-- src/p_setup.c | 12 ++--- 4 files changed, 101 insertions(+), 11 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index cd9d360c8..86fe6b1a5 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -4397,6 +4397,46 @@ udmf sprite = "SPHRA0"; width = 192; } + 610 + { + title = "Row of Items"; + sprite = "RINGA0"; + arg0 + { + title = "Number of items"; + } + arg1 + { + title = "Horizontal spacing"; + } + arg2 + { + title = "Vertical spacing"; + } + stringarg0 + { + title = "Object types"; + } + } + 611 + { + title = "Circle of Items"; + sprite = "RINGA0"; + width = 96; + height = 192; + arg0 + { + title = "Number of items"; + } + arg1 + { + title = "Radius"; + } + stringarg0 + { + title = "Object types"; + } + } } invisible diff --git a/src/m_cheat.c b/src/m_cheat.c index 52202f808..ddc1f6f29 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -1283,7 +1283,7 @@ void OP_NightsObjectplace(player_t *player) mt = OP_CreateNewMapThing(player, (UINT16)cv_mapthingnum.value, false); mt->angle = angle; - if (mt->type >= 600 && mt->type <= 609) // Placement patterns + if (mt->type >= 600 && mt->type <= 611) // Placement patterns P_SpawnItemPattern(mt, false); else if (mt->type == 1713) // NiGHTS Hoops P_SpawnHoop(mt); @@ -1414,7 +1414,7 @@ void OP_ObjectplaceMovement(player_t *player) return; mt = OP_CreateNewMapThing(player, (UINT16)spawnthing, ceiling); - if (mt->type >= 600 && mt->type <= 609) // Placement patterns + if (mt->type >= 600 && mt->type <= 611) // Placement patterns P_SpawnItemPattern(mt, false); else if (mt->type == 1713) // NiGHTS Hoops P_SpawnHoop(mt); diff --git a/src/p_mobj.c b/src/p_mobj.c index 4d5784129..beed59e8f 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -11877,7 +11877,7 @@ static boolean P_SpawnNonMobjMapThing(mapthing_t *mthing) return true; } else if (mthing->type == 750 // Slope vertex point (formerly chaos spawn) - || (mthing->type >= 600 && mthing->type <= 609) // Special placement patterns + || (mthing->type >= 600 && mthing->type <= 611) // Special placement patterns || mthing->type == 1713) // Hoops return true; // These are handled elsewhere. else if (mthing->type == mobjinfo[MT_EMERHUNT].doomednum) @@ -13373,7 +13373,7 @@ void P_SetBonusTime(mobj_t *mobj) P_SetMobjState(mobj, mobj->info->raisestate); } -static void P_SpawnItemRow(mapthing_t *mthing, mobjtype_t* itemtypes, UINT8 numitemtypes, INT32 numitems, fixed_t horizontalspacing, fixed_t verticalspacing, INT16 fixedangle, boolean bonustime) +static void P_SpawnItemRow(mapthing_t *mthing, mobjtype_t *itemtypes, UINT8 numitemtypes, INT32 numitems, fixed_t horizontalspacing, fixed_t verticalspacing, INT16 fixedangle, boolean bonustime) { mapthing_t dummything; mobj_t *mobj = NULL; @@ -13424,7 +13424,7 @@ static void P_SpawnItemRow(mapthing_t *mthing, mobjtype_t* itemtypes, UINT8 numi } } -static void P_SpawnSingularItemRow(mapthing_t* mthing, mobjtype_t itemtype, INT32 numitems, fixed_t horizontalspacing, fixed_t verticalspacing, INT16 fixedangle, boolean bonustime) +static void P_SpawnSingularItemRow(mapthing_t *mthing, mobjtype_t itemtype, INT32 numitems, fixed_t horizontalspacing, fixed_t verticalspacing, INT16 fixedangle, boolean bonustime) { mobjtype_t itemtypes[1] = { itemtype }; return P_SpawnItemRow(mthing, itemtypes, 1, numitems, horizontalspacing, verticalspacing, fixedangle, bonustime); @@ -13488,6 +13488,35 @@ static void P_SpawnItemCircle(mapthing_t *mthing, mobjtype_t *itemtypes, UINT8 n } } +static void P_ParseItemTypes(char *itemstring, mobjtype_t *itemtypes, UINT8 *numitemtypes) +{ + char *tok; + + *numitemtypes = 0; + if (itemstring) + { + char *stringcopy = Z_Malloc(strlen(itemstring) + 1, PU_LEVEL, NULL); + M_Memcpy(stringcopy, itemstring, strlen(itemstring)); + stringcopy[strlen(itemstring)] = '\0'; + + tok = strtok(stringcopy, " "); + while (tok && *numitemtypes < 128) + { + itemtypes[*numitemtypes] = get_number(tok); + tok = strtok(NULL, " "); + (*numitemtypes)++; + } + + Z_Free(stringcopy); + } + else + { + //If no types are supplied, default to ring + itemtypes[0] = MT_RING; + *numitemtypes = 1; + } +} + void P_SpawnItemPattern(mapthing_t *mthing, boolean bonustime) { switch (mthing->type) @@ -13525,6 +13554,27 @@ void P_SpawnItemPattern(mapthing_t *mthing, boolean bonustime) P_SpawnItemCircle(mthing, itemtypes, 2, numitems, size, bonustime); return; } + case 610: // Generic item row + { + mobjtype_t itemtypes[128]; //If you want to have a row with more than 128 different object types, you're crazy. + UINT8 numitemtypes; + if (!udmf) + return; + P_ParseItemTypes(mthing->stringargs[0], itemtypes, &numitemtypes); + P_SpawnItemRow(mthing, itemtypes, numitemtypes, mthing->args[0], mthing->args[1] << FRACBITS, mthing->args[2] << FRACBITS, mthing->angle, bonustime); + return; + } + case 611: // Generic item circle + { + mobjtype_t itemtypes[128]; //If you want to have a circle with more than 128 different object types, you're crazy. + UINT8 numitemtypes; + if (!udmf) + return; + CONS_Printf("Itemstring: %s\n", mthing->stringargs[0]); + P_ParseItemTypes(mthing->stringargs[0], itemtypes, &numitemtypes); + P_SpawnItemCircle(mthing, itemtypes, numitemtypes, mthing->args[0], mthing->args[1] << FRACBITS, bonustime); + return; + } default: return; } diff --git a/src/p_setup.c b/src/p_setup.c index aafe89ab3..25250b449 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -734,7 +734,7 @@ void P_ReloadRings(void) mt->mobj = NULL; P_SetBonusTime(P_SpawnMapThing(mt)); } - else if (mt->type >= 600 && mt->type <= 609) // Item patterns + else if (mt->type >= 600 && mt->type <= 611) // Item patterns { mt->mobj = NULL; P_SpawnItemPattern(mt, true); @@ -893,7 +893,7 @@ static void P_SpawnMapThings(boolean spawnemblems) mt->mobj = NULL; - if (mt->type >= 600 && mt->type <= 609) // item patterns + if (mt->type >= 600 && mt->type <= 611) // item patterns P_SpawnItemPattern(mt, false); else if (mt->type == 1713) // hoops P_SpawnHoop(mt); @@ -1701,9 +1701,9 @@ static void ParseTextmapLinedefParameter(UINT32 i, char *param, char *val) P_SetLinedefV1(i, atol(val)); else if (fastcmp(param, "v2")) P_SetLinedefV2(i, atol(val)); - else if (strlen(param) == 7 && fastncmp(param, "arg", 3) && fastncmp(param + 4, "str", 3)) + else if (fastncmp(param, "stringarg", 9) && strlen(param) > 9) { - size_t argnum = param[3] - '0'; + size_t argnum = atol(param + 9); if (argnum >= NUMLINESTRINGARGS) return; lines[i].stringargs[argnum] = Z_Malloc(strlen(val) + 1, PU_LEVEL, NULL); @@ -1800,9 +1800,9 @@ static void ParseTextmapThingParameter(UINT32 i, char *param, char *val) else if (fastcmp(param, "ambush") && fastcmp("true", val)) mapthings[i].options |= MTF_AMBUSH; - else if (strlen(param) == 7 && fastncmp(param, "arg", 3) && fastncmp(param + 4, "str", 3)) + else if (fastncmp(param, "stringarg", 9) && strlen(param) > 9) { - size_t argnum = param[3] - '0'; + size_t argnum = atol(param + 9); if (argnum >= NUMMAPTHINGSTRINGARGS) return; mapthings[i].stringargs[argnum] = Z_Malloc(strlen(val) + 1, PU_LEVEL, NULL); From 72e2c24fdb714698f1a3c23f1c9035e5a387d3b4 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 20 Dec 2021 23:28:18 +0100 Subject: [PATCH 199/377] Adapt some reserved tags to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 15 +++++++++ src/info.c | 2 +- src/info.h | 2 ++ src/p_enemy.c | 36 +++++++++++++++++++++- src/p_inter.c | 3 +- src/p_setup.c | 9 ++++++ 6 files changed, 64 insertions(+), 3 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 86fe6b1a5..0efe006fb 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -258,6 +258,11 @@ doom sprite = "TRETA1"; width = 16; height = 32; + arg0 + { + title = "Death trigger tag"; + type = 15; + } } 111 { @@ -2704,6 +2709,11 @@ doom sprite = "KOOPA0"; width = 16; height = 48; + arg0 + { + title = "Death trigger tag"; + type = 15; + } } 1807 { @@ -2711,6 +2721,11 @@ doom sprite = "MAXEA0"; width = 8; height = 16; + arg0 + { + title = "Death trigger tag"; + type = 15; + } } 1808 { diff --git a/src/info.c b/src/info.c index f44659bda..d456d2afe 100644 --- a/src/info.c +++ b/src/info.c @@ -899,7 +899,7 @@ state_t states[NUMSTATES] = {SPR_TRET, FF_FULLBRIGHT|2, 7, {A_Pain}, 0, 0, S_TURRETSHOCK7}, // S_TURRETSHOCK6 {SPR_TRET, FF_FULLBRIGHT|3, 7, {NULL}, 0, 0, S_TURRETSHOCK8}, // S_TURRETSHOCK7 {SPR_TRET, FF_FULLBRIGHT|4, 7, {NULL}, 0, 0, S_TURRETSHOCK9}, // S_TURRETSHOCK8 - {SPR_TRET, FF_FULLBRIGHT|4, 7, {A_LinedefExecute}, LE_TURRET, 0, S_XPLD1}, // S_TURRETSHOCK9 + {SPR_TRET, FF_FULLBRIGHT|4, 7, {A_LinedefExecuteFromArg}, 0, 0, S_XPLD1}, // S_TURRETSHOCK9 {SPR_TURR, 0, 1, {A_Look}, 1, 0, S_TURRETPOPDOWN8}, // S_TURRETLOOK {SPR_TURR, 0, 0, {A_FaceTarget}, 0, 0, S_TURRETPOPUP1}, // S_TURRETSEE diff --git a/src/info.h b/src/info.h index 28965f4b3..d5fcc8504 100644 --- a/src/info.h +++ b/src/info.h @@ -150,6 +150,7 @@ enum actionnum A_BOSS3PATH, A_BOSS3SHOCKTHINK, A_LINEDEFEXECUTE, + A_LINEDEFEXECUTEFROMARG, A_PLAYSEESOUND, A_PLAYATTACKSOUND, A_PLAYACTIVESOUND, @@ -409,6 +410,7 @@ void A_Boss3TakeDamage(); void A_Boss3Path(); void A_Boss3ShockThink(); void A_LinedefExecute(); +void A_LinedefExecuteFromArg(); void A_PlaySeeSound(); void A_PlayAttackSound(); void A_PlayActiveSound(); diff --git a/src/p_enemy.c b/src/p_enemy.c index c02ca38be..a4607b497 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -173,6 +173,7 @@ void A_Boss3TakeDamage(mobj_t *actor); void A_Boss3Path(mobj_t *actor); void A_Boss3ShockThink(mobj_t *actor); void A_LinedefExecute(mobj_t *actor); +void A_LinedefExecuteFromArg(mobj_t *actor); void A_PlaySeeSound(mobj_t *actor); void A_PlayAttackSound(mobj_t *actor); void A_PlayActiveSound(mobj_t *actor); @@ -4049,7 +4050,8 @@ bossjustdie: } case MT_KOOPA: { - EV_DoCeiling(LE_KOOPA, NULL, raiseToHighest); + if (mo->spawnpoint) + EV_DoCeiling(mo->spawnpoint->args[0], NULL, raiseToHighest); return; } case MT_FANG: @@ -8307,6 +8309,38 @@ void A_LinedefExecute(mobj_t *actor) P_LinedefExecute((INT16)tagnum, actor, actor->subsector->sector); } +// Function: A_LinedefExecuteFromArg +// +// Description: Object's location is used to set the calling sector. The tag used is the spawnpoint mapthing's args[var1]. +// +// var1 = mapthing arg to take tag from +// var2 = unused +// +void A_LinedefExecuteFromArg(mobj_t *actor) +{ + INT32 tagnum; + INT32 locvar1 = var1; + + if (LUA_CallAction(A_LINEDEFEXECUTEFROMARG, actor)) + return; + + if (!actor->spawnpoint) + return; + + if (locvar1 < 0 || locvar1 > NUMMAPTHINGARGS) + { + CONS_Debug(DBG_GAMELOGIC, "A_LinedefExecuteFromArg: Invalid mapthing arg %d\n", locvar1); + return; + } + + tagnum = actor->spawnpoint->args[locvar1]; + + CONS_Debug(DBG_GAMELOGIC, "A_LinedefExecuteFromArg: Running mobjtype %d's sector with tag %d\n", actor->type, tagnum); + + // tag 32768 displayed in map editors is actually tag -32768, tag 32769 is -32767, 65535 is -1 etc. + P_LinedefExecute((INT16)tagnum, actor, actor->subsector->sector); +} + // Function: A_PlaySeeSound // // Description: Plays the object's seesound. diff --git a/src/p_inter.c b/src/p_inter.c index d84cb8ce5..62f6080bc 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1387,7 +1387,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (player->bot && player->bot != BOT_MPAI) return; - EV_DoElevator(LE_AXE, NULL, bridgeFall); + if (special->spawnpoint) + EV_DoElevator(special->spawnpoint->args[0], NULL, bridgeFall); // scan the remaining thinkers to find koopa for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) diff --git a/src/p_setup.c b/src/p_setup.c index 25250b449..46b47100c 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4873,6 +4873,9 @@ static void P_ConvertBinaryMap(void) { switch (mapthings[i].type) { + case 110: //THZ Turret + mapthings[i].args[0] = LE_TURRET; + break; case 754: //Push point case 755: //Pull point { @@ -5048,6 +5051,12 @@ static void P_ConvertBinaryMap(void) case 1714: //Ideya anchor point mapthings[i].args[0] = mapthings[i].extrainfo; break; + case 1806: //King Bowser + mapthings[i].args[0] = LE_KOOPA; + break; + case 1807: //Axe + mapthings[i].args[0] = LE_AXE; + break; default: break; } From 3205b6d83a1b01b64eebaea2f6ce05c6594ef8e3 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Dec 2021 08:01:51 +0100 Subject: [PATCH 200/377] Adapt player starts to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 210 +++++++++++++++++++++ src/p_mobj.c | 4 +- src/p_setup.c | 6 + 3 files changed, 218 insertions(+), 2 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 0efe006fb..8ae317d89 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -3187,176 +3187,386 @@ udmf { title = "Player 01 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 2 { title = "Player 02 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 3 { title = "Player 03 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 4 { title = "Player 04 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 5 { title = "Player 05 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 6 { title = "Player 06 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 7 { title = "Player 07 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 8 { title = "Player 08 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 9 { title = "Player 09 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 10 { title = "Player 10 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 11 { title = "Player 11 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 12 { title = "Player 12 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 13 { title = "Player 13 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 14 { title = "Player 14 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 15 { title = "Player 15 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 16 { title = "Player 16 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 17 { title = "Player 17 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 18 { title = "Player 18 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 19 { title = "Player 19 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 20 { title = "Player 20 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 21 { title = "Player 21 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 22 { title = "Player 22 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 23 { title = "Player 23 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 24 { title = "Player 24 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 25 { title = "Player 25 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 26 { title = "Player 26 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 27 { title = "Player 27 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 28 { title = "Player 28 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 29 { title = "Player 29 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 30 { title = "Player 30 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 31 { title = "Player 31 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 32 { title = "Player 32 Start"; sprite = "PLAYA0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 33 { title = "Match Start"; sprite = "NDRNA2A8"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 34 { title = "CTF Red Team Start"; sprite = "SIGNG0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } 35 { title = "CTF Blue Team Start"; sprite = "SIGNE0"; + arg0 + { + title = "Spawn on ceiling?"; + type = 11; + enum = "noyes"; + } } } diff --git a/src/p_mobj.c b/src/p_mobj.c index beed59e8f..c673f3971 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -11643,9 +11643,9 @@ void P_MovePlayerToSpawn(INT32 playernum, mapthing_t *mthing) { fixed_t offset = mthing->z << FRACBITS; - // Flagging a player's ambush will make them start on the ceiling + // Setting the spawnpoint's args[0] will make the player start on the ceiling // Objectflip inverts - if (!!(mthing->options & MTF_AMBUSH) ^ !!(mthing->options & MTF_OBJECTFLIP)) + if (!!(mthing->args[0]) ^ !!(mthing->options & MTF_OBJECTFLIP)) z = ceilingspawn - offset; else z = floor + offset; diff --git a/src/p_setup.c b/src/p_setup.c index 46b47100c..fc47c4573 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4871,6 +4871,12 @@ static void P_ConvertBinaryMap(void) for (i = 0; i < nummapthings; i++) { + if (mapthings[i].type >= 1 && mapthings[i].type <= 35) + { + mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); + continue; + } + switch (mapthings[i].type) { case 110: //THZ Turret From bfcbf5136be8689aed5e7b19e7a6aed6d19a7a90 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Dec 2021 17:26:55 +0100 Subject: [PATCH 201/377] Adapt SDURF and Puma to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 8 ++++++++ src/p_enemy.c | 12 ++++++++---- src/p_setup.c | 4 ++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 8ae317d89..cf6b8a875 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -3596,6 +3596,10 @@ udmf sprite = "FISHA0"; width = 8; height = 28; + arg0 + { + title = "Jump strength"; + } } 103 { @@ -6468,6 +6472,10 @@ udmf sprite = "PUMAA0"; width = 8; height = 16; + arg0 + { + title = "Jump strength"; + } } 1806 { diff --git a/src/p_enemy.c b/src/p_enemy.c index a4607b497..64b21809f 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -4803,12 +4803,16 @@ void A_FishJump(mobj_t *actor) fixed_t jumpval; if (locvar1) - jumpval = var1; + jumpval = locvar1; else - jumpval = FixedMul(AngleFixed(actor->angle)/4, actor->scale); + { + if (actor->spawnpoint && actor->spawnpoint->args[0]) + jumpval = actor->spawnpoint->args[0]; + else + jumpval = 44; + } - if (!jumpval) jumpval = FixedMul(44*(FRACUNIT/4), actor->scale); - actor->momz = jumpval; + actor->momz = FixedMul(jumpval << (FRACBITS - 2), actor->scale); P_SetMobjStateNF(actor, actor->info->seestate); } diff --git a/src/p_setup.c b/src/p_setup.c index fc47c4573..ee29d6e10 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4879,6 +4879,10 @@ static void P_ConvertBinaryMap(void) switch (mapthings[i].type) { + case 102: //SDURF + case 1805: //Puma + mapthings[i].args[0] = mapthings[i].angle; + break; case 110: //THZ Turret mapthings[i].args[0] = LE_TURRET; break; From 7eee8b10a9995900f4d2f6a35487ac6fbec29fa9 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Dec 2021 17:31:29 +0100 Subject: [PATCH 202/377] Add A_LinedefExecuteFromArg to deh_tables.c --- src/deh_tables.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/deh_tables.c b/src/deh_tables.c index eda0258d6..f4074cf08 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -197,6 +197,7 @@ actionpointer_t actionpointers[] = {{A_Boss3Path}, "A_BOSS3PATH"}, {{A_Boss3ShockThink}, "A_BOSS3SHOCKTHINK"}, {{A_LinedefExecute}, "A_LINEDEFEXECUTE"}, + {{A_LinedefExecuteFromArg}, "A_LINEDEFEXECUTEFROMARG"}, {{A_PlaySeeSound}, "A_PLAYSEESOUND"}, {{A_PlayAttackSound}, "A_PLAYATTACKSOUND"}, {{A_PlayActiveSound}, "A_PLAYACTIVESOUND"}, From cbebdc219d013a54463b3e4ae074572757b1dd1c Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Dec 2021 17:45:43 +0100 Subject: [PATCH 203/377] Adapt pop-up turret to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 4 ++++ src/p_mobj.c | 5 +---- src/p_setup.c | 3 +++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index cf6b8a875..303bfe396 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -3635,6 +3635,10 @@ udmf sprite = "TURRI1"; width = 12; height = 64; + arg0 + { + title = "Firing delay"; + } } 122 { diff --git a/src/p_mobj.c b/src/p_mobj.c index c673f3971..a3e7f8f96 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12806,10 +12806,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean return false; break; case MT_POPUPTURRET: - if (mthing->angle) - mobj->threshold = mthing->angle; - else - mobj->threshold = (TICRATE*2)-1; + mobj->threshold = mthing->args[0] ? mthing->args[0] : (TICRATE*2)-1; break; case MT_NIGHTSBUMPER: // Pitch of the bumper is set in 30 degree increments. diff --git a/src/p_setup.c b/src/p_setup.c index ee29d6e10..e04de6e55 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4886,6 +4886,9 @@ static void P_ConvertBinaryMap(void) case 110: //THZ Turret mapthings[i].args[0] = LE_TURRET; break; + case 111: //Pop-up Turret + mapthings[i].args[0] = mapthings[i].angle; + break; case 754: //Push point case 755: //Pull point { From 4b58b45b5fb2c81f7541dea755f627e249169f5c Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Dec 2021 17:58:37 +0100 Subject: [PATCH 204/377] Adapt emblem tags to UDMF --- src/p_mobj.c | 4 ++-- src/p_setup.c | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index a3e7f8f96..4810d3623 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12095,7 +12095,7 @@ static boolean P_SetupEmblem(mapthing_t *mthing, mobj_t *mobj) while (emblem) { - if ((emblem->type == ET_GLOBAL || emblem->type == ET_SKIN) && emblem->tag == mthing->angle) + if ((emblem->type == ET_GLOBAL || emblem->type == ET_SKIN) && emblem->tag == Tag_FGet(&mthing->tags)) break; emblem = M_GetLevelEmblems(-1); @@ -12103,7 +12103,7 @@ static boolean P_SetupEmblem(mapthing_t *mthing, mobj_t *mobj) if (!emblem) { - CONS_Debug(DBG_GAMELOGIC, "No map emblem for map %d with tag %d found!\n", gamemap, mthing->angle); + CONS_Debug(DBG_GAMELOGIC, "No map emblem for map %d with tag %d found!\n", gamemap, Tag_FGet(&mthing->tags)); return false; } diff --git a/src/p_setup.c b/src/p_setup.c index e04de6e55..ba3544d12 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3123,6 +3123,7 @@ static void P_AddBinaryMapTags(void) switch (mapthings[i].type) { case 291: + case 322: case 750: case 760: case 761: From 81bf0dceb21bd20de5896e205d8c7a4518ef433a Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Dec 2021 18:12:38 +0100 Subject: [PATCH 205/377] Turn makesoftwarecorona into a function --- src/p_mobj.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 4810d3623..65c337cf2 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12656,6 +12656,15 @@ static boolean P_SetupBooster(mapthing_t* mthing, mobj_t* mobj, boolean strong) return true; } +static mobj_t *P_MakeSoftwareCorona(mobj_t *mo, INT32 height) +{ + mobj_t *corona = P_SpawnMobjFromMobj(mo, 0, 0, height<sprite = SPR_FLAM; + corona->frame = (FF_FULLBRIGHT|FF_TRANS90|12); + corona->tics = -1; + return corona; +} + static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean *doangle) { boolean override = LUA_HookMapThingSpawn(mobj, mthing); @@ -12731,16 +12740,10 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean if (mthing->angle > 0) mobj->color = ((mthing->angle - 1) % (numskincolors - 1)) + 1; break; -#define makesoftwarecorona(mo, h) \ - corona = P_SpawnMobjFromMobj(mo, 0, 0, h<sprite = SPR_FLAM;\ - corona->frame = (FF_FULLBRIGHT|FF_TRANS90|12);\ - corona->tics = -1 case MT_FLAME: if (mthing->options & MTF_EXTRA) { - mobj_t *corona; - makesoftwarecorona(mobj, 20); + mobj_t *corona = P_MakeSoftwareCorona(mobj, 20); P_SetScale(corona, (corona->destscale = mobj->scale*3)); P_SetTarget(&mobj->tracer, corona); } @@ -12753,8 +12756,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean flame->flags2 |= MF2_BOSSNOTRAP; if (mthing->options & MTF_EXTRA) { - mobj_t *corona; - makesoftwarecorona(flame, 20); + mobj_t *corona = P_MakeSoftwareCorona(flame, 20); P_SetScale(corona, (corona->destscale = flame->scale*3)); P_SetTarget(&flame->tracer, corona); } @@ -12763,12 +12765,8 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean case MT_CANDLE: case MT_CANDLEPRICKET: if (mthing->options & MTF_EXTRA) - { - mobj_t *corona; - makesoftwarecorona(mobj, ((mobj->type == MT_CANDLE) ? 42 : 176)); - } + P_MakeSoftwareCorona(mobj, ((mobj->type == MT_CANDLE) ? 42 : 176)); break; -#undef makesoftwarecorona case MT_JACKO1: case MT_JACKO2: case MT_JACKO3: From af30847a1f8b8d33892d1e11684702088104b2f6 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Dec 2021 18:19:10 +0100 Subject: [PATCH 206/377] Adapt zoom tube waypoint to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 8 ++++++++ src/p_mobj.c | 4 ++-- src/p_setup.c | 4 ++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 303bfe396..03c2fc82d 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -4773,6 +4773,14 @@ udmf { title = "Zoom Tube Waypoint"; sprite = "internal:zoom"; + arg0 + { + title = "Sequence"; + } + arg1 + { + title = "Order"; + } } 754 diff --git a/src/p_mobj.c b/src/p_mobj.c index 65c337cf2..7f12a190b 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12819,8 +12819,8 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean break; case MT_TUBEWAYPOINT: { - UINT8 sequence = mthing->angle >> 8; - UINT8 id = mthing->angle & 255; + UINT8 sequence = mthing->args[0]; + UINT8 id = mthing->args[1]; mobj->health = id; mobj->threshold = sequence; P_AddWaypoint(sequence, id, mobj); diff --git a/src/p_setup.c b/src/p_setup.c index ba3544d12..bf12c88bc 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4890,6 +4890,10 @@ static void P_ConvertBinaryMap(void) case 111: //Pop-up Turret mapthings[i].args[0] = mapthings[i].angle; break; + case 753: //Zoom tube waypoint + mapthings[i].args[0] = mapthings[i].angle >> 8; + mapthings[i].args[1] = mapthings[i].angle & 255; + break; case 754: //Push point case 755: //Pull point { From 693fa7ba81ee97dc3207e90c03ecbbd0d431157b Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Dec 2021 18:27:19 +0100 Subject: [PATCH 207/377] Adapt star posts to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 4 ++++ src/p_mobj.c | 10 +--------- src/p_setup.c | 11 +++++++++++ 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 03c2fc82d..0fe11cf5e 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -4370,6 +4370,10 @@ udmf sprite = "STPTA0M0"; width = 64; height = 128; + arg0 + { + title = "Order"; + } } 520 { diff --git a/src/p_mobj.c b/src/p_mobj.c index 7f12a190b..f6954baef 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12966,15 +12966,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean mobj_t* mo2; boolean foundanother = false; - if (mthing->extrainfo) - // Allow thing Parameter to define star post num too! - // For starposts above param 15 (the 16th), add 360 to the angle like before and start parameter from 1 (NOT 0)! - // So the 16th starpost is angle=0 param=15, the 17th would be angle=360 param=1. - // This seems more intuitive for mappers to use until UDMF is ready, since most SP maps won't have over 16 consecutive star posts. - mobj->health = mthing->extrainfo + (mthing->angle/360)*15 + 1; - else - // Old behavior if Parameter is 0; add 360 to the angle for each consecutive star post. - mobj->health = (mthing->angle/360) + 1; + mobj->health = mthing->args[0] + 1; // See if other starposts exist in this level that have the same value. for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) diff --git a/src/p_setup.c b/src/p_setup.c index bf12c88bc..1761a4be9 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4890,6 +4890,17 @@ static void P_ConvertBinaryMap(void) case 111: //Pop-up Turret mapthings[i].args[0] = mapthings[i].angle; break; + case 502: //Star post + if (mapthings[i].extrainfo) + // Allow thing Parameter to define star post num too! + // For starposts above param 15 (the 16th), add 360 to the angle like before and start parameter from 1 (NOT 0)! + // So the 16th starpost is angle=0 param=15, the 17th would be angle=360 param=1. + // This seems more intuitive for mappers to use, since most SP maps won't have over 16 consecutive star posts. + mapthings[i].args[0] = mapthings[i].extrainfo + (mapthings[i].angle/360) * 15; + else + // Old behavior if Parameter is 0; add 360 to the angle for each consecutive star post. + mapthings[i].args[0] = (mapthings[i].angle/360); + break; case 753: //Zoom tube waypoint mapthings[i].args[0] = mapthings[i].angle >> 8; mapthings[i].args[1] = mapthings[i].angle & 255; From 5918ecc2feb121e8cfdc2812b5a58da94f69df59 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Dec 2021 18:32:24 +0100 Subject: [PATCH 208/377] Refactor star post check --- src/p_mobj.c | 49 +++++++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index f6954baef..b676fd9c0 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12665,6 +12665,28 @@ static mobj_t *P_MakeSoftwareCorona(mobj_t *mo, INT32 height) return corona; } +static boolean P_MapAlreadyHasStarPost(mobj_t *mobj) +{ + thinker_t *th; + mobj_t *mo2; + + for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) + { + if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) + continue; + + mo2 = (mobj_t *)th; + + if (mo2 == mobj) + continue; + + if (mo2->type == MT_STARPOST && mo2->health == mobj->health) + return true; + } + + return false; +} + static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean *doangle) { boolean override = LUA_HookMapThingSpawn(mobj, mthing); @@ -12961,35 +12983,10 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean } break; case MT_STARPOST: - { - thinker_t* th; - mobj_t* mo2; - boolean foundanother = false; - mobj->health = mthing->args[0] + 1; - - // See if other starposts exist in this level that have the same value. - for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) - { - if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) - continue; - - mo2 = (mobj_t*)th; - - if (mo2 == mobj) - continue; - - if (mo2->type == MT_STARPOST && mo2->health == mobj->health) - { - foundanother = true; - break; - } - } - - if (!foundanother) + if (!P_MapAlreadyHasStarPost(mobj)) numstarposts++; break; - } case MT_SPIKE: // Pop up spikes! if (mthing->options & MTF_OBJECTSPECIAL) From 52c319167fe8d6138a6482e26a98db1bf789b002 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Dec 2021 21:08:40 +0100 Subject: [PATCH 209/377] (Mostly) adapt the Ideya Drone to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 24 + src/p_mobj.c | 519 +++++++++++---------- src/p_setup.c | 13 + src/p_spec.h | 8 + src/p_user.c | 8 +- 5 files changed, 309 insertions(+), 263 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 0fe11cf5e..7140267ba 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -6374,6 +6374,30 @@ udmf sprite = "NDRNA1"; width = 16; height = 56; + arg0 + { + title = "Time limit"; + } + arg1 + { + title = "Height"; + } + arg2 + { + title = "Radius"; + } + arg3 + { + title = "Alignment"; + type = 11; + enum + { + 0 = "Bottom with offset"; + 1 = "Bottom"; + 2 = "Middle"; + 3 = "Top"; + } + } } 1704 { diff --git a/src/p_mobj.c b/src/p_mobj.c index b676fd9c0..262c406dc 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8692,245 +8692,242 @@ static boolean P_EggRobo1Think(mobj_t *mobj) static void P_NiGHTSDroneThink(mobj_t *mobj) { + mobj_t *goalpost = NULL; + mobj_t *sparkle = NULL; + mobj_t *droneman = NULL; + + boolean flip = mobj->flags2 & MF2_OBJECTFLIP; + boolean topaligned = (mobj->flags & MF_SLIDEME) && !(mobj->flags & MF_GRENADEBOUNCE); + boolean middlealigned = (mobj->flags & MF_GRENADEBOUNCE) && !(mobj->flags & MF_SLIDEME); + boolean bottomoffsetted = !(mobj->flags & MF_SLIDEME) && !(mobj->flags & MF_GRENADEBOUNCE); + boolean flipchanged = false; + + fixed_t dronemanoffset, goaloffset, sparkleoffset, droneboxmandiff, dronemangoaldiff; + + if (mobj->target && mobj->target->type == MT_NIGHTSDRONE_GOAL) { - // variable setup - mobj_t *goalpost = NULL; - mobj_t *sparkle = NULL; - mobj_t *droneman = NULL; + goalpost = mobj->target; + if (goalpost->target && goalpost->target->type == MT_NIGHTSDRONE_SPARKLING) + sparkle = goalpost->target; + if (goalpost->tracer && goalpost->tracer->type == MT_NIGHTSDRONE_MAN) + droneman = goalpost->tracer; + } - boolean flip = mobj->flags2 & MF2_OBJECTFLIP; - boolean topaligned = (mobj->flags & MF_SLIDEME) && !(mobj->flags & MF_GRENADEBOUNCE); - boolean middlealigned = (mobj->flags & MF_GRENADEBOUNCE) && !(mobj->flags & MF_SLIDEME); - boolean bottomoffsetted = !(mobj->flags & MF_SLIDEME) && !(mobj->flags & MF_GRENADEBOUNCE); - boolean flipchanged = false; + if (!goalpost || !sparkle || !droneman) + return; - fixed_t dronemanoffset, goaloffset, sparkleoffset, droneboxmandiff, dronemangoaldiff; + // did NIGHTSDRONE position, scale, flip, or flags change? all elements need to be synced + droneboxmandiff = max(mobj->height - droneman->height, 0); + dronemangoaldiff = max(droneman->height - goalpost->height, 0); - if (mobj->target && mobj->target->type == MT_NIGHTSDRONE_GOAL) + if (!(goalpost->flags2 & MF2_OBJECTFLIP) && (mobj->flags2 & MF2_OBJECTFLIP)) + { + goalpost->eflags |= MFE_VERTICALFLIP; + goalpost->flags2 |= MF2_OBJECTFLIP; + sparkle->eflags |= MFE_VERTICALFLIP; + sparkle->flags2 |= MF2_OBJECTFLIP; + droneman->eflags |= MFE_VERTICALFLIP; + droneman->flags2 |= MF2_OBJECTFLIP; + flipchanged = true; + } + else if ((goalpost->flags2 & MF2_OBJECTFLIP) && !(mobj->flags2 & MF2_OBJECTFLIP)) + { + goalpost->eflags &= ~MFE_VERTICALFLIP; + goalpost->flags2 &= ~MF2_OBJECTFLIP; + sparkle->eflags &= ~MFE_VERTICALFLIP; + sparkle->flags2 &= ~MF2_OBJECTFLIP; + droneman->eflags &= ~MFE_VERTICALFLIP; + droneman->flags2 &= ~MF2_OBJECTFLIP; + flipchanged = true; + } + + if (goalpost->destscale != mobj->destscale + || goalpost->movefactor != mobj->z + || goalpost->friction != mobj->height + || flipchanged + || goalpost->threshold != (INT32)(mobj->flags & (MF_SLIDEME|MF_GRENADEBOUNCE))) + { + goalpost->destscale = sparkle->destscale = droneman->destscale = mobj->destscale; + + // straight copy-pasta from P_SpawnMapThing, case MT_NIGHTSDRONE + if (!flip) { - goalpost = mobj->target; - if (goalpost->target && goalpost->target->type == MT_NIGHTSDRONE_SPARKLING) - sparkle = goalpost->target; - if (goalpost->tracer && goalpost->tracer->type == MT_NIGHTSDRONE_MAN) - droneman = goalpost->tracer; - } - - if (!goalpost || !sparkle || !droneman) - return; - - // did NIGHTSDRONE position, scale, flip, or flags change? all elements need to be synced - droneboxmandiff = max(mobj->height - droneman->height, 0); - dronemangoaldiff = max(droneman->height - goalpost->height, 0); - - if (!(goalpost->flags2 & MF2_OBJECTFLIP) && (mobj->flags2 & MF2_OBJECTFLIP)) - { - goalpost->eflags |= MFE_VERTICALFLIP; - goalpost->flags2 |= MF2_OBJECTFLIP; - sparkle->eflags |= MFE_VERTICALFLIP; - sparkle->flags2 |= MF2_OBJECTFLIP; - droneman->eflags |= MFE_VERTICALFLIP; - droneman->flags2 |= MF2_OBJECTFLIP; - flipchanged = true; - } - else if ((goalpost->flags2 & MF2_OBJECTFLIP) && !(mobj->flags2 & MF2_OBJECTFLIP)) - { - goalpost->eflags &= ~MFE_VERTICALFLIP; - goalpost->flags2 &= ~MF2_OBJECTFLIP; - sparkle->eflags &= ~MFE_VERTICALFLIP; - sparkle->flags2 &= ~MF2_OBJECTFLIP; - droneman->eflags &= ~MFE_VERTICALFLIP; - droneman->flags2 &= ~MF2_OBJECTFLIP; - flipchanged = true; - } - - if (goalpost->destscale != mobj->destscale - || goalpost->movefactor != mobj->z - || goalpost->friction != mobj->height - || flipchanged - || goalpost->threshold != (INT32)(mobj->flags & (MF_SLIDEME|MF_GRENADEBOUNCE))) - { - goalpost->destscale = sparkle->destscale = droneman->destscale = mobj->destscale; - - // straight copy-pasta from P_SpawnMapThing, case MT_NIGHTSDRONE - if (!flip) + if (topaligned) // Align droneman to top of hitbox { - if (topaligned) // Align droneman to top of hitbox - { - dronemanoffset = droneboxmandiff; - goaloffset = dronemangoaldiff/2 + dronemanoffset; - } - else if (middlealigned) // Align droneman to center of hitbox - { - dronemanoffset = droneboxmandiff/2; - goaloffset = dronemangoaldiff/2 + dronemanoffset; - } - else if (bottomoffsetted) - { - dronemanoffset = 24*FRACUNIT; - goaloffset = dronemangoaldiff + dronemanoffset; - } - else - { - dronemanoffset = 0; - goaloffset = dronemangoaldiff/2 + dronemanoffset; - } - - sparkleoffset = goaloffset - FixedMul(15*FRACUNIT, mobj->scale); + dronemanoffset = droneboxmandiff; + goaloffset = dronemangoaldiff/2 + dronemanoffset; + } + else if (middlealigned) // Align droneman to center of hitbox + { + dronemanoffset = droneboxmandiff/2; + goaloffset = dronemangoaldiff/2 + dronemanoffset; + } + else if (bottomoffsetted) + { + dronemanoffset = 24*FRACUNIT; + goaloffset = dronemangoaldiff + dronemanoffset; } else { - if (topaligned) // Align droneman to top of hitbox - { - dronemanoffset = 0; - goaloffset = dronemangoaldiff/2 + dronemanoffset; - } - else if (middlealigned) // Align droneman to center of hitbox - { - dronemanoffset = droneboxmandiff/2; - goaloffset = dronemangoaldiff/2 + dronemanoffset; - } - else if (bottomoffsetted) - { - dronemanoffset = droneboxmandiff - FixedMul(24*FRACUNIT, mobj->scale); - goaloffset = dronemangoaldiff + dronemanoffset; - } - else - { - dronemanoffset = droneboxmandiff; - goaloffset = dronemangoaldiff/2 + dronemanoffset; - } - - sparkleoffset = goaloffset + FixedMul(15*FRACUNIT, mobj->scale); + dronemanoffset = 0; + goaloffset = dronemangoaldiff/2 + dronemanoffset; } - P_TeleportMove(goalpost, mobj->x, mobj->y, mobj->z + goaloffset); - P_TeleportMove(sparkle, mobj->x, mobj->y, mobj->z + sparkleoffset); - if (goalpost->movefactor != mobj->z || goalpost->friction != mobj->height) - { - P_TeleportMove(droneman, mobj->x, mobj->y, mobj->z + dronemanoffset); - goalpost->movefactor = mobj->z; - goalpost->friction = mobj->height; - } - goalpost->threshold = mobj->flags & (MF_SLIDEME|MF_GRENADEBOUNCE); + sparkleoffset = goaloffset - FixedMul(15*FRACUNIT, mobj->scale); } else { - if (goalpost->x != mobj->x || goalpost->y != mobj->y) + if (topaligned) // Align droneman to top of hitbox { - P_TeleportMove(goalpost, mobj->x, mobj->y, goalpost->z); - P_TeleportMove(sparkle, mobj->x, mobj->y, sparkle->z); + dronemanoffset = 0; + goaloffset = dronemangoaldiff/2 + dronemanoffset; } - - if (droneman->x != mobj->x || droneman->y != mobj->y) - P_TeleportMove(droneman, mobj->x, mobj->y, - droneman->z >= mobj->floorz && droneman->z <= mobj->ceilingz ? droneman->z : mobj->z); - } - - // now toggle states! - // GOAL mode? - if (sparkle->state >= &states[S_NIGHTSDRONE_SPARKLING1] && sparkle->state <= &states[S_NIGHTSDRONE_SPARKLING16]) - { - INT32 i; - boolean bonustime = false; - - for (i = 0; i < MAXPLAYERS; i++) - if (playeringame[i] && players[i].bonustime && players[i].powers[pw_carry] == CR_NIGHTSMODE) - { - bonustime = true; - break; - } - - if (!bonustime) + else if (middlealigned) // Align droneman to center of hitbox { - CONS_Debug(DBG_NIGHTSBASIC, "Removing goal post\n"); - if (goalpost && goalpost->state != &states[S_INVISIBLE]) - P_SetMobjState(goalpost, S_INVISIBLE); - if (sparkle && sparkle->state != &states[S_INVISIBLE]) - P_SetMobjState(sparkle, S_INVISIBLE); + dronemanoffset = droneboxmandiff/2; + goaloffset = dronemangoaldiff/2 + dronemanoffset; } - } - // Invisible/bouncing mode. - else - { - INT32 i; - boolean bonustime = false; - fixed_t zcomp; - - // Bouncy bouncy! - if (!flip) + else if (bottomoffsetted) { - if (topaligned) - zcomp = droneboxmandiff + mobj->z; - else if (middlealigned) - zcomp = (droneboxmandiff/2) + mobj->z; - else if (bottomoffsetted) - zcomp = mobj->z + FixedMul(24*FRACUNIT, mobj->scale); - else - zcomp = mobj->z; + dronemanoffset = droneboxmandiff - FixedMul(24*FRACUNIT, mobj->scale); + goaloffset = dronemangoaldiff + dronemanoffset; } else { - if (topaligned) - zcomp = mobj->z; - else if (middlealigned) - zcomp = (droneboxmandiff/2) + mobj->z; - else if (bottomoffsetted) - zcomp = mobj->z + droneboxmandiff - FixedMul(24*FRACUNIT, mobj->scale); - else - zcomp = mobj->z + droneboxmandiff; + dronemanoffset = droneboxmandiff; + goaloffset = dronemangoaldiff/2 + dronemanoffset; } - droneman->angle += ANG10; - if (!flip && droneman->z <= zcomp) - droneman->momz = FixedMul(5*FRACUNIT, droneman->scale); - else if (flip && droneman->z >= zcomp) - droneman->momz = FixedMul(-5*FRACUNIT, droneman->scale); + sparkleoffset = goaloffset + FixedMul(15*FRACUNIT, mobj->scale); + } - // state switching logic + P_TeleportMove(goalpost, mobj->x, mobj->y, mobj->z + goaloffset); + P_TeleportMove(sparkle, mobj->x, mobj->y, mobj->z + sparkleoffset); + if (goalpost->movefactor != mobj->z || goalpost->friction != mobj->height) + { + P_TeleportMove(droneman, mobj->x, mobj->y, mobj->z + dronemanoffset); + goalpost->movefactor = mobj->z; + goalpost->friction = mobj->height; + } + goalpost->threshold = mobj->flags & (MF_SLIDEME|MF_GRENADEBOUNCE); + } + else + { + if (goalpost->x != mobj->x || goalpost->y != mobj->y) + { + P_TeleportMove(goalpost, mobj->x, mobj->y, goalpost->z); + P_TeleportMove(sparkle, mobj->x, mobj->y, sparkle->z); + } + + if (droneman->x != mobj->x || droneman->y != mobj->y) + P_TeleportMove(droneman, mobj->x, mobj->y, + droneman->z >= mobj->floorz && droneman->z <= mobj->ceilingz ? droneman->z : mobj->z); + } + + // now toggle states! + // GOAL mode? + if (sparkle->state >= &states[S_NIGHTSDRONE_SPARKLING1] && sparkle->state <= &states[S_NIGHTSDRONE_SPARKLING16]) + { + INT32 i; + boolean bonustime = false; + + for (i = 0; i < MAXPLAYERS; i++) + if (playeringame[i] && players[i].bonustime && players[i].powers[pw_carry] == CR_NIGHTSMODE) + { + bonustime = true; + break; + } + + if (!bonustime) + { + CONS_Debug(DBG_NIGHTSBASIC, "Removing goal post\n"); + if (goalpost && goalpost->state != &states[S_INVISIBLE]) + P_SetMobjState(goalpost, S_INVISIBLE); + if (sparkle && sparkle->state != &states[S_INVISIBLE]) + P_SetMobjState(sparkle, S_INVISIBLE); + } + } + // Invisible/bouncing mode. + else + { + INT32 i; + boolean bonustime = false; + fixed_t zcomp; + + // Bouncy bouncy! + if (!flip) + { + if (topaligned) + zcomp = droneboxmandiff + mobj->z; + else if (middlealigned) + zcomp = (droneboxmandiff/2) + mobj->z; + else if (bottomoffsetted) + zcomp = mobj->z + FixedMul(24*FRACUNIT, mobj->scale); + else + zcomp = mobj->z; + } + else + { + if (topaligned) + zcomp = mobj->z; + else if (middlealigned) + zcomp = (droneboxmandiff/2) + mobj->z; + else if (bottomoffsetted) + zcomp = mobj->z + droneboxmandiff - FixedMul(24*FRACUNIT, mobj->scale); + else + zcomp = mobj->z + droneboxmandiff; + } + + droneman->angle += ANG10; + if (!flip && droneman->z <= zcomp) + droneman->momz = FixedMul(5*FRACUNIT, droneman->scale); + else if (flip && droneman->z >= zcomp) + droneman->momz = FixedMul(-5*FRACUNIT, droneman->scale); + + // state switching logic + for (i = 0; i < MAXPLAYERS; i++) + if (playeringame[i] && players[i].bonustime && players[i].powers[pw_carry] == CR_NIGHTSMODE) + { + bonustime = true; + break; + } + + if (bonustime) + { + CONS_Debug(DBG_NIGHTSBASIC, "Adding goal post\n"); + if (!(droneman->flags2 & MF2_DONTDRAW)) + droneman->flags2 |= MF2_DONTDRAW; + if (goalpost->state == &states[S_INVISIBLE]) + P_SetMobjState(goalpost, mobjinfo[goalpost->type].meleestate); + if (sparkle->state == &states[S_INVISIBLE]) + P_SetMobjState(sparkle, mobjinfo[sparkle->type].meleestate); + } + else if (!G_IsSpecialStage(gamemap)) + { for (i = 0; i < MAXPLAYERS; i++) - if (playeringame[i] && players[i].bonustime && players[i].powers[pw_carry] == CR_NIGHTSMODE) + if (playeringame[i] && players[i].powers[pw_carry] != CR_NIGHTSMODE) { - bonustime = true; + bonustime = true; // variable reuse break; } if (bonustime) { - CONS_Debug(DBG_NIGHTSBASIC, "Adding goal post\n"); + // show droneman if at least one player is non-nights + if (goalpost->state != &states[S_INVISIBLE]) + P_SetMobjState(goalpost, S_INVISIBLE); + if (sparkle->state != &states[S_INVISIBLE]) + P_SetMobjState(sparkle, S_INVISIBLE); + if (droneman->state != &states[mobjinfo[droneman->type].meleestate]) + P_SetMobjState(droneman, mobjinfo[droneman->type].meleestate); + if (droneman->flags2 & MF2_DONTDRAW) + droneman->flags2 &= ~MF2_DONTDRAW; + } + else + { + // else, hide it if (!(droneman->flags2 & MF2_DONTDRAW)) droneman->flags2 |= MF2_DONTDRAW; - if (goalpost->state == &states[S_INVISIBLE]) - P_SetMobjState(goalpost, mobjinfo[goalpost->type].meleestate); - if (sparkle->state == &states[S_INVISIBLE]) - P_SetMobjState(sparkle, mobjinfo[sparkle->type].meleestate); - } - else if (!G_IsSpecialStage(gamemap)) - { - for (i = 0; i < MAXPLAYERS; i++) - if (playeringame[i] && players[i].powers[pw_carry] != CR_NIGHTSMODE) - { - bonustime = true; // variable reuse - break; - } - - if (bonustime) - { - // show droneman if at least one player is non-nights - if (goalpost->state != &states[S_INVISIBLE]) - P_SetMobjState(goalpost, S_INVISIBLE); - if (sparkle->state != &states[S_INVISIBLE]) - P_SetMobjState(sparkle, S_INVISIBLE); - if (droneman->state != &states[mobjinfo[droneman->type].meleestate]) - P_SetMobjState(droneman, mobjinfo[droneman->type].meleestate); - if (droneman->flags2 & MF2_DONTDRAW) - droneman->flags2 &= ~MF2_DONTDRAW; - } - else - { - // else, hide it - if (!(droneman->flags2 & MF2_DONTDRAW)) - droneman->flags2 |= MF2_DONTDRAW; - } } } } @@ -12496,16 +12493,13 @@ static boolean P_SetupParticleGen(mapthing_t *mthing, mobj_t *mobj) return true; } -static boolean P_SetupNiGHTSDrone(mapthing_t* mthing, mobj_t* mobj) +static boolean P_SetupNiGHTSDrone(mapthing_t *mthing, mobj_t *mobj) { boolean flip = mthing->options & MTF_OBJECTFLIP; - boolean topaligned = (mthing->options & MTF_OBJECTSPECIAL) && !(mthing->options & MTF_EXTRA); - boolean middlealigned = (mthing->options & MTF_EXTRA) && !(mthing->options & MTF_OBJECTSPECIAL); - boolean bottomoffsetted = !(mthing->options & MTF_OBJECTSPECIAL) && !(mthing->options & MTF_EXTRA); - - INT16 timelimit = mthing->angle & 0xFFF; - fixed_t hitboxradius = ((mthing->angle & 0xF000) >> 12)*32*FRACUNIT; - fixed_t hitboxheight = mthing->extrainfo*32*FRACUNIT; + INT16 timelimit = mthing->args[0]; + fixed_t hitboxheight = mthing->args[1] << FRACBITS; + fixed_t hitboxradius = mthing->args[2] << FRACBITS; + INT32 dronemanalignment = mthing->args[3]; fixed_t oldheight = mobj->height; fixed_t dronemanoffset, goaloffset, sparkleoffset, droneboxmandiff, dronemangoaldiff; @@ -12528,25 +12522,25 @@ static boolean P_SetupNiGHTSDrone(mapthing_t* mthing, mobj_t* mobj) if (!flip) { - if (topaligned) // Align droneman to top of hitbox + switch (dronemanalignment) { - dronemanoffset = droneboxmandiff; - goaloffset = dronemangoaldiff/2 + dronemanoffset; - } - else if (middlealigned) // Align droneman to center of hitbox - { - dronemanoffset = droneboxmandiff/2; - goaloffset = dronemangoaldiff/2 + dronemanoffset; - } - else if (bottomoffsetted) - { - dronemanoffset = 24*FRACUNIT; - goaloffset = dronemangoaldiff + dronemanoffset; - } - else - { - dronemanoffset = 0; - goaloffset = dronemangoaldiff/2 + dronemanoffset; + case TMDA_BOTTOMOFFSET: + default: + dronemanoffset = FixedMul(24*FRACUNIT, mobj->scale); + goaloffset = dronemangoaldiff + dronemanoffset; + break; + case TMDA_BOTTOM: + dronemanoffset = 0; + goaloffset = dronemangoaldiff/2 + dronemanoffset; + break; + case TMDA_MIDDLE: + dronemanoffset = droneboxmandiff/2; + goaloffset = dronemangoaldiff/2 + dronemanoffset; + break; + case TMDA_TOP: + dronemanoffset = droneboxmandiff; + goaloffset = dronemangoaldiff/2 + dronemanoffset; + break; } sparkleoffset = goaloffset - FixedMul(15*FRACUNIT, mobj->scale); @@ -12556,25 +12550,25 @@ static boolean P_SetupNiGHTSDrone(mapthing_t* mthing, mobj_t* mobj) mobj->eflags |= MFE_VERTICALFLIP; mobj->flags2 |= MF2_OBJECTFLIP; - if (topaligned) // Align droneman to top of hitbox + switch (dronemanalignment) { - dronemanoffset = 0; - goaloffset = dronemangoaldiff/2 + dronemanoffset; - } - else if (middlealigned) // Align droneman to center of hitbox - { - dronemanoffset = droneboxmandiff/2; - goaloffset = dronemangoaldiff/2 + dronemanoffset; - } - else if (bottomoffsetted) - { - dronemanoffset = droneboxmandiff - FixedMul(24*FRACUNIT, mobj->scale); - goaloffset = dronemangoaldiff + dronemanoffset; - } - else - { - dronemanoffset = droneboxmandiff; - goaloffset = dronemangoaldiff/2 + dronemanoffset; + case TMDA_BOTTOMOFFSET: + default: + dronemanoffset = droneboxmandiff - FixedMul(24*FRACUNIT, mobj->scale); + goaloffset = dronemangoaldiff + dronemanoffset; + break; + case TMDA_BOTTOM: + dronemanoffset = droneboxmandiff; + goaloffset = dronemangoaldiff/2 + dronemanoffset; + break; + case TMDA_MIDDLE: + dronemanoffset = droneboxmandiff/2; + goaloffset = dronemangoaldiff/2 + dronemanoffset; + break; + case TMDA_TOP: + dronemanoffset = 0; + goaloffset = dronemangoaldiff/2 + dronemanoffset; + break; } sparkleoffset = goaloffset + FixedMul(15*FRACUNIT, mobj->scale); @@ -12582,9 +12576,9 @@ static boolean P_SetupNiGHTSDrone(mapthing_t* mthing, mobj_t* mobj) // spawn visual elements { - mobj_t* goalpost = P_SpawnMobjFromMobj(mobj, 0, 0, goaloffset, MT_NIGHTSDRONE_GOAL); - mobj_t* sparkle = P_SpawnMobjFromMobj(mobj, 0, 0, sparkleoffset, MT_NIGHTSDRONE_SPARKLING); - mobj_t* droneman = P_SpawnMobjFromMobj(mobj, 0, 0, dronemanoffset, MT_NIGHTSDRONE_MAN); + mobj_t *goalpost = P_SpawnMobjFromMobj(mobj, 0, 0, goaloffset, MT_NIGHTSDRONE_GOAL); + mobj_t *sparkle = P_SpawnMobjFromMobj(mobj, 0, 0, sparkleoffset, MT_NIGHTSDRONE_SPARKLING); + mobj_t *droneman = P_SpawnMobjFromMobj(mobj, 0, 0, dronemanoffset, MT_NIGHTSDRONE_MAN); P_SetTarget(&mobj->target, goalpost); P_SetTarget(&goalpost->target, sparkle); @@ -12600,12 +12594,21 @@ static boolean P_SetupNiGHTSDrone(mapthing_t* mthing, mobj_t* mobj) // Remember position preference for later mobj->flags &= ~(MF_SLIDEME|MF_GRENADEBOUNCE); - if (topaligned) - mobj->flags |= MF_SLIDEME; - else if (middlealigned) - mobj->flags |= MF_GRENADEBOUNCE; - else if (!bottomoffsetted) - mobj->flags |= MF_SLIDEME|MF_GRENADEBOUNCE; + switch (dronemanalignment) + { + case TMDA_BOTTOMOFFSET: + default: + mobj->flags |= MF_SLIDEME|MF_GRENADEBOUNCE; + break; + case TMDA_BOTTOM: + break; + case TMDA_MIDDLE: + mobj->flags |= MF_GRENADEBOUNCE; + break; + case TMDA_TOP: + mobj->flags |= MF_SLIDEME; + break; + } // Remember old Z position and flags for correction detection goalpost->movefactor = mobj->z; diff --git a/src/p_setup.c b/src/p_setup.c index 1761a4be9..12ccfff4d 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -5058,6 +5058,19 @@ static void P_ConvertBinaryMap(void) mapthings[i].args[0] = mapthings[i].extrainfo; mapthings[i].args[1] = mapthings[i].options; break; + case 1703: //Ideya drone + mapthings[i].args[0] = mapthings[i].angle & 0xFFF; + mapthings[i].args[1] = mapthings[i].extrainfo*32; + mapthings[i].args[2] = ((mapthings[i].angle & 0xF000) >> 12)*32; + if ((mapthings[i].options & (MTF_OBJECTSPECIAL|MTF_EXTRA)) == (MTF_OBJECTSPECIAL|MTF_EXTRA)) + mapthings[i].args[3] = TMDA_BOTTOM; + else if ((mapthings[i].options & (MTF_OBJECTSPECIAL|MTF_EXTRA)) == MTF_OBJECTSPECIAL) + mapthings[i].args[3] = TMDA_TOP; + else if ((mapthings[i].options & (MTF_OBJECTSPECIAL|MTF_EXTRA)) == MTF_EXTRA) + mapthings[i].args[3] = TMDA_MIDDLE; + else + mapthings[i].args[3] = TMDA_BOTTOMOFFSET; + break; case 1704: //NiGHTS bumper mapthings[i].pitch = 30 * (((mapthings[i].options & 15) + 9) % 12); mapthings[i].options &= ~0xF; diff --git a/src/p_spec.h b/src/p_spec.h index 8e210b543..f9ad63957 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -36,6 +36,14 @@ typedef enum TMM_ALWAYSTHINK = 1<<7, } textmapmaceflags_t; +typedef enum +{ + TMDA_BOTTOMOFFSET = 1, + TMDA_BOTTOM = 1<<1, + TMDA_MIDDLE = 1<<2, + TMDA_TOP = 1<<3, +} textmapdronealignment_t; + //FOF flags typedef enum { diff --git a/src/p_user.c b/src/p_user.c index 011a23215..4f4a185ed 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -706,8 +706,7 @@ static void P_DeNightserizePlayer(player_t *player) // If you screwed up, kiss your score and ring bonus goodbye. // But only do this in special stage (and instakill!) In regular stages, wait til we hit the ground. - player->marescore = player->spheres =\ - player->rings = 0; + player->marescore = player->spheres = player->rings = 0; } // Check to see if the player should be killed. @@ -717,13 +716,12 @@ static void P_DeNightserizePlayer(player_t *player) continue; mo2 = (mobj_t *)th; - if (!(mo2->type == MT_NIGHTSDRONE)) + if (mo2->type != MT_NIGHTSDRONE) continue; if (mo2->flags2 & MF2_AMBUSH) { - player->marescore = player->spheres =\ - player->rings = 0; + player->marescore = player->spheres = player->rings = 0; P_DamageMobj(player->mo, NULL, NULL, 1, DMG_INSTAKILL); // Reset music to beginning if MIXNIGHTSCOUNTDOWN From a5ac10733af33a9012dbce763e51359f5fcc4624 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Dec 2021 21:51:37 +0100 Subject: [PATCH 210/377] Adapt Hive Elemental to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 4 ++++ src/p_mobj.c | 4 ++-- src/p_setup.c | 3 +++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 7140267ba..c72603cc6 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -3844,6 +3844,10 @@ udmf sprite = "HIVEA0"; width = 32; height = 80; + arg0 + { + title = "Number of bees"; + } } 128 { diff --git a/src/p_mobj.c b/src/p_mobj.c index 262c406dc..0652967d7 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12859,8 +12859,8 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean return false; break; case MT_HIVEELEMENTAL: - if (mthing->extrainfo) - mobj->extravalue1 = mthing->extrainfo; + if (mthing->args[0]) + mobj->extravalue1 = mthing->args[0]; break; case MT_GLAREGOYLE: case MT_GLAREGOYLEUP: diff --git a/src/p_setup.c b/src/p_setup.c index 12ccfff4d..8d6b3e5de 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4890,6 +4890,9 @@ static void P_ConvertBinaryMap(void) case 111: //Pop-up Turret mapthings[i].args[0] = mapthings[i].angle; break; + case 127: //Hive Elemental + mapthings[i].args[0] = mapthings[i].extrainfo; + break; case 502: //Star post if (mapthings[i].extrainfo) // Allow thing Parameter to define star post num too! From 5eb2448a409e7337d30d7dd7cca3ef21145a48d6 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Dec 2021 21:57:35 +0100 Subject: [PATCH 211/377] Adapt Pterabytes to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 5 +++++ src/p_enemy.c | 2 +- src/p_setup.c | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index c72603cc6..d5af8fb90 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -3752,6 +3752,11 @@ udmf sprite = "PTERA2A8"; width = 16; height = 16; + arg0 + { + title = "Number of Pterabytes"; + default = 1; + } } 136 { diff --git a/src/p_enemy.c b/src/p_enemy.c index 64b21809f..079ae5e64 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -14270,7 +14270,7 @@ void A_SpawnPterabytes(mobj_t *actor) return; if (actor->spawnpoint) - amount = actor->spawnpoint->extrainfo + 1; + amount = min(1, actor->spawnpoint->args[0]); interval = FixedAngle(FRACUNIT*360/amount); diff --git a/src/p_setup.c b/src/p_setup.c index 8d6b3e5de..9ef539110 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4893,6 +4893,9 @@ static void P_ConvertBinaryMap(void) case 127: //Hive Elemental mapthings[i].args[0] = mapthings[i].extrainfo; break; + case 135: //Pterabyte Spawner + mapthings[i].args[0] = mapthings[i].extrainfo + 1; + break; case 502: //Star post if (mapthings[i].extrainfo) // Allow thing Parameter to define star post num too! From fe8c1d133112a55ab98c61b531779299f035f4c3 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 21 Dec 2021 22:00:42 +0100 Subject: [PATCH 212/377] Adapt Pyre Fly to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 6 ++++++ src/p_mobj.c | 4 ++-- src/p_setup.c | 3 +++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index d5af8fb90..e5bec6d3a 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -3764,6 +3764,12 @@ udmf sprite = "PYREA0"; width = 24; height = 34; + arg0 + { + title = "Start on fire?"; + type = 11; + enum = "noyes"; + } } 137 { diff --git a/src/p_mobj.c b/src/p_mobj.c index 0652967d7..7c44ae8da 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12924,8 +12924,8 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean } break; case MT_PYREFLY: - //start on fire if Ambush flag is set, otherwise behave normally - if (mthing->options & MTF_AMBUSH) + //start on fire if args[0], otherwise behave normally + if (mthing->args[0]) { P_SetMobjState(mobj, mobj->info->meleestate); mobj->extravalue2 = 2; diff --git a/src/p_setup.c b/src/p_setup.c index 9ef539110..03a7cf564 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4896,6 +4896,9 @@ static void P_ConvertBinaryMap(void) case 135: //Pterabyte Spawner mapthings[i].args[0] = mapthings[i].extrainfo + 1; break; + case 136: //Pyre Fly + mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); + break; case 502: //Star post if (mapthings[i].extrainfo) // Allow thing Parameter to define star post num too! From baa99150d076cf4fb2781d95414a35dc00e27033 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 25 Dec 2021 09:58:00 +0100 Subject: [PATCH 213/377] Adapt Fang waypoint to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 6 ++++++ src/p_enemy.c | 25 ++++++++++------------ src/p_setup.c | 4 ++++ 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index e5bec6d3a..5cc285118 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -3989,6 +3989,12 @@ udmf sprite = "internal:eggmanway"; width = 8; height = 16; + arg0 + { + title = "Center waypoint?"; + type = 11; + enum = "noyes"; + } } } diff --git a/src/p_enemy.c b/src/p_enemy.c index 079ae5e64..bff7622b7 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -12693,7 +12693,7 @@ void A_Boss5FindWaypoint(mobj_t *actor) { INT32 locvar1 = var1; boolean avoidcenter; - UINT32 i; + INT32 i; UINT8 extrainfo = (actor->spawnpoint ? actor->spawnpoint->extrainfo : 0); if (LUA_CallAction(A_BOSS5FINDWAYPOINT, actor)) @@ -12735,25 +12735,26 @@ void A_Boss5FindWaypoint(mobj_t *actor) } else if (locvar1 == 1) // always go to ambush-marked waypoint { + boolean found = false; + if (avoidcenter) goto nowaypoints; // if we can't go the center, why on earth are we doing this? - for (i = 0; i < nummapthings; i++) + TAG_ITER_THINGS(extrainfo, i) { if (!mapthings[i].mobj) continue; if (mapthings[i].mobj->type != MT_FANGWAYPOINT) continue; - if (mapthings[i].extrainfo != extrainfo) - continue; - if (!(mapthings[i].options & MTF_AMBUSH)) + if (!(mapthings[i].args[0])) continue; P_SetTarget(&actor->tracer, mapthings[i].mobj); + found = true; break; } - if (i == nummapthings) + if (!found) goto nowaypoints; } else // locvar1 == 0 @@ -12766,7 +12767,7 @@ void A_Boss5FindWaypoint(mobj_t *actor) actor->z += hackoffset; // first, count how many waypoints we have - for (i = 0; i < nummapthings; i++) + TAG_ITER_THINGS(extrainfo, i) { if (!mapthings[i].mobj) continue; @@ -12774,9 +12775,7 @@ void A_Boss5FindWaypoint(mobj_t *actor) continue; if (actor->tracer == mapthings[i].mobj) // this was your tracer last time continue; - if (mapthings[i].extrainfo != extrainfo) - continue; - if (mapthings[i].options & MTF_AMBUSH) + if (mapthings[i].args[0]) { if (avoidcenter) continue; @@ -12823,7 +12822,7 @@ void A_Boss5FindWaypoint(mobj_t *actor) numfangwaypoints = 0; // now find them again and add them to the table! - for (i = 0; i < nummapthings; i++) + TAG_ITER_THINGS(extrainfo, i) { if (!mapthings[i].mobj) continue; @@ -12831,9 +12830,7 @@ void A_Boss5FindWaypoint(mobj_t *actor) continue; if (actor->tracer == mapthings[i].mobj) // this was your tracer last time continue; - if (mapthings[i].extrainfo != extrainfo) - continue; - if (mapthings[i].options & MTF_AMBUSH) + if (mapthings[i].args[0]) { if (avoidcenter) continue; diff --git a/src/p_setup.c b/src/p_setup.c index 03a7cf564..e2603cc46 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3130,6 +3130,7 @@ static void P_AddBinaryMapTags(void) case 762: Tag_FSet(&mapthings[i].tags, mapthings[i].angle); break; + case 294: case 780: Tag_FSet(&mapthings[i].tags, mapthings[i].extrainfo); break; @@ -4899,6 +4900,9 @@ static void P_ConvertBinaryMap(void) case 136: //Pyre Fly mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); break; + case 294: + mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); + break; case 502: //Star post if (mapthings[i].extrainfo) // Allow thing Parameter to define star post num too! From 3661fd507941ab410363a0cb17e2f4f23e82eaf0 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 26 Dec 2021 20:09:38 +0100 Subject: [PATCH 214/377] Adapt boss fly point to UDMF --- src/p_enemy.c | 83 +++++++++++++++++++-------------------------------- src/p_setup.c | 1 + 2 files changed, 31 insertions(+), 53 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index bff7622b7..26458f735 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3862,6 +3862,33 @@ void A_Explode(mobj_t *actor) P_RadiusAttack(actor, actor->target, actor->info->damage, locvar1, true); } +static mobj_t *P_FindBossFlyPoint(mobj_t *mo, INT32 tag) +{ + INT32 i; + mobj_t *closest = NULL; + + TAG_ITER_THINGS(tag, i) + { + mobj_t *mo2 = mapthings[i].mobj; + + if (!mo2) + continue; + + if (mo2->type != MT_BOSSFLYPOINT) + continue; + + // If this one's further than the last one, don't go for it. + if (closest && + P_AproxDistance(P_AproxDistance(mo->x - mo2->x, mo->y - mo2->y), mo->z - mo2->z) > + P_AproxDistance(P_AproxDistance(mo->x - closest->x, mo->y - closest->y), mo->z - closest->z)) + continue; + + closest = mo2; + } + + return closest; +} + // Function: A_BossDeath // // Description: Possibly trigger special effects when boss dies. @@ -4114,32 +4141,7 @@ bossjustdie: if (P_MobjWasRemoved(mo)) return; - P_SetTarget(&mo->target, NULL); - - // Flee! Flee! Find a point to escape to! If none, just shoot upward! - // scan the thinkers to find the runaway point - for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) - { - if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) - continue; - - mo2 = (mobj_t *)th; - - if (mo2->type != MT_BOSSFLYPOINT) - continue; - - if (mo2->spawnpoint && mo2->spawnpoint->extrainfo != extrainfo) - continue; - - // If this one's further then the last one, don't go for it. - if (mo->target && - P_AproxDistance(P_AproxDistance(mo->x - mo2->x, mo->y - mo2->y), mo->z - mo2->z) > - P_AproxDistance(P_AproxDistance(mo->x - mo->target->x, mo->y - mo->target->y), mo->z - mo->target->z)) - continue; - - // Otherwise... Do! - P_SetTarget(&mo->target, mo2); - } + P_SetTarget(&mo->target, P_FindBossFlyPoint(mo, extrainfo)); mo->flags |= MF_NOGRAVITY|MF_NOCLIP; mo->flags |= MF_NOCLIPHEIGHT; @@ -12701,35 +12703,10 @@ void A_Boss5FindWaypoint(mobj_t *actor) avoidcenter = !actor->tracer || (actor->health == actor->info->damage+1); - if (locvar1 == 2) // look for the boss waypoint + if (locvar1 == 2) // look for the boss flypoint { - thinker_t *th; - mobj_t *mo2; - P_SetTarget(&actor->tracer, NULL); - // Flee! Flee! Find a point to escape to! If none, just shoot upward! - // scan the thinkers to find the runaway point - for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) - { - if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) - continue; + P_SetTarget(&actor->tracer, P_FindBossFlyPoint(actor, extrainfo)); - mo2 = (mobj_t *)th; - - if (mo2->type != MT_BOSSFLYPOINT) - continue; - - if (mo2->spawnpoint && mo2->spawnpoint->extrainfo != extrainfo) - continue; - - // If this one's further then the last one, don't go for it. - if (actor->tracer && - P_AproxDistance(P_AproxDistance(actor->x - mo2->x, actor->y - mo2->y), actor->z - mo2->z) > - P_AproxDistance(P_AproxDistance(actor->x - actor->tracer->x, actor->y - actor->tracer->y), actor->z - actor->tracer->z)) - continue; - - // Otherwise... Do! - P_SetTarget(&actor->tracer, mo2); - } if (!actor->tracer) return; // no boss flypoints found } diff --git a/src/p_setup.c b/src/p_setup.c index e2603cc46..c6bcded53 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3130,6 +3130,7 @@ static void P_AddBinaryMapTags(void) case 762: Tag_FSet(&mapthings[i].tags, mapthings[i].angle); break; + case 290: case 294: case 780: Tag_FSet(&mapthings[i].tags, mapthings[i].extrainfo); From ea6fe56df6bc4189f53cae21d0e1030aadad00af Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 26 Dec 2021 20:31:02 +0100 Subject: [PATCH 215/377] Refactor A_BossDeath --- src/p_enemy.c | 398 ++++++++++++++++++++++++++------------------------ 1 file changed, 210 insertions(+), 188 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index 26458f735..c90eb5336 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3889,57 +3889,33 @@ static mobj_t *P_FindBossFlyPoint(mobj_t *mo, INT32 tag) return closest; } -// Function: A_BossDeath -// -// Description: Possibly trigger special effects when boss dies. -// -// var1 = unused -// var2 = unused -// -void A_BossDeath(mobj_t *mo) +static void P_DoBossVictory(mobj_t *mo) { thinker_t *th; mobj_t *mo2; INT32 i; - if (LUA_CallAction(A_BOSSDEATH, mo)) - return; - - if (mo->spawnpoint && mo->spawnpoint->extrainfo) - P_LinedefExecute(LE_BOSSDEAD+(mo->spawnpoint->extrainfo*LE_PARAMWIDTH), mo, NULL); - else - P_LinedefExecute(LE_BOSSDEAD, mo, NULL); - mo->health = 0; - - // Boss is dead (but not necessarily fleeing...) - // Lua may use this to ignore bosses after they start fleeing - mo->flags2 |= MF2_BOSSDEAD; - - // make sure there is a player alive for victory - for (i = 0; i < MAXPLAYERS; i++) - if (playeringame[i] && ((players[i].mo && players[i].mo->health) - || ((netgame || multiplayer) && (players[i].lives || players[i].continues)))) - break; - - if (i == MAXPLAYERS) - return; // no one left alive, so do not end game - - // scan the remaining thinkers to see - // if all bosses are dead + // scan the remaining thinkers to see if all bosses are dead for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) { if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) continue; mo2 = (mobj_t *)th; - if (mo2 != mo && (mo2->flags & MF_BOSS) && mo2->health > 0) - goto bossjustdie; // other boss not dead - just go straight to dying! + + if (mo2 == mo) + continue; + + if ((mo2->flags & MF_BOSS) && mo2->health > 0) + return; } // victory! P_LinedefExecute(LE_ALLBOSSESDEAD, mo, NULL); + if (stoppedclock && modeattacking) // if you're just time attacking, skip making the capsule appear since you don't need to step on it anyways. - goto bossjustdie; + return; + if (mo->flags2 & MF2_BOSSNOTRAP) { for (i = 0; i < MAXPLAYERS; i++) @@ -3979,8 +3955,196 @@ void A_BossDeath(mobj_t *mo) mapheaderinfo[gamemap-1]->muspostbossfadein); } } +} + +static void P_SpawnBoss1Junk(mobj_t *mo) +{ + mobj_t *mo2 = P_SpawnMobjFromMobj(mo, + P_ReturnThrustX(mo, mo->angle - ANGLE_90, 32<angle - ANGLE_90, 32<angle = mo->angle; + P_InstaThrust(mo2, mo2->angle - ANGLE_90, 4*mo2->scale); + P_SetObjectMomZ(mo2, 4*FRACUNIT, false); + P_SetMobjState(mo2, S_BOSSEGLZ1); + + mo2 = P_SpawnMobjFromMobj(mo, + P_ReturnThrustX(mo, mo->angle + ANGLE_90, 32<angle + ANGLE_90, 32<angle = mo->angle; + P_InstaThrust(mo2, mo2->angle + ANGLE_90, 4*mo2->scale); + P_SetObjectMomZ(mo2, 4*FRACUNIT, false); + P_SetMobjState(mo2, S_BOSSEGLZ2); +} + +static void P_SpawnBoss2Junk(mobj_t *mo) +{ + mobj_t *mo2 = P_SpawnMobjFromMobj(mo, + P_ReturnThrustX(mo, mo->angle - ANGLE_90, 32<angle - ANGLE_90, 32<angle = mo->angle; + P_InstaThrust(mo2, mo2->angle - ANGLE_90, 4*mo2->scale); + P_SetObjectMomZ(mo2, 4*FRACUNIT, false); + P_SetMobjState(mo2, S_BOSSTANK1); + + mo2 = P_SpawnMobjFromMobj(mo, + P_ReturnThrustX(mo, mo->angle + ANGLE_90, 32<angle + ANGLE_90, 32<angle = mo->angle; + P_InstaThrust(mo2, mo2->angle + ANGLE_90, 4*mo2->scale); + P_SetObjectMomZ(mo2, 4*FRACUNIT, false); + P_SetMobjState(mo2, S_BOSSTANK2); + + mo2 = P_SpawnMobjFromMobj(mo, 0, 0, + mobjinfo[MT_EGGMOBILE2].height + (32<angle = mo->angle; + P_SetObjectMomZ(mo2, 4*FRACUNIT, false); + mo2->momz += mo->momz; + P_SetMobjState(mo2, S_BOSSSPIGOT); +} + +static void P_SpawnBoss3Junk(mobj_t *mo) +{ + mobj_t *mo2 = P_SpawnMobjFromMobj(mo, 0, 0, 0, MT_BOSSJUNK); + mo2->angle = mo->angle; + P_SetMobjState(mo2, S_BOSSSEBH1); +} + +static void P_DoCybrakdemonDeath(mobj_t *mo) +{ + mo->flags |= MF_NOCLIP; + mo->flags &= ~(MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIPHEIGHT); + + S_StartSound(NULL, sfx_bedie2); + P_SpawnMobjFromMobj(mo, 0, 0, 0, MT_CYBRAKDEMON_VILE_EXPLOSION); + mo->z += P_MobjFlip(mo); + P_SetObjectMomZ(mo, 12*FRACUNIT, false); + S_StartSound(mo, sfx_bgxpld); + if (mo->spawnpoint && !(mo->spawnpoint->options & MTF_EXTRA)) + P_InstaThrust(mo, R_PointToAngle2(0, 0, mo->x, mo->y), 14*FRACUNIT); +} + +static void P_DoBoss5Death(mobj_t *mo) +{ + if (mo->flags2 & MF2_SLIDEPUSH) + { + P_RemoveMobj(mo); + return; + } + if (mo->tracer) + { + var1 = var2 = 0; + A_Boss5Jump(mo); + mo->momx = ((16 - 1)*mo->momx)/16; + mo->momy = ((16 - 1)*mo->momy)/16; + { + const fixed_t time = FixedHypot(mo->tracer->x - mo->x, mo->tracer->y - mo->y)/FixedHypot(mo->momx, mo->momy); + const fixed_t speed = 64*FRACUNIT; + mobj_t *pole = P_SpawnMobj( + mo->tracer->x - P_ReturnThrustX(mo->tracer, mo->tracer->angle, speed*time), + mo->tracer->y - P_ReturnThrustY(mo->tracer, mo->tracer->angle, speed*time), + mo->tracer->floorz + (256+1)*FRACUNIT, + MT_FSGNB); + P_SetTarget(&pole->tracer, P_SpawnMobj( + pole->x, pole->y, + pole->z - 256*FRACUNIT, + MT_FSGNB)); + P_SetTarget(&pole->tracer->tracer, P_SpawnMobj( + pole->x + P_ReturnThrustX(pole, mo->tracer->angle, FRACUNIT), + pole->y + P_ReturnThrustY(pole, mo->tracer->angle, FRACUNIT), + pole->z + 256*FRACUNIT, + MT_FSGNA)); + pole->tracer->flags |= MF_NOCLIPTHING; + P_SetScale(pole, (pole->destscale = 2*FRACUNIT)); + P_SetScale(pole->tracer, (pole->tracer->destscale = 2*FRACUNIT)); + pole->angle = pole->tracer->angle = mo->tracer->angle; + pole->tracer->tracer->angle = pole->angle - ANGLE_90; + pole->momx = P_ReturnThrustX(pole, pole->angle, speed); + pole->momy = P_ReturnThrustY(pole, pole->angle, speed); + pole->tracer->momx = pole->momx; + pole->tracer->momy = pole->momy; + pole->tracer->tracer->momx = pole->momx; + pole->tracer->tracer->momy = pole->momy; + } + } + else + { + P_SetObjectMomZ(mo, 10*FRACUNIT, false); + mo->flags |= MF_NOGRAVITY; + } + mo->flags |= MF_NOCLIP|MF_NOCLIPHEIGHT; +} + +static void P_DoBossDefaultDeath(mobj_t *mo) +{ + UINT8 extrainfo = (mo->spawnpoint ? mo->spawnpoint->extrainfo : 0); + + // Stop exploding and prepare to run. + P_SetMobjState(mo, mo->info->xdeathstate); + if (P_MobjWasRemoved(mo)) + return; + + P_SetTarget(&mo->target, P_FindBossFlyPoint(mo, extrainfo)); + + mo->flags |= MF_NOGRAVITY|MF_NOCLIP; + mo->flags |= MF_NOCLIPHEIGHT; + + mo->movedir = 0; + mo->extravalue1 = 35; + mo->flags2 |= MF2_BOSSFLEE; + mo->momz = P_MobjFlip(mo)*2*mo->scale; + + if (mo->target) + { + angle_t diff = R_PointToAngle2(mo->x, mo->y, mo->target->x, mo->target->y) - mo->angle; + if (diff) + { + if (diff > ANGLE_180) + diff = InvAngle(InvAngle(diff)/mo->extravalue1); + else + diff /= mo->extravalue1; + mo->movedir = diff; + } + } +} + +// Function: A_BossDeath +// +// Description: Possibly trigger special effects when boss dies. +// +// var1 = unused +// var2 = unused +// +void A_BossDeath(mobj_t *mo) +{ + INT32 i; + UINT8 extrainfo = (mo->spawnpoint ? mo->spawnpoint->extrainfo : 0); + + if (LUA_CallAction(A_BOSSDEATH, mo)) + return; + + P_LinedefExecute(LE_BOSSDEAD+(extrainfo*LE_PARAMWIDTH), mo, NULL); + mo->health = 0; + + // Boss is dead (but not necessarily fleeing...) + // Lua may use this to ignore bosses after they start fleeing + mo->flags2 |= MF2_BOSSDEAD; + + // make sure there is a player alive for victory + for (i = 0; i < MAXPLAYERS; i++) + if (playeringame[i] && ((players[i].mo && players[i].mo->health) + || ((netgame || multiplayer) && (players[i].lives || players[i].continues)))) + break; + + if (i == MAXPLAYERS) + return; // no one left alive, so do not end game + + P_DoBossVictory(mo); -bossjustdie: if (LUA_HookMobj(mo, MOBJ_HOOK(BossDeath))) return; else if (P_MobjWasRemoved(mo)) @@ -3992,61 +4156,13 @@ bossjustdie: default: break; case MT_EGGMOBILE: // twin laser pods - { - mo2 = P_SpawnMobjFromMobj(mo, - P_ReturnThrustX(mo, mo->angle - ANGLE_90, 32<angle - ANGLE_90, 32<angle = mo->angle; - P_InstaThrust(mo2, mo2->angle - ANGLE_90, 4*mo2->scale); - P_SetObjectMomZ(mo2, 4*FRACUNIT, false); - P_SetMobjState(mo2, S_BOSSEGLZ1); - - mo2 = P_SpawnMobjFromMobj(mo, - P_ReturnThrustX(mo, mo->angle + ANGLE_90, 32<angle + ANGLE_90, 32<angle = mo->angle; - P_InstaThrust(mo2, mo2->angle + ANGLE_90, 4*mo2->scale); - P_SetObjectMomZ(mo2, 4*FRACUNIT, false); - P_SetMobjState(mo2, S_BOSSEGLZ2); - } + P_SpawnBoss1Junk(mo); break; case MT_EGGMOBILE2: // twin tanks + spigot - { - mo2 = P_SpawnMobjFromMobj(mo, - P_ReturnThrustX(mo, mo->angle - ANGLE_90, 32<angle - ANGLE_90, 32<angle = mo->angle; - P_InstaThrust(mo2, mo2->angle - ANGLE_90, 4*mo2->scale); - P_SetObjectMomZ(mo2, 4*FRACUNIT, false); - P_SetMobjState(mo2, S_BOSSTANK1); - - mo2 = P_SpawnMobjFromMobj(mo, - P_ReturnThrustX(mo, mo->angle + ANGLE_90, 32<angle + ANGLE_90, 32<angle = mo->angle; - P_InstaThrust(mo2, mo2->angle + ANGLE_90, 4*mo2->scale); - P_SetObjectMomZ(mo2, 4*FRACUNIT, false); - P_SetMobjState(mo2, S_BOSSTANK2); - - mo2 = P_SpawnMobjFromMobj(mo, 0, 0, - mobjinfo[MT_EGGMOBILE2].height + (32<angle = mo->angle; - P_SetObjectMomZ(mo2, 4*FRACUNIT, false); - mo2->momz += mo->momz; - P_SetMobjState(mo2, S_BOSSSPIGOT); - } + P_SpawnBoss2Junk(mo); break; case MT_EGGMOBILE3: - { - mo2 = P_SpawnMobjFromMobj(mo, 0, 0, 0, MT_BOSSJUNK); - mo2->angle = mo->angle; - P_SetMobjState(mo2, S_BOSSSEBH1); - } + P_SpawnBoss3Junk(mo); break; } @@ -4054,118 +4170,24 @@ bossjustdie: switch (mo->type) { case MT_BLACKEGGMAN: - { mo->flags |= MF_NOCLIP; mo->flags &= ~MF_SPECIAL; S_StartSound(NULL, sfx_befall); break; - } case MT_CYBRAKDEMON: - { - mo->flags |= MF_NOCLIP; - mo->flags &= ~(MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIPHEIGHT); - - S_StartSound(NULL, sfx_bedie2); - P_SpawnMobjFromMobj(mo, 0, 0, 0, MT_CYBRAKDEMON_VILE_EXPLOSION); - mo->z += P_MobjFlip(mo); - P_SetObjectMomZ(mo, 12*FRACUNIT, false); - S_StartSound(mo, sfx_bgxpld); - if (mo->spawnpoint && !(mo->spawnpoint->options & MTF_EXTRA)) - P_InstaThrust(mo, R_PointToAngle2(0, 0, mo->x, mo->y), 14*FRACUNIT); + P_DoCybrakdemonDeath(mo); break; - } case MT_KOOPA: - { if (mo->spawnpoint) EV_DoCeiling(mo->spawnpoint->args[0], NULL, raiseToHighest); - return; - } - case MT_FANG: - { - if (mo->flags2 & MF2_SLIDEPUSH) - { - P_RemoveMobj(mo); - return; - } - if (mo->tracer) - { - var1 = var2 = 0; - A_Boss5Jump(mo); - mo->momx = ((16 - 1)*mo->momx)/16; - mo->momy = ((16 - 1)*mo->momy)/16; - { - const fixed_t time = FixedHypot(mo->tracer->x - mo->x, mo->tracer->y - mo->y)/FixedHypot(mo->momx, mo->momy); - const fixed_t speed = 64*FRACUNIT; - mobj_t *pole = P_SpawnMobj( - mo->tracer->x - P_ReturnThrustX(mo->tracer, mo->tracer->angle, speed*time), - mo->tracer->y - P_ReturnThrustY(mo->tracer, mo->tracer->angle, speed*time), - mo->tracer->floorz + (256+1)*FRACUNIT, - MT_FSGNB); - P_SetTarget(&pole->tracer, P_SpawnMobj( - pole->x, pole->y, - pole->z - 256*FRACUNIT, - MT_FSGNB)); - P_SetTarget(&pole->tracer->tracer, P_SpawnMobj( - pole->x + P_ReturnThrustX(pole, mo->tracer->angle, FRACUNIT), - pole->y + P_ReturnThrustY(pole, mo->tracer->angle, FRACUNIT), - pole->z + 256*FRACUNIT, - MT_FSGNA)); - pole->tracer->flags |= MF_NOCLIPTHING; - P_SetScale(pole, (pole->destscale = 2*FRACUNIT)); - P_SetScale(pole->tracer, (pole->tracer->destscale = 2*FRACUNIT)); - pole->angle = pole->tracer->angle = mo->tracer->angle; - pole->tracer->tracer->angle = pole->angle - ANGLE_90; - pole->momx = P_ReturnThrustX(pole, pole->angle, speed); - pole->momy = P_ReturnThrustY(pole, pole->angle, speed); - pole->tracer->momx = pole->momx; - pole->tracer->momy = pole->momy; - pole->tracer->tracer->momx = pole->momx; - pole->tracer->tracer->momy = pole->momy; - } - } - else - { - P_SetObjectMomZ(mo, 10*FRACUNIT, false); - mo->flags |= MF_NOGRAVITY; - } - mo->flags |= MF_NOCLIP|MF_NOCLIPHEIGHT; - return; - } - default: //eggmobiles - { - UINT8 extrainfo = (mo->spawnpoint ? mo->spawnpoint->extrainfo : 0); - - // Stop exploding and prepare to run. - P_SetMobjState(mo, mo->info->xdeathstate); - if (P_MobjWasRemoved(mo)) - return; - - P_SetTarget(&mo->target, P_FindBossFlyPoint(mo, extrainfo)); - - mo->flags |= MF_NOGRAVITY|MF_NOCLIP; - mo->flags |= MF_NOCLIPHEIGHT; - - mo->movedir = 0; - mo->extravalue1 = 35; - mo->flags2 |= MF2_BOSSFLEE; - mo->momz = P_MobjFlip(mo)*2*mo->scale; - - if (mo->target) - { - angle_t diff = R_PointToAngle2(mo->x, mo->y, mo->target->x, mo->target->y) - mo->angle; - if (diff) - { - if (diff > ANGLE_180) - diff = InvAngle(InvAngle(diff)/mo->extravalue1); - else - diff /= mo->extravalue1; - mo->movedir = diff; - } - } - break; - } + case MT_FANG: + P_DoBoss5Death(mo); + break; + default: //eggmobiles + P_DoBossDefaultDeath(mo); + break; } } From 8535b595d641c33148839501c56c09e5ab7ee26d Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 26 Dec 2021 21:11:24 +0100 Subject: [PATCH 216/377] Adapt some more player spawning stuff to UDMF --- src/g_demo.c | 2 +- src/m_cheat.c | 2 +- src/p_mobj.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/g_demo.c b/src/g_demo.c index c97dbcf9e..01bc84a40 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -2212,7 +2212,7 @@ void G_AddGhost(char *defdemoname) gh->mo->angle = FixedAngle(mthing->angle << FRACBITS); f = gh->mo->floorz; c = gh->mo->ceilingz - mobjinfo[MT_PLAYER].height; - if (!!(mthing->options & MTF_AMBUSH) ^ !!(mthing->options & MTF_OBJECTFLIP)) + if (!!(mthing->args[0]) ^ !!(mthing->options & MTF_OBJECTFLIP)) { z = c - offset; if (z < f) diff --git a/src/m_cheat.c b/src/m_cheat.c index ddc1f6f29..b5c3b6563 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -539,7 +539,7 @@ void Command_Teleport_f(void) // Flagging a player's ambush will make them start on the ceiling // Objectflip inverts - if (!!(mt->options & MTF_AMBUSH) ^ !!(mt->options & MTF_OBJECTFLIP)) + if (!!(mt->args[0]) ^ !!(mt->options & MTF_OBJECTFLIP)) intz = ss->sector->ceilingheight - p->mo->height - offset; else intz = ss->sector->floorheight + offset; diff --git a/src/p_mobj.c b/src/p_mobj.c index 7c44ae8da..e97719ddb 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -11652,7 +11652,7 @@ void P_MovePlayerToSpawn(INT32 playernum, mapthing_t *mthing) mobj->eflags |= MFE_VERTICALFLIP; mobj->flags2 |= MF2_OBJECTFLIP; } - if (mthing->options & MTF_AMBUSH) + if (mthing->args[0]) P_SetPlayerMobjState(mobj, S_PLAY_FALL); else if (metalrecording) P_SetPlayerMobjState(mobj, S_PLAY_WAIT); From 36217c646898fb72c38e2a10c6d18fdfa5897311 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 26 Dec 2021 21:33:20 +0100 Subject: [PATCH 217/377] Finish adapting slope vertices to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 6 ++++++ src/p_setup.c | 3 +++ src/p_slopes.c | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 5cc285118..1cb3b41ee 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -4778,6 +4778,12 @@ udmf { title = "Slope Vertex"; sprite = "internal:vertexslope"; + arg0 + { + title = "Absolute height?"; + type = 11; + enum = "noyes"; + } } 751 diff --git a/src/p_setup.c b/src/p_setup.c index c6bcded53..cc5b32d73 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4915,6 +4915,9 @@ static void P_ConvertBinaryMap(void) // Old behavior if Parameter is 0; add 360 to the angle for each consecutive star post. mapthings[i].args[0] = (mapthings[i].angle/360); break; + case 750: //Slope vertex + mapthings[i].args[0] = mapthings[i].extrainfo; + break; case 753: //Zoom tube waypoint mapthings[i].args[0] = mapthings[i].angle >> 8; mapthings[i].args[1] = mapthings[i].angle & 255; diff --git a/src/p_slopes.c b/src/p_slopes.c index bfca153a6..c0cc3a98e 100644 --- a/src/p_slopes.c +++ b/src/p_slopes.c @@ -469,7 +469,7 @@ static pslope_t *MakeViaMapthings(INT16 tag1, INT16 tag2, INT16 tag3, UINT8 flag vx[i].x = mt->x << FRACBITS; vx[i].y = mt->y << FRACBITS; vx[i].z = mt->z << FRACBITS; - if (!mt->extrainfo) + if (!mt->args[0]) vx[i].z += R_PointInSubsector(vx[i].x, vx[i].y)->sector->floorheight; } From c550de5dfa5e06370fd91ee03263c00cd1be23fc Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 27 Dec 2021 07:32:57 +0100 Subject: [PATCH 218/377] Adapt spikes to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 36 ++++++++++++++++++++++ src/p_mobj.c | 33 ++++++++------------ src/p_setup.c | 22 +++++++++++++ src/p_spec.h | 6 ++++ 4 files changed, 76 insertions(+), 21 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 1cb3b41ee..5736cb7bf 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -4417,6 +4417,24 @@ udmf width = 16; height = 14; arrow = 1; + arg0 + { + title = "Retraction interval"; + } + arg1 + { + title = "Start interval"; + } + arg2 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Start retracted"; + 2 = "Intangible"; + } + } } 523 { @@ -4424,6 +4442,24 @@ udmf sprite = "USPKA0"; width = 8; height = 32; + arg0 + { + title = "Retraction interval"; + } + arg1 + { + title = "Start interval"; + } + arg2 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Start retracted"; + 2 = "Intangible"; + } + } } 1130 { diff --git a/src/p_mobj.c b/src/p_mobj.c index e97719ddb..bb9bd22a7 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10072,16 +10072,9 @@ static boolean P_FuseThink(mobj_t *mobj) case MT_METALSONIC_BATTLE: break; // don't remove case MT_SPIKE: - P_SetMobjState(mobj, mobj->state->nextstate); - mobj->fuse = mobj->info->speed; - if (mobj->spawnpoint) - mobj->fuse += mobj->spawnpoint->angle; - break; case MT_WALLSPIKE: P_SetMobjState(mobj, mobj->state->nextstate); - mobj->fuse = mobj->info->speed; - if (mobj->spawnpoint) - mobj->fuse += (mobj->spawnpoint->angle / 360); + mobj->fuse = mobj->spawnpoint ? mobj->spawnpoint->args[0] : mobj->info->speed; break; case MT_NIGHTSCORE: P_RemoveMobj(mobj); @@ -12992,15 +12985,13 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean break; case MT_SPIKE: // Pop up spikes! - if (mthing->options & MTF_OBJECTSPECIAL) + if (mthing->args[0]) { mobj->flags &= ~MF_SCENERY; - mobj->fuse = (16 - mthing->extrainfo)*(mthing->angle + mobj->info->speed)/16; - if (mthing->options & MTF_EXTRA) - P_SetMobjState(mobj, mobj->info->meleestate); + mobj->fuse = mthing->args[1]; } - // Use per-thing collision for spikes if the deaf flag isn't checked. - if (!(mthing->options & MTF_AMBUSH) && !metalrecording) + // Use per-thing collision for spikes unless the intangible flag is checked. + if (!(mthing->args[2] & TMSF_INTANGIBLE) && !metalrecording) { P_UnsetThingPosition(mobj); mobj->flags &= ~(MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIPHEIGHT); @@ -13010,18 +13001,18 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean break; case MT_WALLSPIKE: // Pop up spikes! - if (mthing->options & MTF_OBJECTSPECIAL) + if (mthing->args[0]) { mobj->flags &= ~MF_SCENERY; - mobj->fuse = (16 - mthing->extrainfo)*((mthing->angle/360) + mobj->info->speed)/16; - if (mthing->options & MTF_EXTRA) - P_SetMobjState(mobj, mobj->info->meleestate); + mobj->fuse = mthing->args[1]; } - // Use per-thing collision for spikes if the deaf flag isn't checked. - if (!(mthing->options & MTF_AMBUSH) && !metalrecording) + if (mthing->args[2] & TMSF_RETRACTED) + P_SetMobjState(mobj, mobj->info->meleestate); + // Use per-thing collision for spikes unless the intangible flag is checked. + if (!(mthing->args[2] & TMSF_INTANGIBLE) && !metalrecording) { P_UnsetThingPosition(mobj); - mobj->flags &= ~(MF_NOBLOCKMAP | MF_NOCLIPHEIGHT); + mobj->flags &= ~(MF_NOBLOCKMAP|MF_NOCLIPHEIGHT); mobj->flags |= MF_SOLID; P_SetThingPosition(mobj); } diff --git a/src/p_setup.c b/src/p_setup.c index cc5b32d73..ac7d9e919 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4915,6 +4915,28 @@ static void P_ConvertBinaryMap(void) // Old behavior if Parameter is 0; add 360 to the angle for each consecutive star post. mapthings[i].args[0] = (mapthings[i].angle/360); break; + case 522: //Wall spike + if (mapthings[i].options & MTF_OBJECTSPECIAL) + { + mapthings[i].args[0] = mobjinfo[MT_WALLSPIKE].speed + mapthings[i].angle/360; + mapthings[i].args[1] = (16 - mapthings[i].extrainfo) * mapthings[i].args[0]/16; + if (mapthings[i].options & MTF_EXTRA) + mapthings[i].args[2] |= TMSF_RETRACTED; + } + if (mapthings[i].options & MTF_AMBUSH) + mapthings[i].args[2] |= TMSF_INTANGIBLE; + break; + case 523: //Spike + if (mapthings[i].options & MTF_OBJECTSPECIAL) + { + mapthings[i].args[0] = mobjinfo[MT_SPIKE].speed + mapthings[i].angle; + mapthings[i].args[1] = (16 - mapthings[i].extrainfo) * mapthings[i].args[0]/16; + if (mapthings[i].options & MTF_EXTRA) + mapthings[i].args[2] |= TMSF_RETRACTED; + } + if (mapthings[i].options & MTF_AMBUSH) + mapthings[i].args[2] |= TMSF_INTANGIBLE; + break; case 750: //Slope vertex mapthings[i].args[0] = mapthings[i].extrainfo; break; diff --git a/src/p_spec.h b/src/p_spec.h index f9ad63957..88dc6d9f8 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -44,6 +44,12 @@ typedef enum TMDA_TOP = 1<<3, } textmapdronealignment_t; +typedef enum +{ + TMSF_RETRACTED = 1, + TMSF_INTANGIBLE = 1<<1, +} textmapspikeflags_t; + //FOF flags typedef enum { From a14eacd63a855c19317786e129361156f5ab43d8 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 27 Dec 2021 08:55:59 +0100 Subject: [PATCH 219/377] Bowser isn't a boss, so don't call A_BossDeath just to do that one thing it needs to do --- src/p_enemy.c | 4 ---- src/p_mobj.c | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index c90eb5336..220f8cf16 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -4178,10 +4178,6 @@ void A_BossDeath(mobj_t *mo) case MT_CYBRAKDEMON: P_DoCybrakdemonDeath(mo); break; - case MT_KOOPA: - if (mo->spawnpoint) - EV_DoCeiling(mo->spawnpoint->args[0], NULL, raiseToHighest); - break; case MT_FANG: P_DoBoss5Death(mo); break; diff --git a/src/p_mobj.c b/src/p_mobj.c index bb9bd22a7..7e8f4b397 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6939,7 +6939,6 @@ static void P_RemoveOverlay(mobj_t *thing) } } -void A_BossDeath(mobj_t *mo); // AI for the Koopa boss. static void P_KoopaThinker(mobj_t *koopa) { @@ -6947,7 +6946,8 @@ static void P_KoopaThinker(mobj_t *koopa) if (koopa->watertop > koopa->z + koopa->height + FixedMul(128*FRACUNIT, koopa->scale) && koopa->health > 0) { - A_BossDeath(koopa); + if (koopa->spawnpoint) + EV_DoCeiling(koopa->spawnpoint->args[0], NULL, raiseToHighest); P_RemoveMobj(koopa); return; } From 06bbee50bf7f31c2df2b44c6c6bd8315c550f3c1 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 27 Dec 2021 15:07:37 +0100 Subject: [PATCH 220/377] Adapt boss IDs and trigger tags to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 167 +++++++++++++++++++++ src/info.c | 8 +- src/p_enemy.c | 29 ++-- src/p_mobj.c | 41 +++-- src/p_setup.c | 35 +++++ 5 files changed, 245 insertions(+), 35 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 5736cb7bf..31d6b794d 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -3895,6 +3895,25 @@ udmf sprite = "EGGMA1"; width = 24; height = 76; + arg0 + { + title = "Boss ID"; + } + arg1 + { + title = "Death trigger tag"; + type = 15; + } + arg2 + { + title = "Victory trigger tag"; + type = 15; + } + arg3 + { + title = "Pinch trigger tag"; + type = 15; + } } 201 { @@ -3902,6 +3921,25 @@ udmf sprite = "EGGNA1"; width = 24; height = 76; + arg0 + { + title = "Boss ID"; + } + arg1 + { + title = "Death trigger tag"; + type = 15; + } + arg2 + { + title = "Victory trigger tag"; + type = 15; + } + arg3 + { + title = "Pinch trigger tag"; + type = 15; + } } 202 { @@ -3909,6 +3947,25 @@ udmf sprite = "EGGOA1"; width = 32; height = 116; + arg0 + { + title = "Boss ID"; + } + arg1 + { + title = "Death trigger tag"; + type = 15; + } + arg2 + { + title = "Victory trigger tag"; + type = 15; + } + arg3 + { + title = "Pinch trigger tag"; + type = 15; + } } 203 { @@ -3916,6 +3973,30 @@ udmf sprite = "EGGPA1"; width = 24; height = 76; + arg0 + { + title = "Boss ID"; + } + arg1 + { + title = "Death trigger tag"; + type = 15; + } + arg2 + { + title = "Victory trigger tag"; + type = 15; + } + arg3 + { + title = "Pinch trigger tag"; + type = 15; + } + arg4 + { + title = "Cage drop trigger tag"; + type = 15; + } } 204 { @@ -3923,6 +4004,25 @@ udmf sprite = "FANGA1"; width = 24; height = 60; + arg0 + { + title = "Boss ID"; + } + arg1 + { + title = "Death trigger tag"; + type = 15; + } + arg2 + { + title = "Victory trigger tag"; + type = 15; + } + arg3 + { + title = "Pinch trigger tag"; + type = 15; + } } 206 { @@ -3930,6 +4030,30 @@ udmf sprite = "BRAKB1"; width = 48; height = 160; + arg0 + { + title = "Boss ID"; + } + arg1 + { + title = "Death trigger tag"; + type = 15; + } + arg2 + { + title = "Victory trigger tag"; + type = 15; + } + arg3 + { + title = "Pinch trigger tag"; + type = 15; + } + arg4 + { + title = "Platform trigger tag"; + type = 15; + } } 207 { @@ -3944,6 +4068,25 @@ udmf sprite = "METLC1"; width = 16; height = 48; + arg0 + { + title = "Boss ID"; + } + arg1 + { + title = "Death trigger tag"; + type = 15; + } + arg2 + { + title = "Victory trigger tag"; + type = 15; + } + arg3 + { + title = "Pinch trigger tag"; + type = 15; + } } 209 { @@ -3951,6 +4094,30 @@ udmf sprite = "BRAK01"; width = 48; height = 160; + arg0 + { + title = "Boss ID"; + } + arg1 + { + title = "Death trigger tag"; + type = 15; + } + arg2 + { + title = "Victory trigger tag"; + type = 15; + } + arg3 + { + title = "Pinch trigger tag"; + type = 15; + } + arg4 + { + title = "Attack trigger tag"; + type = 15; + } } 290 { diff --git a/src/info.c b/src/info.c index d456d2afe..ddcf6709e 100644 --- a/src/info.c +++ b/src/info.c @@ -1452,7 +1452,7 @@ state_t states[NUMSTATES] = {SPR_FANG, 18, 16, {A_FaceTarget}, 3, 0, S_FANG_PINCHLOBSHOT1}, // S_FANG_PINCHLOBSHOT0 {SPR_FANG, 19, 2, {A_FaceTarget}, 3, 0, S_FANG_PINCHLOBSHOT2}, // S_FANG_PINCHLOBSHOT1 {SPR_FANG, 20, 30, {A_Boss5MakeItRain}, MT_FBOMB, -16, S_FANG_PINCHLOBSHOT3}, // S_FANG_PINCHLOBSHOT2 - {SPR_FANG, 20, 18, {A_LinedefExecute}, LE_BOSS4DROP, 0, S_FANG_PINCHLOBSHOT4}, // S_FANG_PINCHLOBSHOT3 + {SPR_FANG, 20, 18, {A_LinedefExecuteFromArg}, 3, 0, S_FANG_PINCHLOBSHOT4}, // S_FANG_PINCHLOBSHOT3 {SPR_FANG, 0, 0, {A_Boss5Calm}, 0, 0, S_FANG_PATHINGSTART1}, // S_FANG_PINCHLOBSHOT4 {SPR_FANG, 21, 0, {A_DoNPCPain}, 0, 0, S_FANG_DIE2}, // S_FANG_DIE1 @@ -1584,7 +1584,7 @@ state_t states[NUMSTATES] = {SPR_BRAK, 21, 3*TICRATE, {NULL}, 0, 0, S_BLACKEGG_DESTROYPLAT2}, // S_BLACKEGG_DESTROYPLAT1 {SPR_BRAK, 21, 1, {A_PlaySound}, sfx_s3k54, 0, S_BLACKEGG_DESTROYPLAT3}, // S_BLACKEGG_DESTROYPLAT2 - {SPR_BRAK, 21, 14, {A_LinedefExecute}, LE_BRAKPLATFORM, 0, S_BLACKEGG_STND}, // S_BLACKEGG_DESTROYPLAT3 + {SPR_BRAK, 21, 14, {A_LinedefExecuteFromArg}, 4, 0, S_BLACKEGG_STND}, // S_BLACKEGG_DESTROYPLAT3 {SPR_NULL, 0, 1, {A_CapeChase}, (160 - 20) << 16, 0, S_BLACKEGG_HELPER}, // S_BLACKEGG_HELPER @@ -1618,7 +1618,7 @@ state_t states[NUMSTATES] = {SPR_BRAK, 26 + FF_FULLBRIGHT, 2, {A_BrakFireShot}, MT_CYBRAKDEMON_FLAMESHOT, 128, S_CYBRAKDEMON_FLAME_ATTACK4}, // S_CYBRAKDEMON_FLAME_ATTACK3 // Fire {SPR_BRAK, 7, 1, {A_Repeat}, 30, S_CYBRAKDEMON_FLAME_ATTACK3, S_CYBRAKDEMON_FINISH_ATTACK1}, // S_CYBRAKDEMON_FLAME_ATTACK4 // Loop {SPR_BRAK, 0, 6, {A_RandomState}, S_CYBRAKDEMON_VILE_ATTACK1, S_CYBRAKDEMON_NAPALM_ATTACK1, S_CYBRAKDEMON_MISSILE_ATTACK1}, // S_CYBRAKDEMON_CHOOSE_ATTACK2 - {SPR_BRAK, 20, 0, {A_LinedefExecute}, LE_BRAKVILEATACK, 0, S_CYBRAKDEMON_VILE_ATTACK2}, // S_CYBRAKDEMON_VILE_ATTACK1 + {SPR_BRAK, 20, 0, {A_LinedefExecuteFromArg}, 4, 0, S_CYBRAKDEMON_VILE_ATTACK2}, // S_CYBRAKDEMON_VILE_ATTACK1 {SPR_BRAK, 20, 24, {A_VileTarget}, MT_CYBRAKDEMON_TARGET_RETICULE, 1, S_CYBRAKDEMON_VILE_ATTACK3}, // S_CYBRAKDEMON_VILE_ATTACK2 {SPR_BRAK, 19, 8, {A_FaceTarget}, 0, 0, S_CYBRAKDEMON_VILE_ATTACK4}, // S_CYBRAKDEMON_VILE_ATTACK3 {SPR_BRAK, 18, 8, {A_FaceTarget}, 0, 0, S_CYBRAKDEMON_VILE_ATTACK5}, // S_CYBRAKDEMON_VILE_ATTACK4 @@ -1631,7 +1631,7 @@ state_t states[NUMSTATES] = {SPR_BRAK, 0, 0, {A_SetReactionTime}, 0, 0, S_CYBRAKDEMON_WALK1}, // S_CYBRAKDEMON_FINISH_ATTACK2 // If just attacked, remove MF2_FRET w/out going back to spawnstate {SPR_BRAK, 18, 24, {A_Pain}, 0, 0, S_CYBRAKDEMON_PAIN2}, // S_CYBRAKDEMON_PAIN1 {SPR_BRAK, 18, 0, {A_CheckHealth}, 3, S_CYBRAKDEMON_PAIN3, S_CYBRAKDEMON_CHOOSE_ATTACK1}, // S_CYBRAKDEMON_PAIN2 - {SPR_BRAK, 18, 0, {A_LinedefExecute}, LE_PINCHPHASE, 0, S_CYBRAKDEMON_CHOOSE_ATTACK1}, // S_CYBRAKDEMON_PAIN3 + {SPR_BRAK, 18, 0, {A_LinedefExecuteFromArg}, 3, 0, S_CYBRAKDEMON_CHOOSE_ATTACK1}, // S_CYBRAKDEMON_PAIN3 {SPR_BRAK, 18, 1, {A_Repeat}, 1, S_CYBRAKDEMON_DIE1, S_CYBRAKDEMON_DIE2}, // S_CYBRAKDEMON_DIE1 {SPR_BRAK, 18, 2, {A_BossScream}, 2, 0, S_CYBRAKDEMON_DIE3}, // S_CYBRAKDEMON_DIE2 {SPR_BRAK, 18, 0, {A_Repeat}, 52, S_CYBRAKDEMON_DIE2, S_CYBRAKDEMON_DIE4}, // S_CYBRAKDEMON_DIE3 diff --git a/src/p_enemy.c b/src/p_enemy.c index 220f8cf16..5d7cacb36 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3911,7 +3911,8 @@ static void P_DoBossVictory(mobj_t *mo) } // victory! - P_LinedefExecute(LE_ALLBOSSESDEAD, mo, NULL); + if (mo->spawnpoint) + P_LinedefExecute(mo->spawnpoint->args[1], mo, NULL); if (stoppedclock && modeattacking) // if you're just time attacking, skip making the capsule appear since you don't need to step on it anyways. return; @@ -4081,14 +4082,14 @@ static void P_DoBoss5Death(mobj_t *mo) static void P_DoBossDefaultDeath(mobj_t *mo) { - UINT8 extrainfo = (mo->spawnpoint ? mo->spawnpoint->extrainfo : 0); + INT32 bossid = (mo->spawnpoint ? mo->spawnpoint->args[0] : 0); // Stop exploding and prepare to run. P_SetMobjState(mo, mo->info->xdeathstate); if (P_MobjWasRemoved(mo)) return; - P_SetTarget(&mo->target, P_FindBossFlyPoint(mo, extrainfo)); + P_SetTarget(&mo->target, P_FindBossFlyPoint(mo, bossid)); mo->flags |= MF_NOGRAVITY|MF_NOCLIP; mo->flags |= MF_NOCLIPHEIGHT; @@ -4122,12 +4123,12 @@ static void P_DoBossDefaultDeath(mobj_t *mo) void A_BossDeath(mobj_t *mo) { INT32 i; - UINT8 extrainfo = (mo->spawnpoint ? mo->spawnpoint->extrainfo : 0); if (LUA_CallAction(A_BOSSDEATH, mo)) return; - P_LinedefExecute(LE_BOSSDEAD+(extrainfo*LE_PARAMWIDTH), mo, NULL); + if (mo->spawnpoint) + P_LinedefExecute(mo->spawnpoint->args[1], mo, NULL); mo->health = 0; // Boss is dead (but not necessarily fleeing...) @@ -7070,10 +7071,8 @@ void A_Boss1Chase(mobj_t *actor) } else { - if (actor->spawnpoint && actor->spawnpoint->extrainfo) - P_LinedefExecute(LE_PINCHPHASE+(actor->spawnpoint->extrainfo*LE_PARAMWIDTH), actor, NULL); - else - P_LinedefExecute(LE_PINCHPHASE, actor, NULL); + if (actor->spawnpoint) + P_LinedefExecute(actor->spawnpoint->args[3], actor, NULL); P_SetMobjState(actor, actor->info->raisestate); } @@ -8324,8 +8323,6 @@ void A_LinedefExecute(mobj_t *actor) if (locvar2) tagnum += locvar2*(AngleFixed(actor->angle)>>FRACBITS); - else if (actor->spawnpoint && actor->spawnpoint->extrainfo) - tagnum += (actor->spawnpoint->extrainfo*LE_PARAMWIDTH); CONS_Debug(DBG_GAMELOGIC, "A_LinedefExecute: Running mobjtype %d's sector with tag %d\n", actor->type, tagnum); @@ -12714,7 +12711,7 @@ void A_Boss5FindWaypoint(mobj_t *actor) INT32 locvar1 = var1; boolean avoidcenter; INT32 i; - UINT8 extrainfo = (actor->spawnpoint ? actor->spawnpoint->extrainfo : 0); + INT32 bossid = (actor->spawnpoint ? actor->spawnpoint->args[0] : 0); if (LUA_CallAction(A_BOSS5FINDWAYPOINT, actor)) return; @@ -12723,7 +12720,7 @@ void A_Boss5FindWaypoint(mobj_t *actor) if (locvar1 == 2) // look for the boss flypoint { - P_SetTarget(&actor->tracer, P_FindBossFlyPoint(actor, extrainfo)); + P_SetTarget(&actor->tracer, P_FindBossFlyPoint(actor, bossid)); if (!actor->tracer) return; // no boss flypoints found @@ -12735,7 +12732,7 @@ void A_Boss5FindWaypoint(mobj_t *actor) if (avoidcenter) goto nowaypoints; // if we can't go the center, why on earth are we doing this? - TAG_ITER_THINGS(extrainfo, i) + TAG_ITER_THINGS(bossid, i) { if (!mapthings[i].mobj) continue; @@ -12762,7 +12759,7 @@ void A_Boss5FindWaypoint(mobj_t *actor) actor->z += hackoffset; // first, count how many waypoints we have - TAG_ITER_THINGS(extrainfo, i) + TAG_ITER_THINGS(bossid, i) { if (!mapthings[i].mobj) continue; @@ -12817,7 +12814,7 @@ void A_Boss5FindWaypoint(mobj_t *actor) numfangwaypoints = 0; // now find them again and add them to the table! - TAG_ITER_THINGS(extrainfo, i) + TAG_ITER_THINGS(bossid, i) { if (!mapthings[i].mobj) continue; diff --git a/src/p_mobj.c b/src/p_mobj.c index 7e8f4b397..406519e22 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -4347,7 +4347,8 @@ static void P_Boss2Thinker(mobj_t *mobj) { mobj->flags &= ~MF_NOGRAVITY; A_Boss2Pogo(mobj); - P_LinedefExecute(LE_PINCHPHASE, mobj, NULL); + if (mobj->spawnpoint) + P_LinedefExecute(mobj->spawnpoint->args[3], mobj, NULL); } } @@ -4476,7 +4477,8 @@ static void P_Boss3Thinker(mobj_t *mobj) dummy->cusval = mobj->cusval; CONS_Debug(DBG_GAMELOGIC, "Eggman path %d - Dummy selected paths %d and %d\n", way0, way1, way2); - P_LinedefExecute(LE_PINCHPHASE+(mobj->cusval*LE_PARAMWIDTH), mobj, NULL); + if (mobj->spawnpoint) + P_LinedefExecute(mobj->spawnpoint->args[3], mobj, NULL); } } else if (mobj->movecount) // Firing mode @@ -4642,12 +4644,14 @@ static void P_Boss3Thinker(mobj_t *mobj) // Move Boss4's sectors by delta. static boolean P_Boss4MoveCage(mobj_t *mobj, fixed_t delta) { - const UINT16 tag = 65534 + (mobj->spawnpoint ? mobj->spawnpoint->extrainfo*LE_PARAMWIDTH : 0); INT32 snum; sector_t *sector; boolean gotcage = false; - TAG_ITER_SECTORS(tag, snum) + if (!mobj->spawnpoint) + return false; + + TAG_ITER_SECTORS(mobj->spawnpoint->args[3], snum) { sector = §ors[snum]; sector->floorheight += delta; @@ -4726,13 +4730,15 @@ static void P_Boss4PinchSpikeballs(mobj_t *mobj, angle_t angle, fixed_t dz) // Destroy cage FOFs. static void P_Boss4DestroyCage(mobj_t *mobj) { - const UINT16 tag = 65534 + (mobj->spawnpoint ? mobj->spawnpoint->extrainfo*LE_PARAMWIDTH : 0); INT32 snum; size_t a; sector_t *sector, *rsec; ffloor_t *rover; - TAG_ITER_SECTORS(tag, snum) + if (!mobj->spawnpoint) + return; + + TAG_ITER_SECTORS(mobj->spawnpoint->args[3], snum) { sector = §ors[snum]; @@ -5005,13 +5011,15 @@ static void P_Boss4Thinker(mobj_t *mobj) { // Proceed to pinch phase! P_Boss4DestroyCage(mobj); mobj->movedir = 3; - P_LinedefExecute(LE_PINCHPHASE + (mobj->spawnpoint ? mobj->spawnpoint->extrainfo*LE_PARAMWIDTH : 0), mobj, NULL); + if (mobj->spawnpoint) + P_LinedefExecute(mobj->spawnpoint->args[3], mobj, NULL); P_Boss4MoveSpikeballs(mobj, FixedAngle(mobj->movecount), 0); var1 = 3; A_BossJetFume(mobj); return; } - P_LinedefExecute(LE_BOSS4DROP - (mobj->info->spawnhealth-mobj->health) + (mobj->spawnpoint ? mobj->spawnpoint->extrainfo*LE_PARAMWIDTH : 0), mobj, NULL); + if (mobj->spawnpoint) + P_LinedefExecute(mobj->spawnpoint->args[4] - (mobj->info->spawnhealth-mobj->health), mobj, NULL); // 1 -> 1.5 second timer mobj->threshold = TICRATE+(TICRATE*(mobj->info->spawnhealth-mobj->health)/10); if (mobj->threshold < 1) @@ -5043,7 +5051,8 @@ static void P_Boss4Thinker(mobj_t *mobj) { // Proceed to pinch phase! P_Boss4DestroyCage(mobj); mobj->movedir = 3; - P_LinedefExecute(LE_PINCHPHASE + (mobj->spawnpoint ? mobj->spawnpoint->extrainfo*LE_PARAMWIDTH : 0), mobj, NULL); + if (mobj->spawnpoint) + P_LinedefExecute(mobj->spawnpoint->args[3], mobj, NULL); var1 = 3; A_BossJetFume(mobj); return; @@ -5183,7 +5192,8 @@ static void P_Boss7Thinker(mobj_t *mobj) // Begin platform destruction mobj->flags2 |= MF2_FRET; P_SetMobjState(mobj, mobj->info->raisestate); - P_LinedefExecute(LE_PINCHPHASE, mobj, NULL); + if (mobj->spawnpoint) + P_LinedefExecute(mobj->spawnpoint->args[3], mobj, NULL); } } else if (mobj->state == &states[S_BLACKEGG_HITFACE4] && mobj->tics == mobj->state->tics) @@ -5277,7 +5287,7 @@ static void P_Boss7Thinker(mobj_t *mobj) INT32 i; boolean foundgoop = false; INT32 closestNum; - UINT8 extrainfo = (mobj->spawnpoint ? mobj->spawnpoint->extrainfo : 0); + UINT8 bossid = (mobj->spawnpoint ? mobj->spawnpoint->args[0] : 0); // Looks for players in goop. If you find one, try to jump on him. for (i = 0; i < MAXPLAYERS; i++) @@ -5307,7 +5317,7 @@ static void P_Boss7Thinker(mobj_t *mobj) continue; if (!mo2->spawnpoint) continue; - if (mo2->spawnpoint->extrainfo != extrainfo) + if (mo2->spawnpoint->extrainfo != bossid) continue; if (mobj->health <= mobj->info->damage && !(mo2->spawnpoint->options & 7)) continue; // don't jump to center @@ -5364,7 +5374,7 @@ static void P_Boss7Thinker(mobj_t *mobj) continue; if ((mo2->spawnpoint->options & 7) != waypointNum) continue; - if (mo2->spawnpoint->extrainfo != extrainfo) + if (mo2->spawnpoint->extrainfo != bossid) continue; hitspot = mo2; @@ -6040,7 +6050,8 @@ static void P_Boss9Thinker(mobj_t *mobj) mobj->watertop = mobj->floorz + 16*FRACUNIT; else mobj->watertop = mobj->target->floorz + 16*FRACUNIT; - P_LinedefExecute(LE_PINCHPHASE, mobj, NULL); + if (mobj->spawnpoint) + P_LinedefExecute(mobj->spawnpoint->args[3], mobj, NULL); #if 0 whoosh = P_SpawnMobjFromMobj(mobj, 0, 0, 0, MT_GHOST); // done here so the offset is correct @@ -10147,7 +10158,7 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->flags & MF_NOTHINK) return; - if ((mobj->flags & MF_BOSS) && mobj->spawnpoint && (bossdisabled & (1<spawnpoint->extrainfo))) + if ((mobj->flags & MF_BOSS) && mobj->spawnpoint && (bossdisabled & (1<spawnpoint->args[0]))) return; // Remove dead target/tracer. diff --git a/src/p_setup.c b/src/p_setup.c index ac7d9e919..7fe66148f 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3175,6 +3175,8 @@ static line_t *P_FindPointPushLine(taglist_t *list) static void P_ConvertBinaryMap(void) { size_t i; + mobjtype_t mobjtypeofthing[4096]; + mobjtype_t mobjtype; for (i = 0; i < numlines; i++) { @@ -4872,6 +4874,14 @@ static void P_ConvertBinaryMap(void) } } + for (i = 0; i < NUMMOBJTYPES; i++) + { + if (mobjinfo[i].doomednum < 0 || mobjinfo[i].doomednum >= 4096) + continue; + + mobjtypeofthing[mobjinfo[i].doomednum] = (mobjtype_t)i; + } + for (i = 0; i < nummapthings; i++) { if (mapthings[i].type >= 1 && mapthings[i].type <= 35) @@ -4880,6 +4890,19 @@ static void P_ConvertBinaryMap(void) continue; } + mobjtype = mobjtypeofthing[mapthings[i].type]; + if (mobjtype) + { + if (mobjinfo[mobjtype].flags & MF_BOSS) + { + INT32 paramoffset = mapthings[i].extrainfo*LE_PARAMWIDTH; + mapthings[i].args[0] = mapthings[i].extrainfo; + mapthings[i].args[1] = LE_BOSSDEAD + paramoffset; + mapthings[i].args[2] = LE_ALLBOSSESDEAD + paramoffset; + mapthings[i].args[3] = LE_PINCHPHASE + paramoffset; + } + } + switch (mapthings[i].type) { case 102: //SDURF @@ -4901,6 +4924,18 @@ static void P_ConvertBinaryMap(void) case 136: //Pyre Fly mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); break; + case 203: //Egg Colosseum + mapthings[i].args[4] = LE_BOSS4DROP + mapthings[i].extrainfo * LE_PARAMWIDTH; + break; + case 204: //Fang + mapthings[i].args[3] = LE_BOSS4DROP + mapthings[i].extrainfo*LE_PARAMWIDTH; + break; + case 206: //Brak Eggman (Old) + mapthings[i].args[4] = LE_BRAKPLATFORM + mapthings[i].extrainfo*LE_PARAMWIDTH; + break; + case 209: //Brak Eggman + mapthings[i].args[4] = LE_BRAKVILEATACK + mapthings[i].extrainfo*LE_PARAMWIDTH; + break; case 294: mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); break; From 8db84ffef9c6da8a845d8c07158a2adb40772651 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 27 Dec 2021 15:37:21 +0100 Subject: [PATCH 221/377] Adapt boss waypoint to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 8 +++ src/p_enemy.c | 24 +++------ src/p_mobj.c | 62 +++++++++------------- src/p_setup.c | 5 ++ 4 files changed, 44 insertions(+), 55 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 31d6b794d..318981f18 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -4142,6 +4142,14 @@ udmf width = 8; height = 16; sprite = "internal:eggmanway"; + arg0 + { + title = "Sea Egg sequence"; + } + arg1 + { + title = "Brak Eggman sequence"; + } } 293 { diff --git a/src/p_enemy.c b/src/p_enemy.c index 5d7cacb36..7e00ad91d 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8114,10 +8114,6 @@ void A_Boss3TakeDamage(mobj_t *actor) actor->movecount = var1; actor->movefactor = -512*FRACUNIT; - - /*if (actor->target && actor->target->spawnpoint) - actor->threshold = actor->target->spawnpoint->extrainfo;*/ - } // Function: A_Boss3Path @@ -8157,27 +8153,21 @@ void A_Boss3Path(mobj_t *actor) if (!(actor->flags2 & MF2_STRONGBOX)) { - thinker_t *th; mobj_t *mo2; + INT32 i; P_SetTarget(&actor->target, NULL); - // scan the thinkers - // to find a point that matches - // the number - for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) + // Find waypoint + TAG_ITER_THINGS(actor->cusval, i) { - if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) - continue; + mo2 = mapthings[i].mobj; - mo2 = (mobj_t *)th; + if (!mo2) + continue; if (mo2->type != MT_BOSS3WAYPOINT) continue; - if (!mo2->spawnpoint) - continue; - if (mo2->spawnpoint->angle != actor->threshold) - continue; - if (mo2->spawnpoint->extrainfo != actor->cusval) + if (mapthings[i].args[0] != actor->threshold) continue; P_SetTarget(&actor->target, mo2); diff --git a/src/p_mobj.c b/src/p_mobj.c index 406519e22..b1b9db68a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -4520,27 +4520,21 @@ static void P_Boss3Thinker(mobj_t *mobj) if (!(mobj->flags2 & MF2_STRONGBOX)) { - thinker_t *th; mobj_t *mo2; + INT32 i; P_SetTarget(&mobj->tracer, NULL); - // scan the thinkers - // to find a point that matches - // the number - for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) + // Find waypoint + TAG_ITER_THINGS(mobj->cusval, i) { - if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) - continue; + mo2 = mapthings[i].mobj; - mo2 = (mobj_t *)th; + if (!mo2) + continue; if (mo2->type != MT_BOSS3WAYPOINT) continue; - if (!mo2->spawnpoint) - continue; - if (mo2->spawnpoint->angle != mobj->threshold) - continue; - if (mo2->spawnpoint->extrainfo != mobj->cusval) + if (mapthings[i].args[0] != mobj->threshold) continue; P_SetTarget(&mobj->tracer, mo2); @@ -5283,8 +5277,7 @@ static void P_Boss7Thinker(mobj_t *mobj) fixed_t vertical, horizontal; fixed_t airtime = 5*TICRATE; INT32 waypointNum = 0; - thinker_t *th; - INT32 i; + INT32 i, j; boolean foundgoop = false; INT32 closestNum; UINT8 bossid = (mobj->spawnpoint ? mobj->spawnpoint->args[0] : 0); @@ -5307,19 +5300,15 @@ static void P_Boss7Thinker(mobj_t *mobj) closestdist = INT32_MAX; // Just in case... // Find waypoint he is closest to - for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) + TAG_ITER_THINGS(bossid, j) { - if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) - continue; + mo2 = mapthings[j].mobj; - mo2 = (mobj_t *)th; + if (!mo2) + continue; if (mo2->type != MT_BOSS3WAYPOINT) continue; - if (!mo2->spawnpoint) - continue; - if (mo2->spawnpoint->extrainfo != bossid) - continue; - if (mobj->health <= mobj->info->damage && !(mo2->spawnpoint->options & 7)) + if (mobj->health <= mobj->info->damage && !mapthings[j].args[1]) continue; // don't jump to center dist = P_AproxDistance(players[i].mo->x - mo2->x, players[i].mo->y - mo2->y); @@ -5327,7 +5316,7 @@ static void P_Boss7Thinker(mobj_t *mobj) if (!(closestNum == -1 || dist < closestdist)) continue; - closestNum = (mo2->spawnpoint->options & 7); + closestNum = mapthings[j].args[1]; closestdist = dist; foundgoop = true; } @@ -5347,7 +5336,7 @@ static void P_Boss7Thinker(mobj_t *mobj) } if (mobj->tracer && mobj->tracer->type == MT_BOSS3WAYPOINT - && mobj->tracer->spawnpoint && (mobj->tracer->spawnpoint->options & 7) == waypointNum) + && mobj->tracer->spawnpoint && mobj->tracer->spawnpoint->args[1] == waypointNum) { if (P_RandomChance(FRACUNIT/2)) waypointNum++; @@ -5360,28 +5349,25 @@ static void P_Boss7Thinker(mobj_t *mobj) waypointNum = ((waypointNum + 5) % 5); } - // scan the thinkers to find - // the waypoint to use - for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) + // Scan mapthings to find the waypoint to use + TAG_ITER_THINGS(bossid, i) { - if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) + mo2 = mapthings[i].mobj; + + if (!mo2) continue; - mo2 = (mobj_t *)th; if (mo2->type != MT_BOSS3WAYPOINT) continue; - if (!mo2->spawnpoint) - continue; - if ((mo2->spawnpoint->options & 7) != waypointNum) - continue; - if (mo2->spawnpoint->extrainfo != bossid) + + if (mapthings[i].args[1] != waypointNum) continue; hitspot = mo2; break; } - if (hitspot == NULL) + if (!hitspot) { CONS_Debug(DBG_GAMELOGIC, "BlackEggman unable to find waypoint #%d!\n", waypointNum); P_SetMobjState(mobj, mobj->info->spawnstate); @@ -12735,7 +12721,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean } break; case MT_EGGMOBILE3: - mobj->cusval = mthing->extrainfo; + mobj->cusval = mthing->args[0]; break; case MT_FAN: if (mthing->options & MTF_OBJECTSPECIAL) diff --git a/src/p_setup.c b/src/p_setup.c index 7fe66148f..c9237bef8 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3131,6 +3131,7 @@ static void P_AddBinaryMapTags(void) Tag_FSet(&mapthings[i].tags, mapthings[i].angle); break; case 290: + case 292: case 294: case 780: Tag_FSet(&mapthings[i].tags, mapthings[i].extrainfo); @@ -4936,6 +4937,10 @@ static void P_ConvertBinaryMap(void) case 209: //Brak Eggman mapthings[i].args[4] = LE_BRAKVILEATACK + mapthings[i].extrainfo*LE_PARAMWIDTH; break; + case 292: //Boss waypoint + mapthings[i].args[0] = mapthings[i].angle; + mapthings[i].args[1] = mapthings[i].options & 7; + break; case 294: mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); break; From 3bab07d036874d613f9dad0841e9ebc99d08c042 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 27 Dec 2021 17:36:16 +0100 Subject: [PATCH 222/377] Adapt flickies to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 39 ++++++++++++++++++ src/p_enemy.c | 48 +++++++++++----------- src/p_local.h | 2 +- src/p_setup.c | 25 ++++++++--- src/p_spec.h | 7 ++++ 5 files changed, 91 insertions(+), 30 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 318981f18..7032dcca5 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -7107,6 +7107,21 @@ udmf title = "Flickies"; width = 8; height = 20; + arg0 + { + title = "Radius"; + } + arg1 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Move aimlessly"; + 2 = "No movement"; + 4 = "Hop"; + } + } 2200 { @@ -7147,6 +7162,30 @@ udmf { title = "Fish"; sprite = "FL08A1"; + arg2 + { + title = "Color"; + type = 11; + enum + { + 0 = "Random"; + 1 = "Red"; + 2 = "Cyan"; + 3 = "Blue"; + 4 = "Vapor"; + 5 = "Purple"; + 6 = "Bubblegum"; + 7 = "Neon"; + 8 = "Black"; + 9 = "Beige"; + 10 = "Lavender"; + 11 = "Ruby"; + 12 = "Salmon"; + 13 = "Sunset"; + 14 = "Orange"; + 15 = "Yellow"; + } + } } 2208 { diff --git a/src/p_enemy.c b/src/p_enemy.c index 7e00ad91d..27f169e20 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -11690,7 +11690,7 @@ void A_FlickySpawn(mobj_t *actor) } // Internal Flicky color setting -void P_InternalFlickySetColor(mobj_t *actor, UINT8 extrainfo) +void P_InternalFlickySetColor(mobj_t *actor, UINT8 color) { UINT8 flickycolors[] = { SKINCOLOR_RED, @@ -11710,11 +11710,11 @@ void P_InternalFlickySetColor(mobj_t *actor, UINT8 extrainfo) SKINCOLOR_YELLOW, }; - if (extrainfo == 0) + if (color == 0) // until we can customize flicky colors by level header, just stick to SRB2's defaults actor->color = flickycolors[P_RandomKey(2)]; //flickycolors[P_RandomKey(sizeof(flickycolors))]; else - actor->color = flickycolors[min(extrainfo-1, 14)]; // sizeof(flickycolors)-1 + actor->color = flickycolors[min(color-1, 14)]; // sizeof(flickycolors)-1 } // Function: A_FlickyCenter @@ -11724,17 +11724,17 @@ void P_InternalFlickySetColor(mobj_t *actor, UINT8 extrainfo) // var1: // Lower 16 bits = if 0, spawns random flicky based on level header. Else, spawns the designated thing type. // Bits 17-20 = Flicky color, up to 15. Applies to fish. -// Bit 21 = Flag MF_SLIDEME (see below) -// Bit 22 = Flag MF_GRENADEBOUNCE (see below) -// Bit 23 = Flag MF_NOCLIPTHING (see below) +// Bit 21 = Flag TMFF_AIMLESS (see below) +// Bit 22 = Flag TMFF_STATIONARY (see below) +// Bit 23 = Flag TMFF_HOP (see below) // // If actor is placed from a spawnpoint (map Thing), the Thing's properties take precedence. // -// var2 = maximum default distance away from spawn the flickies are allowed to travel. If angle != 0, then that's the radius. +// var2 = maximum default distance away from spawn the flickies are allowed to travel. If args[0] != 0, then that's the radius. // -// If MTF_EXTRA (MF_SLIDEME): is flagged, Flickies move aimlessly. Else, orbit around the target. -// If MTF_OBJECTSPECIAL (MF_GRENADEBOUNCE): Flickies stand in-place without gravity (unless they hop, then gravity is applied.) -// If MTF_AMBUSH (MF_NOCLIPTHING): is flagged, Flickies hop. +// If TMFF_AIMLESS (MF_SLIDEME): is flagged, Flickies move aimlessly. Else, orbit around the target. +// If TMFF_STATIONARY (MF_GRENADEBOUNCE): Flickies stand in-place without gravity (unless they hop, then gravity is applied.) +// If TMFF_HOP (MF_NOCLIPTHING): is flagged, Flickies hop. // void A_FlickyCenter(mobj_t *actor) { @@ -11756,14 +11756,15 @@ void A_FlickyCenter(mobj_t *actor) if (actor->spawnpoint) { actor->flags &= ~(MF_SLIDEME|MF_GRENADEBOUNCE|MF_NOCLIPTHING); - actor->flags |= ( - ((actor->spawnpoint->options & MTF_EXTRA) ? MF_SLIDEME : 0) - | ((actor->spawnpoint->options & MTF_OBJECTSPECIAL) ? MF_GRENADEBOUNCE : 0) - | ((actor->spawnpoint->options & MTF_AMBUSH) ? MF_NOCLIPTHING : 0) - ); - actor->extravalue1 = actor->spawnpoint->angle ? abs(actor->spawnpoint->angle) * FRACUNIT - : locvar2 ? abs(locvar2) : 384 * FRACUNIT; - actor->extravalue2 = actor->spawnpoint->extrainfo; + if (actor->spawnpoint->args[1] & TMFF_AIMLESS) + actor->flags |= MF_SLIDEME; + if (actor->spawnpoint->args[1] & TMFF_STATIONARY) + actor->flags |= MF_GRENADEBOUNCE; + if (actor->spawnpoint->args[1] & TMFF_HOP) + actor->flags |= MF_NOCLIPTHING; + actor->extravalue1 = actor->spawnpoint->args[0] ? abs(actor->spawnpoint->args[0])*FRACUNIT + : locvar2 ? abs(locvar2) : 384*FRACUNIT; + actor->extravalue2 = actor->spawnpoint->args[2]; actor->friction = actor->spawnpoint->x*FRACUNIT; actor->movefactor = actor->spawnpoint->y*FRACUNIT; actor->watertop = actor->spawnpoint->z*FRACUNIT; @@ -11771,11 +11772,12 @@ void A_FlickyCenter(mobj_t *actor) else { actor->flags &= ~(MF_SLIDEME|MF_GRENADEBOUNCE|MF_NOCLIPTHING); - actor->flags |= ( - ((flickyflags & 1) ? MF_SLIDEME : 0) - | ((flickyflags & 2) ? MF_GRENADEBOUNCE : 0) - | ((flickyflags & 4) ? MF_NOCLIPTHING : 0) - ); + if (flickyflags & TMFF_AIMLESS) + actor->flags |= MF_SLIDEME; + if (flickyflags & TMFF_STATIONARY) + actor->flags |= MF_GRENADEBOUNCE; + if (flickyflags & TMFF_HOP) + actor->flags |= MF_NOCLIPTHING; actor->extravalue1 = abs(locvar2); actor->extravalue2 = flickycolor; actor->friction = actor->x; diff --git a/src/p_local.h b/src/p_local.h index bbcd86b39..11a4856cf 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -370,7 +370,7 @@ void P_NewChaseDir(mobj_t *actor); boolean P_LookForPlayers(mobj_t *actor, boolean allaround, boolean tracer, fixed_t dist); mobj_t *P_InternalFlickySpawn(mobj_t *actor, mobjtype_t flickytype, fixed_t momz, boolean lookforplayers, SINT8 moveforward); -void P_InternalFlickySetColor(mobj_t *actor, UINT8 extrainfo); +void P_InternalFlickySetColor(mobj_t *actor, UINT8 color); #define P_IsFlickyCenter(type) (type > MT_FLICKY_01 && type < MT_SEED && (type - MT_FLICKY_01) % 2 ? 1 : 0) void P_InternalFlickyBubble(mobj_t *actor); void P_InternalFlickyFly(mobj_t *actor, fixed_t flyspeed, fixed_t targetdist, fixed_t chasez); diff --git a/src/p_setup.c b/src/p_setup.c index c9237bef8..5e9daa327 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4885,12 +4885,6 @@ static void P_ConvertBinaryMap(void) for (i = 0; i < nummapthings; i++) { - if (mapthings[i].type >= 1 && mapthings[i].type <= 35) - { - mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); - continue; - } - mobjtype = mobjtypeofthing[mapthings[i].type]; if (mobjtype) { @@ -4904,6 +4898,25 @@ static void P_ConvertBinaryMap(void) } } + if (mapthings[i].type >= 1 && mapthings[i].type <= 35) //Player starts + { + mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); + continue; + } + else if (mapthings[i].type >= 2200 && mapthings[i].type <= 2217) //Flickies + { + mapthings[i].args[0] = mapthings[i].angle; + if (mapthings[i].options & MTF_EXTRA) + mapthings[i].args[1] |= TMFF_AIMLESS; + if (mapthings[i].options & MTF_OBJECTSPECIAL) + mapthings[i].args[1] |= TMFF_STATIONARY; + if (mapthings[i].options & MTF_AMBUSH) + mapthings[i].args[1] |= TMFF_HOP; + if (mapthings[i].type == 2207) + mapthings[i].args[2] = mapthings[i].extrainfo; + continue; + } + switch (mapthings[i].type) { case 102: //SDURF diff --git a/src/p_spec.h b/src/p_spec.h index 88dc6d9f8..53d7cd511 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -50,6 +50,13 @@ typedef enum TMSF_INTANGIBLE = 1<<1, } textmapspikeflags_t; +typedef enum +{ + TMFF_AIMLESS = 1, + TMFF_STATIONARY = 1<<1, + TMFF_HOP = 1<<2, +} textmapflickyflags_t; + //FOF flags typedef enum { From 720df51b6edd031050411d1c268b311703bcb4b8 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 27 Dec 2021 17:58:18 +0100 Subject: [PATCH 223/377] Adapt most flame jet settings to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 24 ++++++++++++++++++++++ src/p_mobj.c | 16 +++++---------- src/p_setup.c | 6 ++++++ 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 7032dcca5..b07a7f8a7 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -6110,6 +6110,18 @@ udmf sprite = "internal:flameh"; width = 16; height = 40; + arg0 + { + title = "On time"; + } + arg1 + { + title = "Off time"; + } + arg2 + { + title = "Strength"; + } } 1301 { @@ -6117,6 +6129,18 @@ udmf sprite = "internal:flamev"; width = 16; height = 40; + arg0 + { + title = "On time"; + } + arg1 + { + title = "Off time"; + } + arg2 + { + title = "Strength"; + } } 1302 { diff --git a/src/p_mobj.c b/src/p_mobj.c index b1b9db68a..7a9b50c3d 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7226,8 +7226,7 @@ static void P_FlameJetSceneryThink(mobj_t *mobj) else flame->angle += FixedAngle(mobj->fuse<movedir; + strength = (mobj->movedir ? mobj->movedir : 80)<<(FRACBITS-2); P_InstaThrust(flame, flame->angle, strength); S_StartSound(flame, sfx_fire); @@ -7257,8 +7256,7 @@ static void P_VerticalFlameJetSceneryThink(mobj_t *mobj) flame = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_FLAMEJETFLAME); - strength = 20*FRACUNIT; - strength -= ((20*FRACUNIT)/16)*mobj->movedir; + strength = (mobj->movedir ? mobj->movedir : 80)<<(FRACBITS-2); // If deaf'd, the object spawns on the ceiling. if (mobj->flags2 & MF2_AMBUSH) @@ -12797,13 +12795,9 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean break; case MT_FLAMEJET: case MT_VERTICALFLAMEJET: - mobj->threshold = (mthing->angle >> 10) & 7; - mobj->movecount = (mthing->angle >> 13); - - mobj->threshold *= (TICRATE/2); - mobj->movecount *= (TICRATE/2); - - mobj->movedir = mthing->extrainfo; + mobj->movecount = mthing->args[0]; + mobj->threshold = mthing->args[1]; + mobj->movedir = mthing->args[2]; break; case MT_MACEPOINT: case MT_CHAINMACEPOINT: diff --git a/src/p_setup.c b/src/p_setup.c index 5e9daa327..dee0c86de 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -5141,6 +5141,12 @@ static void P_ConvertBinaryMap(void) P_WriteConstant(MT_ROCKCRUMBLE1 + (sides[lines[j].sidenum[0]].rowoffset >> FRACBITS), &mapthings[i].stringargs[0]); break; } + case 1300: //Flame jet (horizontal) + case 1301: //Flame jet (vertical) + mapthings[i].args[0] = (mapthings[i].angle >> 13)*TICRATE/2; + mapthings[i].args[1] = ((mapthings[i].angle >> 10) & 7)*TICRATE/2; + mapthings[i].args[2] = 80 - 5*mapthings[i].extrainfo; + break; case 1700: //Axis mapthings[i].args[2] = mapthings[i].angle & 16383; mapthings[i].args[3] = !!(mapthings[i].angle & 16384); From fd3fa9a924c248853b0f679f7abb33d1f0525268 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 27 Dec 2021 18:52:46 +0100 Subject: [PATCH 224/377] Adapt flame-related objects to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 46 ++++++++++++++++++++++ src/p_mobj.c | 10 ++--- src/p_setup.c | 16 ++++++++ src/p_spec.h | 6 +++ 4 files changed, 73 insertions(+), 5 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index b07a7f8a7..523c29c56 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -5409,6 +5409,12 @@ udmf sprite = "FLAMA0E0"; width = 8; height = 32; + arg0 + { + title = "Corona?"; + type = 11; + enum = "noyes"; + } } 1102 { @@ -5798,6 +5804,12 @@ udmf sprite = "CNDLA0"; width = 8; height = 48; + arg0 + { + title = "Corona?"; + type = 11; + enum = "noyes"; + } } 1120 { @@ -5805,6 +5817,12 @@ udmf sprite = "CNDLB0"; width = 8; height = 176; + arg0 + { + title = "Corona?"; + type = 11; + enum = "noyes"; + } } 1121 { @@ -5812,6 +5830,16 @@ udmf sprite = "FLMHA0"; width = 24; height = 80; + arg0 + { + title = "Flags"; + type = 12; + enum + { + 1 = "No flame"; + 2 = "Add corona"; + } + } } 1122 { @@ -7045,6 +7073,12 @@ udmf sprite = "PUMKA0"; width = 16; height = 40; + arg0 + { + title = "Flicker"; + type = 11; + enum = "yesno"; + } } 2007 { @@ -7052,6 +7086,12 @@ udmf sprite = "PUMKB0"; width = 16; height = 40; + arg0 + { + title = "Flicker"; + type = 11; + enum = "yesno"; + } } 2008 { @@ -7059,6 +7099,12 @@ udmf sprite = "PUMKC0"; width = 16; height = 40; + arg0 + { + title = "Flicker"; + type = 11; + enum = "yesno"; + } } 2009 { diff --git a/src/p_mobj.c b/src/p_mobj.c index 7a9b50c3d..7514b18bd 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12754,7 +12754,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean mobj->color = ((mthing->angle - 1) % (numskincolors - 1)) + 1; break; case MT_FLAME: - if (mthing->options & MTF_EXTRA) + if (mthing->args[0]) { mobj_t *corona = P_MakeSoftwareCorona(mobj, 20); P_SetScale(corona, (corona->destscale = mobj->scale*3)); @@ -12762,12 +12762,12 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean } break; case MT_FLAMEHOLDER: - if (!(mthing->options & MTF_OBJECTSPECIAL)) // Spawn the fire + if (!(mthing->args[0] & TMFH_NOFLAME)) // Spawn the fire { mobj_t *flame = P_SpawnMobjFromMobj(mobj, 0, 0, mobj->height, MT_FLAME); P_SetTarget(&flame->target, mobj); flame->flags2 |= MF2_BOSSNOTRAP; - if (mthing->options & MTF_EXTRA) + if (mthing->args[0] & TMFH_CORONA) { mobj_t *corona = P_MakeSoftwareCorona(flame, 20); P_SetScale(corona, (corona->destscale = flame->scale*3)); @@ -12777,13 +12777,13 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean break; case MT_CANDLE: case MT_CANDLEPRICKET: - if (mthing->options & MTF_EXTRA) + if (mthing->args[0]) P_MakeSoftwareCorona(mobj, ((mobj->type == MT_CANDLE) ? 42 : 176)); break; case MT_JACKO1: case MT_JACKO2: case MT_JACKO3: - if (!(mthing->options & MTF_EXTRA)) // take the torch out of the crafting recipe + if (!(mthing->args[0])) // take the torch out of the crafting recipe { mobj_t *overlay = P_SpawnMobjFromMobj(mobj, 0, 0, 0, MT_OVERLAY); P_SetTarget(&overlay->target, mobj); diff --git a/src/p_setup.c b/src/p_setup.c index dee0c86de..1b05ab219 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -5124,6 +5124,17 @@ static void P_ConvertBinaryMap(void) } break; } + case 1101: //Torch + case 1119: //Candle + case 1120: //Candle pricket + mapthings[i].args[0] = !!(mapthings[i].options & MTF_EXTRA); + break; + case 1121: //Flame holder + if (mapthings[i].options & MTF_OBJECTSPECIAL) + mapthings[i].args[0] |= TMFH_NOFLAME; + if (mapthings[i].options & MTF_EXTRA) + mapthings[i].args[0] |= TMFH_CORONA; + break; case 1202: //Rock spawner { mtag_t tag = (mtag_t)mapthings[i].angle; @@ -5197,6 +5208,11 @@ static void P_ConvertBinaryMap(void) case 1807: //Axe mapthings[i].args[0] = LE_AXE; break; + case 2006: //Jack-o'-lantern 1 + case 2007: //Jack-o'-lantern 2 + case 2008: //Jack-o'-lantern 3 + mapthings[i].args[0] = !!(mapthings[i].options & MTF_EXTRA); + break; default: break; } diff --git a/src/p_spec.h b/src/p_spec.h index 53d7cd511..3bd3b0d5c 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -57,6 +57,12 @@ typedef enum TMFF_HOP = 1<<2, } textmapflickyflags_t; +typedef enum +{ + TMFH_NOFLAME = 1, + TMFH_CORONA = 1<<1, +} textmapflameholderflags_t; + //FOF flags typedef enum { From 43a15387d296e71b7916929332093f6a227880ac Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 27 Dec 2021 21:28:42 +0100 Subject: [PATCH 225/377] Adapt diagonal springs to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 30 ++++++++++++++++++++++ src/p_mobj.c | 16 +++++++----- src/p_setup.c | 8 ++++++ src/p_spec.h | 6 +++++ 4 files changed, 54 insertions(+), 6 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 523c29c56..41a99d1d7 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -4722,6 +4722,16 @@ udmf title = "Diagonal Yellow Spring"; sprite = "YSPRD2"; width = 16; + arg0 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Ignore gravity"; + 2 = "Rotate 22.5° CCW"; + } + } } 556 { @@ -4729,6 +4739,16 @@ udmf title = "Diagonal Red Spring"; sprite = "RSPRD2"; width = 16; + arg0 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Ignore gravity"; + 2 = "Rotate 22.5° CCW"; + } + } } 557 { @@ -4736,6 +4756,16 @@ udmf title = "Diagonal Blue Spring"; sprite = "BSPRD2"; width = 16; + arg0 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Ignore gravity"; + 2 = "Rotate 22.5° CCW"; + } + } } 558 { diff --git a/src/p_mobj.c b/src/p_mobj.c index 7514b18bd..018d853f6 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -13050,6 +13050,16 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean if (maptol & TOL_XMAS) P_SetMobjState(mobj, mobj->info->seestate); break; + case MT_YELLOWDIAG: + case MT_REDDIAG: + case MT_BLUEDIAG: + mobj->angle = FixedAngle(mthing->angle << FRACBITS); + if (mthing->args[0] & TMDS_NOGRAVITY) + mobj->flags |= MF_NOGRAVITY; + if (mthing->args[0] & TMDS_ROTATEEXTRA) + mobj->angle += ANGLE_22h; + *doangle = false; + break; default: break; } @@ -13065,9 +13075,6 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean static void P_SetAmbush(mobj_t *mobj) { - if (mobj->type == MT_YELLOWDIAG || mobj->type == MT_REDDIAG || mobj->type == MT_BLUEDIAG) - mobj->angle += ANGLE_22h; - if (mobj->flags & MF_NIGHTSITEM) { // Spawn already displayed @@ -13095,9 +13102,6 @@ static void P_SetAmbush(mobj_t *mobj) static void P_SetObjectSpecial(mobj_t *mobj) { - if (mobj->type == MT_YELLOWDIAG || mobj->type == MT_REDDIAG || mobj->type == MT_BLUEDIAG) - mobj->flags |= MF_NOGRAVITY; - if ((mobj->flags & MF_MONITOR) && mobj->info->speed != 0) { // flag for strong/weak random boxes diff --git a/src/p_setup.c b/src/p_setup.c index 1b05ab219..783446298 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4990,6 +4990,14 @@ static void P_ConvertBinaryMap(void) if (mapthings[i].options & MTF_AMBUSH) mapthings[i].args[2] |= TMSF_INTANGIBLE; break; + case 555: //Diagonal yellow spring + case 556: //Diagonal red spring + case 557: //Diagonal blue spring + if (mapthings[i].options & MTF_OBJECTSPECIAL) + mapthings[i].args[0] |= TMDS_NOGRAVITY; + if (mapthings[i].options & MTF_AMBUSH) + mapthings[i].args[0] |= TMDS_ROTATEEXTRA; + break; case 750: //Slope vertex mapthings[i].args[0] = mapthings[i].extrainfo; break; diff --git a/src/p_spec.h b/src/p_spec.h index 3bd3b0d5c..743c37744 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -63,6 +63,12 @@ typedef enum TMFH_CORONA = 1<<1, } textmapflameholderflags_t; +typedef enum +{ + TMDS_NOGRAVITY = 1, + TMDS_ROTATEEXTRA = 1<<1, +} textmapdiagonalspringflags_t; + //FOF flags typedef enum { From 90eb7c71a348351631d56ccb80fdc8934dac20f9 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 28 Dec 2021 07:29:41 +0100 Subject: [PATCH 226/377] Adapt skybox view point to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 10 ++++++++++ src/p_mobj.c | 2 +- src/p_setup.c | 3 +++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 41a99d1d7..f1ed572c1 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -5142,6 +5142,16 @@ udmf { title = "Skybox View Point"; sprite = "internal:skyb"; + arg0 + { + title = "Type"; + type = 11; + enum + { + 0 = "Viewpoint"; + 1 = "Centerpoint"; + } + } } } diff --git a/src/p_mobj.c b/src/p_mobj.c index 018d853f6..250935cc5 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12705,7 +12705,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean break; } - if (mthing->options & MTF_OBJECTSPECIAL) + if (mthing->args[0]) skyboxcenterpnts[tag] = mobj; else skyboxviewpnts[tag] = mobj; diff --git a/src/p_setup.c b/src/p_setup.c index 783446298..1027b92e2 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -5079,6 +5079,9 @@ static void P_ConvertBinaryMap(void) mapthings[i].type = 761; break; } + case 780: //Skybox + mapthings[i].args[0] = !!(mapthings[i].options & MTF_OBJECTSPECIAL); + break; case 1104: //Mace spawnpoint case 1105: //Chain with maces spawnpoint case 1106: //Chained spring spawnpoint From b1d087051112a6d1faaa6f9609c596cc0016bc17 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 28 Dec 2021 07:40:38 +0100 Subject: [PATCH 227/377] (Mostly) adapt fan to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 10 ++++++++++ src/p_map.c | 2 +- src/p_mobj.c | 6 +++--- src/p_setup.c | 4 ++++ 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index f1ed572c1..4aa66b87d 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -4680,6 +4680,16 @@ udmf sprite = "FANSA0D0"; width = 16; height = 8; + arg0 + { + title = "Lift height"; + } + arg1 + { + title = "Invisible?"; + type = 11; + enum = "noyes"; + } } 541 { diff --git a/src/p_map.c b/src/p_map.c index 836e75c4e..7caf5eca5 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -492,7 +492,7 @@ static void P_DoFanAndGasJet(mobj_t *spring, mobj_t *object) switch (spring->type) { case MT_FAN: // fan - if (zdist > (spring->health << FRACBITS)) // max z distance determined by health (set by map thing angle) + if (zdist > (spring->health << FRACBITS)) // max z distance determined by health (set by map thing args[0]) break; if (flipval*object->momz >= FixedMul(speed, spring->scale)) // if object's already moving faster than your best, don't bother break; diff --git a/src/p_mobj.c b/src/p_mobj.c index 250935cc5..22a500715 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12722,7 +12722,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean mobj->cusval = mthing->args[0]; break; case MT_FAN: - if (mthing->options & MTF_OBJECTSPECIAL) + if (mthing->args[1]) { P_UnsetThingPosition(mobj); if (sector_list) @@ -12733,8 +12733,8 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean mobj->flags |= MF_NOSECTOR; // this flag basically turns it invisible P_SetThingPosition(mobj); } - if (mthing->angle) - mobj->health = mthing->angle; + if (mthing->args[0]) + mobj->health = mthing->args[0]; else mobj->health = FixedMul(mobj->subsector->sector->ceilingheight - mobj->subsector->sector->floorheight, 3*(FRACUNIT/4)) >> FRACBITS; break; diff --git a/src/p_setup.c b/src/p_setup.c index 1027b92e2..3a7b70b95 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4990,6 +4990,10 @@ static void P_ConvertBinaryMap(void) if (mapthings[i].options & MTF_AMBUSH) mapthings[i].args[2] |= TMSF_INTANGIBLE; break; + case 540: //Fan + mapthings[i].args[0] = mapthings[i].angle; + mapthings[i].args[1] = !!(mapthings[i].options & MTF_OBJECTSPECIAL); + break; case 555: //Diagonal yellow spring case 556: //Diagonal red spring case 557: //Diagonal blue spring From 8b69c621114325d2fbc3a60cabe0c92a2a87d711 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 28 Dec 2021 08:19:56 +0100 Subject: [PATCH 228/377] Adapt more scenery items to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 36 ++++++++++++++++++++++ src/p_mobj.c | 12 ++++---- src/p_setup.c | 15 +++++++++ 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 4aa66b87d..250934fad 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -5351,6 +5351,10 @@ udmf width = 8; height = 16; hangs = 1; + arg0 + { + title = "Dripping delay"; + } } 1003 { @@ -5386,6 +5390,12 @@ udmf sprite = "KELPA0"; width = 16; height = 292; + arg0 + { + title = "Double size?"; + type = 11; + enum = "noyes"; + } } 1008 { @@ -5393,6 +5403,12 @@ udmf sprite = "DSTGA0"; width = 8; height = 116; + arg0 + { + title = "Double size?"; + type = 11; + enum = "noyes"; + } } 1010 { @@ -5408,6 +5424,12 @@ udmf sprite = "DSTGA0"; width = 8; height = 116; + arg0 + { + title = "Double size?"; + type = 11; + enum = "noyes"; + } } 1012 { @@ -6240,6 +6262,16 @@ udmf sprite = "LFALF0"; width = 30; height = 32; + arg0 + { + title = "Initial delay"; + } + arg1 + { + title = "Double size?"; + type = 11; + enum = "noyes"; + } } 1305 { @@ -7081,6 +7113,10 @@ udmf sprite = "FMCEA0"; width = 18; height = 28; + arg0 + { + title = "Initial delay"; + } } 2001 { diff --git a/src/p_mobj.c b/src/p_mobj.c index 22a500715..aaefa9fed 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12791,7 +12791,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean } break; case MT_WATERDRIP: - mobj->tics = 3*TICRATE + mthing->angle; + mobj->tics = 3*TICRATE + mthing->args[0]; break; case MT_FLAMEJET: case MT_VERTICALFLAMEJET: @@ -12856,7 +12856,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean case MT_DSZSTALAGMITE: case MT_DSZ2STALAGMITE: case MT_KELP: - if (mthing->options & MTF_OBJECTSPECIAL) { // make mobj twice as big as normal + if (mthing->args[0]) { // make mobj twice as big as normal P_SetScale(mobj, 2*mobj->scale); // not 2*FRACUNIT in case of something like the old ERZ3 mode mobj->destscale = mobj->scale; } @@ -12896,12 +12896,12 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean } break; case MT_SMASHINGSPIKEBALL: - if (mthing->angle > 0) - mobj->tics += mthing->angle; + if (mthing->args[0] > 0) + mobj->tics += mthing->args[0]; break; case MT_LAVAFALL: - mobj->fuse = 30 + mthing->angle; - if (mthing->options & MTF_AMBUSH) + mobj->fuse = 30 + mthing->args[0]; + if (mthing->args[1]) { P_SetScale(mobj, 2*mobj->scale); mobj->destscale = mobj->scale; diff --git a/src/p_setup.c b/src/p_setup.c index 3a7b70b95..b25b3aa14 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -5086,6 +5086,14 @@ static void P_ConvertBinaryMap(void) case 780: //Skybox mapthings[i].args[0] = !!(mapthings[i].options & MTF_OBJECTSPECIAL); break; + case 1002: //Dripping water + mapthings[i].args[0] = mapthings[i].angle; + break; + case 1007: //Kelp + case 1008: //Stalagmite (DSZ1) + case 1011: //Stalagmite (DSZ2) + mapthings[i].args[0] = !!(mapthings[i].options & MTF_OBJECTSPECIAL); + break; case 1104: //Mace spawnpoint case 1105: //Chain with maces spawnpoint case 1106: //Chained spring spawnpoint @@ -5173,6 +5181,10 @@ static void P_ConvertBinaryMap(void) mapthings[i].args[1] = ((mapthings[i].angle >> 10) & 7)*TICRATE/2; mapthings[i].args[2] = 80 - 5*mapthings[i].extrainfo; break; + case 1304: //Lavafall + mapthings[i].args[0] = mapthings[i].angle; + mapthings[i].args[1] = !!(mapthings[i].options & MTF_AMBUSH); + break; case 1700: //Axis mapthings[i].args[2] = mapthings[i].angle & 16383; mapthings[i].args[3] = !!(mapthings[i].angle & 16384); @@ -5223,6 +5235,9 @@ static void P_ConvertBinaryMap(void) case 1807: //Axe mapthings[i].args[0] = LE_AXE; break; + case 2000: //Smashing spikeball + mapthings[i].args[0] = mapthings[i].angle; + break; case 2006: //Jack-o'-lantern 1 case 2007: //Jack-o'-lantern 2 case 2008: //Jack-o'-lantern 3 From e140bd82528db6ee89bd30ca14df62a4f29f2bf7 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 28 Dec 2021 08:26:04 +0100 Subject: [PATCH 229/377] Adapt balloon colors to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 4 ++++ src/p_mobj.c | 4 ++-- src/p_setup.c | 4 ++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 250934fad..4453edace 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -4710,6 +4710,10 @@ udmf sprite = "BLONA0"; width = 32; height = 64; + stringarg0 + { + title = "Color"; + } } 550 { diff --git a/src/p_mobj.c b/src/p_mobj.c index aaefa9fed..bf413572f 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12750,8 +12750,8 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean } break; case MT_BALLOON: - if (mthing->angle > 0) - mobj->color = ((mthing->angle - 1) % (numskincolors - 1)) + 1; + if (mthing->stringargs[0]) + mobj->color = get_number(mthing->stringargs[0]); break; case MT_FLAME: if (mthing->args[0]) diff --git a/src/p_setup.c b/src/p_setup.c index b25b3aa14..dfabc0e9f 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4994,6 +4994,10 @@ static void P_ConvertBinaryMap(void) mapthings[i].args[0] = mapthings[i].angle; mapthings[i].args[1] = !!(mapthings[i].options & MTF_OBJECTSPECIAL); break; + case 543: //Balloon + if (mapthings[i].angle > 0) + P_WriteConstant(((mapthings[i].angle - 1) % (numskincolors - 1)) + 1, &mapthings[i].stringargs[0]); + break; case 555: //Diagonal yellow spring case 556: //Diagonal red spring case 557: //Diagonal blue spring From 52482716190980add0f6416a2c1b8cf8899d98d9 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 28 Dec 2021 08:33:57 +0100 Subject: [PATCH 230/377] Adapt blast linedef executor to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 5 +++++ src/p_inter.c | 2 +- src/p_setup.c | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 4453edace..d2c13154d 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -5099,6 +5099,11 @@ udmf sprite = "TOADA0"; width = 32; height = 16; + arg0 + { + title = "Linedef tag"; + type = 15; + } } 757 { diff --git a/src/p_inter.c b/src/p_inter.c index 62f6080bc..9a3562fc8 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2771,7 +2771,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget case MT_BLASTEXECUTOR: if (target->spawnpoint) - P_LinedefExecute(target->spawnpoint->angle, (source ? source : inflictor), target->subsector->sector); + P_LinedefExecute(target->spawnpoint->args[0], (source ? source : inflictor), target->subsector->sector); break; case MT_SPINBOBERT: diff --git a/src/p_setup.c b/src/p_setup.c index dfabc0e9f..54f887d60 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -5048,6 +5048,9 @@ static void P_ConvertBinaryMap(void) mapthings[i].type = 754; break; } + case 756: //Blast linedef executor + mapthings[i].args[0] = mapthings[i].angle; + break; case 757: //Fan particle generator { INT32 j = Tag_FindLineSpecial(15, mapthings[i].angle); From 1cff7a161aff241841133c53131a123b99b97dbe Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 28 Dec 2021 09:58:45 +0100 Subject: [PATCH 231/377] Adapt ambient sound effects to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 70 +---- src/info.c | 285 +-------------------- src/info.h | 12 +- src/m_cheat.c | 2 +- src/p_mobj.c | 13 +- src/p_mobj.h | 2 +- src/p_setup.c | 27 ++ 7 files changed, 53 insertions(+), 358 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index d2c13154d..58c4fe53d 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -4965,68 +4965,16 @@ udmf 700 { - title = "Water Ambience A (Large)"; - sprite = "internal:ambiance"; - } - - 701 - { - title = "Water Ambience B (Large)"; - sprite = "internal:ambiance"; - } - - 702 - { - title = "Water Ambience C (Medium)"; - sprite = "internal:ambiance"; - } - - 703 - { - title = "Water Ambience D (Medium)"; - sprite = "internal:ambiance"; - } - - 704 - { - title = "Water Ambience E (Small)"; - sprite = "internal:ambiance"; - } - - 705 - { - title = "Water Ambience F (Small)"; - sprite = "internal:ambiance"; - } - - 706 - { - title = "Water Ambience G (Extra Large)"; - sprite = "internal:ambiance"; - } - - 707 - { - title = "Water Ambience H (Extra Large)"; - sprite = "internal:ambiance"; - } - - 708 - { - title = "Disco Ambience"; - sprite = "internal:ambiance"; - } - - 709 - { - title = "Volcano Ambience"; - sprite = "internal:ambiance"; - } - - 710 - { - title = "Machine Ambience"; + title = "Ambient Sound Effect"; sprite = "internal:ambiance"; + arg0 + { + title = "Repeat speed"; + } + stringarg0 + { + title = "Sound"; + } } 750 diff --git a/src/info.c b/src/info.c index ddcf6709e..51f9ea8e6 100644 --- a/src/info.c +++ b/src/info.c @@ -18056,13 +18056,13 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, - // ambient water 1a (large) - { // MT_AWATERA + // ambient sound effect + { // MT_AMBIENT 700, // doomednum S_INVISIBLE, // spawnstate - 35, // spawnhealth + 1000, // spawnhealth S_NULL, // seestate - sfx_amwtr1, // seesound + sfx_None, // seesound 8, // reactiontime sfx_None, // attacksound S_NULL, // painstate @@ -18084,283 +18084,6 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, - // ambient water 1b (large) - { // MT_AWATERB - 701, // doomednum - S_INVISIBLE, // spawnstate - 35, // spawnhealth - S_NULL, // seestate - sfx_amwtr2, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 0, // speed - 16*FRACUNIT, // radius - 16*FRACUNIT, // height - 0, // display offset - 100, // mass - 0, // damage - sfx_None, // activesound - MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY|MF_AMBIENT, // flags - S_NULL // raisestate - }, - - // ambient water 2a (medium) - { // MT_AWATERC - 702, // doomednum - S_INVISIBLE, // spawnstate - 35, // spawnhealth - S_NULL, // seestate - sfx_amwtr3, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 0, // speed - 16*FRACUNIT, // radius - 16*FRACUNIT, // height - 0, // display offset - 100, // mass - 0, // damage - sfx_None, // activesound - MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY|MF_AMBIENT, // flags - S_NULL // raisestate - }, - - // ambient water 2b (medium) - { // MT_AWATERD - 703, // doomednum - S_INVISIBLE, // spawnstate - 35, // spawnhealth - S_NULL, // seestate - sfx_amwtr4, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 0, // speed - 16*FRACUNIT, // radius - 16*FRACUNIT, // height - 0, // display offset - 100, // mass - 0, // damage - sfx_None, // activesound - MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY|MF_AMBIENT, // flags - S_NULL // raisestate - }, - - // ambient water 3a (small) - { // MT_AWATERE - 704, // doomednum - S_INVISIBLE, // spawnstate - 35, // spawnhealth - S_NULL, // seestate - sfx_amwtr5, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 0, // speed - 16*FRACUNIT, // radius - 16*FRACUNIT, // height - 0, // display offset - 100, // mass - 0, // damage - sfx_None, // activesound - MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY|MF_AMBIENT, // flags - S_NULL // raisestate - }, - - // ambient water 3b (small) - { // MT_AWATERF - 705, // doomednum - S_INVISIBLE, // spawnstate - 35, // spawnhealth - S_NULL, // seestate - sfx_amwtr6, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 0, // speed - 16*FRACUNIT, // radius - 16*FRACUNIT, // height - 0, // display offset - 100, // mass - 0, // damage - sfx_None, // activesound - MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY|MF_AMBIENT, // flags - S_NULL // raisestate - }, - - // ambient water 4a (extra large) - { // MT_AWATERG - 706, // doomednum - S_INVISIBLE, // spawnstate - 35, // spawnhealth - S_NULL, // seestate - sfx_amwtr7, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 0, // speed - 16*FRACUNIT, // radius - 16*FRACUNIT, // height - 0, // display offset - 100, // mass - 0, // damage - sfx_None, // activesound - MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY|MF_AMBIENT, // flags - S_NULL // raisestate - }, - - // ambient water 4b (extra large) - { // MT_AWATERH - 707, // doomednum - S_INVISIBLE, // spawnstate - 35, // spawnhealth - S_NULL, // seestate - sfx_amwtr8, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 0, // speed - 16*FRACUNIT, // radius - 16*FRACUNIT, // height - 0, // display offset - 100, // mass - 0, // damage - sfx_None, // activesound - MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY|MF_AMBIENT, // flags - S_NULL // raisestate - }, - - { // MT_RANDOMAMBIENT - 708, // doomednum - S_INVISIBLE, // spawnstate - 512, // spawnhealth: repeat speed - S_NULL, // seestate - sfx_ambint, // seesound - 0, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 255, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 0, // speed - 8*FRACUNIT, // radius - 16*FRACUNIT, // height - 0, // display offset - 1000, // mass - 0, // damage - sfx_None, // activesound - MF_NOSECTOR|MF_NOBLOCKMAP|MF_NOGRAVITY|MF_AMBIENT, // flags - S_NULL // raisestate - }, - - { // MT_RANDOMAMBIENT2 - 709, // doomednum - S_INVISIBLE, // spawnstate - 220, // spawnhealth: repeat speed - S_NULL, // seestate - sfx_ambin2, // seesound - 0, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 255, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 0, // speed - 8*FRACUNIT, // radius - 16*FRACUNIT, // height - 0, // display offset - 1000, // mass - 0, // damage - sfx_None, // activesound - MF_NOSECTOR|MF_NOBLOCKMAP|MF_NOGRAVITY|MF_AMBIENT, // flags - S_NULL // raisestate - }, - - { // MT_MACHINEAMBIENCE - 710, // doomednum - S_INVISIBLE, // spawnstate - 24, // spawnhealth: repeat speed - S_NULL, // seestate - sfx_ambmac, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 200, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 1*FRACUNIT, // speed - 16*FRACUNIT, // radius - 16*FRACUNIT, // height - 0, // display offset - 100, // mass - 20, // damage - sfx_None, // activesound - MF_NOSECTOR|MF_NOBLOCKMAP|MF_NOGRAVITY|MF_AMBIENT, // flags - S_NULL // raisestate - }, - { // MT_CORK -1, // doomednum S_CORK, // spawnstate diff --git a/src/info.h b/src/info.h index d5fcc8504..7b33f92ba 100644 --- a/src/info.h +++ b/src/info.h @@ -4934,17 +4934,7 @@ typedef enum mobj_type MT_FINISHFLAG, // Finish flag // Ambient Sounds - MT_AWATERA, // Ambient Water Sound 1 - MT_AWATERB, // Ambient Water Sound 2 - MT_AWATERC, // Ambient Water Sound 3 - MT_AWATERD, // Ambient Water Sound 4 - MT_AWATERE, // Ambient Water Sound 5 - MT_AWATERF, // Ambient Water Sound 6 - MT_AWATERG, // Ambient Water Sound 7 - MT_AWATERH, // Ambient Water Sound 8 - MT_RANDOMAMBIENT, - MT_RANDOMAMBIENT2, - MT_MACHINEAMBIENCE, + MT_AMBIENT, MT_CORK, MT_LHRT, diff --git a/src/m_cheat.c b/src/m_cheat.c index b5c3b6563..2f90b54ee 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -1004,7 +1004,7 @@ static void OP_CycleThings(INT32 amt) } while (mobjinfo[op_currentthing].doomednum == -1 || op_currentthing == MT_NIGHTSDRONE - || mobjinfo[op_currentthing].flags & (MF_AMBIENT|MF_NOSECTOR) + || mobjinfo[op_currentthing].flags & MF_NOSECTOR || (states[mobjinfo[op_currentthing].spawnstate].sprite == SPR_NULL && states[mobjinfo[op_currentthing].seestate].sprite == SPR_NULL) ); diff --git a/src/p_mobj.c b/src/p_mobj.c index bf413572f..55f7a729a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10230,10 +10230,12 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->flags2 & MF2_FIRING) P_FiringThink(mobj); - if (mobj->flags & MF_AMBIENT) + if (mobj->type == MT_AMBIENT) { - if (!(leveltime % mobj->health) && mobj->info->seesound) - S_StartSound(mobj, mobj->info->seesound); + if (leveltime % mobj->health) + return; + if (mobj->threshold) + S_StartSound(mobj, mobj->threshold); return; } @@ -13060,6 +13062,11 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean mobj->angle += ANGLE_22h; *doangle = false; break; + case MT_AMBIENT: + if (mthing->stringargs[0]) + mobj->threshold = get_number(mthing->stringargs[0]); + mobj->health = mthing->args[0] ? mthing->args[0] : TICRATE; + break; default: break; } diff --git a/src/p_mobj.h b/src/p_mobj.h index 2d096385b..23028f995 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -118,7 +118,7 @@ typedef enum // Don't apply gravity (every tic); object will float, keeping current height // or changing it actively. MF_NOGRAVITY = 1<<9, - // This object is an ambient sound. + // This object is an ambient sound. Obsolete, but keep this around for backwards compatibility. MF_AMBIENT = 1<<10, // Slide this object when it hits a wall. MF_SLIDEME = 1<<11, diff --git a/src/p_setup.c b/src/p_setup.c index 54f887d60..37893f4c8 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -5006,6 +5006,33 @@ static void P_ConvertBinaryMap(void) if (mapthings[i].options & MTF_AMBUSH) mapthings[i].args[0] |= TMDS_ROTATEEXTRA; break; + case 700: //Water ambience A + case 701: //Water ambience A + case 702: //Water ambience A + case 703: //Water ambience A + case 704: //Water ambience A + case 705: //Water ambience A + case 706: //Water ambience A + case 707: //Water ambience A + mapthings[i].args[0] = 35; + P_WriteConstant(sfx_amwtr1 + mapthings[i].type - 700, &mapthings[i].stringargs[0]); + mapthings[i].type = 700; + break; + case 708: //Disco ambience + mapthings[i].args[0] = 512; + P_WriteConstant(sfx_ambint, &mapthings[i].stringargs[0]); + mapthings[i].type = 700; + break; + case 709: //Volcano ambience + mapthings[i].args[0] = 220; + P_WriteConstant(sfx_ambin2, &mapthings[i].stringargs[0]); + mapthings[i].type = 700; + break; + case 710: //Machine ambience + mapthings[i].args[0] = 24; + P_WriteConstant(sfx_ambmac, &mapthings[i].stringargs[0]); + mapthings[i].type = 700; + break; case 750: //Slope vertex mapthings[i].args[0] = mapthings[i].extrainfo; break; From 5d1284bc81dbe31efc8b21c750ffa5d4296dd803 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 28 Dec 2021 11:42:53 +0100 Subject: [PATCH 232/377] Fix unitialized array in P_ConvertBinaryMap --- src/p_setup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_setup.c b/src/p_setup.c index 37893f4c8..492c0aabc 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3176,7 +3176,7 @@ static line_t *P_FindPointPushLine(taglist_t *list) static void P_ConvertBinaryMap(void) { size_t i; - mobjtype_t mobjtypeofthing[4096]; + mobjtype_t mobjtypeofthing[4096] = {0}; mobjtype_t mobjtype; for (i = 0; i < numlines; i++) From b4a206c063d2ac43c7e3aa7732f7db6ede56ac3a Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 28 Dec 2021 13:14:48 +0100 Subject: [PATCH 233/377] Adapt remaining enemies to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 125 ++++++++++++++++++++- src/p_enemy.c | 21 +++- src/p_mobj.c | 53 ++++++++- src/p_setup.c | 37 +++++- src/p_spec.h | 13 +++ 5 files changed, 235 insertions(+), 14 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 58c4fe53d..102805b1b 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -3607,6 +3607,12 @@ udmf sprite = "BUZZA1"; width = 28; height = 40; + arg0 + { + title = "Can move?"; + type = 11; + enum = "yesno"; + } } 104 { @@ -3614,6 +3620,12 @@ udmf sprite = "RBUZA1"; width = 28; height = 40; + arg0 + { + title = "Can move?"; + type = 11; + enum = "yesno"; + } } 108 { @@ -3674,6 +3686,16 @@ udmf sprite = "CRABA0"; width = 24; height = 32; + arg0 + { + title = "Spawn direction"; + type = 11; + enum + { + 0 = "Right"; + 1 = "Left"; + } + } } 138 { @@ -3681,6 +3703,16 @@ udmf sprite = "CR2BA0"; width = 24; height = 32; + arg0 + { + title = "Spawn direction"; + type = 11; + enum + { + 0 = "Right"; + 1 = "Left"; + } + } } 117 { @@ -3688,6 +3720,12 @@ udmf sprite = "ARCHA1"; width = 24; height = 32; + arg0 + { + title = "Can jump?"; + type = 11; + enum = "yesno"; + } } 118 { @@ -3709,6 +3747,23 @@ udmf sprite = "ESHIA1"; width = 16; height = 48; + arg0 + { + title = "Turn direction"; + type = 11; + enum + { + 0 = "Back"; + 1 = "Right"; + 2 = "Left"; + } + } + arg1 + { + title = "Double speed?"; + type = 11; + enum = "noyes"; + } } 115 { @@ -3784,6 +3839,12 @@ udmf sprite = "JETBB1"; width = 20; height = 50; + arg0 + { + title = "Can move?"; + type = 11; + enum = "yesno"; + } } 106 { @@ -3791,6 +3852,12 @@ udmf sprite = "JETGB1"; width = 20; height = 48; + arg0 + { + title = "Can move?"; + type = 11; + enum = "yesno"; + } } 112 { @@ -3840,6 +3907,12 @@ udmf sprite = "CACOA0"; width = 32; height = 32; + arg0 + { + title = "Can move?"; + type = 11; + enum = "yesno"; + } } 133 { @@ -3866,6 +3939,12 @@ udmf sprite = "BUMBA1"; width = 16; height = 32; + arg0 + { + title = "Can move?"; + type = 11; + enum = "yesno"; + } } 124 { @@ -4551,6 +4630,12 @@ udmf sprite = "BUBLE0"; width = 8; height = 16; + arg0 + { + title = "Distance check?"; + type = 11; + enum = "yesno"; + } } 501 { @@ -4686,9 +4771,13 @@ udmf } arg1 { - title = "Invisible?"; - type = 11; - enum = "noyes"; + title = "Flags"; + type = 12; + enum + { + 1 = "Invisible"; + 2 = "No distance check"; + } } } 541 @@ -4710,6 +4799,12 @@ udmf sprite = "BLONA0"; width = 32; height = 64; + arg0 + { + title = "Respawn?"; + type = 11; + enum = "noyes"; + } stringarg0 { title = "Color"; @@ -5942,6 +6037,12 @@ udmf sprite = "BTBLA0"; width = 24; height = 48; + arg0 + { + title = "Move perpetually?"; + type = 11; + enum = "noyes"; + } } 1201 { @@ -5949,6 +6050,12 @@ udmf sprite = "STBLA0"; width = 12; height = 24; + arg0 + { + title = "Move perpetually?"; + type = 11; + enum = "noyes"; + } } 1202 { @@ -6608,6 +6715,12 @@ udmf sprite = "NTPNALAR"; width = 16; height = 32; + arg0 + { + title = "Can move?"; + type = 11; + enum = "yesno"; + } } } @@ -6727,6 +6840,12 @@ udmf 3 = "Top"; } } + arg4 + { + title = "Die upon time up?"; + type = 11; + enum = "noyes"; + } } 1704 { diff --git a/src/p_enemy.c b/src/p_enemy.c index 27f169e20..e077b3926 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -7909,12 +7909,21 @@ void A_GuardChase(mobj_t *actor) false) && speed > 0) // can't be the same check as previous so that P_TryMove gets to happen. { - if (actor->spawnpoint && ((actor->spawnpoint->options & (MTF_EXTRA|MTF_OBJECTSPECIAL)) == MTF_OBJECTSPECIAL)) - actor->angle += ANGLE_90; - else if (actor->spawnpoint && ((actor->spawnpoint->options & (MTF_EXTRA|MTF_OBJECTSPECIAL)) == MTF_EXTRA)) - actor->angle -= ANGLE_90; - else - actor->angle += ANGLE_180; + INT32 direction = actor->spawnpoint ? actor->spawnpoint->args[0] : TMGD_BACK; + + switch (direction) + { + case TMGD_BACK: + default: + actor->angle += ANGLE_180; + break; + case TMGD_RIGHT: + actor->angle -= ANGLE_90; + break; + case TMGD_LEFT: + actor->angle += ANGLE_90; + break; + } } if (actor->extravalue1 < actor->info->speed) diff --git a/src/p_mobj.c b/src/p_mobj.c index 55f7a729a..aa27c4015 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2681,7 +2681,7 @@ boolean P_ZMovement(mobj_t *mo) { if (mo->flags2 & MF2_AMBUSH) { - // If deafed, give the tumbleweed another random kick if it runs out of steam. + // Give the tumbleweed another random kick if it runs out of steam. mom.z += P_MobjFlip(mo)*FixedMul(6*FRACUNIT, mo->scale); if (P_RandomChance(FRACUNIT/2)) @@ -12504,6 +12504,9 @@ static boolean P_SetupNiGHTSDrone(mapthing_t *mthing, mobj_t *mobj) else mobj->height = mobjinfo[MT_NIGHTSDRONE].height; + if (mthing->args[4]) + mobj->flags2 |= MF2_AMBUSH; //Kill player upon time up + droneboxmandiff = max(mobj->height - mobjinfo[MT_NIGHTSDRONE_MAN].height, 0); dronemangoaldiff = max(mobjinfo[MT_NIGHTSDRONE_MAN].height - mobjinfo[MT_NIGHTSDRONE_GOAL].height, 0); @@ -12723,8 +12726,12 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean case MT_EGGMOBILE3: mobj->cusval = mthing->args[0]; break; + case MT_BUBBLES: + if (mthing->args[0]) + mobj->flags2 |= MF2_AMBUSH; + break; case MT_FAN: - if (mthing->args[1]) + if (mthing->args[1] & TMF_INVISIBLE) { P_UnsetThingPosition(mobj); if (sector_list) @@ -12735,6 +12742,8 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean mobj->flags |= MF_NOSECTOR; // this flag basically turns it invisible P_SetThingPosition(mobj); } + if (mthing->args[1] & TMF_NODISTANCECHECK) + mobj->flags2 |= MF2_AMBUSH; if (mthing->args[0]) mobj->health = mthing->args[0]; else @@ -12754,6 +12763,8 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean case MT_BALLOON: if (mthing->stringargs[0]) mobj->color = get_number(mthing->stringargs[0]); + if (mthing->args[0]) + mobj->flags2 |= MF2_AMBUSH; break; case MT_FLAME: if (mthing->args[0]) @@ -13032,12 +13043,13 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean break; case MT_BIGTUMBLEWEED: case MT_LITTLETUMBLEWEED: - if (mthing->options & MTF_AMBUSH) + if (mthing->args[0]) { fixed_t offset = FixedMul(16*FRACUNIT, mobj->scale); mobj->momx += P_RandomChance(FRACUNIT/2) ? offset : -offset; mobj->momy += P_RandomChance(FRACUNIT/2) ? offset : -offset; mobj->momz += offset; + mobj->flags2 |= MF2_AMBUSH; } break; case MT_REDFLAG: @@ -13067,6 +13079,23 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean mobj->threshold = get_number(mthing->stringargs[0]); mobj->health = mthing->args[0] ? mthing->args[0] : TICRATE; break; + case MT_GOLDBUZZ: + case MT_REDBUZZ: + case MT_JETTBOMBER: + case MT_JETTGUNNER: + case MT_ROBOHOOD: + case MT_CRUSHSTACEAN: + case MT_BANPYURA: + case MT_BUMBLEBORE: + case MT_CACOLANTERN: + case MT_PIAN: + if (mthing->args[0]) + mobj->flags2 |= MF2_AMBUSH; + break; + case MT_EGGGUARD: + if (mthing->args[1]) + mobj->flags2 |= MF2_AMBUSH; + break; default: break; } @@ -13099,10 +13128,28 @@ static void P_SetAmbush(mobj_t *mobj) mobj->flags2 |= MF2_AMBUSH; } + //TODO: Make this obsolete else if (mobj->type != MT_AXIS && mobj->type != MT_AXISTRANSFER && mobj->type != MT_AXISTRANSFERLINE && mobj->type != MT_NIGHTSBUMPER && + mobj->type != MT_NIGHTSDRONE && + mobj->type != MT_BALLOON && + mobj->type != MT_BIGTUMBLEWEED && + mobj->type != MT_LITTLETUMBLEWEED && + mobj->type != MT_BUBBLES && + mobj->type != MT_FAN && + mobj->type != MT_ROBOHOOD && + mobj->type != MT_CRUSHSTACEAN && + mobj->type != MT_BANPYURA && + mobj->type != MT_GOLDBUZZ && + mobj->type != MT_REDBUZZ && + mobj->type != MT_JETTBOMBER && + mobj->type != MT_JETTGUNNER && + mobj->type != MT_BUMBLEBORE && + mobj->type != MT_CACOLANTERN && + mobj->type != MT_PIAN && + mobj->type != MT_EGGGUARD && mobj->type != MT_STARPOST) mobj->flags2 |= MF2_AMBUSH; } diff --git a/src/p_setup.c b/src/p_setup.c index 492c0aabc..8333c21f3 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4929,6 +4929,27 @@ static void P_ConvertBinaryMap(void) case 111: //Pop-up Turret mapthings[i].args[0] = mapthings[i].angle; break; + case 103: //Buzz (Gold) + case 104: //Buzz (Red) + case 105: //Jetty-syn Bomber + case 106: //Jetty-syn Gunner + case 117: //Robo-Hood + case 126: //Crushstacean + case 128: //Bumblebore + case 132: //Cacolantern + case 138: //Banpyura + case 1602: //Pian + mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); + break; + case 119: //Egg Guard + if ((mapthings[i].options & (MTF_EXTRA|MTF_OBJECTSPECIAL)) == MTF_OBJECTSPECIAL) + mapthings[i].args[0] = TMGD_LEFT; + else if ((mapthings[i].options & (MTF_EXTRA|MTF_OBJECTSPECIAL)) == MTF_EXTRA) + mapthings[i].args[0] = TMGD_RIGHT; + else + mapthings[i].args[0] = TMGD_BACK; + mapthings[i].args[1] = !!(mapthings[i].options & MTF_AMBUSH); + break; case 127: //Hive Elemental mapthings[i].args[0] = mapthings[i].extrainfo; break; @@ -4954,7 +4975,10 @@ static void P_ConvertBinaryMap(void) mapthings[i].args[0] = mapthings[i].angle; mapthings[i].args[1] = mapthings[i].options & 7; break; - case 294: + case 294: //Fang waypoint + mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); + break; + case 500: //Air bubble patch mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); break; case 502: //Star post @@ -4992,11 +5016,15 @@ static void P_ConvertBinaryMap(void) break; case 540: //Fan mapthings[i].args[0] = mapthings[i].angle; - mapthings[i].args[1] = !!(mapthings[i].options & MTF_OBJECTSPECIAL); + if (mapthings[i].options & MTF_OBJECTSPECIAL) + mapthings[i].args[1] |= TMF_INVISIBLE; + if (mapthings[i].options & MTF_AMBUSH) + mapthings[i].args[1] |= TMF_NODISTANCECHECK; break; case 543: //Balloon if (mapthings[i].angle > 0) P_WriteConstant(((mapthings[i].angle - 1) % (numskincolors - 1)) + 1, &mapthings[i].stringargs[0]); + mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); break; case 555: //Diagonal yellow spring case 556: //Diagonal red spring @@ -5192,6 +5220,10 @@ static void P_ConvertBinaryMap(void) if (mapthings[i].options & MTF_EXTRA) mapthings[i].args[0] |= TMFH_CORONA; break; + case 1200: //Tumbleweed (Big) + case 1201: //Tumbleweed (Small) + mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); + break; case 1202: //Rock spawner { mtag_t tag = (mtag_t)mapthings[i].angle; @@ -5240,6 +5272,7 @@ static void P_ConvertBinaryMap(void) mapthings[i].args[3] = TMDA_MIDDLE; else mapthings[i].args[3] = TMDA_BOTTOMOFFSET; + mapthings[i].args[4] = !!(mapthings[i].options & MTF_AMBUSH); break; case 1704: //NiGHTS bumper mapthings[i].pitch = 30 * (((mapthings[i].options & 15) + 9) % 12); diff --git a/src/p_spec.h b/src/p_spec.h index 743c37744..697a140ea 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -69,6 +69,19 @@ typedef enum TMDS_ROTATEEXTRA = 1<<1, } textmapdiagonalspringflags_t; +typedef enum +{ + TMF_INVISIBLE = 1, + TMF_NODISTANCECHECK = 1<<1, +} textmapfanflags_t; + +typedef enum +{ + TMGD_BACK = 0, + TMGD_RIGHT = 1, + TMGD_LEFT = 2, +} textmapguarddirection_t; + //FOF flags typedef enum { From 42f823600c1c874731e3b4805ccdb84b8db468d8 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 28 Dec 2021 14:01:45 +0100 Subject: [PATCH 234/377] Adapt NiGHTS items to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 50 ++++++++++++++++++++++ src/p_mobj.c | 23 +++++----- src/p_setup.c | 7 +++ src/p_spec.h | 6 +++ 4 files changed, 75 insertions(+), 11 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 102805b1b..d0dc85cc5 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -6866,26 +6866,76 @@ udmf { title = "Super Paraloop"; sprite = "NPRUA0"; + arg0 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Bonus time only"; + 2 = "Spawn immediately"; + } + } } 1708 { title = "Drill Refill"; sprite = "NPRUB0"; + arg0 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Bonus time only"; + 2 = "Spawn immediately"; + } + } } 1709 { title = "Nightopian Helper"; sprite = "NPRUC0"; + arg0 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Bonus time only"; + 2 = "Spawn immediately"; + } + } } 1711 { title = "Extra Time"; sprite = "NPRUD0"; + arg0 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Bonus time only"; + 2 = "Spawn immediately"; + } + } } 1712 { title = "Link Freeze"; sprite = "NPRUE0"; + arg0 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Bonus time only"; + 2 = "Spawn immediately"; + } + } } 1713 { diff --git a/src/p_mobj.c b/src/p_mobj.c index aa27c4015..c1d0fb7ac 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -13105,19 +13105,24 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean if (mthing->options & MTF_OBJECTSPECIAL) // No egg trap for this boss mobj->flags2 |= MF2_BOSSNOTRAP; } + if (mobj->flags & MF_NIGHTSITEM) + { + // Requires you to be in bonus time to activate + if (mthing->args[0] & TMNI_BONUSONLY) + mobj->flags2 |= MF2_STRONGBOX; + // Spawn already displayed + if (mthing->args[0] & TMNI_REVEAL) + { + mobj->flags |= MF_SPECIAL; + mobj->flags &= ~MF_NIGHTSITEM; + } + } return true; } static void P_SetAmbush(mobj_t *mobj) { - if (mobj->flags & MF_NIGHTSITEM) - { - // Spawn already displayed - mobj->flags |= MF_SPECIAL; - mobj->flags &= ~MF_NIGHTSITEM; - } - if (mobj->flags & MF_PUSHABLE) mobj->flags &= ~MF_PUSHABLE; @@ -13163,10 +13168,6 @@ static void P_SetObjectSpecial(mobj_t *mobj) mobj->flags2 |= MF2_STRONGBOX; } - // Requires you to be in bonus time to activate - if (mobj->flags & MF_NIGHTSITEM) - mobj->flags2 |= MF2_STRONGBOX; - // Pushables bounce and slide coolly with object special flag set if (mobj->flags & MF_PUSHABLE) { diff --git a/src/p_setup.c b/src/p_setup.c index 8333c21f3..5431b0124 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4896,6 +4896,13 @@ static void P_ConvertBinaryMap(void) mapthings[i].args[2] = LE_ALLBOSSESDEAD + paramoffset; mapthings[i].args[3] = LE_PINCHPHASE + paramoffset; } + if (mobjinfo[mobjtype].flags & MF_NIGHTSITEM) + { + if (mapthings[i].options & MTF_OBJECTSPECIAL) + mapthings[i].args[0] |= TMNI_BONUSONLY; + if (mapthings[i].options & MTF_AMBUSH) + mapthings[i].args[0] |= TMNI_REVEAL; + } } if (mapthings[i].type >= 1 && mapthings[i].type <= 35) //Player starts diff --git a/src/p_spec.h b/src/p_spec.h index 697a140ea..61ad5d6e4 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -82,6 +82,12 @@ typedef enum TMGD_LEFT = 2, } textmapguarddirection_t; +typedef enum +{ + TMNI_BONUSONLY = 1, + TMNI_REVEAL = 1<<1, +} textmapnightsitem_t; + //FOF flags typedef enum { From 53931727bddb9a51b0eed348ba23eb1722fd36f3 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 28 Dec 2021 14:28:36 +0100 Subject: [PATCH 235/377] Adapt pushables to UDMF --- extras/conf/udb/Includes/SRB222_misc.cfg | 8 ++ extras/conf/udb/Includes/SRB222_things.cfg | 96 ++++++++++++++++++++++ src/p_mobj.c | 44 +++++----- src/p_setup.c | 11 +++ src/p_spec.h | 8 ++ 5 files changed, 146 insertions(+), 21 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 2111c198b..dbcd22629 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -582,6 +582,14 @@ enums 64 = "Clip inside ground"; 128 = "No distance check"; } + + pushablebehavior + { + 0 = "Normal"; + 1 = "Slide"; + 2 = "Immovable"; + 3 = "Classic"; + } } //Default things filters diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index d0dc85cc5..649ddd647 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -3740,6 +3740,12 @@ udmf sprite = "CBBSA1"; width = 32; height = 72; + arg0 + { + title = "Push behavior"; + type = 11; + enum = "pushablebehavior"; + } } 119 { @@ -5379,6 +5385,12 @@ udmf sprite = "GARGA1"; width = 16; height = 40; + arg0 + { + title = "Push behavior"; + type = 11; + enum = "pushablebehavior"; + } } 1009 { @@ -5388,6 +5400,12 @@ udmf sprite = "GARGB1"; width = 32; height = 80; + arg0 + { + title = "Push behavior"; + type = 11; + enum = "pushablebehavior"; + } } 1001 { @@ -5548,6 +5566,12 @@ udmf sprite = "ESTAA1"; width = 32; height = 240; + arg0 + { + title = "Push behavior"; + type = 11; + enum = "pushablebehavior"; + } } 1103 { @@ -5875,6 +5899,12 @@ udmf sprite = "CSTAA1"; width = 16; height = 40; + arg0 + { + title = "Push behavior"; + type = 11; + enum = "pushablebehavior"; + } } 1112 { @@ -5884,6 +5914,12 @@ udmf sprite = "CBBSA1"; width = 32; height = 72; + arg0 + { + title = "Push behavior"; + type = 11; + enum = "pushablebehavior"; + } } 1114 { @@ -5986,6 +6022,12 @@ udmf sprite = "CBLLA0"; width = 20; height = 40; + arg0 + { + title = "Push behavior"; + type = 11; + enum = "pushablebehavior"; + } } 1125 { @@ -6182,6 +6224,12 @@ udmf sprite = "BARRA1"; width = 24; height = 63; + arg0 + { + title = "Push behavior"; + type = 11; + enum = "pushablebehavior"; + } } 1217 { @@ -6637,6 +6685,12 @@ udmf sprite = "BGARA1"; width = 16; height = 40; + arg0 + { + title = "Push behavior"; + type = 11; + enum = "pushablebehavior"; + } } 1501 { @@ -6646,6 +6700,12 @@ udmf sprite = "BGARA1"; width = 16; height = 40; + arg0 + { + title = "Push behavior"; + type = 11; + enum = "pushablebehavior"; + } } 1502 { @@ -6655,6 +6715,12 @@ udmf sprite = "BGARA1"; width = 16; height = 40; + arg0 + { + title = "Push behavior"; + type = 11; + enum = "pushablebehavior"; + } } 1503 { @@ -6664,6 +6730,12 @@ udmf sprite = "BGARA1"; width = 16; height = 40; + arg0 + { + title = "Push behavior"; + type = 11; + enum = "pushablebehavior"; + } } 1504 { @@ -6687,6 +6759,12 @@ udmf sprite = "BGARD1"; width = 16; height = 40; + arg0 + { + title = "Push behavior"; + type = 11; + enum = "pushablebehavior"; + } } } @@ -7078,6 +7156,12 @@ udmf sprite = "XMS3A0"; width = 16; height = 64; + arg0 + { + title = "Push behavior"; + type = 11; + enum = "pushablebehavior"; + } } 1853 { @@ -7086,6 +7170,12 @@ udmf sprite = "XMS3B0"; width = 16; height = 80; + arg0 + { + title = "Push behavior"; + type = 11; + enum = "pushablebehavior"; + } } 1854 { @@ -7146,6 +7236,12 @@ udmf sprite = "ESTAB1"; width = 20; height = 96; + arg0 + { + title = "Push behavior"; + type = 11; + enum = "pushablebehavior"; + } } } diff --git a/src/p_mobj.c b/src/p_mobj.c index c1d0fb7ac..4fe3e02ac 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -13117,15 +13117,31 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean mobj->flags &= ~MF_NIGHTSITEM; } } + if (mobj->flags & MF_PUSHABLE) + { + switch (mthing->args[0]) + { + case TMP_NORMAL: + default: + break; + case TMP_SLIDE: + mobj->flags2 |= MF2_SLIDEPUSH; + mobj->flags |= MF_BOUNCE; + break; + case TMP_IMMOVABLE: + mobj->flags &= ~MF_PUSHABLE; + break; + case TMP_CLASSIC: + mobj->flags2 |= MF2_CLASSICPUSH; + break; + } + } return true; } static void P_SetAmbush(mobj_t *mobj) { - if (mobj->flags & MF_PUSHABLE) - mobj->flags &= ~MF_PUSHABLE; - if ((mobj->flags & MF_MONITOR) && mobj->info->speed != 0) { // flag for strong/weak random boxes @@ -13167,13 +13183,6 @@ static void P_SetObjectSpecial(mobj_t *mobj) // any monitor with nonzero speed is allowed to respawn like this mobj->flags2 |= MF2_STRONGBOX; } - - // Pushables bounce and slide coolly with object special flag set - if (mobj->flags & MF_PUSHABLE) - { - mobj->flags2 |= MF2_SLIDEPUSH; - mobj->flags |= MF_BOUNCE; - } } static mobj_t *P_SpawnMobjFromMapThing(mapthing_t *mthing, fixed_t x, fixed_t y, fixed_t z, mobjtype_t i) @@ -13202,18 +13211,11 @@ static mobj_t *P_SpawnMobjFromMapThing(mapthing_t *mthing, fixed_t x, fixed_t y, if (i == MT_NIGHTSBUMPER) return mobj; - if ((mthing->options & MTF_AMBUSH) - && (mthing->options & MTF_OBJECTSPECIAL) - && (mobj->flags & MF_PUSHABLE)) - mobj->flags2 |= MF2_CLASSICPUSH; - else - { - if (mthing->options & MTF_AMBUSH) - P_SetAmbush(mobj); + if (mthing->options & MTF_AMBUSH) + P_SetAmbush(mobj); - if (mthing->options & MTF_OBJECTSPECIAL) - P_SetObjectSpecial(mobj); - } + if (mthing->options & MTF_OBJECTSPECIAL) + P_SetObjectSpecial(mobj); // Generic reverse gravity for individual objects flag. if (mthing->options & MTF_OBJECTFLIP) diff --git a/src/p_setup.c b/src/p_setup.c index 5431b0124..de6eb1c93 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4903,6 +4903,17 @@ static void P_ConvertBinaryMap(void) if (mapthings[i].options & MTF_AMBUSH) mapthings[i].args[0] |= TMNI_REVEAL; } + if (mobjinfo[mobjtype].flags & MF_PUSHABLE) + { + if ((mapthings[i].options & (MTF_OBJECTSPECIAL|MTF_AMBUSH)) == (MTF_OBJECTSPECIAL|MTF_AMBUSH)) + mapthings[i].args[0] = TMP_CLASSIC; + else if (mapthings[i].options & MTF_OBJECTSPECIAL) + mapthings[i].args[0] = TMP_SLIDE; + else if (mapthings[i].options & MTF_AMBUSH) + mapthings[i].args[0] = TMP_IMMOVABLE; + else + mapthings[i].args[0] = TMP_NORMAL; + } } if (mapthings[i].type >= 1 && mapthings[i].type <= 35) //Player starts diff --git a/src/p_spec.h b/src/p_spec.h index 61ad5d6e4..220376903 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -88,6 +88,14 @@ typedef enum TMNI_REVEAL = 1<<1, } textmapnightsitem_t; +typedef enum +{ + TMP_NORMAL = 0, + TMP_SLIDE = 1, + TMP_IMMOVABLE = 2, + TMP_CLASSIC = 3, +} textmappushabletype_t; + //FOF flags typedef enum { From 79c3197de2c40bb8f91582cebceda46f736ec6f2 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 28 Dec 2021 16:38:52 +0100 Subject: [PATCH 236/377] Adapt various thing types for UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 135 +++++++++++++++++++++ src/p_inter.c | 2 +- src/p_mobj.c | 45 +++++-- src/p_setup.c | 57 +++++++++ src/p_spec.h | 7 ++ 5 files changed, 236 insertions(+), 10 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 649ddd647..02d90eacf 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -4265,6 +4265,12 @@ udmf width = 24; height = 24; sprite = "RINGA0"; + arg0 + { + title = "Float?"; + type = 11; + enum = "yesno"; + } 300 { @@ -4380,6 +4386,12 @@ udmf sprite = "TOKEA0"; width = 16; height = 32; + arg0 + { + title = "Float?"; + type = 11; + enum = "yesno"; + } } 313 { @@ -4420,11 +4432,23 @@ udmf { title = "Emerald Hunt Location"; sprite = "SHRDA0"; + arg0 + { + title = "Float?"; + type = 11; + enum = "yesno"; + } } 321 { title = "Match Chaos Emerald Spawn"; sprite = "CEMGA0"; + arg0 + { + title = "Float?"; + type = 11; + enum = "yesno"; + } } 322 { @@ -4432,6 +4456,12 @@ udmf sprite = "EMBMA0"; width = 16; height = 30; + arg0 + { + title = "Float?"; + type = 11; + enum = "yesno"; + } } } @@ -4661,6 +4691,12 @@ udmf { title = "Order"; } + arg1 + { + title = "Respawn at center?"; + type = 11; + enum = "noyes"; + } } 520 { @@ -4668,6 +4704,12 @@ udmf sprite = "SPHRD0"; width = 16; height = 24; + arg0 + { + title = "Float?"; + type = 11; + enum = "yesno"; + } } 521 { @@ -4675,6 +4717,12 @@ udmf sprite = "SPIKA0"; width = 12; height = 8; + arg0 + { + title = "Float?"; + type = 11; + enum = "yesno"; + } } 522 { @@ -4791,6 +4839,12 @@ udmf title = "Gas Jet"; sprite = "STEMD0"; width = 32; + arg0 + { + title = "Play sound?"; + type = 11; + enum = "noyes"; + } } 542 { @@ -4889,6 +4943,12 @@ udmf sprite = "SSWYD2D8"; width = 16; height = 32; + arg0 + { + title = "Float?"; + type = 11; + enum = "yesno"; + } } 559 { @@ -4897,6 +4957,12 @@ udmf sprite = "SSWRD2D8"; width = 16; height = 32; + arg0 + { + title = "Float?"; + type = 11; + enum = "yesno"; + } } 560 { @@ -4905,6 +4971,12 @@ udmf sprite = "SSWBD2D8"; width = 16; height = 32; + arg0 + { + title = "Float?"; + type = 11; + enum = "yesno"; + } } 1134 { @@ -4927,6 +4999,12 @@ udmf sprite = "BSTYA0"; width = 28; height = 2; + arg0 + { + title = "Force spin?"; + type = 11; + enum = "noyes"; + } } 545 { @@ -4935,6 +5013,12 @@ udmf sprite = "BSTRA0"; width = 28; height = 2; + arg0 + { + title = "Force spin?"; + type = 11; + enum = "noyes"; + } } } @@ -5572,6 +5656,12 @@ udmf type = 11; enum = "pushablebehavior"; } + arg1 + { + title = "Solid gold?"; + type = 11; + enum = "noyes"; + } } 1103 { @@ -6049,6 +6139,17 @@ udmf sprite = "EGR1A1"; width = 20; height = 72; + arg0 + { + title = "Movement"; + type = 11; + enum + { + 0 = "None"; + 1 = "Right"; + 2 = "Left"; + } + } } 1128 { @@ -6265,6 +6366,12 @@ udmf sprite = "SALDARAL"; width = 96; height = 160; + arg0 + { + title = "Allow non-minecart players?"; + type = 11; + enum = "noyes"; + } } 1222 { @@ -6293,6 +6400,16 @@ udmf sprite = "internal:zoom"; width = 8; height = 16; + arg0 + { + title = "Type"; + type = 11; + enum + { + 0 = "Disable"; + 1 = "Enable"; + } + } } 1230 { @@ -6391,6 +6508,12 @@ udmf sprite = "PUMIA1A5"; width = 30; height = 60; + arg0 + { + title = "Buoyant?"; + type = 11; + enum = "yesno"; + } } 1306 { @@ -6939,6 +7062,12 @@ udmf sprite = "SPHRA0"; width = 16; height = 24; + arg0 + { + title = "Float?"; + type = 11; + enum = "yesno"; + } } 1707 { @@ -7051,6 +7180,12 @@ udmf sprite = "COINA0"; width = 16; height = 24; + arg0 + { + title = "Float?"; + type = 11; + enum = "yesno"; + } } 1801 { diff --git a/src/p_inter.c b/src/p_inter.c index 9a3562fc8..028ac0ef3 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1437,7 +1437,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) // Misc touchables // // *************** // case MT_STARPOST: - P_TouchStarPost(special, player, special->spawnpoint && (special->spawnpoint->options & MTF_OBJECTSPECIAL)); + P_TouchStarPost(special, player, special->spawnpoint && special->spawnpoint->args[1]); return; case MT_FAKEMOBILE: diff --git a/src/p_mobj.c b/src/p_mobj.c index 4fe3e02ac..fa3bba57a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8590,9 +8590,9 @@ static boolean P_EggRobo1Think(mobj_t *mobj) { fixed_t basex = mobj->cusval, basey = mobj->cvmem; - if (mobj->spawnpoint && mobj->spawnpoint->options & (MTF_AMBUSH|MTF_OBJECTSPECIAL)) + if (mobj->spawnpoint && mobj->spawnpoint->args[0] != TMED_NONE) { - angle_t sideang = mobj->movedir + ((mobj->spawnpoint->options & MTF_AMBUSH) ? ANGLE_90 : -ANGLE_90); + angle_t sideang = mobj->movedir + ((mobj->spawnpoint->args[0] == TMED_LEFT) ? ANGLE_90 : -ANGLE_90); fixed_t oscillate = FixedMul(FINESINE(((leveltime * ANG1) >> (ANGLETOFINESHIFT + 2)) & FINEMASK), 250*mobj->scale); basex += P_ReturnThrustX(mobj, sideang, oscillate); basey += P_ReturnThrustY(mobj, sideang, oscillate); @@ -11775,14 +11775,14 @@ fixed_t P_GetMapThingSpawnHeight(const mobjtype_t mobjtype, const mapthing_t* mt dz = 288*FRACUNIT; break; - // Horizontal springs, may float additional units with MTF_AMBUSH. + // Horizontal springs, float additional units unless args[0] is set. case MT_YELLOWHORIZ: case MT_REDHORIZ: case MT_BLUEHORIZ: - offset += mthing->options & MTF_AMBUSH ? 16*FRACUNIT : 0; + offset += mthing->args[0] ? 0 : 16*FRACUNIT; break; - // Ring-like items, may float additional units with MTF_AMBUSH. + // Ring-like items, float additional units unless args[0] is set. case MT_SPIKEBALL: case MT_EMERHUNT: case MT_EMERALDSPAWN: @@ -11796,13 +11796,13 @@ fixed_t P_GetMapThingSpawnHeight(const mobjtype_t mobjtype, const mapthing_t* mt case MT_BOMBSPHERE: case MT_NIGHTSCHIP: case MT_NIGHTSSTAR: - offset += mthing->options & MTF_AMBUSH ? 24*FRACUNIT : 0; + offset += mthing->args[0] ? 0 : 24*FRACUNIT; break; // Remaining objects. default: if (P_WeaponOrPanel(mobjtype)) - offset += mthing->options & MTF_AMBUSH ? 24*FRACUNIT : 0; + offset += mthing->args[0] ? 0 : 24*FRACUNIT; } if (!(dz + offset)) // Snap to the surfaces when there's no offset set. @@ -12717,7 +12717,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean break; } case MT_EGGSTATUE: - if (mthing->options & MTF_EXTRA) + if (mthing->args[1]) { mobj->color = SKINCOLOR_GOLD; mobj->colorized = true; @@ -13096,6 +13096,22 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean if (mthing->args[1]) mobj->flags2 |= MF2_AMBUSH; break; + case MT_STEAM: + if (mthing->args[0]) + mobj->flags2 |= MF2_AMBUSH; + break; + case MT_SALOONDOORCENTER: + if (mthing->args[0]) + mobj->flags2 |= MF2_AMBUSH; + break; + case MT_MINECARTSWITCHPOINT: + if (mthing->args[0]) + mobj->flags2 |= MF2_AMBUSH; + break; + case MT_ROLLOUTSPAWN: + if (mthing->args[0]) + mobj->flags2 |= MF2_AMBUSH; + break; default: break; } @@ -13136,6 +13152,12 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean break; } } + if (mobj->flags & MF_SPRING && mobj->info->painchance == 3) + { + if (mthing->args[0]) + mobj->flags2 |= MF2_AMBUSH; + } + return true; } @@ -13171,7 +13193,12 @@ static void P_SetAmbush(mobj_t *mobj) mobj->type != MT_CACOLANTERN && mobj->type != MT_PIAN && mobj->type != MT_EGGGUARD && - mobj->type != MT_STARPOST) + mobj->type != MT_STEAM && + mobj->type != MT_SALOONDOORCENTER && + mobj->type != MT_MINECARTSWITCHPOINT && + mobj->type != MT_ROLLOUTSPAWN && + mobj->type != MT_STARPOST && + !(mobj->flags & MF_SPRING && mobj->info->painchance == 3)) mobj->flags2 |= MF2_AMBUSH; } diff --git a/src/p_setup.c b/src/p_setup.c index de6eb1c93..c267167fe 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4914,6 +4914,8 @@ static void P_ConvertBinaryMap(void) else mapthings[i].args[0] = TMP_NORMAL; } + if (mobjinfo[mobjtype].flags & MF_SPRING && mobjinfo[mobjtype].painchance == 3) + mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); } if (mapthings[i].type >= 1 && mapthings[i].type <= 35) //Player starts @@ -4996,6 +4998,32 @@ static void P_ConvertBinaryMap(void) case 294: //Fang waypoint mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); break; + case 300: //Ring + case 301: //Bounce ring + case 302: //Rail ring + case 303: //Infinity ring + case 304: //Automatic ring + case 305: //Explosion ring + case 306: //Scatter ring + case 307: //Grenade ring + case 308: //Red team ring + case 309: //Blue team ring + case 312: //Emerald token + case 320: //Emerald hunt location + case 321: //Match chaos emerald spawn + case 322: //Emblem + case 330: //Bounce ring panel + case 331: //Rail ring panel + case 332: //Automatic ring panel + case 333: //Explosion ring panel + case 334: //Scatter ring panel + case 335: //Grenade ring panel + case 520: //Bomb sphere + case 521: //Spikeball + case 1706: //Blue sphere + case 1800: //Coin + mapthings[i].args[0] = !(mapthings[i].options & MTF_AMBUSH); + break; case 500: //Air bubble patch mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); break; @@ -5009,6 +5037,7 @@ static void P_ConvertBinaryMap(void) else // Old behavior if Parameter is 0; add 360 to the angle for each consecutive star post. mapthings[i].args[0] = (mapthings[i].angle/360); + mapthings[i].args[1] = !!(mapthings[i].options & MTF_OBJECTSPECIAL); break; case 522: //Wall spike if (mapthings[i].options & MTF_OBJECTSPECIAL) @@ -5039,6 +5068,9 @@ static void P_ConvertBinaryMap(void) if (mapthings[i].options & MTF_AMBUSH) mapthings[i].args[1] |= TMF_NODISTANCECHECK; break; + case 541: //Gas jet + mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); + break; case 543: //Balloon if (mapthings[i].angle > 0) P_WriteConstant(((mapthings[i].angle - 1) % (numskincolors - 1)) + 1, &mapthings[i].stringargs[0]); @@ -5052,6 +5084,11 @@ static void P_ConvertBinaryMap(void) if (mapthings[i].options & MTF_AMBUSH) mapthings[i].args[0] |= TMDS_ROTATEEXTRA; break; + case 558: //Horizontal yellow spring + case 559: //Horizontal red spring + case 560: //Horizontal blue spring + mapthings[i].args[0] = !(mapthings[i].options & MTF_AMBUSH); + break; case 700: //Water ambience A case 701: //Water ambience A case 702: //Water ambience A @@ -5174,6 +5211,9 @@ static void P_ConvertBinaryMap(void) case 1011: //Stalagmite (DSZ2) mapthings[i].args[0] = !!(mapthings[i].options & MTF_OBJECTSPECIAL); break; + case 1102: //Eggman Statue + mapthings[i].args[1] = !!(mapthings[i].options & MTF_EXTRA); + break; case 1104: //Mace spawnpoint case 1105: //Chain with maces spawnpoint case 1106: //Chained spring spawnpoint @@ -5238,6 +5278,14 @@ static void P_ConvertBinaryMap(void) if (mapthings[i].options & MTF_EXTRA) mapthings[i].args[0] |= TMFH_CORONA; break; + case 1127: //Spectator EggRobo + if (mapthings[i].options & MTF_AMBUSH) + mapthings[i].args[0] = TMED_LEFT; + else if (mapthings[i].options & MTF_OBJECTSPECIAL) + mapthings[i].args[0] = TMED_RIGHT; + else + mapthings[i].args[0] = TMED_NONE; + break; case 1200: //Tumbleweed (Big) case 1201: //Tumbleweed (Small) mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); @@ -5259,6 +5307,12 @@ static void P_ConvertBinaryMap(void) P_WriteConstant(MT_ROCKCRUMBLE1 + (sides[lines[j].sidenum[0]].rowoffset >> FRACBITS), &mapthings[i].stringargs[0]); break; } + case 1221: //Minecart saloon door + mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); + break; + case 1229: //Minecart switch point + mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); + break; case 1300: //Flame jet (horizontal) case 1301: //Flame jet (vertical) mapthings[i].args[0] = (mapthings[i].angle >> 13)*TICRATE/2; @@ -5269,6 +5323,9 @@ static void P_ConvertBinaryMap(void) mapthings[i].args[0] = mapthings[i].angle; mapthings[i].args[1] = !!(mapthings[i].options & MTF_AMBUSH); break; + case 1305: //Rollout Rock + mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); + break; case 1700: //Axis mapthings[i].args[2] = mapthings[i].angle & 16383; mapthings[i].args[3] = !!(mapthings[i].angle & 16384); diff --git a/src/p_spec.h b/src/p_spec.h index 220376903..0fc7c6ee1 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -96,6 +96,13 @@ typedef enum TMP_CLASSIC = 3, } textmappushabletype_t; +typedef enum +{ + TMED_NONE = 0, + TMED_RIGHT = 1, + TMED_LEFT = 2, +} textmapeggrobodirection_t; + //FOF flags typedef enum { From e71a952d709bdca005234b4d91aaa81c5bf27980 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 28 Dec 2021 17:54:26 +0100 Subject: [PATCH 237/377] Adapt monitors to UDMF --- extras/conf/udb/Includes/SRB222_misc.cfg | 7 ++ extras/conf/udb/Includes/SRB222_things.cfg | 110 +++++++++++++++++++++ src/p_enemy.c | 8 +- src/p_mobj.c | 56 ++++------- src/p_setup.c | 20 +++- src/p_spec.h | 7 ++ 6 files changed, 166 insertions(+), 42 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index dbcd22629..3547266cb 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -590,6 +590,13 @@ enums 2 = "Immovable"; 3 = "Classic"; } + + monitorrespawn + { + 0 = "Same item"; + 1 = "Random (Weak)"; + 2 = "Random (Strong)"; + } } //Default things filters diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 02d90eacf..ab1ce5ad5 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -4472,56 +4472,131 @@ udmf title = "Monitors"; width = 18; height = 40; + arg0 + { + title = "Death trigger tag"; + type = 15; + } 400 { title = "Super Ring (10 Rings)"; sprite = "TVRIA0"; + arg1 + { + title = "Respawn behavior"; + type = 11; + enum = "monitorrespawn"; + } } 401 { title = "Pity Shield"; sprite = "TVPIA0"; + arg1 + { + title = "Respawn behavior"; + type = 11; + enum = "monitorrespawn"; + } } 402 { title = "Attraction Shield"; sprite = "TVATA0"; + arg1 + { + title = "Respawn behavior"; + type = 11; + enum = "monitorrespawn"; + } } 403 { title = "Force Shield"; sprite = "TVFOA0"; + arg1 + { + title = "Respawn behavior"; + type = 11; + enum = "monitorrespawn"; + } } 404 { title = "Armageddon Shield"; sprite = "TVARA0"; + arg1 + { + title = "Respawn behavior"; + type = 11; + enum = "monitorrespawn"; + } } 405 { title = "Whirlwind Shield"; sprite = "TVWWA0"; + arg1 + { + title = "Respawn behavior"; + type = 11; + enum = "monitorrespawn"; + } } 406 { title = "Elemental Shield"; sprite = "TVELA0"; + arg1 + { + title = "Respawn behavior"; + type = 11; + enum = "monitorrespawn"; + } } 407 { title = "Super Sneakers"; sprite = "TVSSA0"; + arg1 + { + title = "Respawn behavior"; + type = 11; + enum = "monitorrespawn"; + } } 408 { title = "Invincibility"; sprite = "TVIVA0"; + arg1 + { + title = "Respawn behavior"; + type = 11; + enum = "monitorrespawn"; + } } 409 { title = "Extra Life"; sprite = "TV1UA0"; + arg1 + { + title = "Respawn behavior"; + type = 11; + enum = "monitorrespawn"; + } + arg2 + { + title = "Points"; + type = 11; + enum + { + 0 = "1,000"; + 1 = "10,000"; + } + } } 410 { @@ -4532,6 +4607,12 @@ udmf { title = "Teleporter"; sprite = "TVMXA0"; + arg1 + { + title = "Respawn behavior"; + type = 11; + enum = "monitorrespawn"; + } } 413 { @@ -4552,6 +4633,12 @@ udmf { title = "Recycler"; sprite = "TVRCA0"; + arg1 + { + title = "Respawn behavior"; + type = 11; + enum = "monitorrespawn"; + } } 418 { @@ -4567,16 +4654,34 @@ udmf { title = "Flame Shield"; sprite = "TVFLA0"; + arg1 + { + title = "Respawn behavior"; + type = 11; + enum = "monitorrespawn"; + } } 421 { title = "Water Shield"; sprite = "TVBBA0"; + arg1 + { + title = "Respawn behavior"; + type = 11; + enum = "monitorrespawn"; + } } 422 { title = "Lightning Shield"; sprite = "TVZPA0"; + arg1 + { + title = "Respawn behavior"; + type = 11; + enum = "monitorrespawn"; + } } } @@ -4587,6 +4692,11 @@ udmf title = "Monitors (Respawning)"; width = 20; height = 44; + arg0 + { + title = "Death trigger tag"; + type = 15; + } 431 { diff --git a/src/p_enemy.c b/src/p_enemy.c index e077b3926..bbbb9495f 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3717,8 +3717,8 @@ void A_MonitorPop(mobj_t *actor) // Run a linedef executor immediately upon popping // You may want to delay your effects by 18 tics to sync with the reward giving - if (actor->spawnpoint && actor->lastlook) - P_LinedefExecute(actor->lastlook, actor->target, NULL); + if (actor->spawnpoint && actor->spawnpoint->args[0]) + P_LinedefExecute(actor->spawnpoint->args[0], actor->target, NULL); } // Function: A_GoldMonitorPop @@ -3803,8 +3803,8 @@ void A_GoldMonitorPop(mobj_t *actor) // Run a linedef executor immediately upon popping // You may want to delay your effects by 18 tics to sync with the reward giving - if (actor->spawnpoint && actor->lastlook) - P_LinedefExecute(actor->lastlook, actor->target, NULL); + if (actor->spawnpoint && actor->spawnpoint->args[0]) + P_LinedefExecute(actor->spawnpoint->args[0], actor->target, NULL); } // Function: A_GoldMonitorRestore diff --git a/src/p_mobj.c b/src/p_mobj.c index fa3bba57a..09c518fe7 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12033,7 +12033,7 @@ static mobjtype_t P_GetMobjtypeSubstitute(mapthing_t *mthing, mobjtype_t i) case 2: // Unchanging if (i == MT_MYSTERY_BOX) return MT_NULL; // don't spawn - mthing->options &= ~(MTF_AMBUSH|MTF_OBJECTSPECIAL); // no random respawning! + mthing->args[1] = TMMR_SAME; // no random respawning! return i; case 3: // Don't spawn return MT_NULL; @@ -12063,8 +12063,7 @@ static mobjtype_t P_GetMobjtypeSubstitute(mapthing_t *mthing, mobjtype_t i) if (modeattacking && i == MT_1UP_BOX) // 1UPs -->> Score TVs { - // Either or, doesn't matter which. - if (mthing->options & (MTF_AMBUSH | MTF_OBJECTSPECIAL)) + if (mthing->args[2]) return MT_SCORE10K_BOX; // 10,000 else return MT_SCORE1K_BOX; // 1,000 @@ -13157,22 +13156,27 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean if (mthing->args[0]) mobj->flags2 |= MF2_AMBUSH; } - + if ((mobj->flags & MF_MONITOR) && mobj->info->speed != 0) + { + switch (mthing->args[1]) + { + case TMMR_SAME: + default: + break; + case TMMR_WEAK: + mobj->flags2 |= MF2_AMBUSH; + break; + case TMMR_STRONG: + mobj->flags2 |= MF2_STRONGBOX; + } + } return true; } static void P_SetAmbush(mobj_t *mobj) { - if ((mobj->flags & MF_MONITOR) && mobj->info->speed != 0) - { - // flag for strong/weak random boxes - // any monitor with nonzero speed is allowed to respawn like this - mobj->flags2 |= MF2_AMBUSH; - } - - //TODO: Make this obsolete - else if (mobj->type != MT_AXIS && + if (mobj->type != MT_AXIS && mobj->type != MT_AXISTRANSFER && mobj->type != MT_AXISTRANSFERLINE && mobj->type != MT_NIGHTSBUMPER && @@ -13198,20 +13202,11 @@ static void P_SetAmbush(mobj_t *mobj) mobj->type != MT_MINECARTSWITCHPOINT && mobj->type != MT_ROLLOUTSPAWN && mobj->type != MT_STARPOST && - !(mobj->flags & MF_SPRING && mobj->info->painchance == 3)) + !((mobj->flags & MF_SPRING) && mobj->info->painchance == 3) && + !((mobj->flags & MF_MONITOR) && mobj->info->speed != 0)) mobj->flags2 |= MF2_AMBUSH; } -static void P_SetObjectSpecial(mobj_t *mobj) -{ - if ((mobj->flags & MF_MONITOR) && mobj->info->speed != 0) - { - // flag for strong/weak random boxes - // any monitor with nonzero speed is allowed to respawn like this - mobj->flags2 |= MF2_STRONGBOX; - } -} - static mobj_t *P_SpawnMobjFromMapThing(mapthing_t *mthing, fixed_t x, fixed_t y, fixed_t z, mobjtype_t i) { mobj_t *mobj = NULL; @@ -13241,9 +13236,6 @@ static mobj_t *P_SpawnMobjFromMapThing(mapthing_t *mthing, fixed_t x, fixed_t y, if (mthing->options & MTF_AMBUSH) P_SetAmbush(mobj); - if (mthing->options & MTF_OBJECTSPECIAL) - P_SetObjectSpecial(mobj); - // Generic reverse gravity for individual objects flag. if (mthing->options & MTF_OBJECTFLIP) { @@ -13251,16 +13243,6 @@ static mobj_t *P_SpawnMobjFromMapThing(mapthing_t *mthing, fixed_t x, fixed_t y, mobj->flags2 |= MF2_OBJECTFLIP; } - // Extra functionality - if (mthing->options & MTF_EXTRA) - { - if (mobj->flags & MF_MONITOR && (mthing->angle & 16384)) - { - // Store line exec tag to run upon popping - mobj->lastlook = (mthing->angle & 16383); - } - } - // Final set of not being able to draw nightsitems. if (mobj->flags & MF_NIGHTSITEM) mobj->flags2 |= MF2_DONTDRAW; diff --git a/src/p_setup.c b/src/p_setup.c index c267167fe..0f9234767 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4914,8 +4914,23 @@ static void P_ConvertBinaryMap(void) else mapthings[i].args[0] = TMP_NORMAL; } - if (mobjinfo[mobjtype].flags & MF_SPRING && mobjinfo[mobjtype].painchance == 3) + if ((mobjinfo[mobjtype].flags & MF_SPRING) && mobjinfo[mobjtype].painchance == 3) mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); + if (mobjinfo[mobjtype].flags & MF_MONITOR) + { + if ((mapthings[i].options & MTF_EXTRA) && mapthings[i].angle & 16384) + mapthings[i].args[0] = mapthings[i].angle & 16383; + + if (mobjinfo[mobjtype].speed != 0) + { + if (mapthings[i].options & MTF_OBJECTSPECIAL) + mapthings[i].args[1] = TMMR_STRONG; + else if (mapthings[i].options & MTF_AMBUSH) + mapthings[i].args[1] = TMMR_WEAK; + else + mapthings[i].args[1] = TMMR_SAME; + } + } } if (mapthings[i].type >= 1 && mapthings[i].type <= 35) //Player starts @@ -5024,6 +5039,9 @@ static void P_ConvertBinaryMap(void) case 1800: //Coin mapthings[i].args[0] = !(mapthings[i].options & MTF_AMBUSH); break; + case 409: //Extra life monitor + mapthings[i].args[2] = !(mapthings[i].options & (MTF_AMBUSH|MTF_OBJECTSPECIAL)); + break; case 500: //Air bubble patch mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); break; diff --git a/src/p_spec.h b/src/p_spec.h index 0fc7c6ee1..994db8cf4 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -103,6 +103,13 @@ typedef enum TMED_LEFT = 2, } textmapeggrobodirection_t; +typedef enum +{ + TMMR_SAME = 0, + TMMR_WEAK = 1, + TMMR_STRONG = 2, +} textmapmonitorrespawn_t; + //FOF flags typedef enum { From a091b7d16d54c1a970d2fdcc05b70ec8dc645151 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 28 Dec 2021 22:52:24 +0100 Subject: [PATCH 238/377] Adapt bosses to UDMF and remove now-unused mapthing flags --- extras/conf/udb/Includes/SRB222_misc.cfg | 3 - extras/conf/udb/Includes/SRB222_things.cfg | 162 +++++++++++++++++---- src/info.c | 8 +- src/p_enemy.c | 10 +- src/p_mobj.c | 90 +++++------- src/p_setup.c | 40 +++-- src/p_spec.h | 12 ++ 7 files changed, 221 insertions(+), 104 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 3547266cb..57c7c88a3 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -87,10 +87,7 @@ thingflags // THING FLAGS thingflags_udmf { - extra = "Extra"; flip = "Flip"; - special = "Special"; - ambush = "Ambush"; } diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index ab1ce5ad5..328cf7673 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -3985,16 +3985,22 @@ udmf title = "Boss ID"; } arg1 + { + title = "End level on death?"; + type = 11; + enum = "noyes"; + } + arg2 { title = "Death trigger tag"; type = 15; } - arg2 + arg3 { title = "Victory trigger tag"; type = 15; } - arg3 + arg4 { title = "Pinch trigger tag"; type = 15; @@ -4012,19 +4018,31 @@ udmf } arg1 { - title = "Death trigger tag"; - type = 15; + title = "End level on death?"; + type = 11; + enum = "noyes"; } arg2 { - title = "Victory trigger tag"; + title = "Death trigger tag"; type = 15; } arg3 + { + title = "Victory trigger tag"; + type = 15; + } + arg4 { title = "Pinch trigger tag"; type = 15; } + arg5 + { + title = "Speed up when hit?"; + type = 11; + enum = "noyes"; + } } 202 { @@ -4037,16 +4055,22 @@ udmf title = "Boss ID"; } arg1 + { + title = "End level on death?"; + type = 11; + enum = "noyes"; + } + arg2 { title = "Death trigger tag"; type = 15; } - arg2 + arg3 { title = "Victory trigger tag"; type = 15; } - arg3 + arg4 { title = "Pinch trigger tag"; type = 15; @@ -4064,20 +4088,26 @@ udmf } arg1 { - title = "Death trigger tag"; - type = 15; + title = "End level on death?"; + type = 11; + enum = "noyes"; } arg2 { - title = "Victory trigger tag"; + title = "Death trigger tag"; type = 15; } arg3 { - title = "Pinch trigger tag"; + title = "Victory trigger tag"; type = 15; } arg4 + { + title = "Pinch trigger tag"; + type = 15; + } + arg5 { title = "Cage drop trigger tag"; type = 15; @@ -4095,19 +4125,35 @@ udmf } arg1 { - title = "Death trigger tag"; - type = 15; + title = "End level on death?"; + type = 11; + enum = "noyes"; } arg2 { - title = "Victory trigger tag"; + title = "Death trigger tag"; type = 15; } arg3 + { + title = "Victory trigger tag"; + type = 15; + } + arg4 { title = "Pinch trigger tag"; type = 15; } + arg5 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Grayscale"; + 2 = "Skip intro"; + } + } } 206 { @@ -4121,20 +4167,26 @@ udmf } arg1 { - title = "Death trigger tag"; - type = 15; + title = "End level on death?"; + type = 11; + enum = "noyes"; } arg2 { - title = "Victory trigger tag"; + title = "Death trigger tag"; type = 15; } arg3 { - title = "Pinch trigger tag"; + title = "Victory trigger tag"; type = 15; } arg4 + { + title = "Pinch trigger tag"; + type = 15; + } + arg5 { title = "Platform trigger tag"; type = 15; @@ -4146,6 +4198,12 @@ udmf sprite = "METLI1"; width = 16; height = 48; + arg0 + { + title = "Grayscale?"; + type = 11; + enum = "noyes"; + } } 208 { @@ -4159,19 +4217,31 @@ udmf } arg1 { - title = "Death trigger tag"; - type = 15; + title = "End level on death?"; + type = 11; + enum = "noyes"; } arg2 { - title = "Victory trigger tag"; + title = "Death trigger tag"; type = 15; } arg3 + { + title = "Victory trigger tag"; + type = 15; + } + arg4 { title = "Pinch trigger tag"; type = 15; } + arg5 + { + title = "Grayscale?"; + type = 11; + enum = "noyes"; + } } 209 { @@ -4185,24 +4255,40 @@ udmf } arg1 { - title = "Death trigger tag"; - type = 15; + title = "End level on death?"; + type = 11; + enum = "noyes"; } arg2 { - title = "Victory trigger tag"; + title = "Death trigger tag"; type = 15; } arg3 { - title = "Pinch trigger tag"; + title = "Victory trigger tag"; type = 15; } arg4 + { + title = "Pinch trigger tag"; + type = 15; + } + arg5 { title = "Attack trigger tag"; type = 15; } + arg6 + { + title = "Flags"; + type = 12; + enum + { + 1 = "No origin-fling death"; + 2 = "Electric barrier"; + } + } } 290 { @@ -6561,6 +6647,16 @@ udmf { title = "Strength"; } + arg3 + { + title = "Waving direction"; + type = 11; + enum + { + 0 = "Horizontal"; + 1 = "Vertical"; + } + } } 1301 { @@ -6580,6 +6676,16 @@ udmf { title = "Strength"; } + arg3 + { + title = "Shooting direction"; + type = 11; + enum + { + 0 = "Upwards"; + 1 = "Downwards"; + } + } } 1302 { @@ -7714,6 +7820,12 @@ udmf sprite = "ROSYA1"; width = 16; height = 48; + arg0 + { + title = "Grayscale?"; + type = 11; + enum = "noyes"; + } } 2105 { diff --git a/src/info.c b/src/info.c index 51f9ea8e6..c9443700c 100644 --- a/src/info.c +++ b/src/info.c @@ -1452,7 +1452,7 @@ state_t states[NUMSTATES] = {SPR_FANG, 18, 16, {A_FaceTarget}, 3, 0, S_FANG_PINCHLOBSHOT1}, // S_FANG_PINCHLOBSHOT0 {SPR_FANG, 19, 2, {A_FaceTarget}, 3, 0, S_FANG_PINCHLOBSHOT2}, // S_FANG_PINCHLOBSHOT1 {SPR_FANG, 20, 30, {A_Boss5MakeItRain}, MT_FBOMB, -16, S_FANG_PINCHLOBSHOT3}, // S_FANG_PINCHLOBSHOT2 - {SPR_FANG, 20, 18, {A_LinedefExecuteFromArg}, 3, 0, S_FANG_PINCHLOBSHOT4}, // S_FANG_PINCHLOBSHOT3 + {SPR_FANG, 20, 18, {A_LinedefExecuteFromArg}, 4, 0, S_FANG_PINCHLOBSHOT4}, // S_FANG_PINCHLOBSHOT3 {SPR_FANG, 0, 0, {A_Boss5Calm}, 0, 0, S_FANG_PATHINGSTART1}, // S_FANG_PINCHLOBSHOT4 {SPR_FANG, 21, 0, {A_DoNPCPain}, 0, 0, S_FANG_DIE2}, // S_FANG_DIE1 @@ -1584,7 +1584,7 @@ state_t states[NUMSTATES] = {SPR_BRAK, 21, 3*TICRATE, {NULL}, 0, 0, S_BLACKEGG_DESTROYPLAT2}, // S_BLACKEGG_DESTROYPLAT1 {SPR_BRAK, 21, 1, {A_PlaySound}, sfx_s3k54, 0, S_BLACKEGG_DESTROYPLAT3}, // S_BLACKEGG_DESTROYPLAT2 - {SPR_BRAK, 21, 14, {A_LinedefExecuteFromArg}, 4, 0, S_BLACKEGG_STND}, // S_BLACKEGG_DESTROYPLAT3 + {SPR_BRAK, 21, 14, {A_LinedefExecuteFromArg}, 5, 0, S_BLACKEGG_STND}, // S_BLACKEGG_DESTROYPLAT3 {SPR_NULL, 0, 1, {A_CapeChase}, (160 - 20) << 16, 0, S_BLACKEGG_HELPER}, // S_BLACKEGG_HELPER @@ -1618,7 +1618,7 @@ state_t states[NUMSTATES] = {SPR_BRAK, 26 + FF_FULLBRIGHT, 2, {A_BrakFireShot}, MT_CYBRAKDEMON_FLAMESHOT, 128, S_CYBRAKDEMON_FLAME_ATTACK4}, // S_CYBRAKDEMON_FLAME_ATTACK3 // Fire {SPR_BRAK, 7, 1, {A_Repeat}, 30, S_CYBRAKDEMON_FLAME_ATTACK3, S_CYBRAKDEMON_FINISH_ATTACK1}, // S_CYBRAKDEMON_FLAME_ATTACK4 // Loop {SPR_BRAK, 0, 6, {A_RandomState}, S_CYBRAKDEMON_VILE_ATTACK1, S_CYBRAKDEMON_NAPALM_ATTACK1, S_CYBRAKDEMON_MISSILE_ATTACK1}, // S_CYBRAKDEMON_CHOOSE_ATTACK2 - {SPR_BRAK, 20, 0, {A_LinedefExecuteFromArg}, 4, 0, S_CYBRAKDEMON_VILE_ATTACK2}, // S_CYBRAKDEMON_VILE_ATTACK1 + {SPR_BRAK, 20, 0, {A_LinedefExecuteFromArg}, 5, 0, S_CYBRAKDEMON_VILE_ATTACK2}, // S_CYBRAKDEMON_VILE_ATTACK1 {SPR_BRAK, 20, 24, {A_VileTarget}, MT_CYBRAKDEMON_TARGET_RETICULE, 1, S_CYBRAKDEMON_VILE_ATTACK3}, // S_CYBRAKDEMON_VILE_ATTACK2 {SPR_BRAK, 19, 8, {A_FaceTarget}, 0, 0, S_CYBRAKDEMON_VILE_ATTACK4}, // S_CYBRAKDEMON_VILE_ATTACK3 {SPR_BRAK, 18, 8, {A_FaceTarget}, 0, 0, S_CYBRAKDEMON_VILE_ATTACK5}, // S_CYBRAKDEMON_VILE_ATTACK4 @@ -1631,7 +1631,7 @@ state_t states[NUMSTATES] = {SPR_BRAK, 0, 0, {A_SetReactionTime}, 0, 0, S_CYBRAKDEMON_WALK1}, // S_CYBRAKDEMON_FINISH_ATTACK2 // If just attacked, remove MF2_FRET w/out going back to spawnstate {SPR_BRAK, 18, 24, {A_Pain}, 0, 0, S_CYBRAKDEMON_PAIN2}, // S_CYBRAKDEMON_PAIN1 {SPR_BRAK, 18, 0, {A_CheckHealth}, 3, S_CYBRAKDEMON_PAIN3, S_CYBRAKDEMON_CHOOSE_ATTACK1}, // S_CYBRAKDEMON_PAIN2 - {SPR_BRAK, 18, 0, {A_LinedefExecuteFromArg}, 3, 0, S_CYBRAKDEMON_CHOOSE_ATTACK1}, // S_CYBRAKDEMON_PAIN3 + {SPR_BRAK, 18, 0, {A_LinedefExecuteFromArg}, 4, 0, S_CYBRAKDEMON_CHOOSE_ATTACK1}, // S_CYBRAKDEMON_PAIN3 {SPR_BRAK, 18, 1, {A_Repeat}, 1, S_CYBRAKDEMON_DIE1, S_CYBRAKDEMON_DIE2}, // S_CYBRAKDEMON_DIE1 {SPR_BRAK, 18, 2, {A_BossScream}, 2, 0, S_CYBRAKDEMON_DIE3}, // S_CYBRAKDEMON_DIE2 {SPR_BRAK, 18, 0, {A_Repeat}, 52, S_CYBRAKDEMON_DIE2, S_CYBRAKDEMON_DIE4}, // S_CYBRAKDEMON_DIE3 diff --git a/src/p_enemy.c b/src/p_enemy.c index bbbb9495f..f7e8e6565 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3912,7 +3912,7 @@ static void P_DoBossVictory(mobj_t *mo) // victory! if (mo->spawnpoint) - P_LinedefExecute(mo->spawnpoint->args[1], mo, NULL); + P_LinedefExecute(mo->spawnpoint->args[3], mo, NULL); if (stoppedclock && modeattacking) // if you're just time attacking, skip making the capsule appear since you don't need to step on it anyways. return; @@ -4025,7 +4025,7 @@ static void P_DoCybrakdemonDeath(mobj_t *mo) mo->z += P_MobjFlip(mo); P_SetObjectMomZ(mo, 12*FRACUNIT, false); S_StartSound(mo, sfx_bgxpld); - if (mo->spawnpoint && !(mo->spawnpoint->options & MTF_EXTRA)) + if (mo->spawnpoint && !(mo->spawnpoint->args[6] & TMB_NODEATHFLING)) P_InstaThrust(mo, R_PointToAngle2(0, 0, mo->x, mo->y), 14*FRACUNIT); } @@ -4128,7 +4128,7 @@ void A_BossDeath(mobj_t *mo) return; if (mo->spawnpoint) - P_LinedefExecute(mo->spawnpoint->args[1], mo, NULL); + P_LinedefExecute(mo->spawnpoint->args[2], mo, NULL); mo->health = 0; // Boss is dead (but not necessarily fleeing...) @@ -7072,7 +7072,7 @@ void A_Boss1Chase(mobj_t *actor) else { if (actor->spawnpoint) - P_LinedefExecute(actor->spawnpoint->args[3], actor, NULL); + P_LinedefExecute(actor->spawnpoint->args[4], actor, NULL); P_SetMobjState(actor, actor->info->raisestate); } @@ -7196,7 +7196,7 @@ void A_Boss2Chase(mobj_t *actor) } else { - // Only speed up if you have the 'Deaf' flag. + // Only speed up if you have the ambush flag. if (actor->flags2 & MF2_AMBUSH) speedvar = actor->health; else diff --git a/src/p_mobj.c b/src/p_mobj.c index 09c518fe7..3de85fa2b 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -4348,7 +4348,7 @@ static void P_Boss2Thinker(mobj_t *mobj) mobj->flags &= ~MF_NOGRAVITY; A_Boss2Pogo(mobj); if (mobj->spawnpoint) - P_LinedefExecute(mobj->spawnpoint->args[3], mobj, NULL); + P_LinedefExecute(mobj->spawnpoint->args[4], mobj, NULL); } } @@ -4645,7 +4645,7 @@ static boolean P_Boss4MoveCage(mobj_t *mobj, fixed_t delta) if (!mobj->spawnpoint) return false; - TAG_ITER_SECTORS(mobj->spawnpoint->args[3], snum) + TAG_ITER_SECTORS(mobj->spawnpoint->args[4], snum) { sector = §ors[snum]; sector->floorheight += delta; @@ -4732,7 +4732,7 @@ static void P_Boss4DestroyCage(mobj_t *mobj) if (!mobj->spawnpoint) return; - TAG_ITER_SECTORS(mobj->spawnpoint->args[3], snum) + TAG_ITER_SECTORS(mobj->spawnpoint->args[4], snum) { sector = §ors[snum]; @@ -5006,14 +5006,14 @@ static void P_Boss4Thinker(mobj_t *mobj) P_Boss4DestroyCage(mobj); mobj->movedir = 3; if (mobj->spawnpoint) - P_LinedefExecute(mobj->spawnpoint->args[3], mobj, NULL); + P_LinedefExecute(mobj->spawnpoint->args[4], mobj, NULL); P_Boss4MoveSpikeballs(mobj, FixedAngle(mobj->movecount), 0); var1 = 3; A_BossJetFume(mobj); return; } if (mobj->spawnpoint) - P_LinedefExecute(mobj->spawnpoint->args[4] - (mobj->info->spawnhealth-mobj->health), mobj, NULL); + P_LinedefExecute(mobj->spawnpoint->args[5] - (mobj->info->spawnhealth-mobj->health), mobj, NULL); // 1 -> 1.5 second timer mobj->threshold = TICRATE+(TICRATE*(mobj->info->spawnhealth-mobj->health)/10); if (mobj->threshold < 1) @@ -5046,7 +5046,7 @@ static void P_Boss4Thinker(mobj_t *mobj) P_Boss4DestroyCage(mobj); mobj->movedir = 3; if (mobj->spawnpoint) - P_LinedefExecute(mobj->spawnpoint->args[3], mobj, NULL); + P_LinedefExecute(mobj->spawnpoint->args[4], mobj, NULL); var1 = 3; A_BossJetFume(mobj); return; @@ -5187,7 +5187,7 @@ static void P_Boss7Thinker(mobj_t *mobj) mobj->flags2 |= MF2_FRET; P_SetMobjState(mobj, mobj->info->raisestate); if (mobj->spawnpoint) - P_LinedefExecute(mobj->spawnpoint->args[3], mobj, NULL); + P_LinedefExecute(mobj->spawnpoint->args[4], mobj, NULL); } } else if (mobj->state == &states[S_BLACKEGG_HITFACE4] && mobj->tics == mobj->state->tics) @@ -6037,7 +6037,7 @@ static void P_Boss9Thinker(mobj_t *mobj) else mobj->watertop = mobj->target->floorz + 16*FRACUNIT; if (mobj->spawnpoint) - P_LinedefExecute(mobj->spawnpoint->args[3], mobj, NULL); + P_LinedefExecute(mobj->spawnpoint->args[4], mobj, NULL); #if 0 whoosh = P_SpawnMobjFromMobj(mobj, 0, 0, 0, MT_GHOST); // done here so the offset is correct @@ -11909,7 +11909,7 @@ static boolean P_AllowMobjSpawn(mapthing_t* mthing, mobjtype_t i) runemeraldmanager = true; break; case MT_ROSY: - if (!(G_CoopGametype() || (mthing->options & MTF_EXTRA))) + if (!(G_CoopGametype() || mthing->args[0])) return false; // she doesn't hang out here if (!(netgame || multiplayer) && players[consoleplayer].skin == 3) @@ -12722,6 +12722,10 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean mobj->colorized = true; } break; + case MT_EGGMOBILE2: + if (mthing->args[5]) + mobj->flags2 |= MF2_AMBUSH; + break; case MT_EGGMOBILE3: mobj->cusval = mthing->args[0]; break; @@ -12748,11 +12752,27 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean else mobj->health = FixedMul(mobj->subsector->sector->ceilingheight - mobj->subsector->sector->floorheight, 3*(FRACUNIT/4)) >> FRACBITS; break; - case MT_METALSONIC_RACE: - case MT_METALSONIC_BATTLE: case MT_FANG: + if (mthing->args[5] & TMF_GRAYSCALE) + { + mobj->color = SKINCOLOR_SILVER; + mobj->colorized = true; + mobj->flags2 |= MF2_SLIDEPUSH; + } + if (mthing->args[5] & TMF_SKIPINTRO) + mobj->flags2 |= MF2_AMBUSH; + break; + case MT_METALSONIC_BATTLE: + if (mthing->args[5]) + { + mobj->color = SKINCOLOR_SILVER; + mobj->colorized = true; + mobj->flags2 |= MF2_SLIDEPUSH; + } + break; + case MT_METALSONIC_RACE: case MT_ROSY: - if (mthing->options & MTF_EXTRA) + if (mthing->args[0]) { mobj->color = SKINCOLOR_SILVER; mobj->colorized = true; @@ -12810,6 +12830,8 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean mobj->movecount = mthing->args[0]; mobj->threshold = mthing->args[1]; mobj->movedir = mthing->args[2]; + if (mthing->args[3]) + mobj->flags2 |= MF2_AMBUSH; break; case MT_MACEPOINT: case MT_CHAINMACEPOINT: @@ -12971,7 +12993,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean mobj->health = 1 << (tokenbits - 1); break; case MT_CYBRAKDEMON: - if (mthing->options & MTF_AMBUSH) + if (mthing->args[6] & TMB_BARRIER) { mobj_t* elecmobj; elecmobj = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_CYBRAKDEMON_ELECTRIC_BARRIER); @@ -13117,7 +13139,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean if (mobj->flags & MF_BOSS) { - if (mthing->options & MTF_OBJECTSPECIAL) // No egg trap for this boss + if (mthing->args[1]) // No egg trap for this boss mobj->flags2 |= MF2_BOSSNOTRAP; } if (mobj->flags & MF_NIGHTSITEM) @@ -13174,39 +13196,6 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean return true; } -static void P_SetAmbush(mobj_t *mobj) -{ - if (mobj->type != MT_AXIS && - mobj->type != MT_AXISTRANSFER && - mobj->type != MT_AXISTRANSFERLINE && - mobj->type != MT_NIGHTSBUMPER && - mobj->type != MT_NIGHTSDRONE && - mobj->type != MT_BALLOON && - mobj->type != MT_BIGTUMBLEWEED && - mobj->type != MT_LITTLETUMBLEWEED && - mobj->type != MT_BUBBLES && - mobj->type != MT_FAN && - mobj->type != MT_ROBOHOOD && - mobj->type != MT_CRUSHSTACEAN && - mobj->type != MT_BANPYURA && - mobj->type != MT_GOLDBUZZ && - mobj->type != MT_REDBUZZ && - mobj->type != MT_JETTBOMBER && - mobj->type != MT_JETTGUNNER && - mobj->type != MT_BUMBLEBORE && - mobj->type != MT_CACOLANTERN && - mobj->type != MT_PIAN && - mobj->type != MT_EGGGUARD && - mobj->type != MT_STEAM && - mobj->type != MT_SALOONDOORCENTER && - mobj->type != MT_MINECARTSWITCHPOINT && - mobj->type != MT_ROLLOUTSPAWN && - mobj->type != MT_STARPOST && - !((mobj->flags & MF_SPRING) && mobj->info->painchance == 3) && - !((mobj->flags & MF_MONITOR) && mobj->info->speed != 0)) - mobj->flags2 |= MF2_AMBUSH; -} - static mobj_t *P_SpawnMobjFromMapThing(mapthing_t *mthing, fixed_t x, fixed_t y, fixed_t z, mobjtype_t i) { mobj_t *mobj = NULL; @@ -13229,13 +13218,6 @@ static mobj_t *P_SpawnMobjFromMapThing(mapthing_t *mthing, fixed_t x, fixed_t y, mthing->mobj = mobj; - // ignore MTF_ flags and return early - if (i == MT_NIGHTSBUMPER) - return mobj; - - if (mthing->options & MTF_AMBUSH) - P_SetAmbush(mobj); - // Generic reverse gravity for individual objects flag. if (mthing->options & MTF_OBJECTFLIP) { diff --git a/src/p_setup.c b/src/p_setup.c index 0f9234767..1a063bc2c 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1791,14 +1791,8 @@ static void ParseTextmapThingParameter(UINT32 i, char *param, char *val) else if (fastcmp(param, "scale") || fastcmp(param, "scalex") || fastcmp(param, "scaley")) mapthings[i].scale = FLOAT_TO_FIXED(atof(val)); // Flags - else if (fastcmp(param, "extra") && fastcmp("true", val)) - mapthings[i].options |= MTF_EXTRA; else if (fastcmp(param, "flip") && fastcmp("true", val)) mapthings[i].options |= MTF_OBJECTFLIP; - else if (fastcmp(param, "objectspecial") && fastcmp("true", val)) - mapthings[i].options |= MTF_OBJECTSPECIAL; - else if (fastcmp(param, "ambush") && fastcmp("true", val)) - mapthings[i].options |= MTF_AMBUSH; else if (fastncmp(param, "stringarg", 9) && strlen(param) > 9) { @@ -4892,9 +4886,10 @@ static void P_ConvertBinaryMap(void) { INT32 paramoffset = mapthings[i].extrainfo*LE_PARAMWIDTH; mapthings[i].args[0] = mapthings[i].extrainfo; - mapthings[i].args[1] = LE_BOSSDEAD + paramoffset; - mapthings[i].args[2] = LE_ALLBOSSESDEAD + paramoffset; - mapthings[i].args[3] = LE_PINCHPHASE + paramoffset; + mapthings[i].args[1] = !!(mapthings[i].options & MTF_OBJECTSPECIAL); + mapthings[i].args[2] = LE_BOSSDEAD + paramoffset; + mapthings[i].args[3] = LE_ALLBOSSESDEAD + paramoffset; + mapthings[i].args[4] = LE_PINCHPHASE + paramoffset; } if (mobjinfo[mobjtype].flags & MF_NIGHTSITEM) { @@ -4994,17 +4989,35 @@ static void P_ConvertBinaryMap(void) case 136: //Pyre Fly mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); break; + case 202: //Egg Slimer + mapthings[i].args[5] = !!(mapthings[i].options & MTF_AMBUSH); + break; case 203: //Egg Colosseum - mapthings[i].args[4] = LE_BOSS4DROP + mapthings[i].extrainfo * LE_PARAMWIDTH; + mapthings[i].args[5] = LE_BOSS4DROP + mapthings[i].extrainfo * LE_PARAMWIDTH; break; case 204: //Fang - mapthings[i].args[3] = LE_BOSS4DROP + mapthings[i].extrainfo*LE_PARAMWIDTH; + mapthings[i].args[4] = LE_BOSS4DROP + mapthings[i].extrainfo*LE_PARAMWIDTH; + if (mapthings[i].options & MTF_EXTRA) + mapthings[i].args[5] |= TMF_GRAYSCALE; + if (mapthings[i].options & MTF_AMBUSH) + mapthings[i].args[5] |= TMF_SKIPINTRO; break; case 206: //Brak Eggman (Old) - mapthings[i].args[4] = LE_BRAKPLATFORM + mapthings[i].extrainfo*LE_PARAMWIDTH; + mapthings[i].args[5] = LE_BRAKPLATFORM + mapthings[i].extrainfo*LE_PARAMWIDTH; + break; + case 207: //Metal Sonic (Race) + case 2104: //Amy Cameo + mapthings[i].args[0] = !!(mapthings[i].options & MTF_EXTRA); + break; + case 208: //Metal Sonic (Battle) + mapthings[i].args[5] = !!(mapthings[i].options & MTF_EXTRA); break; case 209: //Brak Eggman - mapthings[i].args[4] = LE_BRAKVILEATACK + mapthings[i].extrainfo*LE_PARAMWIDTH; + mapthings[i].args[5] = LE_BRAKVILEATACK + mapthings[i].extrainfo*LE_PARAMWIDTH; + if (mapthings[i].options & MTF_EXTRA) + mapthings[i].args[6] |= TMB_NODEATHFLING; + if (mapthings[i].options & MTF_AMBUSH) + mapthings[i].args[6] |= TMB_BARRIER; break; case 292: //Boss waypoint mapthings[i].args[0] = mapthings[i].angle; @@ -5336,6 +5349,7 @@ static void P_ConvertBinaryMap(void) mapthings[i].args[0] = (mapthings[i].angle >> 13)*TICRATE/2; mapthings[i].args[1] = ((mapthings[i].angle >> 10) & 7)*TICRATE/2; mapthings[i].args[2] = 80 - 5*mapthings[i].extrainfo; + mapthings[i].args[3] = !!(mapthings[i].options & MTF_AMBUSH); break; case 1304: //Lavafall mapthings[i].args[0] = mapthings[i].angle; diff --git a/src/p_spec.h b/src/p_spec.h index 994db8cf4..f77af5a0d 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -110,6 +110,18 @@ typedef enum TMMR_STRONG = 2, } textmapmonitorrespawn_t; +typedef enum +{ + TMF_GRAYSCALE = 1, + TMF_SKIPINTRO = 1<<1, +} textmapfangflags_t; + +typedef enum +{ + TMB_NODEATHFLING = 1, + TMB_BARRIER = 1<<1, +} textmapbrakflags_t; + //FOF flags typedef enum { From 2a868ca60d68f0c2385851ec597bbb00e9b4bcdf Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 28 Dec 2021 23:06:48 +0100 Subject: [PATCH 239/377] Adapt Glaregoyles to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 16 ++++++++++++++++ src/p_mobj.c | 3 +-- src/p_setup.c | 7 +++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 328cf7673..9d557060e 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -7030,6 +7030,10 @@ udmf type = 11; enum = "pushablebehavior"; } + arg1 + { + title = "Starting delay"; + } } 1501 { @@ -7045,6 +7049,10 @@ udmf type = 11; enum = "pushablebehavior"; } + arg1 + { + title = "Starting delay"; + } } 1502 { @@ -7060,6 +7068,10 @@ udmf type = 11; enum = "pushablebehavior"; } + arg1 + { + title = "Starting delay"; + } } 1503 { @@ -7075,6 +7087,10 @@ udmf type = 11; enum = "pushablebehavior"; } + arg1 + { + title = "Starting delay"; + } } 1504 { diff --git a/src/p_mobj.c b/src/p_mobj.c index 3de85fa2b..5a8645708 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12884,8 +12884,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean case MT_GLAREGOYLEUP: case MT_GLAREGOYLEDOWN: case MT_GLAREGOYLELONG: - if (mthing->angle >= 360) - mobj->tics += 7*(mthing->angle/360) + 1; // starting delay + mobj->tics += mthing->args[1]; // starting delay break; case MT_DSZSTALAGMITE: case MT_DSZ2STALAGMITE: diff --git a/src/p_setup.c b/src/p_setup.c index 1a063bc2c..e0c805a4b 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -5358,6 +5358,13 @@ static void P_ConvertBinaryMap(void) case 1305: //Rollout Rock mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); break; + case 1500: //Glaregoyle + case 1501: //Glaregoyle (Up) + case 1502: //Glaregoyle (Down) + case 1503: //Glaregoyle (Long) + if (mapthings[i].angle >= 360) + mapthings[i].args[1] = 7*(mapthings[i].angle/360) + 1; + break; case 1700: //Axis mapthings[i].args[2] = mapthings[i].angle & 16383; mapthings[i].args[3] = !!(mapthings[i].angle & 16384); From e76d33267827114f2a004f2f28880ceab07ccc19 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 28 Dec 2021 23:51:08 +0100 Subject: [PATCH 240/377] Disable the old hacky way of doing egg capsules in UDMF maps --- src/doomdef.h | 2 +- src/p_enemy.c | 13 ++++++++----- src/p_spec.c | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/doomdef.h b/src/doomdef.h index 7e7e35599..41ec9ef33 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -401,7 +401,7 @@ extern skincolor_t skincolors[MAXSKINCOLORS]; #define PUSHACCEL (2*FRACUNIT) // Acceleration for MF2_SLIDEPUSH items. -// Special linedef executor tag numbers! +// Special linedef executor tag numbers! Binary map format only (UDMF has other ways of doing these things). enum { LE_PINCHPHASE = -2, // A boss entered pinch phase (and, in most cases, is preparing their pinch phase attack!) LE_ALLBOSSESDEAD = -3, // All bosses in the map are dead (Egg capsule raise) diff --git a/src/p_enemy.c b/src/p_enemy.c index f7e8e6565..5c92bdc06 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3928,11 +3928,14 @@ static void P_DoBossVictory(mobj_t *mo) } else { - // Bring the egg trap up to the surface - // Incredibly shitty code ahead - EV_DoElevator(LE_CAPSULE0, NULL, elevateHighest); - EV_DoElevator(LE_CAPSULE1, NULL, elevateUp); - EV_DoElevator(LE_CAPSULE2, NULL, elevateHighest); + if (!udmf) + { + // Bring the egg trap up to the surface + // Incredibly shitty code ahead + EV_DoElevator(LE_CAPSULE0, NULL, elevateHighest); + EV_DoElevator(LE_CAPSULE1, NULL, elevateUp); + EV_DoElevator(LE_CAPSULE2, NULL, elevateHighest); + } if (mapheaderinfo[gamemap-1]->muspostbossname[0] && S_MusicExists(mapheaderinfo[gamemap-1]->muspostbossname, !midi_disabled, !digital_disabled)) diff --git a/src/p_spec.c b/src/p_spec.c index deb915eeb..4afc4946d 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4860,7 +4860,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers case 8: // Tells pushable things to check FOFs break; case 9: // Egg trap capsule - if (roversector) + if (!udmf && roversector) P_ProcessEggCapsule(player, sector); break; case 10: // Special Stage Time/Rings From cbf32c6615e3dbb60b71a48897b5083c2bf2859e Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 29 Dec 2021 08:12:28 +0100 Subject: [PATCH 241/377] Adapt some miscellaneous linedef types to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 51 +++++++++++++++ src/hardware/hw_main.c | 2 +- src/p_setup.c | 37 +++++++++++ src/p_spec.c | 68 +++++++------------- src/p_spec.h | 1 + src/r_main.c | 4 +- 6 files changed, 117 insertions(+), 46 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index c8b7ccf5f..b82ab30c9 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1589,6 +1589,57 @@ udmf title = "None"; prefix = "(0)"; } + + 7 + { + title = "Sector Flat Alignment"; + prefix = "(7)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Affected planes"; + type = 11; + enum = "floorceiling"; + default = 2; + } + } + + 10 + { + title = "Culling Plane"; + prefix = "(10)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Culling behavior"; + type = 11; + enum + { + 0 = "Always"; + 1 = "Only while in sector"; + } + } + } + + 40 + { + title = "Visual Portal Between Tagged Linedefs"; + prefix = "(40)"; + } + + 41 + { + title = "Horizon Effect"; + prefix = "(41)"; + } } parameters diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 83a8595d1..4b97e8779 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3576,7 +3576,7 @@ static boolean HWR_DoCulling(line_t *cullheight, line_t *viewcullheight, float v return false; cullplane = FIXED_TO_FLOAT(cullheight->frontsector->floorheight); - if (cullheight->flags & ML_NOCLIMB) // Group culling + if (cullheight->args[1]) // Group culling { if (!viewcullheight) return false; diff --git a/src/p_setup.c b/src/p_setup.c index e0c805a4b..4564ec75e 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3179,6 +3179,43 @@ static void P_ConvertBinaryMap(void) switch (lines[i].special) { + case 7: //Sector flat alignment + lines[i].args[0] = tag; + if ((lines[i].flags & (ML_NETONLY|ML_NONET)) == (ML_NETONLY|ML_NONET)) + { + CONS_Alert(CONS_WARNING, M_GetText("Flat alignment linedef (tag %d) doesn't have anything to do.\nConsider changing the linedef's flag configuration or removing it entirely.\n"), tag); + lines[i].special = 0; + } + else if (lines[i].flags & ML_NETONLY) + lines[i].args[1] = TMP_CEILING; + else if (lines[i].flags & ML_NONET) + lines[i].args[1] = TMP_FLOOR; + else + lines[i].args[1] = TMP_BOTH; + lines[i].flags &= ~(ML_NETONLY|ML_NONET); + + if (lines[i].flags & ML_EFFECT6) // Set offset through x and y texture offsets + { + angle_t flatangle = InvAngle(R_PointToAngle2(lines[i].v1->x, lines[i].v1->y, lines[i].v2->x, lines[i].v2->y)); + fixed_t xoffs = sides[lines[i].sidenum[0]].textureoffset; + fixed_t yoffs = sides[lines[i].sidenum[0]].rowoffset; + + //If no tag is given, apply to front sector + if (lines[i].args[0] == 0) + P_ApplyFlatAlignment(lines[i].frontsector, flatangle, xoffs, yoffs, lines[i].args[1] != TMP_CEILING, lines[i].args[1] != TMP_FLOOR); + else + { + INT32 s; + TAG_ITER_SECTORS(lines[i].args[0], s) + P_ApplyFlatAlignment(sectors + s, flatangle, xoffs, yoffs, lines[i].args[1] != TMP_CEILING, lines[i].args[1] != TMP_FLOOR); + } + lines[i].special = 0; + } + break; + case 10: //Culling plane + lines[i].args[0] = tag; + lines[i].args[1] = !!(lines[i].flags & ML_NOCLIMB); + break; case 20: //PolyObject first line { INT32 check = -1; diff --git a/src/p_spec.c b/src/p_spec.c index 4afc4946d..ca08ad875 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5863,16 +5863,16 @@ void P_InitSpecials(void) globalweather = mapheaderinfo[gamemap-1]->weather; } -static void P_ApplyFlatAlignment(line_t *master, sector_t *sector, angle_t flatangle, fixed_t xoffs, fixed_t yoffs) +void P_ApplyFlatAlignment(sector_t *sector, angle_t flatangle, fixed_t xoffs, fixed_t yoffs, boolean floor, boolean ceiling) { - if (!(master->flags & ML_NETONLY)) // Modify floor flat alignment unless ML_NETONLY flag is set + if (floor) { sector->floorpic_angle = flatangle; sector->floor_xoffs += xoffs; sector->floor_yoffs += yoffs; } - if (!(master->flags & ML_NONET)) // Modify ceiling flat alignment unless ML_NONET flag is set + if (ceiling) { sector->ceilingpic_angle = flatangle; sector->ceiling_xoffs += xoffs; @@ -6046,23 +6046,20 @@ void P_SpawnSpecials(boolean fromnetsave) { mtag_t tag = Tag_FGet(&lines[i].tags); - if (lines[i].special != 7) // This is a hack. I can at least hope nobody wants to prevent flat alignment in netgames... + // set line specials to 0 here too, same reason as above + if (netgame || multiplayer) { - // set line specials to 0 here too, same reason as above - if (netgame || multiplayer) - { - if (lines[i].flags & ML_NONET) - { - lines[i].special = 0; - continue; - } - } - else if (lines[i].flags & ML_NETONLY) + if (lines[i].flags & ML_NONET) { lines[i].special = 0; continue; } } + else if (lines[i].flags & ML_NETONLY) + { + lines[i].special = 0; + continue; + } switch (lines[i].special) { @@ -6102,37 +6099,22 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 7: // Flat alignment - redone by toast - if ((lines[i].flags & (ML_NETONLY|ML_NONET)) != (ML_NETONLY|ML_NONET)) // If you can do something... + { + // Set calculated offsets such that line's v1 is the apparent origin + angle_t flatangle = InvAngle(R_PointToAngle2(lines[i].v1->x, lines[i].v1->y, lines[i].v2->x, lines[i].v2->y)); + fixed_t xoffs = -lines[i].v1->x; + fixed_t yoffs = lines[i].v1->y; + + //If no tag is given, apply to front sector + if (lines[i].args[0] == 0) + P_ApplyFlatAlignment(lines[i].frontsector, flatangle, xoffs, yoffs, lines[i].args[1] != TMP_CEILING, lines[i].args[1] != TMP_FLOOR); + else { - angle_t flatangle = InvAngle(R_PointToAngle2(lines[i].v1->x, lines[i].v1->y, lines[i].v2->x, lines[i].v2->y)); - fixed_t xoffs; - fixed_t yoffs; - - if (lines[i].flags & ML_EFFECT6) // Set offset through x and y texture offsets if ML_EFFECT6 flag is set - { - xoffs = sides[lines[i].sidenum[0]].textureoffset; - yoffs = sides[lines[i].sidenum[0]].rowoffset; - } - else // Otherwise, set calculated offsets such that line's v1 is the apparent origin - { - xoffs = -lines[i].v1->x; - yoffs = lines[i].v1->y; - } - - //If no tag is given, apply to front sector - if (tag == 0) - P_ApplyFlatAlignment(lines + i, lines[i].frontsector, flatangle, xoffs, yoffs); - else - { - TAG_ITER_SECTORS(tag, s) - P_ApplyFlatAlignment(lines + i, sectors + s, flatangle, xoffs, yoffs); - } + TAG_ITER_SECTORS(lines[i].args[0], s) + P_ApplyFlatAlignment(sectors + s, flatangle, xoffs, yoffs, lines[i].args[1] != TMP_CEILING, lines[i].args[1] != TMP_FLOOR); } - else // Otherwise, print a helpful warning. Can I do no less? - CONS_Alert(CONS_WARNING, - M_GetText("Flat alignment linedef (tag %d) doesn't have anything to do.\nConsider changing the linedef's flag configuration or removing it entirely.\n"), - tag); break; + } case 8: // Sector Parameters TAG_ITER_SECTORS(tag, s) @@ -6162,7 +6144,7 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 10: // Vertical culling plane for sprites and FOFs - TAG_ITER_SECTORS(tag, s) + TAG_ITER_SECTORS(lines[i].args[0], s) sectors[s].cullheight = &lines[i]; // This allows it to change in realtime! break; diff --git a/src/p_spec.h b/src/p_spec.h index f77af5a0d..6b98ca0e3 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -454,6 +454,7 @@ void P_SetupLevelFlatAnims(void); // at map load void P_InitSpecials(void); +void P_ApplyFlatAlignment(sector_t* sector, angle_t flatangle, fixed_t xoffs, fixed_t yoffs, boolean floor, boolean ceiling); void P_SpawnSpecials(boolean fromnetsave); // every tic diff --git a/src/r_main.c b/src/r_main.c index 8729b5dcb..b1d27fdff 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -445,7 +445,7 @@ fixed_t R_ScaleFromGlobalAngle(angle_t visangle) // R_DoCulling // Checks viewz and top/bottom heights of an item against culling planes // Returns true if the item is to be culled, i.e it shouldn't be drawn! -// if ML_NOCLIMB is set, the camera view is required to be in the same area for culling to occur +// if args[1] is set, the camera view is required to be in the same area for culling to occur boolean R_DoCulling(line_t *cullheight, line_t *viewcullheight, fixed_t vz, fixed_t bottomh, fixed_t toph) { fixed_t cullplane; @@ -454,7 +454,7 @@ boolean R_DoCulling(line_t *cullheight, line_t *viewcullheight, fixed_t vz, fixe return false; cullplane = cullheight->frontsector->floorheight; - if (cullheight->flags & ML_NOCLIMB) // Group culling + if (cullheight->args[1]) // Group culling { if (!viewcullheight) return false; From 1aa9ba1447a970638c99be8e62767f993c1fdf4e Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 29 Dec 2021 08:31:47 +0100 Subject: [PATCH 242/377] Delete removed mobj types from deh_tables.c --- src/deh_tables.c | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index f4074cf08..f73f10151 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4113,17 +4113,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_FINISHFLAG", // Finish flag // Ambient Sounds - "MT_AWATERA", // Ambient Water Sound 1 - "MT_AWATERB", // Ambient Water Sound 2 - "MT_AWATERC", // Ambient Water Sound 3 - "MT_AWATERD", // Ambient Water Sound 4 - "MT_AWATERE", // Ambient Water Sound 5 - "MT_AWATERF", // Ambient Water Sound 6 - "MT_AWATERG", // Ambient Water Sound 7 - "MT_AWATERH", // Ambient Water Sound 8 - "MT_RANDOMAMBIENT", - "MT_RANDOMAMBIENT2", - "MT_MACHINEAMBIENCE", + "MT_AMBIENT", "MT_CORK", "MT_LHRT", @@ -4227,7 +4217,6 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_CRUMBLEOBJ", // Sound generator for crumbling platform "MT_TUBEWAYPOINT", "MT_PUSH", - "MT_PULL", "MT_GHOST", "MT_OVERLAY", "MT_ANGLEMAN", From c76d0e33268b059295d5ce3bee1df0dc8077a187 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 29 Dec 2021 10:42:20 +0100 Subject: [PATCH 243/377] Implement linedef executor for changing linedef args --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 25 ++++++++++++++++++++ src/p_spec.c | 23 ++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index b82ab30c9..b36ca21f9 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -4584,6 +4584,31 @@ udmf enum = "setadd"; } } + + 468 + { + title = "Change Linedef Argument"; + prefix = "(468)"; + arg0 + { + title = "Linedef tag"; + type = 15; + } + arg1 + { + title = "Argument"; + } + arg2 + { + title = "Value"; + } + arg3 + { + title = "Set/Add?"; + type = 11; + enum = "setadd"; + } + } } linedefexecpoly diff --git a/src/p_spec.c b/src/p_spec.c index ca08ad875..5b2532f93 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3778,6 +3778,29 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) } break; + case 468: // Change linedef executor argument + { + INT32 linenum; + + if (!udmf) + break; + + if (line->args[1] < 0 || line->args[1] >= NUMLINEARGS) + { + CONS_Debug(DBG_GAMELOGIC, "Linedef type 468: Invalid linedef arg %d\n", line->args[1]); + break; + } + + TAG_ITER_LINES(line->args[0], linenum) + { + if (line->args[3]) + lines[linenum].args[line->args[1]] += line->args[2]; + else + lines[linenum].args[line->args[1]] = line->args[2]; + } + } + break; + case 480: // Polyobj_DoorSlide case 481: // Polyobj_DoorSwing PolyDoor(line); From 234e8f5f8f1ab0e256b8071f5bda0881aac464c9 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 29 Dec 2021 10:55:39 +0100 Subject: [PATCH 244/377] Disable camera scanner effect in UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 2 +- src/p_spec.c | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index b36ca21f9..5abb11ae9 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -16,7 +16,7 @@ doom } 5 { - title = "Camera Scanner"; + title = "Camera Scanner "; prefix = "(5)"; } 7 diff --git a/src/p_spec.c b/src/p_spec.c index 5b2532f93..0dd38b7bc 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6116,6 +6116,9 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 5: // Change camera info + if (udmf) + break; + sec = sides[*lines[i].sidenum].sector - sectors; TAG_ITER_SECTORS(tag, s) P_AddCameraScanner(§ors[sec], §ors[s], R_PointToAngle2(lines[i].v2->x, lines[i].v2->y, lines[i].v1->x, lines[i].v1->y)); From 3bac97ee65009f27e3b970e724c854c0e9e4446c Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 29 Dec 2021 10:59:26 +0100 Subject: [PATCH 245/377] Clean up P_SpawnSpecials a bit --- src/p_spec.c | 95 ---------------------------------------------------- 1 file changed, 95 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 4afc4946d..5108b4d73 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6086,15 +6086,6 @@ void P_SpawnSpecials(boolean fromnetsave) } break; - case 2: // Custom exit - break; - - case 3: // Zoom Tube Parameters - break; - - case 4: // Speed pad (combines with sector special Section3:5 or Section3:6) - break; - case 5: // Change camera info sec = sides[*lines[i].sidenum].sector - sectors; TAG_ITER_SECTORS(tag, s) @@ -6158,9 +6149,6 @@ void P_SpawnSpecials(boolean fromnetsave) } break; - case 9: // Chain Parameters - break; - case 10: // Vertical culling plane for sprites and FOFs TAG_ITER_SECTORS(tag, s) sectors[s].cullheight = &lines[i]; // This allows it to change in realtime! @@ -6734,8 +6722,6 @@ void P_SpawnSpecials(boolean fromnetsave) P_AddEachTimeThinker(&lines[i], lines[i].args[0] == TMT_EACHTIMEENTERANDEXIT); break; - break; - case 308: // Race-only linedef executor. Triggers once. if (!P_CheckGametypeRules(lines[i].args[2], (UINT32)lines[i].args[1])) { @@ -6769,51 +6755,6 @@ void P_SpawnSpecials(boolean fromnetsave) P_AddEachTimeThinker(&lines[i], lines[i].args[0] == TMXT_EACHTIMEENTERANDEXIT); break; - // NiGHTS trigger executors - case 323: - case 325: - case 327: - case 329: - break; - - case 399: // Linedef execute on map load - // This is handled in P_RunLevelLoadExecutors. - break; - - case 400: - case 401: - case 402: - case 403: - case 404: - case 405: - case 406: - case 407: - case 408: - case 409: - case 410: - case 411: - case 412: - case 413: - case 414: - case 415: - case 416: - case 417: - case 418: - case 419: - case 420: - case 421: - case 422: - case 423: - case 424: - case 425: - case 426: - case 427: - case 428: - case 429: - case 430: - case 431: - break; - case 449: // Enable bosses with parameter { INT32 bossid = lines[i].args[0]; @@ -6832,42 +6773,6 @@ void P_SpawnSpecials(boolean fromnetsave) break; } - // 500 is used for a scroller - // 501 is used for a scroller - // 502 is used for a scroller - // 503 is used for a scroller - // 504 is used for a scroller - // 505 is used for a scroller - // 506 is used for a scroller - // 507 is used for a scroller - // 508 is used for a scroller - // 510 is used for a scroller - // 511 is used for a scroller - // 512 is used for a scroller - // 513 is used for a scroller - // 514 is used for a scroller - // 515 is used for a scroller - // 520 is used for a scroller - // 521 is used for a scroller - // 522 is used for a scroller - // 523 is used for a scroller - // 524 is used for a scroller - // 525 is used for a scroller - // 530 is used for a scroller - // 531 is used for a scroller - // 532 is used for a scroller - // 533 is used for a scroller - // 534 is used for a scroller - // 535 is used for a scroller - // 540 is used for friction - // 541 is used for wind - // 542 is used for upwards wind - // 543 is used for downwards wind - // 544 is used for current - // 545 is used for upwards current - // 546 is used for downwards current - // 547 is used for push/pull - case 600: // Copy light level to tagged sector's planes sec = sides[*lines[i].sidenum].sector-sectors; TAG_ITER_SECTORS(lines[i].args[0], s) From 49c1645b5fef84c56cfe161a4a207292a9974642 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 29 Dec 2021 11:03:00 +0100 Subject: [PATCH 246/377] Adapt linedef type 63 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 11 +++++++++++ src/p_setup.c | 3 +++ src/p_spec.c | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 5abb11ae9..c2bcfa3b3 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1640,6 +1640,17 @@ udmf title = "Horizon Effect"; prefix = "(41)"; } + + 63 + { + title = "Fake Floor/Ceiling Planes"; + prefix = "(63)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + } } parameters diff --git a/src/p_setup.c b/src/p_setup.c index 4564ec75e..9fe4446a6 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3340,6 +3340,9 @@ static void P_ConvertBinaryMap(void) } lines[i].special = 61; break; + case 63: //Fake floor/ceiling planes + lines[i].args[0] = tag; + break; case 66: //Move floor by displacement case 67: //Move ceiling by displacement case 68: //Move floor and ceiling by displacement diff --git a/src/p_spec.c b/src/p_spec.c index 22ca43bbb..82f18b402 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6206,7 +6206,7 @@ void P_SpawnSpecials(boolean fromnetsave) case 63: // support for drawn heights coming from different sector sec = sides[*lines[i].sidenum].sector-sectors; - TAG_ITER_SECTORS(tag, s) + TAG_ITER_SECTORS(lines[i].args[0], s) sectors[s].heightsec = (INT32)sec; break; From 1e1ea22e5124d7c91d4b5390e04f79a7aab113bf Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 29 Dec 2021 13:53:38 +0100 Subject: [PATCH 247/377] Separate thinker structs for dynamic line and vertex slopes --- src/p_saveg.c | 32 ++++++++++++++++++++++++-------- src/p_slopes.c | 44 +++++++++++++++++++++----------------------- src/p_slopes.h | 20 ++++++++++---------- 3 files changed, 55 insertions(+), 41 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index 4d958f924..ffca42cd3 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2281,16 +2281,23 @@ static void SavePlaneDisplaceThinker(const thinker_t *th, const UINT8 type) WRITEUINT8(save_p, ht->type); } -static inline void SaveDynamicSlopeThinker(const thinker_t *th, const UINT8 type) +static inline void SaveDynamicLineSlopeThinker(const thinker_t *th, const UINT8 type) { - const dynplanethink_t* ht = (const void*)th; + const dynlineplanethink_t* ht = (const void*)th; WRITEUINT8(save_p, type); WRITEUINT8(save_p, ht->type); WRITEUINT32(save_p, SaveSlope(ht->slope)); WRITEUINT32(save_p, SaveLine(ht->sourceline)); WRITEFIXED(save_p, ht->extent); +} +static inline void SaveDynamicVertexSlopeThinker(const thinker_t *th, const UINT8 type) +{ + const dynvertexplanethink_t* ht = (const void*)th; + + WRITEUINT8(save_p, type); + WRITEUINT32(save_p, SaveSlope(ht->slope)); WRITEMEM(save_p, ht->tags, sizeof(ht->tags)); WRITEMEM(save_p, ht->vex, sizeof(ht->vex)); } @@ -2617,12 +2624,12 @@ static void P_NetArchiveThinkers(void) } else if (th->function.acp1 == (actionf_p1)T_DynamicSlopeLine) { - SaveDynamicSlopeThinker(th, tc_dynslopeline); + SaveDynamicLineSlopeThinker(th, tc_dynslopeline); continue; } else if (th->function.acp1 == (actionf_p1)T_DynamicSlopeVert) { - SaveDynamicSlopeThinker(th, tc_dynslopevert); + SaveDynamicVertexSlopeThinker(th, tc_dynslopevert); continue; } #ifdef PARANOIA @@ -3447,15 +3454,24 @@ static inline thinker_t* LoadPlaneDisplaceThinker(actionf_p1 thinker) return &ht->thinker; } -static inline thinker_t* LoadDynamicSlopeThinker(actionf_p1 thinker) +static inline thinker_t* LoadDynamicLineSlopeThinker(actionf_p1 thinker) { - dynplanethink_t* ht = Z_Malloc(sizeof(*ht), PU_LEVSPEC, NULL); + dynlineplanethink_t* ht = Z_Malloc(sizeof(*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; ht->type = READUINT8(save_p); ht->slope = LoadSlope(READUINT32(save_p)); ht->sourceline = LoadLine(READUINT32(save_p)); ht->extent = READFIXED(save_p); + return &ht->thinker; +} + +static inline thinker_t* LoadDynamicVertexSlopeThinker(actionf_p1 thinker) +{ + dynvertexplanethink_t* ht = Z_Malloc(sizeof(*ht), PU_LEVSPEC, NULL); + ht->thinker.function.acp1 = thinker; + + ht->slope = LoadSlope(READUINT32(save_p)); READMEM(save_p, ht->tags, sizeof(ht->tags)); READMEM(save_p, ht->vex, sizeof(ht->vex)); return &ht->thinker; @@ -3770,11 +3786,11 @@ static void P_NetUnArchiveThinkers(void) break; case tc_dynslopeline: - th = LoadDynamicSlopeThinker((actionf_p1)T_DynamicSlopeLine); + th = LoadDynamicLineSlopeThinker((actionf_p1)T_DynamicSlopeLine); break; case tc_dynslopevert: - th = LoadDynamicSlopeThinker((actionf_p1)T_DynamicSlopeVert); + th = LoadDynamicVertexSlopeThinker((actionf_p1)T_DynamicSlopeVert); break; case tc_scroll: diff --git a/src/p_slopes.c b/src/p_slopes.c index c0cc3a98e..415642abf 100644 --- a/src/p_slopes.c +++ b/src/p_slopes.c @@ -121,7 +121,7 @@ static void ReconfigureViaConstants (pslope_t *slope, const fixed_t a, const fix } /// Recalculate dynamic slopes. -void T_DynamicSlopeLine (dynplanethink_t* th) +void T_DynamicSlopeLine (dynlineplanethink_t* th) { pslope_t* slope = th->slope; line_t* srcline = th->sourceline; @@ -161,7 +161,7 @@ void T_DynamicSlopeLine (dynplanethink_t* th) } /// Mapthing-defined -void T_DynamicSlopeVert (dynplanethink_t* th) +void T_DynamicSlopeVert (dynvertexplanethink_t* th) { pslope_t* slope = th->slope; @@ -180,28 +180,26 @@ void T_DynamicSlopeVert (dynplanethink_t* th) ReconfigureViaVertexes(slope, th->vex[0], th->vex[1], th->vex[2]); } -static inline void P_AddDynSlopeThinker (pslope_t* slope, dynplanetype_t type, line_t* sourceline, fixed_t extent, const INT16 tags[3], const vector3_t vx[3]) +static inline void P_AddDynLineSlopeThinker (pslope_t* slope, dynplanetype_t type, line_t* sourceline, fixed_t extent) { - dynplanethink_t* th = Z_Calloc(sizeof (*th), PU_LEVSPEC, NULL); - switch (type) - { - case DP_VERTEX: - th->thinker.function.acp1 = (actionf_p1)T_DynamicSlopeVert; - memcpy(th->tags, tags, sizeof(th->tags)); - memcpy(th->vex, vx, sizeof(th->vex)); - break; - default: - th->thinker.function.acp1 = (actionf_p1)T_DynamicSlopeLine; - th->sourceline = sourceline; - th->extent = extent; - } - + dynlineplanethink_t* th = Z_Calloc(sizeof (*th), PU_LEVSPEC, NULL); + th->thinker.function.acp1 = (actionf_p1)T_DynamicSlopeLine; th->slope = slope; th->type = type; - + th->sourceline = sourceline; + th->extent = extent; P_AddThinker(THINK_DYNSLOPE, &th->thinker); } +static inline void P_AddDynVertexSlopeThinker (pslope_t* slope, const INT16 tags[3], const vector3_t vx[3]) +{ + dynvertexplanethink_t* th = Z_Calloc(sizeof (*th), PU_LEVSPEC, NULL); + th->thinker.function.acp1 = (actionf_p1)T_DynamicSlopeVert; + th->slope = slope; + memcpy(th->tags, tags, sizeof(th->tags)); + memcpy(th->vex, vx, sizeof(th->vex)); + P_AddThinker(THINK_DYNSLOPE, &th->thinker); +} /// Create a new slope and add it to the slope list. static inline pslope_t* Slope_Add (const UINT8 flags) @@ -358,7 +356,7 @@ static void line_SpawnViaLine(const int linenum, const boolean spawnthinker) P_CalculateSlopeNormal(fslope); if (spawnthinker && (flags & SL_DYNAMIC)) - P_AddDynSlopeThinker(fslope, DP_FRONTFLOOR, line, extent, NULL, NULL); + P_AddDynLineSlopeThinker(fslope, DP_FRONTFLOOR, line, extent); } if(frontceil) { @@ -375,7 +373,7 @@ static void line_SpawnViaLine(const int linenum, const boolean spawnthinker) P_CalculateSlopeNormal(cslope); if (spawnthinker && (flags & SL_DYNAMIC)) - P_AddDynSlopeThinker(cslope, DP_FRONTCEIL, line, extent, NULL, NULL); + P_AddDynLineSlopeThinker(cslope, DP_FRONTCEIL, line, extent); } } if(backfloor || backceil) @@ -415,7 +413,7 @@ static void line_SpawnViaLine(const int linenum, const boolean spawnthinker) P_CalculateSlopeNormal(fslope); if (spawnthinker && (flags & SL_DYNAMIC)) - P_AddDynSlopeThinker(fslope, DP_BACKFLOOR, line, extent, NULL, NULL); + P_AddDynLineSlopeThinker(fslope, DP_BACKFLOOR, line, extent); } if(backceil) { @@ -432,7 +430,7 @@ static void line_SpawnViaLine(const int linenum, const boolean spawnthinker) P_CalculateSlopeNormal(cslope); if (spawnthinker && (flags & SL_DYNAMIC)) - P_AddDynSlopeThinker(cslope, DP_BACKCEIL, line, extent, NULL, NULL); + P_AddDynLineSlopeThinker(cslope, DP_BACKCEIL, line, extent); } } } @@ -476,7 +474,7 @@ static pslope_t *MakeViaMapthings(INT16 tag1, INT16 tag2, INT16 tag3, UINT8 flag ReconfigureViaVertexes(ret, vx[0], vx[1], vx[2]); if (spawnthinker && (flags & SL_DYNAMIC)) - P_AddDynSlopeThinker(ret, DP_VERTEX, NULL, 0, tags, vx); + P_AddDynVertexSlopeThinker(ret, tags, vx); return ret; } diff --git a/src/p_slopes.h b/src/p_slopes.h index 43cd3edb0..45588d463 100644 --- a/src/p_slopes.h +++ b/src/p_slopes.h @@ -95,26 +95,26 @@ typedef enum { DP_FRONTCEIL, DP_BACKFLOOR, DP_BACKCEIL, - DP_VERTEX } dynplanetype_t; /// Permit slopes to be dynamically altered through a thinker. typedef struct { thinker_t thinker; - - pslope_t* slope; + pslope_t *slope; dynplanetype_t type; - - // Used by line slopes. - line_t* sourceline; + line_t *sourceline; fixed_t extent; +} dynlineplanethink_t; - // Used by mapthing vertex slopes. +typedef struct +{ + thinker_t thinker; + pslope_t *slope; INT16 tags[3]; vector3_t vex[3]; -} dynplanethink_t; +} dynvertexplanethink_t; -void T_DynamicSlopeLine (dynplanethink_t* th); -void T_DynamicSlopeVert (dynplanethink_t* th); +void T_DynamicSlopeLine (dynlineplanethink_t* th); +void T_DynamicSlopeVert (dynvertexplanethink_t* th); #endif // #ifndef P_SLOPES_H__ From 228efa5ffc77a8fcefc0bdb28fe9d0a1aec0e72a Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 29 Dec 2021 15:29:59 +0100 Subject: [PATCH 248/377] Add "relative" setting to linedef type 799 and adapt it to UDMF --- extras/conf/SRB2-22.cfg | 1 + extras/conf/udb/Includes/SRB222_linedefs.cfg | 16 +++++++++ src/p_saveg.c | 16 +++++++-- src/p_setup.c | 4 ++- src/p_slopes.c | 35 +++++++++++++------- src/p_slopes.h | 5 ++- 6 files changed, 60 insertions(+), 17 deletions(-) diff --git a/extras/conf/SRB2-22.cfg b/extras/conf/SRB2-22.cfg index 9aeada89b..ec568e865 100644 --- a/extras/conf/SRB2-22.cfg +++ b/extras/conf/SRB2-22.cfg @@ -3253,6 +3253,7 @@ linedeftypes { title = "Set Tagged Dynamic Slope Vertex to Front Sector Height"; prefix = "(799)"; + flags64text = "[6] Use relative heights"; } } diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index c2bcfa3b3..169709de4 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -5233,5 +5233,21 @@ udmf } } } + + 799 + { + title = "Set Tagged Dynamic Slope Vertex to Front Sector Height"; + prefix = "(799)"; + arg0 + { + title = "Apply height"; + type = 11; + enum + { + 0 = "Absolute"; + 1 = "Relative"; + } + } + } } } diff --git a/src/p_saveg.c b/src/p_saveg.c index ffca42cd3..5e204f9bc 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2294,12 +2294,17 @@ static inline void SaveDynamicLineSlopeThinker(const thinker_t *th, const UINT8 static inline void SaveDynamicVertexSlopeThinker(const thinker_t *th, const UINT8 type) { + size_t i; const dynvertexplanethink_t* ht = (const void*)th; WRITEUINT8(save_p, type); WRITEUINT32(save_p, SaveSlope(ht->slope)); - WRITEMEM(save_p, ht->tags, sizeof(ht->tags)); - WRITEMEM(save_p, ht->vex, sizeof(ht->vex)); + for (i = 0; i < 3; i++) + WRITEUINT32(save_p, SaveSector(ht->secs[i])); + WRITEMEM(save_p, ht->vex, sizeof(ht->vex)); + WRITEMEM(save_p, ht->origsecheights, sizeof(ht->origsecheights)); + WRITEMEM(save_p, ht->origvecheights, sizeof(ht->origvecheights)); + WRITEUINT8(save_p, ht->relative); } static inline void SavePolyrotatetThinker(const thinker_t *th, const UINT8 type) @@ -3468,12 +3473,17 @@ static inline thinker_t* LoadDynamicLineSlopeThinker(actionf_p1 thinker) static inline thinker_t* LoadDynamicVertexSlopeThinker(actionf_p1 thinker) { + size_t i; dynvertexplanethink_t* ht = Z_Malloc(sizeof(*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; ht->slope = LoadSlope(READUINT32(save_p)); - READMEM(save_p, ht->tags, sizeof(ht->tags)); + for (i = 0; i < 3; i++) + ht->secs[i] = LoadSector(READUINT32(save_p)); READMEM(save_p, ht->vex, sizeof(ht->vex)); + READMEM(save_p, ht->origsecheights, sizeof(ht->origsecheights)); + READMEM(save_p, ht->origvecheights, sizeof(ht->origvecheights)); + ht->relative = READUINT8(save_p); return &ht->thinker; } diff --git a/src/p_setup.c b/src/p_setup.c index 9fe4446a6..2f815a228 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4885,7 +4885,9 @@ static void P_ConvertBinaryMap(void) lines[i].args[4] |= TMSC_BACKTOFRONTCEILING; lines[i].special = 720; break; - + case 799: //Set dynamic slope vertex to front sector height + lines[i].args[0] = !!(lines[i].flags & ML_NOCLIMB); + break; case 900: //Translucent wall (10%) case 901: //Translucent wall (20%) case 902: //Translucent wall (30%) diff --git a/src/p_slopes.c b/src/p_slopes.c index 415642abf..b9154b890 100644 --- a/src/p_slopes.c +++ b/src/p_slopes.c @@ -163,21 +163,17 @@ void T_DynamicSlopeLine (dynlineplanethink_t* th) /// Mapthing-defined void T_DynamicSlopeVert (dynvertexplanethink_t* th) { - pslope_t* slope = th->slope; - size_t i; - INT32 l; - for (i = 0; i < 3; i++) { - l = Tag_FindLineSpecial(799, th->tags[i]); - if (l != -1) { - th->vex[i].z = lines[l].frontsector->floorheight; - } + for (i = 0; i < 3; i++) + { + if (th->relative & (1 << i)) + th->vex[i].z = th->origvecheights[i] + (th->secs[i]->floorheight - th->origsecheights[i]); else - th->vex[i].z = 0; + th->vex[i].z = th->secs[i]->floorheight; } - ReconfigureViaVertexes(slope, th->vex[0], th->vex[1], th->vex[2]); + ReconfigureViaVertexes(th->slope, th->vex[0], th->vex[1], th->vex[2]); } static inline void P_AddDynLineSlopeThinker (pslope_t* slope, dynplanetype_t type, line_t* sourceline, fixed_t extent) @@ -194,10 +190,25 @@ static inline void P_AddDynLineSlopeThinker (pslope_t* slope, dynplanetype_t typ static inline void P_AddDynVertexSlopeThinker (pslope_t* slope, const INT16 tags[3], const vector3_t vx[3]) { dynvertexplanethink_t* th = Z_Calloc(sizeof (*th), PU_LEVSPEC, NULL); + size_t i; + INT32 l; th->thinker.function.acp1 = (actionf_p1)T_DynamicSlopeVert; th->slope = slope; - memcpy(th->tags, tags, sizeof(th->tags)); - memcpy(th->vex, vx, sizeof(th->vex)); + + for (i = 0; i < 3; i++) { + l = Tag_FindLineSpecial(799, tags[i]); + if (l == -1) + { + Z_Free(th); + return; + } + th->secs[i] = lines[l].frontsector; + th->vex[i] = vx[i]; + th->origsecheights[i] = lines[l].frontsector->floorheight; + th->origvecheights[i] = vx[i].z; + if (lines[l].args[0]) + th->relative |= 1<thinker); } diff --git a/src/p_slopes.h b/src/p_slopes.h index 45588d463..0b3e0b517 100644 --- a/src/p_slopes.h +++ b/src/p_slopes.h @@ -111,8 +111,11 @@ typedef struct { thinker_t thinker; pslope_t *slope; - INT16 tags[3]; + sector_t *secs[3]; vector3_t vex[3]; + fixed_t origsecheights[3]; + fixed_t origvecheights[3]; + UINT8 relative; } dynvertexplanethink_t; void T_DynamicSlopeLine (dynlineplanethink_t* th); From 338f1357a61786e42de31849d7f7fc8ce45e84cb Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 29 Dec 2021 15:53:20 +0100 Subject: [PATCH 249/377] Particle generator: Use args[6] instead of angle for tagging --- extras/conf/udb/Includes/SRB222_things.cfg | 5 +++++ src/p_mobj.c | 4 ++-- src/p_setup.c | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 9d557060e..0cb0287c5 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -5465,6 +5465,11 @@ udmf { title = "Rising distance"; } + arg6 + { + title = "Heights control linedef"; + type = 15; + } } 758 { diff --git a/src/p_mobj.c b/src/p_mobj.c index 7b6f14fa4..46510200e 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12430,8 +12430,8 @@ static boolean P_SetupParticleGen(mapthing_t *mthing, mobj_t *mobj) INT32 line; const size_t mthingi = (size_t)(mthing - mapthings); - // Find the corresponding linedef special, using angle as tag - line = Tag_FindLineSpecial(15, mthing->angle); + // Find the corresponding linedef special, using args[6] as tag + line = mthing->args[6] ? Tag_FindLineSpecial(15, mthing->args[6]) : -1; type = mthing->stringargs[0] ? get_number(mthing->stringargs[0]) : MT_PARTICLE; diff --git a/src/p_setup.c b/src/p_setup.c index e0c805a4b..77d009194 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -5206,6 +5206,7 @@ static void P_ConvertBinaryMap(void) mapthings[i].args[2] = sides[lines[j].sidenum[0]].textureoffset >> FRACBITS; mapthings[i].args[3] = sides[lines[j].sidenum[0]].rowoffset >> FRACBITS; mapthings[i].args[4] = lines[j].backsector ? sides[lines[j].sidenum[1]].textureoffset >> FRACBITS : 0; + mapthings[i].args[6] = mapthings[i].angle; if (sides[lines[j].sidenum[0]].toptexture) P_WriteConstant(sides[lines[j].sidenum[0]].toptexture, &mapthings[i].stringargs[0]); break; From 0b3180cdfa4bddc6a87343e22049ed897a56f324 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 29 Dec 2021 21:03:47 +0100 Subject: [PATCH 250/377] Adapt linedef type 64 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 34 +++++++++++++++++++ src/p_setup.c | 8 +++++ src/p_spec.c | 35 +++++++++++++------- 3 files changed, 65 insertions(+), 12 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 169709de4..684ed5ac8 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1662,6 +1662,40 @@ udmf title = "Fan Particle Generator Heights"; prefix = "(15)"; } + + 64 + { + title = "Continuously Appearing/Disappearing FOF"; + prefix = "(64)"; + arg0 + { + title = "Control linedef tag"; + type = 15; + } + arg1 + { + title = "Control sector tag"; + type = 13; + } + arg2 + { + title = "On time"; + } + arg3 + { + title = "Off time"; + } + arg4 + { + title = "Initial delay"; + } + arg5 + { + title = "Play sound?"; + type = 11; + enum = "yesno"; + } + } } polyobject diff --git a/src/p_setup.c b/src/p_setup.c index c6cfdfe1d..c8da584e8 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3343,6 +3343,14 @@ static void P_ConvertBinaryMap(void) case 63: //Fake floor/ceiling planes lines[i].args[0] = tag; break; + case 64: //Appearing/disappearing FOF + lines[i].args[0] = (lines[i].flags & ML_BLOCKMONSTERS) ? 0 : tag; + lines[i].args[1] = (lines[i].flags & ML_BLOCKMONSTERS) ? tag : Tag_FGet(&lines[i].frontsector->tags); + lines[i].args[2] = lines[i].dx >> FRACBITS; + lines[i].args[3] = lines[i].dy >> FRACBITS; + lines[i].args[4] = lines[i].frontsector->floorheight >> FRACBITS; + lines[i].args[5] = !!(lines[i].flags & ML_NOCLIMB); + break; case 66: //Move floor by displacement case 67: //Move ceiling by displacement case 68: //Move floor and ceiling by displacement diff --git a/src/p_spec.c b/src/p_spec.c index 82f18b402..f202cede2 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2989,7 +2989,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (line->stringargs[0]) LUA_HookLinedefExecute(line, mo, callsec); else - CONS_Alert(CONS_WARNING, "Linedef %s is missing the hook name of the Lua function to call! (This should be given in arg0str)\n", sizeu1(line-lines)); + CONS_Alert(CONS_WARNING, "Linedef %s is missing the hook name of the Lua function to call! (This should be given in stringarg0)\n", sizeu1(line-lines)); break; case 444: // Earthquake camera @@ -6211,19 +6211,30 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 64: // Appearing/Disappearing FOF option - if (lines[i].flags & ML_BLOCKMONSTERS) { // Find FOFs by control sector tag - TAG_ITER_SECTORS(tag, s) - for (j = 0; (unsigned)j < sectors[s].linecount; j++) - if (sectors[s].lines[j]->special >= 100 && sectors[s].lines[j]->special < 300) - Add_MasterDisappearer(abs(lines[i].dx>>FRACBITS), abs(lines[i].dy>>FRACBITS), abs(sides[lines[i].sidenum[0]].sector->floorheight>>FRACBITS), (INT32)(sectors[s].lines[j]-lines), (INT32)i); - } else // Find FOFs by effect sector tag + if (lines[i].args[0] == 0) // Find FOFs by control sector tag { - TAG_ITER_LINES(tag, s) + TAG_ITER_SECTORS(lines[i].args[1], s) { - if ((size_t)s == i) + for (j = 0; (unsigned)j < sectors[s].linecount; j++) + { + if (sectors[s].lines[j]->special < 100 || sectors[s].lines[j]->special >= 300) + continue; + + Add_MasterDisappearer(abs(lines[i].args[2]), abs(lines[i].args[3]), abs(lines[i].args[4]), (INT32)(sectors[s].lines[j] - lines), (INT32)i); + } + } + } + else // Find FOFs by effect sector tag + { + TAG_ITER_LINES(lines[i].args[0], s) + { + if (lines[s].special < 100 || lines[s].special >= 300) continue; - if (Tag_Find(&sides[lines[s].sidenum[0]].sector->tags, Tag_FGet(&sides[lines[i].sidenum[0]].sector->tags))) - Add_MasterDisappearer(abs(lines[i].dx>>FRACBITS), abs(lines[i].dy>>FRACBITS), abs(sides[lines[i].sidenum[0]].sector->floorheight>>FRACBITS), s, (INT32)i); + + if (lines[i].args[1] != 0 && !Tag_Find(&lines[s].frontsector->tags, lines[i].args[1])) + continue; + + Add_MasterDisappearer(abs(lines[i].args[2]), abs(lines[i].args[3]), abs(lines[i].args[4]), s, (INT32)i); } } break; @@ -7469,7 +7480,7 @@ void T_Disappear(disappear_t *d) { rover->flags |= FF_EXISTS; - if (!(lines[d->sourceline].flags & ML_NOCLIMB)) + if (!(lines[d->sourceline].args[5])) { sectors[s].soundorg.z = P_GetFFloorTopZAt(rover, sectors[s].soundorg.x, sectors[s].soundorg.y); S_StartSound(§ors[s].soundorg, sfx_appear); From 208f852c4b931c9a6970eb1f62357ae61e2a216c Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 29 Dec 2021 21:04:55 +0100 Subject: [PATCH 251/377] Remove bridge thinker linedef type from UDB config --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 5 ----- 1 file changed, 5 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 684ed5ac8..0de8bb152 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -125,11 +125,6 @@ doom title = "Continuously Appearing/Disappearing FOF"; prefix = "(64)"; } - 65 - { - title = "Bridge Thinker "; - prefix = "(65)"; - } 76 { title = "Make FOF Bouncy"; From 69797377c4bededbae4358d11c1157d52a390b8d Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 29 Dec 2021 23:03:37 +0100 Subject: [PATCH 252/377] Adapt some parameter linedef types to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 98 ++++++++++++++++++++ src/p_setup.c | 27 ++++++ src/p_spec.c | 72 +++++++------- src/p_spec.h | 12 +++ src/p_user.c | 4 +- 5 files changed, 180 insertions(+), 33 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 0de8bb152..097ac02eb 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1652,12 +1652,110 @@ udmf { title = "Parameters"; + 2 + { + title = "Custom Exit"; + prefix = "(2)"; + arg0 + { + title = "Next map"; + } + arg1 + { + title = "Flags"; + type = 12; + enum + { + 1 = "Skip score tally"; + 2 = "Check emeralds"; + } + } + arg2 + { + title = "Next map (all emeralds)"; + } + } + + 3 + { + title = "Zoom Tube Parameters"; + prefix = "(3)"; + arg0 + { + title = "Speed"; + } + arg1 + { + title = "Sequence"; + } + arg2 + { + title = "Check player direction?"; + type = 11; + enum = "yesno"; + } + } + + 4 + { + title = "Speed Pad Parameters"; + prefix = "(4)"; + arg0 + { + title = "Speed"; + } + arg1 + { + title = "Flags"; + type = 12; + enum + { + 1 = "No teleport to center"; + 2 = "Force spinning frames"; + } + } + stringarg0 + { + title = "Sound"; + } + } + + 11 + { + title = "Rope Hang Parameters"; + prefix = "(11)"; + arg0 + { + title = "Speed"; + } + arg1 + { + title = "Sequence"; + } + arg2 + { + title = "Loop?"; + type = 11; + enum = "yesno"; + } + } + 15 { title = "Fan Particle Generator Heights"; prefix = "(15)"; } + 16 + { + title = "Minecart Parameters"; + prefix = "(16)"; + arg0 + { + title = "Order"; + } + } + 64 { title = "Continuously Appearing/Disappearing FOF"; diff --git a/src/p_setup.c b/src/p_setup.c index c8da584e8..08ff08f98 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3179,6 +3179,25 @@ static void P_ConvertBinaryMap(void) switch (lines[i].special) { + case 2: //Custom exit + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[1] |= TMEF_SKIPTALLY; + if (lines[i].flags & ML_BLOCKMONSTERS) + lines[i].args[1] |= TMEF_EMERALDCHECK; + break; + case 3: //Zoom tube parameters + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[2] = !!(lines[i].flags & ML_EFFECT4); + break; + case 4: //Speed pad parameters + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + if (lines[i].flags & ML_EFFECT4) + lines[i].args[1] |= TMSP_NOTELEPORT; + if (lines[i].flags & ML_EFFECT5) + lines[i].args[1] |= TMSP_FORCESPIN; + P_WriteConstant(sides[lines[i].sidenum[0]].toptexture ? sides[lines[i].sidenum[0]].toptexture : sfx_spdpad, &lines[i].stringargs[0]); + break; case 7: //Sector flat alignment lines[i].args[0] = tag; if ((lines[i].flags & (ML_NETONLY|ML_NONET)) == (ML_NETONLY|ML_NONET)) @@ -3216,6 +3235,14 @@ static void P_ConvertBinaryMap(void) lines[i].args[0] = tag; lines[i].args[1] = !!(lines[i].flags & ML_NOCLIMB); break; + case 11: //Rope hang parameters + lines[i].args[0] = (lines[i].flags & ML_NOCLIMB) ? 0 : sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[2] = !!(lines[i].flags & ML_EFFECT1); + break; + case 16: //Minecart parameters + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + break; case 20: //PolyObject first line { INT32 check = -1; diff --git a/src/p_spec.c b/src/p_spec.c index f202cede2..ab2f67d74 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4311,15 +4311,36 @@ static void P_ProcessEggCapsule(player_t *player, sector_t *sector) static void P_ProcessSpeedPad(player_t *player, sector_t *sector, sector_t *roversector, mtag_t sectag) { - INT32 lineindex; + INT32 lineindex = -1; angle_t lineangle; fixed_t linespeed; fixed_t sfxnum; + size_t i; if (player->powers[pw_flashing] != 0 && player->powers[pw_flashing] < TICRATE/2) return; - lineindex = Tag_FindLineSpecial(4, sectag); + // Try for lines facing the sector itself, with tag 0. + for (i = 0; i < sector->linecount; i++) + { + line_t *li = sector->lines[i]; + + if (li->frontsector != sector) + continue; + + if (li->special != 4) + continue; + + if (!Tag_Find(&li->tags, 0)) + continue; + + lineindex = li - lines; + break; + } + + // Nothing found? Look via tag. + if (lineindex == -1) + lineindex = Tag_FindLineSpecial(4, sectag); if (lineindex == -1) { @@ -4328,7 +4349,7 @@ static void P_ProcessSpeedPad(player_t *player, sector_t *sector, sector_t *rove } lineangle = R_PointToAngle2(lines[lineindex].v1->x, lines[lineindex].v1->y, lines[lineindex].v2->x, lines[lineindex].v2->y); - linespeed = sides[lines[lineindex].sidenum[0]].textureoffset; + linespeed = lines[lineindex].args[0] << FRACBITS; if (linespeed == 0) { @@ -4341,7 +4362,7 @@ static void P_ProcessSpeedPad(player_t *player, sector_t *sector, sector_t *rove if (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG) P_SetPlayerAngle(player, player->mo->angle); - if (!(lines[lineindex].flags & ML_EFFECT4)) + if (!(lines[lineindex].args[1] & TMSP_NOTELEPORT)) { P_UnsetThingPosition(player->mo); if (roversector) // make FOF speed pads work @@ -4359,7 +4380,7 @@ static void P_ProcessSpeedPad(player_t *player, sector_t *sector, sector_t *rove P_InstaThrust(player->mo, player->mo->angle, linespeed); - if (lines[lineindex].flags & ML_EFFECT5) // Roll! + if (lines[lineindex].args[1] & TMSP_FORCESPIN) // Roll! { if (!(player->pflags & PF_SPINNING)) player->pflags |= PF_SPINNING; @@ -4369,7 +4390,7 @@ static void P_ProcessSpeedPad(player_t *player, sector_t *sector, sector_t *rove player->powers[pw_flashing] = TICRATE/3; - sfxnum = sides[lines[lineindex].sidenum[0]].toptexture; + sfxnum = lines[lineindex].stringargs[0] ? get_number(lines[lineindex].stringargs[0]) : sfx_spdpad; if (!sfxnum) sfxnum = sfx_spdpad; @@ -4414,13 +4435,13 @@ static void P_ProcessExitSector(player_t *player, boolean isTouching, mtag_t sec return; } - // Special goodies with the block monsters flag depending on emeralds collected - if ((lines[lineindex].flags & ML_BLOCKMONSTERS) && ALL7EMERALDS(emeralds)) - nextmapoverride = (INT16)(lines[lineindex].frontsector->ceilingheight>>FRACBITS); + // Special goodies depending on emeralds collected + if ((lines[lineindex].args[1] & TMEF_EMERALDCHECK) && ALL7EMERALDS(emeralds)) + nextmapoverride = (INT16)(udmf ? lines[lineindex].args[2] : lines[lineindex].frontsector->ceilingheight>>FRACBITS); else - nextmapoverride = (INT16)(lines[lineindex].frontsector->floorheight>>FRACBITS); + nextmapoverride = (INT16)(udmf ? lines[lineindex].args[0] : lines[lineindex].frontsector->floorheight>>FRACBITS); - if (lines[lineindex].flags & ML_NOCLIMB) + if (lines[lineindex].args[1] & TMEF_SKIPTALLY) skipstats = 1; } @@ -4491,10 +4512,10 @@ static void P_ProcessZoomTube(player_t *player, sector_t *sector, mtag_t sectag, } // Grab speed and sequence values - speed = abs(sides[lines[lineindex].sidenum[0]].textureoffset)/8; + speed = abs(lines[lineindex].args[0])<<(FRACBITS-3); if (end) speed *= -1; - sequence = abs(sides[lines[lineindex].sidenum[0]].rowoffset)>>FRACBITS; + sequence = abs(lines[lineindex].args[1]); if (speed == 0) { @@ -4514,7 +4535,7 @@ static void P_ProcessZoomTube(player_t *player, sector_t *sector, mtag_t sectag, an = R_PointToAngle2(player->mo->x, player->mo->y, waypoint->x, waypoint->y) - player->mo->angle; - if (an > ANGLE_90 && an < ANGLE_270 && !(lines[lineindex].flags & ML_EFFECT4)) + if (an > ANGLE_90 && an < ANGLE_270 && !(lines[lineindex].args[2])) return; // behind back P_SetTarget(&player->mo->tracer, waypoint); @@ -4625,14 +4646,8 @@ static void P_ProcessRopeHang(player_t *player, sector_t *sector, mtag_t sectag) } // Grab speed and sequence values - speed = abs(sides[lines[lineindex].sidenum[0]].textureoffset)/8; - sequence = abs(sides[lines[lineindex].sidenum[0]].rowoffset)>>FRACBITS; - - if (speed == 0) - { - CONS_Debug(DBG_GAMELOGIC, "ERROR: Waypoint sequence %d at zero speed.\n", sequence); - return; - } + speed = abs(lines[lineindex].args[0]) << (FRACBITS - 3); + sequence = abs(lines[lineindex].args[1]); // Find the closest waypoint // Find the preceding waypoint @@ -4694,21 +4709,21 @@ static void P_ProcessRopeHang(player_t *player, sector_t *sector, mtag_t sectag) P_ResetPlayer(player); player->mo->momx = player->mo->momy = player->mo->momz = 0; - if (lines[lineindex].flags & ML_EFFECT1) // Don't wrap + if (lines[lineindex].args[2]) // Don't wrap { mobj_t *highest = P_GetLastWaypoint(sequence); highest->flags |= MF_SLIDEME; } // Changing the conditions on these ifs to fix issues with snapping to the wrong spot -Red - if ((lines[lineindex].flags & ML_EFFECT1) && waypointmid->health == 0) + if ((lines[lineindex].args[2]) && waypointmid->health == 0) { closest = waypointhigh; player->mo->x = resulthigh.x; player->mo->y = resulthigh.y; player->mo->z = resulthigh.z - P_GetPlayerHeight(player); } - else if ((lines[lineindex].flags & ML_EFFECT1) && waypointmid->health == numwaypoints[sequence] - 1) + else if ((lines[lineindex].args[2]) && waypointmid->health == numwaypoints[sequence] - 1) { closest = waypointmid; player->mo->x = resultlow.x; @@ -4739,12 +4754,7 @@ static void P_ProcessRopeHang(player_t *player, sector_t *sector, mtag_t sectag) P_SetTarget(&player->mo->tracer, closest); player->powers[pw_carry] = CR_ROPEHANG; - - // Option for static ropes. - if (lines[lineindex].flags & ML_NOCLIMB) - player->speed = 0; - else - player->speed = speed; + player->speed = speed; S_StartSound(player->mo, sfx_s3k4a); diff --git a/src/p_spec.h b/src/p_spec.h index 6b98ca0e3..6b1db7faf 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -122,6 +122,18 @@ typedef enum TMB_BARRIER = 1<<1, } textmapbrakflags_t; +typedef enum +{ + TMEF_SKIPTALLY = 1, + TMEF_EMERALDCHECK = 1<<1, +} textmapexitflags_t; + +typedef enum +{ + TMSP_NOTELEPORT = 1, + TMSP_FORCESPIN = 1<<1, +} textmapspeedpadflags_t; + //FOF flags typedef enum { diff --git a/src/p_user.c b/src/p_user.c index 5be3370ae..60000afa0 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -10768,7 +10768,7 @@ static mobj_t *P_LookForRails(mobj_t* mobj, fixed_t c, fixed_t s, angle_t target fixed_t nx, ny; angle_t nang, dummy, angdiff; mobj_t *mark; - mobj_t *snax = P_GetAxis(sides[lines[lline].sidenum[0]].textureoffset >> FRACBITS); + mobj_t *snax = P_GetAxis(lines[lline].args[0]); if (!snax) return NULL; P_GetAxisPosition(x, y, snax, &nx, &ny, &nang, &dummy); @@ -10870,7 +10870,7 @@ static void P_MinecartThink(player_t *player) // Update axis if the cart is standing on a rail. if (sec && lnum != -1) { - mobj_t *axis = P_GetAxis(sides[lines[lnum].sidenum[0]].textureoffset >> FRACBITS); + mobj_t *axis = P_GetAxis(lines[lnum].args[0]); fixed_t newx, newy; angle_t targetangle, grind; angle_t prevangle, angdiff; From 9af28321a53e74f21dadaeff1cd6efae91dcf43b Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 29 Dec 2021 23:12:46 +0100 Subject: [PATCH 253/377] Fix unadapted flag for linedef type 426 --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index 7084b8740..b5523698f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2664,7 +2664,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) // Reset bot too. if (bot) { - if (line->flags & ML_NOCLIMB) + if (line->args[0]) P_TeleportMove(bot, mo->x, mo->y, mo->z); bot->momx = bot->momy = bot->momz = 1; bot->pmomz = 0; From 73ba288e5d8bf410b08216a3bb2ab8fec4cf3cb3 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 29 Dec 2021 23:45:43 +0100 Subject: [PATCH 254/377] P_ProcessLinedefsAfterSidedefs: Skip text copying in UDMF --- src/p_setup.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 08ff08f98..16019e5c0 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2048,6 +2048,9 @@ static void P_ProcessLinedefsAfterSidedefs(void) ld->frontsector = sides[ld->sidenum[0]].sector; //e6y: Can't be -1 here ld->backsector = ld->sidenum[1] != 0xffff ? sides[ld->sidenum[1]].sector : 0; + if (udmf) + continue; + switch (ld->special) { // Compile linedef 'text' from both sidedefs 'text' for appropriate specials. @@ -2068,8 +2071,6 @@ static void P_ProcessLinedefsAfterSidedefs(void) break; case 447: // Change colormap case 455: // Fade colormap - if (udmf) - break; if (ld->flags & ML_DONTPEGBOTTOM) // alternate alpha (by texture offsets) { extracolormap_t *exc = R_CopyColormap(sides[ld->sidenum[0]].colormap_data, false); From 696d4945a7a31825f13334acc401d78fbeafd43a Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 30 Dec 2021 07:54:16 +0100 Subject: [PATCH 255/377] Adapt linedef type 14 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 27 +++++++++++++++++++ src/p_floor.c | 28 +++++++++----------- src/p_setup.c | 6 +++++ 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 097ac02eb..7c2411dc8 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1717,6 +1717,7 @@ udmf stringarg0 { title = "Sound"; + type = 2; } } @@ -1740,6 +1741,31 @@ udmf } } + 14 + { + title = "Bustable Block Parameters"; + prefix = "(14)"; + arg0 + { + title = "Debris spacing"; + } + arg1 + { + title = "Debris lifetime"; + } + arg2 + { + title = "Launch from center?"; + type = 11; + enum = "noyes"; + } + stringarg0 + { + title = "Debris object type"; + type = 2; + } + } + 15 { title = "Fan Particle Generator Heights"; @@ -4699,6 +4725,7 @@ udmf stringarg0 { title = "Prompt name"; + type = 2; } } diff --git a/src/p_floor.c b/src/p_floor.c index c3a13d802..85a1f54a8 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -11,6 +11,7 @@ /// \file p_floor.c /// \brief Floor animation, elevators +#include "dehacked.h" #include "doomdef.h" #include "doomstat.h" #include "m_random.h" @@ -1812,7 +1813,7 @@ void EV_CrumbleChain(sector_t *sec, ffloor_t *rover) fixed_t leftx, rightx, topy, bottomy, topz, bottomz, widthfactor, heightfactor, a, b, c, spacing; mobjtype_t type; tic_t lifetime; - INT16 flags; + boolean fromcenter; sector_t *controlsec = rover->master->frontsector; mtag_t tag = Tag_FGet(&controlsec->tags); @@ -1842,25 +1843,20 @@ void EV_CrumbleChain(sector_t *sec, ffloor_t *rover) spacing = (32<>FRACBITS != -1) - lifetime = (sides[lines[tagline].sidenum[0]].rowoffset>>FRACBITS); - else - lifetime = 0; - } - flags = lines[tagline].flags; + if (lines[tagline].stringargs[0]) + type = get_number(lines[tagline].stringargs[0]); + if (lines[tagline].args[0]) + spacing = lines[tagline].args[0] << FRACBITS; + if (lines[tagline].args[1]) + lifetime = (lines[tagline].args[1] != -1) ? lines[tagline].args[1] : 0; + fromcenter = !!lines[tagline].args[2]; } } @@ -1895,7 +1891,7 @@ void EV_CrumbleChain(sector_t *sec, ffloor_t *rover) topz = *rover->topheight-(spacing>>1); bottomz = *rover->bottomheight; - if (flags & ML_EFFECT1) + if (fromcenter) { widthfactor = (rightx + topy - leftx - bottomy)>>3; heightfactor = (topz - *rover->bottomheight)>>2; @@ -1918,7 +1914,7 @@ void EV_CrumbleChain(sector_t *sec, ffloor_t *rover) spawned = P_SpawnMobj(a, b, c, type); spawned->angle += P_RandomKey(36)*ANG10; // irrelevant for default objects but might make sense for some custom ones - if (flags & ML_EFFECT1) + if (fromcenter) { P_InstaThrust(spawned, R_PointToAngle2(sec->soundorg.x, sec->soundorg.y, a, b), FixedDiv(P_AproxDistance(a - sec->soundorg.x, b - sec->soundorg.y), widthfactor)); P_SetObjectMomZ(spawned, FixedDiv((c - bottomz), heightfactor), false); diff --git a/src/p_setup.c b/src/p_setup.c index 16019e5c0..850fee4f1 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3241,6 +3241,12 @@ static void P_ConvertBinaryMap(void) lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; lines[i].args[2] = !!(lines[i].flags & ML_EFFECT1); break; + case 14: //Bustable block parameters + lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[2] = !!(lines[i].flags & ML_EFFECT1); + P_WriteConstant(sides[lines[i].sidenum[0]].toptexture, &lines[i].stringargs[0]); + break; case 16: //Minecart parameters lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; break; From 34229030f289c311eb02d66a96d00b7a3757d861 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 30 Dec 2021 08:10:20 +0100 Subject: [PATCH 256/377] Make implementation of slope copying with linedef type 700 not hacky --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 1 + src/p_setup.c | 6 +- src/p_slopes.c | 62 ++++++++++++-------- src/p_slopes.h | 3 +- 4 files changed, 42 insertions(+), 30 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 7c2411dc8..7e316c1ce 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -5303,6 +5303,7 @@ udmf { 1 = "No physics"; 2 = "Dynamic"; + 4 = "Copy to other side"; } } } diff --git a/src/p_setup.c b/src/p_setup.c index 850fee4f1..2e3fb1967 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4839,12 +4839,8 @@ static void P_ConvertBinaryMap(void) lines[i].args[2] |= TMSL_NOPHYSICS; if (lines[i].flags & ML_NONET) lines[i].args[2] |= TMSL_DYNAMIC; - if (lines[i].flags & ML_TFERLINE) - { - lines[i].args[4] |= backfloor ? TMSC_BACKTOFRONTFLOOR : (frontfloor ? TMSC_FRONTTOBACKFLOOR : 0); - lines[i].args[4] |= backceil ? TMSC_BACKTOFRONTCEILING : (frontceil ? TMSC_FRONTTOBACKCEILING : 0); - } + lines[i].args[2] |= TMSL_COPY; lines[i].special = 700; break; diff --git a/src/p_slopes.c b/src/p_slopes.c index b9154b890..d67c68edf 100644 --- a/src/p_slopes.c +++ b/src/p_slopes.c @@ -277,6 +277,27 @@ static fixed_t GetExtent(sector_t *sector, line_t *line) return fardist; } +static boolean P_CopySlope(pslope_t** toslope, pslope_t* fromslope) +{ + if (*toslope || !fromslope) + return true; + + *toslope = fromslope; + return true; +} + +static void P_UpdateHasSlope(sector_t *sec) +{ + size_t i; + + sec->hasslope = true; + + // if this is an FOF control sector, make sure any target sectors also are marked as having slopes + if (sec->numattached) + for (i = 0; i < sec->numattached; i++) + sectors[sec->attached[i]].hasslope = true; +} + /// Creates one or more slopes based on the given line type and front/back sectors. static void line_SpawnViaLine(const int linenum, const boolean spawnthinker) { @@ -444,6 +465,23 @@ static void line_SpawnViaLine(const int linenum, const boolean spawnthinker) P_AddDynLineSlopeThinker(cslope, DP_BACKCEIL, line, extent); } } + + if (line->args[2] & TMSL_COPY) + { + if (frontfloor) + P_CopySlope(&line->backsector->f_slope, line->frontsector->f_slope); + if (backfloor) + P_CopySlope(&line->frontsector->f_slope, line->backsector->f_slope); + if (frontceil) + P_CopySlope(&line->backsector->c_slope, line->frontsector->c_slope); + if (backceil) + P_CopySlope(&line->frontsector->c_slope, line->backsector->c_slope); + + if (backfloor || backceil) + P_UpdateHasSlope(line->frontsector); + if (frontfloor || frontceil) + P_UpdateHasSlope(line->backsector); + } } /// Creates a new slope from three mapthings with the specified IDs @@ -600,27 +638,6 @@ static boolean P_SetSlopeFromTag(sector_t *sec, INT32 tag, boolean ceiling) return false; } -static boolean P_CopySlope(pslope_t **toslope, pslope_t *fromslope) -{ - if (*toslope || !fromslope) - return true; - - *toslope = fromslope; - return true; -} - -static void P_UpdateHasSlope(sector_t *sec) -{ - size_t i; - - sec->hasslope = true; - - // if this is an FOF control sector, make sure any target sectors also are marked as having slopes - if (sec->numattached) - for (i = 0; i < sec->numattached; i++) - sectors[sec->attached[i]].hasslope = true; -} - // // P_CopySectorSlope // @@ -710,9 +727,6 @@ void P_SpawnSlopes(const boolean fromsave) { for (i = 0; i < numlines; i++) switch (lines[i].special) { - case 700: - if (lines[i].flags & ML_TFERLINE) P_CopySectorSlope(&lines[i]); - break; case 720: P_CopySectorSlope(&lines[i]); default: diff --git a/src/p_slopes.h b/src/p_slopes.h index 0b3e0b517..ae1966011 100644 --- a/src/p_slopes.h +++ b/src/p_slopes.h @@ -44,7 +44,8 @@ typedef enum typedef enum { TMSL_NOPHYSICS = 1, - TMSL_DYNAMIC = 2, + TMSL_DYNAMIC = 1<<1, + TMSL_COPY = 1<<2, } textmapslopeflags_t; void P_LinkSlopeThinkers (void); From ff4b68424f6836f7d7dc06f5284bba6632ebd2d3 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 30 Dec 2021 08:32:59 +0100 Subject: [PATCH 257/377] Fix missing section title in UDB config --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 7e316c1ce..da54414da 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -5145,6 +5145,8 @@ udmf light { + title = "Lighting"; + 600 { title = "Copy Light Level to Tagged Sector's Planes"; From 2fd6eafbcf0f226d7edda5a47b6e8b6c49eb5839 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 30 Dec 2021 14:16:00 +0100 Subject: [PATCH 258/377] Expose sector flags to Lua and UDMF --- extras/conf/udb/Includes/SRB222_misc.cfg | 5 +++ src/deh_lua.c | 15 +++++++++ src/deh_tables.c | 8 +++++ src/deh_tables.h | 1 + src/lua_maplib.c | 10 +++++- src/p_map.c | 2 +- src/p_mobj.c | 8 ++--- src/p_polyobj.c | 2 +- src/p_setup.c | 15 ++++++++- src/p_spec.c | 40 ++++++++++++------------ src/r_defs.h | 12 +++---- 11 files changed, 84 insertions(+), 34 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 57c7c88a3..6d64aea81 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -74,6 +74,11 @@ sectorflags colormapfog = "Fog Planes in Colormap"; colormapfadesprites = "Fade Fullbright in Colormap"; colormapprotected = "Protected Colormap"; + flipspecial_nofloor = "No Trigger on Floor Touch"; + flipspecial_ceiling = "Trigger on Ceiling Touch"; + triggerspecial_touch = "Trigger on Edge Touch"; + triggerspecial_headbump = "Trigger on Headbump"; + invertprecip = "Invert Precipitation"; } thingflags diff --git a/src/deh_lua.c b/src/deh_lua.c index a2ffca95b..ae062695c 100644 --- a/src/deh_lua.c +++ b/src/deh_lua.c @@ -338,6 +338,21 @@ static inline int lib_getenum(lua_State *L) if (mathlib) return luaL_error(L, "linedef flag '%s' could not be found.\n", word); return 0; } + else if (fastncmp("MSF_", word, 3)) { + p = word + 4; + for (i = 0; i < 4; i++) + if (MSF_LIST[i] && fastcmp(p, MSF_LIST[i])) { + lua_pushinteger(L, ((lua_Integer)1 << i)); + return 1; + } + if (fastcmp(p, "FLIPSPECIAL_BOTH")) + { + lua_pushinteger(L, (lua_Integer)MSF_FLIPSPECIAL_BOTH); + return 1; + } + if (mathlib) return luaL_error(L, "sector flag '%s' could not be found.\n", word); + return 0; + } else if (fastncmp("S_",word,2)) { p = word+2; for (i = 0; i < NUMSTATEFREESLOTS; i++) { diff --git a/src/deh_tables.c b/src/deh_tables.c index f73f10151..73cf7068e 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4471,6 +4471,14 @@ const char *const ML_LIST[16] = { "TFERLINE" }; +// Sector flags +const char *const MSF_LIST[4] = { + "FLIPSPECIAL_FLOOR", + "FLIPSPECIAL_CEILING", + "TRIGGERSPECIAL_TOUCH", + "TRIGGERSPECIAL_HEADBUMP", +}; + const char *COLOR_ENUMS[] = { "NONE", // SKINCOLOR_NONE, diff --git a/src/deh_tables.h b/src/deh_tables.h index 1f265cc99..77260d507 100644 --- a/src/deh_tables.h +++ b/src/deh_tables.h @@ -65,6 +65,7 @@ extern const char *const MAPTHINGFLAG_LIST[4]; extern const char *const PLAYERFLAG_LIST[]; extern const char *const GAMETYPERULE_LIST[]; extern const char *const ML_LIST[16]; // Linedef flags +extern const char* const MSF_LIST[4]; // Sector flags extern const char *COLOR_ENUMS[]; extern const char *const POWERS_LIST[]; extern const char *const HUDITEMS_LIST[]; diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 0ee87d2d2..9f267d071 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -48,7 +48,8 @@ enum sector_e { sector_lines, sector_ffloors, sector_fslope, - sector_cslope + sector_cslope, + sector_flags, }; static const char *const sector_opt[] = { @@ -72,6 +73,7 @@ static const char *const sector_opt[] = { "ffloors", "f_slope", "c_slope", + "flags", NULL}; enum subsector_e { @@ -649,6 +651,9 @@ static int sector_get(lua_State *L) case sector_cslope: // c_slope LUA_PushUserdata(L, sector->c_slope, META_SLOPE); return 1; + case sector_flags: // flags + lua_pushinteger(L, sector->flags); + return 1; } return 0; } @@ -735,6 +740,9 @@ static int sector_set(lua_State *L) break; case sector_taglist: return LUA_ErrSetDirectly(L, "sector_t", "taglist"); + case sector_flags: + sector->flags = luaL_checkinteger(L, 3); + break; } return 0; } diff --git a/src/p_map.c b/src/p_map.c index 5d90399d5..6b69df9cb 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3455,7 +3455,7 @@ static boolean PTR_SlideTraverse(intercept_t *in) // see if it is closer than best so far if (li->polyobj && slidemo->player) { - if ((li->polyobj->lines[0]->backsector->flags & SF_TRIGGERSPECIAL_TOUCH) && !(li->polyobj->flags & POF_NOSPECIALS)) + if ((li->polyobj->lines[0]->backsector->flags & MSF_TRIGGERSPECIAL_TOUCH) && !(li->polyobj->flags & POF_NOSPECIALS)) P_ProcessSpecialSector(slidemo->player, slidemo->subsector->sector, li->polyobj->lines[0]->backsector); } diff --git a/src/p_mobj.c b/src/p_mobj.c index 46510200e..47a70233b 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2324,9 +2324,9 @@ boolean P_CheckDeathPitCollide(mobj_t *mo) return false; if (((mo->z <= mo->subsector->sector->floorheight - && ((mo->subsector->sector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(mo->eflags & MFE_VERTICALFLIP)) && (mo->subsector->sector->flags & SF_FLIPSPECIAL_FLOOR)) + && ((mo->subsector->sector->flags & MSF_TRIGGERSPECIAL_HEADBUMP) || !(mo->eflags & MFE_VERTICALFLIP)) && (mo->subsector->sector->flags & MSF_FLIPSPECIAL_FLOOR)) || (mo->z + mo->height >= mo->subsector->sector->ceilingheight - && ((mo->subsector->sector->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (mo->eflags & MFE_VERTICALFLIP)) && (mo->subsector->sector->flags & SF_FLIPSPECIAL_CEILING))) + && ((mo->subsector->sector->flags & MSF_TRIGGERSPECIAL_HEADBUMP) || (mo->eflags & MFE_VERTICALFLIP)) && (mo->subsector->sector->flags & MSF_FLIPSPECIAL_CEILING))) && (GETSECSPECIAL(mo->subsector->sector->special, 1) == 6 || GETSECSPECIAL(mo->subsector->sector->special, 1) == 7)) return true; @@ -11219,7 +11219,7 @@ void P_SpawnPrecipitation(void) if (curWeather == PRECIP_SNOW) { // Not in a sector with visible sky -- exception for NiGHTS. - if ((!(maptol & TOL_NIGHTS) && (precipsector->sector->ceilingpic != skyflatnum)) == !(precipsector->sector->flags & SF_INVERTPRECIP)) + if ((!(maptol & TOL_NIGHTS) && (precipsector->sector->ceilingpic != skyflatnum)) == !(precipsector->sector->flags & MSF_INVERTPRECIP)) continue; rainmo = P_SpawnSnowMobj(x, y, height, MT_SNOWFLAKE); @@ -11232,7 +11232,7 @@ void P_SpawnPrecipitation(void) else // everything else. { // Not in a sector with visible sky. - if ((precipsector->sector->ceilingpic != skyflatnum) == !(precipsector->sector->flags & SF_INVERTPRECIP)) + if ((precipsector->sector->ceilingpic != skyflatnum) == !(precipsector->sector->flags & MSF_INVERTPRECIP)) continue; rainmo = P_SpawnRainMobj(x, y, height, MT_RAIN); diff --git a/src/p_polyobj.c b/src/p_polyobj.c index 47327c949..bcad36f80 100644 --- a/src/p_polyobj.c +++ b/src/p_polyobj.c @@ -963,7 +963,7 @@ static INT32 Polyobj_clipThings(polyobj_t *po, line_t *line) else Polyobj_pushThing(po, line, mo); - if (mo->player && (po->lines[0]->backsector->flags & SF_TRIGGERSPECIAL_TOUCH) && !(po->flags & POF_NOSPECIALS)) + if (mo->player && (po->lines[0]->backsector->flags & MSF_TRIGGERSPECIAL_TOUCH) && !(po->flags & POF_NOSPECIALS)) P_ProcessSpecialSector(mo->player, mo->subsector->sector, po->lines[0]->backsector); hitflags |= 1; diff --git a/src/p_setup.c b/src/p_setup.c index 2e3fb1967..b83d950f2 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1001,7 +1001,6 @@ static void P_InitializeSector(sector_t *ss) ss->gravity = NULL; ss->verticalflip = false; - ss->flags = SF_FLIPSPECIAL_FLOOR; ss->cullheight = NULL; @@ -1048,6 +1047,8 @@ static void P_LoadSectors(UINT8 *data) ss->colormap_protected = false; + ss->flags = MSF_FLIPSPECIAL_FLOOR; + P_InitializeSector(ss); } } @@ -1661,6 +1662,16 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) } else if (fastcmp(param, "colormapprotected") && fastcmp("true", val)) sectors[i].colormap_protected = true; + else if (fastcmp(param, "flipspecial_nofloor") && fastcmp("true", val)) + sectors[i].flags &= ~MSF_FLIPSPECIAL_FLOOR; + else if (fastcmp(param, "flipspecial_ceiling") && fastcmp("true", val)) + sectors[i].flags |= MSF_FLIPSPECIAL_CEILING; + else if (fastcmp(param, "triggerspecial_touch") && fastcmp("true", val)) + sectors[i].flags |= MSF_TRIGGERSPECIAL_TOUCH; + else if (fastcmp(param, "triggerspecial_headbump") && fastcmp("true", val)) + sectors[i].flags |= MSF_TRIGGERSPECIAL_HEADBUMP; + else if (fastcmp(param, "invertprecip") && fastcmp("true", val)) + sectors[i].flags |= MSF_INVERTPRECIP; } static void ParseTextmapSidedefParameter(UINT32 i, char *param, char *val) @@ -1937,6 +1948,8 @@ static void P_LoadTextmap(void) sc->colormap_protected = false; + sc->flags = MSF_FLIPSPECIAL_FLOOR; + textmap_colormap.used = false; textmap_colormap.lightcolor = 0; textmap_colormap.lightalpha = 25; diff --git a/src/p_spec.c b/src/p_spec.c index ab2f67d74..37b077535 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3945,8 +3945,8 @@ boolean P_IsFlagAtBase(mobjtype_t flag) static boolean P_IsMobjTouchingPlane(mobj_t *mo, sector_t *sec, fixed_t floorz, fixed_t ceilingz) { - boolean floorallowed = ((sec->flags & SF_FLIPSPECIAL_FLOOR) && ((sec->flags & SF_TRIGGERSPECIAL_HEADBUMP) || !(mo->eflags & MFE_VERTICALFLIP)) && (mo->z == floorz)); - boolean ceilingallowed = ((sec->flags & SF_FLIPSPECIAL_CEILING) && ((sec->flags & SF_TRIGGERSPECIAL_HEADBUMP) || (mo->eflags & MFE_VERTICALFLIP)) && (mo->z + mo->height == ceilingz)); + boolean floorallowed = ((sec->flags & MSF_FLIPSPECIAL_FLOOR) && ((sec->flags & MSF_TRIGGERSPECIAL_HEADBUMP) || !(mo->eflags & MFE_VERTICALFLIP)) && (mo->z == floorz)); + boolean ceilingallowed = ((sec->flags & MSF_FLIPSPECIAL_CEILING) && ((sec->flags & MSF_TRIGGERSPECIAL_HEADBUMP) || (mo->eflags & MFE_VERTICALFLIP)) && (mo->z + mo->height == ceilingz)); return (floorallowed || ceilingallowed); } @@ -4007,7 +4007,7 @@ static sector_t *P_MobjTouching3DFloorSpecial(mobj_t *mo, sector_t *sector, INT3 // This FOF has the special we're looking for, but are we allowed to touch it? if (sector == mo->subsector->sector - || (rover->master->frontsector->flags & SF_TRIGGERSPECIAL_TOUCH)) + || (rover->master->frontsector->flags & MSF_TRIGGERSPECIAL_TOUCH)) return rover->master->frontsector; } @@ -4031,7 +4031,7 @@ static sector_t *P_MobjTouchingPolyobjSpecial(mobj_t *mo, INT32 section, INT32 n if (GETSECSPECIAL(polysec->special, section) != number) continue; - touching = (polysec->flags & SF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, mo); + touching = (polysec->flags & MSF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, mo); inside = P_MobjInsidePolyobj(po, mo); if (!(inside || touching)) @@ -4071,7 +4071,7 @@ sector_t *P_MobjTouchingSectorSpecial(mobj_t *mo, INT32 section, INT32 number) if (result) return result; - if (!(node->m_sector->flags & SF_TRIGGERSPECIAL_TOUCH)) + if (!(node->m_sector->flags & MSF_TRIGGERSPECIAL_TOUCH)) continue; if (GETSECSPECIAL(mo->subsector->sector->special, section) == number) @@ -4120,7 +4120,7 @@ static sector_t *P_Check3DFloorTriggers(player_t *player, sector_t *sector, line // This FOF has the special we're looking for, but are we allowed to touch it? if (sector == player->mo->subsector->sector - || (rover->master->frontsector->flags & SF_TRIGGERSPECIAL_TOUCH)) + || (rover->master->frontsector->flags & MSF_TRIGGERSPECIAL_TOUCH)) return rover->master->frontsector; } @@ -4147,7 +4147,7 @@ static sector_t *P_CheckPolyobjTriggers(player_t *player, line_t *sourceline) if (!Tag_Find(&sourceline->tags, Tag_FGet(&polysec->tags))) return false; - touching = (polysec->flags & SF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, player->mo); + touching = (polysec->flags & MSF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, player->mo); inside = P_MobjInsidePolyobj(po, player->mo); if (!(inside || touching)) @@ -4217,7 +4217,7 @@ sector_t *P_FindPlayerTrigger(player_t *player, line_t *sourceline) if (caller) return caller; - if (!(loopsector->flags & SF_TRIGGERSPECIAL_TOUCH)) + if (!(loopsector->flags & MSF_TRIGGERSPECIAL_TOUCH)) continue; if (P_CheckSectorTriggers(player, loopsector, sourceline)) @@ -5024,7 +5024,7 @@ static void P_PlayerOnSpecial3DFloor(player_t *player, sector_t *sector) // This FOF has the special we're looking for, but are we allowed to touch it? if (sector == player->mo->subsector->sector - || (rover->master->frontsector->flags & SF_TRIGGERSPECIAL_TOUCH)) + || (rover->master->frontsector->flags & MSF_TRIGGERSPECIAL_TOUCH)) { P_ProcessSpecialSector(player, rover->master->frontsector, sector); if TELEPORTED(player->mo) return; @@ -5050,7 +5050,7 @@ static void P_PlayerOnSpecialPolyobj(player_t *player) if (!polysec->special) continue; - touching = (polysec->flags & SF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, player->mo); + touching = (polysec->flags & MSF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, player->mo); inside = P_MobjInsidePolyobj(po, player->mo); if (!(inside || touching)) @@ -5102,7 +5102,7 @@ void P_PlayerInSpecialSector(player_t *player) P_PlayerOnSpecial3DFloor(player, loopsector); if TELEPORTED(player->mo) return; - if (!(loopsector->flags & SF_TRIGGERSPECIAL_TOUCH)) + if (!(loopsector->flags & MSF_TRIGGERSPECIAL_TOUCH)) continue; P_ProcessSpecialSector(player, loopsector, NULL); @@ -5152,7 +5152,7 @@ static void P_CheckMobjPolyobjTrigger(mobj_t *mo) if (!polysec->special) continue; - touching = (polysec->flags & SF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, mo); + touching = (polysec->flags & MSF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, mo); inside = P_MobjInsidePolyobj(po, mo); if (!(inside || touching)) @@ -5994,9 +5994,9 @@ void P_SpawnSpecials(boolean fromnetsave) { case 5: // Spikes //Terrible hack to replace an even worse hack: - //Spike damage automatically sets SF_TRIGGERSPECIAL_TOUCH. + //Spike damage automatically sets MSF_TRIGGERSPECIAL_TOUCH. //Yes, this also affects other specials on the same sector. Sorry. - sector->flags |= SF_TRIGGERSPECIAL_TOUCH; + sector->flags |= MSF_TRIGGERSPECIAL_TOUCH; break; case 15: // Bouncy FOF CONS_Alert(CONS_WARNING, M_GetText("Deprecated bouncy FOF sector type detected. Please use linedef type 76 instead.\n")); @@ -6148,19 +6148,19 @@ void P_SpawnSpecials(boolean fromnetsave) { if (lines[i].flags & ML_NOCLIMB) { - sectors[s].flags &= ~SF_FLIPSPECIAL_FLOOR; - sectors[s].flags |= SF_FLIPSPECIAL_CEILING; + sectors[s].flags &= ~MSF_FLIPSPECIAL_FLOOR; + sectors[s].flags |= MSF_FLIPSPECIAL_CEILING; } else if (lines[i].flags & ML_EFFECT4) - sectors[s].flags |= SF_FLIPSPECIAL_BOTH; + sectors[s].flags |= MSF_FLIPSPECIAL_BOTH; if (lines[i].flags & ML_EFFECT3) - sectors[s].flags |= SF_TRIGGERSPECIAL_TOUCH; + sectors[s].flags |= MSF_TRIGGERSPECIAL_TOUCH; if (lines[i].flags & ML_EFFECT2) - sectors[s].flags |= SF_TRIGGERSPECIAL_HEADBUMP; + sectors[s].flags |= MSF_TRIGGERSPECIAL_HEADBUMP; if (lines[i].flags & ML_EFFECT1) - sectors[s].flags |= SF_INVERTPRECIP; + sectors[s].flags |= MSF_INVERTPRECIP; if (lines[i].frontsector && GETSECSPECIAL(lines[i].frontsector->special, 4) == 12) sectors[s].camsec = sides[*lines[i].sidenum].sector-sectors; diff --git a/src/r_defs.h b/src/r_defs.h index 0609a48a8..c10428431 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -276,14 +276,14 @@ typedef struct pslope_s typedef enum { // flipspecial - planes with effect - SF_FLIPSPECIAL_FLOOR = 1, - SF_FLIPSPECIAL_CEILING = 1<<1, - SF_FLIPSPECIAL_BOTH = (SF_FLIPSPECIAL_FLOOR|SF_FLIPSPECIAL_CEILING), + MSF_FLIPSPECIAL_FLOOR = 1, + MSF_FLIPSPECIAL_CEILING = 1<<1, + MSF_FLIPSPECIAL_BOTH = (MSF_FLIPSPECIAL_FLOOR|MSF_FLIPSPECIAL_CEILING), // triggerspecial - conditions under which plane touch causes effect - SF_TRIGGERSPECIAL_TOUCH = 1<<2, - SF_TRIGGERSPECIAL_HEADBUMP = 1<<3, + MSF_TRIGGERSPECIAL_TOUCH = 1<<2, + MSF_TRIGGERSPECIAL_HEADBUMP = 1<<3, // invertprecip - inverts presence of precipitation - SF_INVERTPRECIP = 1<<4, + MSF_INVERTPRECIP = 1<<4, } sectorflags_t; From 2a1f96aa3cecae4c41d5c6cee918a6c69e5213dc Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 30 Dec 2021 14:26:51 +0100 Subject: [PATCH 259/377] Adapt linedef type 8 to UDMF --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 6 +++++ src/p_setup.c | 28 ++++++++++++++++++++ src/p_spec.c | 26 +++--------------- 3 files changed, 38 insertions(+), 22 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index da54414da..e8ec7de2b 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1721,6 +1721,12 @@ udmf } } + 8 + { + title = "Set Camera Collision Planes"; + prefix = "(8)"; + } + 11 { title = "Rope Hang Parameters"; diff --git a/src/p_setup.c b/src/p_setup.c index b83d950f2..987f4f6f5 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3245,6 +3245,34 @@ static void P_ConvertBinaryMap(void) lines[i].special = 0; } break; + case 8: //Special sector properties + { + INT32 s; + + TAG_ITER_SECTORS(tag, s) + { + if (lines[i].flags & ML_NOCLIMB) + { + sectors[s].flags &= ~MSF_FLIPSPECIAL_FLOOR; + sectors[s].flags |= MSF_FLIPSPECIAL_CEILING; + } + else if (lines[i].flags & ML_EFFECT4) + sectors[s].flags |= MSF_FLIPSPECIAL_BOTH; + + if (lines[i].flags & ML_EFFECT3) + sectors[s].flags |= MSF_TRIGGERSPECIAL_TOUCH; + if (lines[i].flags & ML_EFFECT2) + sectors[s].flags |= MSF_TRIGGERSPECIAL_HEADBUMP; + + if (lines[i].flags & ML_EFFECT1) + sectors[s].flags |= MSF_INVERTPRECIP; + } + + if (GETSECSPECIAL(lines[i].frontsector->special, 4) != 12) + lines[i].special = 0; + + break; + } case 10: //Culling plane lines[i].args[0] = tag; lines[i].args[1] = !!(lines[i].flags & ML_NOCLIMB); diff --git a/src/p_spec.c b/src/p_spec.c index 37b077535..ef48fbf62 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6143,28 +6143,10 @@ void P_SpawnSpecials(boolean fromnetsave) break; } - case 8: // Sector Parameters - TAG_ITER_SECTORS(tag, s) - { - if (lines[i].flags & ML_NOCLIMB) - { - sectors[s].flags &= ~MSF_FLIPSPECIAL_FLOOR; - sectors[s].flags |= MSF_FLIPSPECIAL_CEILING; - } - else if (lines[i].flags & ML_EFFECT4) - sectors[s].flags |= MSF_FLIPSPECIAL_BOTH; - - if (lines[i].flags & ML_EFFECT3) - sectors[s].flags |= MSF_TRIGGERSPECIAL_TOUCH; - if (lines[i].flags & ML_EFFECT2) - sectors[s].flags |= MSF_TRIGGERSPECIAL_HEADBUMP; - - if (lines[i].flags & ML_EFFECT1) - sectors[s].flags |= MSF_INVERTPRECIP; - - if (lines[i].frontsector && GETSECSPECIAL(lines[i].frontsector->special, 4) == 12) - sectors[s].camsec = sides[*lines[i].sidenum].sector-sectors; - } + case 8: // Set camera collision planes + if (lines[i].frontsector) + TAG_ITER_SECTORS(tag, s) + sectors[s].camsec = lines[i].frontsector-sectors; break; case 10: // Vertical culling plane for sprites and FOFs From b74d06b4e7de16833cad70bd054e7b3095d37559 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 30 Dec 2021 14:33:24 +0100 Subject: [PATCH 260/377] Netsync sector flags --- src/p_saveg.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/p_saveg.c b/src/p_saveg.c index 5e204f9bc..0f5679940 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -852,6 +852,7 @@ static void P_NetUnArchiveWaypoints(void) #define SD_CRUMBLESTATE 0x04 #define SD_FLOORLIGHT 0x08 #define SD_CEILLIGHT 0x10 +#define SD_FLAG 0x20 #define LD_FLAG 0x01 #define LD_SPECIAL 0x02 @@ -1037,6 +1038,8 @@ static void ArchiveSectors(void) diff3 |= SD_FLOORLIGHT; if (ss->ceilinglightlevel != spawnss->ceilinglightlevel || ss->ceilinglightabsolute != spawnss->ceilinglightabsolute) diff3 |= SD_CEILLIGHT; + if (ss->flags != spawnss->flags) + diff3 |= SD_FLAG; if (ss->ffloors && CheckFFloorDiff(ss)) diff |= SD_FFLOORS; @@ -1101,6 +1104,8 @@ static void ArchiveSectors(void) WRITEINT16(save_p, ss->ceilinglightlevel); WRITEUINT8(save_p, ss->ceilinglightabsolute); } + if (diff3 & SD_FLAG) + WRITEUINT32(save_p, ss->flags); if (diff & SD_FFLOORS) ArchiveFFloors(ss); } @@ -1202,6 +1207,9 @@ static void UnArchiveSectors(void) sectors[i].ceilinglightlevel = READINT16(save_p); sectors[i].ceilinglightabsolute = READUINT8(save_p); } + if (diff3 & SD_FLAG) + sectors[i].flags = READUINT32(save_p); + if (diff & SD_FFLOORS) UnArchiveFFloors(§ors[i]); From f30b97ba933c4407e40e4990e855efbdd3523895 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 30 Dec 2021 14:48:40 +0100 Subject: [PATCH 261/377] Adapt heat wave effect to UDMF --- extras/conf/udb/Includes/SRB222_misc.cfg | 1 + src/deh_lua.c | 2 +- src/deh_tables.c | 3 +- src/deh_tables.h | 2 +- src/p_mobj.c | 10 ++--- src/p_setup.c | 11 +++++ src/p_user.c | 56 +++++++++--------------- src/r_defs.h | 1 + 8 files changed, 40 insertions(+), 46 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 6d64aea81..52cd22322 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -79,6 +79,7 @@ sectorflags triggerspecial_touch = "Trigger on Edge Touch"; triggerspecial_headbump = "Trigger on Headbump"; invertprecip = "Invert Precipitation"; + heatwave = "Heat Wave"; } thingflags diff --git a/src/deh_lua.c b/src/deh_lua.c index ae062695c..28030052a 100644 --- a/src/deh_lua.c +++ b/src/deh_lua.c @@ -340,7 +340,7 @@ static inline int lib_getenum(lua_State *L) } else if (fastncmp("MSF_", word, 3)) { p = word + 4; - for (i = 0; i < 4; i++) + for (i = 0; i < 5; i++) if (MSF_LIST[i] && fastcmp(p, MSF_LIST[i])) { lua_pushinteger(L, ((lua_Integer)1 << i)); return 1; diff --git a/src/deh_tables.c b/src/deh_tables.c index 73cf7068e..b6a9e0225 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4472,11 +4472,12 @@ const char *const ML_LIST[16] = { }; // Sector flags -const char *const MSF_LIST[4] = { +const char *const MSF_LIST[5] = { "FLIPSPECIAL_FLOOR", "FLIPSPECIAL_CEILING", "TRIGGERSPECIAL_TOUCH", "TRIGGERSPECIAL_HEADBUMP", + "HEATWAVE", }; const char *COLOR_ENUMS[] = { diff --git a/src/deh_tables.h b/src/deh_tables.h index 77260d507..982c6ff4a 100644 --- a/src/deh_tables.h +++ b/src/deh_tables.h @@ -65,7 +65,7 @@ extern const char *const MAPTHINGFLAG_LIST[4]; extern const char *const PLAYERFLAG_LIST[]; extern const char *const GAMETYPERULE_LIST[]; extern const char *const ML_LIST[16]; // Linedef flags -extern const char* const MSF_LIST[4]; // Sector flags +extern const char* const MSF_LIST[5]; // Sector flags extern const char *COLOR_ENUMS[]; extern const char *const POWERS_LIST[]; extern const char *const HUDITEMS_LIST[]; diff --git a/src/p_mobj.c b/src/p_mobj.c index 47a70233b..428274679 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3551,19 +3551,16 @@ static boolean P_CameraCheckHeat(camera_t *thiscam) { sector_t *sector; fixed_t halfheight = thiscam->z + (thiscam->height >> 1); - size_t i; // see if we are in water sector = thiscam->subsector->sector; - for (i = 0; i < sector->tags.count; i++) - if (Tag_FindLineSpecial(13, sector->tags.tags[i]) != -1) - return true; + if (sector->flags & MSF_HEATWAVE) + return true; if (sector->ffloors) { ffloor_t *rover; - size_t j; for (rover = sector->ffloors; rover; rover = rover->next) { @@ -3575,8 +3572,7 @@ static boolean P_CameraCheckHeat(camera_t *thiscam) if (halfheight <= P_GetFFloorBottomZAt(rover, thiscam->x, thiscam->y)) continue; - for (j = 0; j < rover->master->frontsector->tags.count; j++) - if (Tag_FindLineSpecial(13, rover->master->frontsector->tags.tags[j]) != -1) + if (rover->master->frontsector->flags & MSF_HEATWAVE) return true; } } diff --git a/src/p_setup.c b/src/p_setup.c index 987f4f6f5..ec35ad824 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1672,6 +1672,8 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) sectors[i].flags |= MSF_TRIGGERSPECIAL_HEADBUMP; else if (fastcmp(param, "invertprecip") && fastcmp("true", val)) sectors[i].flags |= MSF_INVERTPRECIP; + else if (fastcmp(param, "heatwave") && fastcmp("true", val)) + sectors[i].flags |= MSF_HEATWAVE; } static void ParseTextmapSidedefParameter(UINT32 i, char *param, char *val) @@ -3282,6 +3284,15 @@ static void P_ConvertBinaryMap(void) lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; lines[i].args[2] = !!(lines[i].flags & ML_EFFECT1); break; + case 13: //Heat wave effect + { + INT32 s; + + TAG_ITER_SECTORS(tag, s) + sectors[s].flags |= MSF_HEATWAVE; + + break; + } case 14: //Bustable block parameters lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; diff --git a/src/p_user.c b/src/p_user.c index 60000afa0..8adb6ef9b 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -10466,7 +10466,6 @@ static void P_CalcPostImg(player_t *player) postimg_t *type; INT32 *param; fixed_t pviewheight; - size_t i; if (player->mo->eflags & MFE_VERTICALFLIP) pviewheight = player->mo->z + player->mo->height - player->viewheight; @@ -10491,45 +10490,30 @@ static void P_CalcPostImg(player_t *player) } // see if we are in heat (no, not THAT kind of heat...) - for (i = 0; i < sector->tags.count; i++) + if (sector->flags & MSF_HEATWAVE) + *type = postimg_heat; + else if (sector->ffloors) { - if (Tag_FindLineSpecial(13, sector->tags.tags[i]) != -1) - { - *type = postimg_heat; - break; - } - else if (sector->ffloors) - { - ffloor_t *rover; - fixed_t topheight; - fixed_t bottomheight; - boolean gotres = false; + ffloor_t *rover; + fixed_t topheight; + fixed_t bottomheight; - for (rover = sector->ffloors; rover; rover = rover->next) + for (rover = sector->ffloors; rover; rover = rover->next) + { + if (!(rover->flags & FF_EXISTS)) + continue; + + topheight = P_GetFFloorTopZAt (rover, player->mo->x, player->mo->y); + bottomheight = P_GetFFloorBottomZAt(rover, player->mo->x, player->mo->y); + + if (pviewheight >= topheight || pviewheight <= bottomheight) + continue; + + if (rover->master->frontsector->flags & MSF_HEATWAVE) { - size_t j; - - if (!(rover->flags & FF_EXISTS)) - continue; - - topheight = P_GetFFloorTopZAt (rover, player->mo->x, player->mo->y); - bottomheight = P_GetFFloorBottomZAt(rover, player->mo->x, player->mo->y); - - if (pviewheight >= topheight || pviewheight <= bottomheight) - continue; - - for (j = 0; j < rover->master->frontsector->tags.count; j++) - { - if (Tag_FindLineSpecial(13, rover->master->frontsector->tags.tags[j]) != -1) - { - *type = postimg_heat; - gotres = true; - break; - } - } - } - if (gotres) + *type = postimg_heat; break; + } } } diff --git a/src/r_defs.h b/src/r_defs.h index c10428431..16c4ad64f 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -284,6 +284,7 @@ typedef enum MSF_TRIGGERSPECIAL_HEADBUMP = 1<<3, // invertprecip - inverts presence of precipitation MSF_INVERTPRECIP = 1<<4, + MSF_HEATWAVE = 1<<5, // heat wave effect } sectorflags_t; From e3d41e0bda760400521d8b847b27fd5c826e9839 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 30 Dec 2021 15:32:28 +0100 Subject: [PATCH 262/377] Adapt linedef type 540 to UDMF --- extras/conf/udb/Includes/SRB222_misc.cfg | 6 +++ src/lua_maplib.c | 6 +++ src/p_setup.c | 9 ++++ src/p_spec.c | 54 ++++++++++++------------ src/r_defs.h | 2 + 5 files changed, 50 insertions(+), 27 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 52cd22322..4139fa967 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -226,6 +226,12 @@ universalfields type = 3; default = false; } + + friction + { + type = 0; + default = 0; + } } linedef diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 9f267d071..a74c6fc97 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -50,6 +50,7 @@ enum sector_e { sector_fslope, sector_cslope, sector_flags, + sector_friction, }; static const char *const sector_opt[] = { @@ -74,6 +75,7 @@ static const char *const sector_opt[] = { "f_slope", "c_slope", "flags", + "friction", NULL}; enum subsector_e { @@ -654,6 +656,9 @@ static int sector_get(lua_State *L) case sector_flags: // flags lua_pushinteger(L, sector->flags); return 1; + case sector_friction: // friction + lua_pushinteger(L, sector->friction); + return 1; } return 0; } @@ -681,6 +686,7 @@ static int sector_set(lua_State *L) case sector_ffloors: // ffloors case sector_fslope: // f_slope case sector_cslope: // c_slope + case sector_friction: // friction default: return luaL_error(L, "sector_t field " LUA_QS " cannot be set.", sector_opt[field]); case sector_floorheight: { // floorheight diff --git a/src/p_setup.c b/src/p_setup.c index ec35ad824..85d4ee5dc 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1674,6 +1674,8 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) sectors[i].flags |= MSF_INVERTPRECIP; else if (fastcmp(param, "heatwave") && fastcmp("true", val)) sectors[i].flags |= MSF_HEATWAVE; + else if (fastcmp(param, "friction")) + sectors[i].friction = atol(val); } static void ParseTextmapSidedefParameter(UINT32 i, char *param, char *val) @@ -4835,6 +4837,13 @@ static void P_ConvertBinaryMap(void) lines[i].args[4] |= TMST_NONEXCLUSIVE; lines[i].special = 510; break; + case 540: //Floor friction + { + INT32 s; + TAG_ITER_SECTORS(tag, s) + sectors[s].friction = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + break; + } case 541: //Wind case 542: //Upwards wind case 543: //Downwards wind diff --git a/src/p_spec.c b/src/p_spec.c index ef48fbf62..69b76aee7 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -8184,40 +8184,40 @@ void T_Friction(friction_t *f) static void P_SpawnFriction(void) { size_t i; - line_t *l = lines; - mtag_t tag; - register INT32 s; - fixed_t strength; // frontside texture offset controls magnitude + sector_t *s = sectors; + + fixed_t strength; // friction value of sector fixed_t friction; // friction value to be applied during movement INT32 movefactor; // applied to each player move to simulate inertia - for (i = 0; i < numlines; i++, l++) - if (l->special == 540) - { - tag = Tag_FGet(&l->tags); - strength = sides[l->sidenum[0]].textureoffset>>FRACBITS; - if (strength > 0) // sludge - strength = strength*2; // otherwise, the maximum sludginess value is +967... + for (i = 0; i < numsectors; i++, s++) + { + if (!s->friction) + continue; - // The following might seem odd. At the time of movement, - // the move distance is multiplied by 'friction/0x10000', so a - // higher friction value actually means 'less friction'. - friction = ORIG_FRICTION - (0x1EB8*strength)/0x80; // ORIG_FRICTION is 0xE800 + strength = s->friction; + if (strength > 0) // sludge + strength = strength*2; // otherwise, the maximum sludginess value is +967... - if (friction > FRACUNIT) - friction = FRACUNIT; - if (friction < 0) - friction = 0; + // The following might seem odd. At the time of movement, + // the move distance is multiplied by 'friction/0x10000', so a + // higher friction value actually means 'less friction'. + friction = ORIG_FRICTION - (0x1EB8*strength)/0x80; // ORIG_FRICTION is 0xE800 - movefactor = FixedDiv(ORIG_FRICTION, friction); - if (movefactor < FRACUNIT) - movefactor = 8*movefactor - 7*FRACUNIT; - else - movefactor = FRACUNIT; + if (friction > FRACUNIT) + friction = FRACUNIT; + if (friction < 0) + friction = 0; - TAG_ITER_SECTORS(tag, s) - Add_Friction(friction, movefactor, s, -1); - } + movefactor = FixedDiv(ORIG_FRICTION, friction); + if (movefactor < FRACUNIT) + movefactor = 8*movefactor - 7*FRACUNIT; + else + movefactor = FRACUNIT; + + Add_Friction(friction, movefactor, (INT32)(s-sectors), -1); + + } } /* diff --git a/src/r_defs.h b/src/r_defs.h index 16c4ad64f..105494bd7 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -371,6 +371,8 @@ typedef struct sector_s boolean verticalflip; // If gravity < 0, then allow flipped physics sectorflags_t flags; + INT32 friction; + // Sprite culling feature struct line_s *cullheight; From 86e2fefcacec985ff8f5c20ea8428f96f61d4518 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 30 Dec 2021 18:19:42 +0100 Subject: [PATCH 263/377] Add sector gravity field for UDMF --- src/lua_maplib.c | 8 ++++++++ src/p_enemy.c | 15 +++------------ src/p_mobj.c | 14 ++++++-------- src/p_saveg.c | 8 +++++++- src/p_setup.c | 8 +++++++- src/p_spec.c | 10 +++++++++- src/p_spec.h | 1 + src/r_defs.h | 4 ++-- 8 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/lua_maplib.c b/src/lua_maplib.c index a74c6fc97..0a147acbb 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -51,6 +51,7 @@ enum sector_e { sector_cslope, sector_flags, sector_friction, + sector_gravity, }; static const char *const sector_opt[] = { @@ -76,6 +77,7 @@ static const char *const sector_opt[] = { "c_slope", "flags", "friction", + "gravity", NULL}; enum subsector_e { @@ -659,6 +661,9 @@ static int sector_get(lua_State *L) case sector_friction: // friction lua_pushinteger(L, sector->friction); return 1; + case sector_gravity: // gravity + lua_pushfixed(L, sector->gravity); + return 1; } return 0; } @@ -749,6 +754,9 @@ static int sector_set(lua_State *L) case sector_flags: sector->flags = luaL_checkinteger(L, 3); break; + case sector_gravity: + sector->gravity = luaL_checkfixed(L, 3); + break; } return 0; } diff --git a/src/p_enemy.c b/src/p_enemy.c index 5c92bdc06..9cf5687e7 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -11461,10 +11461,7 @@ void A_BrakLobShot(mobj_t *actor) return; // Don't even bother if we've got nothing to aim at. // Look up actor's current gravity situation - if (actor->subsector->sector->gravity) - g = FixedMul(gravity,(FixedDiv(*actor->subsector->sector->gravity>>FRACBITS, 1000))); - else - g = gravity; + g = FixedMul(gravity, P_GetSectorGravityFactor(actor->subsector->sector)); // Look up distance between actor and its target x = P_AproxDistance(actor->target->x - actor->x, actor->target->y - actor->y); @@ -11576,10 +11573,7 @@ void A_NapalmScatter(mobj_t *actor) airtime = 16<subsector->sector->gravity) - g = FixedMul(gravity,(FixedDiv(*actor->subsector->sector->gravity>>FRACBITS, 1000))); - else - g = gravity; + g = FixedMul(gravity, P_GetSectorGravityFactor(actor->subsector->sector)); // vy = (g*(airtime-1))/2 vy = FixedMul(g,(airtime-(1<>1; @@ -12289,10 +12283,7 @@ void A_Boss5Jump(mobj_t *actor) return; // Don't even bother if we've got nothing to aim at. // Look up actor's current gravity situation - if (actor->subsector->sector->gravity) - g = FixedMul(gravity,(FixedDiv(*actor->subsector->sector->gravity>>FRACBITS, 1000))); - else - g = gravity; + g = FixedMul(gravity, P_GetSectorGravityFactor(actor->subsector->sector)); // Look up distance between actor and its tracer x = P_AproxDistance(actor->tracer->x - actor->x, actor->tracer->y - actor->y); diff --git a/src/p_mobj.c b/src/p_mobj.c index 428274679..aea7964be 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1446,6 +1446,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo) if (mo->subsector->sector->ffloors) // Check for 3D floor gravity too. { ffloor_t *rover; + fixed_t gravfactor; for (rover = mo->subsector->sector->ffloors; rover; rover = rover->next) { @@ -1455,11 +1456,12 @@ fixed_t P_GetMobjGravity(mobj_t *mo) if ((rover->flags & (FF_SWIMMABLE|FF_GOOWATER)) == (FF_SWIMMABLE|FF_GOOWATER)) goopgravity = true; - if (!(rover->master->frontsector->gravity)) + gravfactor = P_GetSectorGravityFactor(mo->subsector->sector); + + if (gravfactor == FRACUNIT) continue; - gravityadd = -FixedMul(gravity, - (FixedDiv(*rover->master->frontsector->gravity>>FRACBITS, 1000))); + gravityadd = -FixedMul(gravity, gravfactor); if (rover->master->frontsector->verticalflip && gravityadd > 0) mo->eflags |= MFE_VERTICALFLIP; @@ -1471,11 +1473,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo) if (no3dfloorgrav) { - if (mo->subsector->sector->gravity) - gravityadd = -FixedMul(gravity, - (FixedDiv(*mo->subsector->sector->gravity>>FRACBITS, 1000))); - else - gravityadd = -gravity; + gravityadd = -FixedMul(gravity, P_GetSectorGravityFactor(mo->subsector->sector)); if (mo->subsector->sector->verticalflip && gravityadd > 0) mo->eflags |= MFE_VERTICALFLIP; diff --git a/src/p_saveg.c b/src/p_saveg.c index 0f5679940..66df83603 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -853,6 +853,7 @@ static void P_NetUnArchiveWaypoints(void) #define SD_FLOORLIGHT 0x08 #define SD_CEILLIGHT 0x10 #define SD_FLAG 0x20 +#define SD_GRAVITY 0x40 #define LD_FLAG 0x01 #define LD_SPECIAL 0x02 @@ -1040,6 +1041,8 @@ static void ArchiveSectors(void) diff3 |= SD_CEILLIGHT; if (ss->flags != spawnss->flags) diff3 |= SD_FLAG; + if (ss->gravity != spawnss->gravity) + diff3 |= SD_GRAVITY; if (ss->ffloors && CheckFFloorDiff(ss)) diff |= SD_FFLOORS; @@ -1106,6 +1109,8 @@ static void ArchiveSectors(void) } if (diff3 & SD_FLAG) WRITEUINT32(save_p, ss->flags); + if (diff3 & SD_GRAVITY) + WRITEFIXED(save_p, ss->gravity); if (diff & SD_FFLOORS) ArchiveFFloors(ss); } @@ -1209,7 +1214,8 @@ static void UnArchiveSectors(void) } if (diff3 & SD_FLAG) sectors[i].flags = READUINT32(save_p); - + if (diff3 & SD_GRAVITY) + sectors[i].gravity = READFIXED(save_p); if (diff & SD_FFLOORS) UnArchiveFFloors(§ors[i]); diff --git a/src/p_setup.c b/src/p_setup.c index 85d4ee5dc..2bcde2b92 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -999,7 +999,7 @@ static void P_InitializeSector(sector_t *ss) ss->extra_colormap = NULL; - ss->gravity = NULL; + ss->gravityptr = NULL; ss->verticalflip = false; ss->cullheight = NULL; @@ -1047,6 +1047,8 @@ static void P_LoadSectors(UINT8 *data) ss->colormap_protected = false; + ss->gravity = FRACUNIT; + ss->flags = MSF_FLIPSPECIAL_FLOOR; P_InitializeSector(ss); @@ -1676,6 +1678,8 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) sectors[i].flags |= MSF_HEATWAVE; else if (fastcmp(param, "friction")) sectors[i].friction = atol(val); + else if (fastcmp(param, "gravity")) + sectors[i].gravity = FLOAT_TO_FIXED(atof(val)); } static void ParseTextmapSidedefParameter(UINT32 i, char *param, char *val) @@ -1952,6 +1956,8 @@ static void P_LoadTextmap(void) sc->colormap_protected = false; + sc->gravity = FRACUNIT; + sc->flags = MSF_FLIPSPECIAL_FLOOR; textmap_colormap.used = false; diff --git a/src/p_spec.c b/src/p_spec.c index 69b76aee7..846ce9376 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5958,6 +5958,14 @@ static boolean P_CheckGametypeRules(INT32 checktype, UINT32 target) } } +fixed_t P_GetSectorGravityFactor(sector_t *sec) +{ + if (sec->gravityptr) + return FixedDiv(*sec->gravityptr >> FRACBITS, 1000); + else + return sec->gravity; +} + /** After the map has loaded, scans for specials that spawn 3Dfloors and * thinkers. * @@ -6105,7 +6113,7 @@ void P_SpawnSpecials(boolean fromnetsave) sec = sides[*lines[i].sidenum].sector - sectors; TAG_ITER_SECTORS(tag, s) { - sectors[s].gravity = §ors[sec].floorheight; // This allows it to change in realtime! + sectors[s].gravityptr = §ors[sec].floorheight; // This allows it to change in realtime! if (lines[i].flags & ML_NOCLIMB) sectors[s].verticalflip = true; diff --git a/src/p_spec.h b/src/p_spec.h index 6b1db7faf..82f858a05 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -467,6 +467,7 @@ void P_SetupLevelFlatAnims(void); // at map load void P_InitSpecials(void); void P_ApplyFlatAlignment(sector_t* sector, angle_t flatangle, fixed_t xoffs, fixed_t yoffs, boolean floor, boolean ceiling); +fixed_t P_GetSectorGravityFactor(sector_t *sec); void P_SpawnSpecials(boolean fromnetsave); // every tic diff --git a/src/r_defs.h b/src/r_defs.h index 105494bd7..0fd13b707 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -366,8 +366,8 @@ typedef struct sector_s extracolormap_t *extra_colormap; boolean colormap_protected; - // This points to the master's floorheight, so it can be changed in realtime! - fixed_t *gravity; // per-sector gravity + fixed_t gravity; // per-sector gravity factor + fixed_t *gravityptr; // For binary format: Read gravity from floor height of master sector boolean verticalflip; // If gravity < 0, then allow flipped physics sectorflags_t flags; From b3863c57be9bcf6edaa3ff8821965b6b3e77aca9 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 30 Dec 2021 18:50:02 +0100 Subject: [PATCH 264/377] Replace verticalflip in sector_t with a sector flag that's accessible via Lua and UDMF --- extras/conf/udb/Includes/SRB222_misc.cfg | 1 + src/deh_lua.c | 2 +- src/deh_tables.c | 3 ++- src/deh_tables.h | 2 +- src/lua_maplib.c | 1 + src/p_mobj.c | 4 ++-- src/p_saveg.c | 3 +++ src/p_setup.c | 3 ++- src/p_spec.c | 8 +++++--- src/r_defs.h | 4 ++-- 10 files changed, 20 insertions(+), 11 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 4139fa967..36518be9f 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -79,6 +79,7 @@ sectorflags triggerspecial_touch = "Trigger on Edge Touch"; triggerspecial_headbump = "Trigger on Headbump"; invertprecip = "Invert Precipitation"; + gravityflip = "Flip Objects in Reverse Gravity"; heatwave = "Heat Wave"; } diff --git a/src/deh_lua.c b/src/deh_lua.c index 28030052a..e360febaf 100644 --- a/src/deh_lua.c +++ b/src/deh_lua.c @@ -340,7 +340,7 @@ static inline int lib_getenum(lua_State *L) } else if (fastncmp("MSF_", word, 3)) { p = word + 4; - for (i = 0; i < 5; i++) + for (i = 0; i < 6; i++) if (MSF_LIST[i] && fastcmp(p, MSF_LIST[i])) { lua_pushinteger(L, ((lua_Integer)1 << i)); return 1; diff --git a/src/deh_tables.c b/src/deh_tables.c index b6a9e0225..095aae0f2 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4472,11 +4472,12 @@ const char *const ML_LIST[16] = { }; // Sector flags -const char *const MSF_LIST[5] = { +const char *const MSF_LIST[6] = { "FLIPSPECIAL_FLOOR", "FLIPSPECIAL_CEILING", "TRIGGERSPECIAL_TOUCH", "TRIGGERSPECIAL_HEADBUMP", + "GRAVITYFLIP", "HEATWAVE", }; diff --git a/src/deh_tables.h b/src/deh_tables.h index 982c6ff4a..2e514a5b1 100644 --- a/src/deh_tables.h +++ b/src/deh_tables.h @@ -65,7 +65,7 @@ extern const char *const MAPTHINGFLAG_LIST[4]; extern const char *const PLAYERFLAG_LIST[]; extern const char *const GAMETYPERULE_LIST[]; extern const char *const ML_LIST[16]; // Linedef flags -extern const char* const MSF_LIST[5]; // Sector flags +extern const char* const MSF_LIST[6]; // Sector flags extern const char *COLOR_ENUMS[]; extern const char *const POWERS_LIST[]; extern const char *const HUDITEMS_LIST[]; diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 0a147acbb..74f45535f 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -753,6 +753,7 @@ static int sector_set(lua_State *L) return LUA_ErrSetDirectly(L, "sector_t", "taglist"); case sector_flags: sector->flags = luaL_checkinteger(L, 3); + CheckForReverseGravity |= (sector->flags & MSF_GRAVITYFLIP); break; case sector_gravity: sector->gravity = luaL_checkfixed(L, 3); diff --git a/src/p_mobj.c b/src/p_mobj.c index aea7964be..bdfee2616 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1463,7 +1463,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo) gravityadd = -FixedMul(gravity, gravfactor); - if (rover->master->frontsector->verticalflip && gravityadd > 0) + if ((rover->master->frontsector->flags & MSF_GRAVITYFLIP) && gravityadd > 0) mo->eflags |= MFE_VERTICALFLIP; no3dfloorgrav = false; @@ -1475,7 +1475,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo) { gravityadd = -FixedMul(gravity, P_GetSectorGravityFactor(mo->subsector->sector)); - if (mo->subsector->sector->verticalflip && gravityadd > 0) + if ((mo->subsector->sector->flags & MSF_GRAVITYFLIP) && gravityadd > 0) mo->eflags |= MFE_VERTICALFLIP; } diff --git a/src/p_saveg.c b/src/p_saveg.c index 66df83603..d7a9750b7 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1213,7 +1213,10 @@ static void UnArchiveSectors(void) sectors[i].ceilinglightabsolute = READUINT8(save_p); } if (diff3 & SD_FLAG) + { sectors[i].flags = READUINT32(save_p); + CheckForReverseGravity |= (sectors[i].flags & MSF_GRAVITYFLIP); + } if (diff3 & SD_GRAVITY) sectors[i].gravity = READFIXED(save_p); diff --git a/src/p_setup.c b/src/p_setup.c index 2bcde2b92..70c6276d0 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1000,7 +1000,6 @@ static void P_InitializeSector(sector_t *ss) ss->extra_colormap = NULL; ss->gravityptr = NULL; - ss->verticalflip = false; ss->cullheight = NULL; @@ -1674,6 +1673,8 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) sectors[i].flags |= MSF_TRIGGERSPECIAL_HEADBUMP; else if (fastcmp(param, "invertprecip") && fastcmp("true", val)) sectors[i].flags |= MSF_INVERTPRECIP; + else if (fastcmp(param, "gravityflip") && fastcmp("true", val)) + sectors[i].flags |= MSF_GRAVITYFLIP; else if (fastcmp(param, "heatwave") && fastcmp("true", val)) sectors[i].flags |= MSF_HEATWAVE; else if (fastcmp(param, "friction")) diff --git a/src/p_spec.c b/src/p_spec.c index 846ce9376..604921445 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5994,6 +5994,8 @@ void P_SpawnSpecials(boolean fromnetsave) sector = sectors; for (i = 0; i < numsectors; i++, sector++) { + CheckForReverseGravity |= (sector->flags & MSF_GRAVITYFLIP); + if (!sector->special) continue; @@ -6116,11 +6118,11 @@ void P_SpawnSpecials(boolean fromnetsave) sectors[s].gravityptr = §ors[sec].floorheight; // This allows it to change in realtime! if (lines[i].flags & ML_NOCLIMB) - sectors[s].verticalflip = true; + sectors[s].flags |= MSF_GRAVITYFLIP; else - sectors[s].verticalflip = false; + sectors[s].flags &= ~MSF_GRAVITYFLIP; - CheckForReverseGravity = sectors[s].verticalflip; + CheckForReverseGravity |= (sectors[s].flags & MSF_GRAVITYFLIP); } break; diff --git a/src/r_defs.h b/src/r_defs.h index 0fd13b707..c565473dd 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -284,7 +284,8 @@ typedef enum MSF_TRIGGERSPECIAL_HEADBUMP = 1<<3, // invertprecip - inverts presence of precipitation MSF_INVERTPRECIP = 1<<4, - MSF_HEATWAVE = 1<<5, // heat wave effect + MSF_GRAVITYFLIP = 1<<5, + MSF_HEATWAVE = 1<<6, } sectorflags_t; @@ -368,7 +369,6 @@ typedef struct sector_s fixed_t gravity; // per-sector gravity factor fixed_t *gravityptr; // For binary format: Read gravity from floor height of master sector - boolean verticalflip; // If gravity < 0, then allow flipped physics sectorflags_t flags; INT32 friction; From 7b830fbddf7c6d4b3e7815e9b28914d5c815664c Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 30 Dec 2021 19:28:01 +0100 Subject: [PATCH 265/377] Add "change sector's gravity" linedef executor in UDMF to replace linedef type 1 --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 37 ++++++++++++++++++++ src/p_spec.c | 30 ++++++++++++++++ src/p_spec.h | 7 ++++ 3 files changed, 74 insertions(+) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index e8ec7de2b..e2e1d187a 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -3677,6 +3677,43 @@ udmf enum = "setadd"; } } + + 469 + { + title = "Change Tagged Sector's Gravity"; + prefix = "(469)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } + arg1 + { + title = "Set/Multiply?"; + type = 11; + enum + { + 0 = "Set"; + 1 = "Multiply"; + } + } + arg2 + { + title = "Flip flag"; + type = 11; + enum + { + 0 = "Don't change"; + 1 = "Set"; + 2 = "Remove"; + } + } + stringarg0 + { + title = "Gravity value"; + type = 2; + } + } } linedefexecplane diff --git a/src/p_spec.c b/src/p_spec.c index 604921445..2e6094ef2 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3801,6 +3801,33 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) } break; + case 469: // Change sector gravity + { + fixed_t gravityvalue; + + if (!udmf) + break; + + if (!line->stringargs[0]) + break; + + gravityvalue = FloatToFixed(atof(line->stringargs[0])); + + TAG_ITER_SECTORS(line->args[0], secnum) + { + if (line->args[1]) + sectors[secnum].gravity = FixedMul(sectors[secnum].gravity, gravityvalue); + else + sectors[secnum].gravity = gravityvalue; + + if (line->args[2] == TMF_ADD) + sectors[secnum].flags |= MSF_GRAVITYFLIP; + else if (line->args[2] == TMF_REMOVE) + sectors[secnum].flags &= ~MSF_GRAVITYFLIP; + } + } + break; + case 480: // Polyobj_DoorSlide case 481: // Polyobj_DoorSwing PolyDoor(line); @@ -6112,6 +6139,9 @@ void P_SpawnSpecials(boolean fromnetsave) ffloortype_e ffloorflags; case 1: // Definable gravity per sector + if (udmf) + break; + sec = sides[*lines[i].sidenum].sector - sectors; TAG_ITER_SECTORS(tag, s) { diff --git a/src/p_spec.h b/src/p_spec.h index 82f858a05..c1f25b3d6 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -412,6 +412,13 @@ typedef enum //TMP_FREEZETHINKERS = 1<<6, } textmappromptflags_t; +typedef enum +{ + TMF_NOCHANGE = 0, + TMF_ADD = 1, + TMF_REMOVE = 2, +} textmapsetflagflags_t; + typedef enum { TMSD_FRONT = 0, From 570a6ab395ee0cc2de69e3d1a6e1abb5da6de3a8 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 30 Dec 2021 20:37:57 +0100 Subject: [PATCH 266/377] Turn "intangible to camera" sector special into a sector flag --- extras/conf/udb/Includes/SRB222_misc.cfg | 1 + src/deh_lua.c | 2 +- src/deh_tables.c | 3 ++- src/deh_tables.h | 2 +- src/p_map.c | 6 +++--- src/p_maputl.c | 4 ++-- src/p_setup.c | 14 ++++++++++++++ src/p_spec.c | 2 +- src/p_user.c | 6 +++--- src/r_defs.h | 1 + 10 files changed, 29 insertions(+), 12 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 36518be9f..709514df8 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -81,6 +81,7 @@ sectorflags invertprecip = "Invert Precipitation"; gravityflip = "Flip Objects in Reverse Gravity"; heatwave = "Heat Wave"; + noclipcamera = "Intangible to the Camera"; } thingflags diff --git a/src/deh_lua.c b/src/deh_lua.c index e360febaf..10f5eb46d 100644 --- a/src/deh_lua.c +++ b/src/deh_lua.c @@ -340,7 +340,7 @@ static inline int lib_getenum(lua_State *L) } else if (fastncmp("MSF_", word, 3)) { p = word + 4; - for (i = 0; i < 6; i++) + for (i = 0; i < 7; i++) if (MSF_LIST[i] && fastcmp(p, MSF_LIST[i])) { lua_pushinteger(L, ((lua_Integer)1 << i)); return 1; diff --git a/src/deh_tables.c b/src/deh_tables.c index 095aae0f2..276bfce18 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4472,13 +4472,14 @@ const char *const ML_LIST[16] = { }; // Sector flags -const char *const MSF_LIST[6] = { +const char *const MSF_LIST[7] = { "FLIPSPECIAL_FLOOR", "FLIPSPECIAL_CEILING", "TRIGGERSPECIAL_TOUCH", "TRIGGERSPECIAL_HEADBUMP", "GRAVITYFLIP", "HEATWAVE", + "NOCLIPCAMERA", }; const char *COLOR_ENUMS[] = { diff --git a/src/deh_tables.h b/src/deh_tables.h index 2e514a5b1..8cabb2063 100644 --- a/src/deh_tables.h +++ b/src/deh_tables.h @@ -65,7 +65,7 @@ extern const char *const MAPTHINGFLAG_LIST[4]; extern const char *const PLAYERFLAG_LIST[]; extern const char *const GAMETYPERULE_LIST[]; extern const char *const ML_LIST[16]; // Linedef flags -extern const char* const MSF_LIST[6]; // Sector flags +extern const char* const MSF_LIST[7]; // Sector flags extern const char *COLOR_ENUMS[]; extern const char *const POWERS_LIST[]; extern const char *const HUDITEMS_LIST[]; diff --git a/src/p_map.c b/src/p_map.c index 6b69df9cb..8b236c7c3 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -2319,7 +2319,7 @@ boolean P_CheckCameraPosition(fixed_t x, fixed_t y, camera_t *thiscam) mapcampointer = thiscam; - if (GETSECSPECIAL(newsubsec->sector->special, 4) == 12) + if (newsubsec->sector->flags & MSF_NOCLIPCAMERA) { // Camera noclip on entire sector. tmfloorz = tmdropoffz = thiscam->z; tmceilingz = tmdrpoffceilz = thiscam->z + thiscam->height; @@ -2359,7 +2359,7 @@ boolean P_CheckCameraPosition(fixed_t x, fixed_t y, camera_t *thiscam) for (rover = newsubsec->sector->ffloors; rover; rover = rover->next) { fixed_t topheight, bottomheight; - if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERALL) || GETSECSPECIAL(rover->master->frontsector->special, 4) == 12) + if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERALL) || (rover->master->frontsector->flags & MSF_NOCLIPCAMERA)) continue; topheight = P_CameraGetFOFTopZ(thiscam, newsubsec->sector, rover, x, y, NULL); @@ -2431,7 +2431,7 @@ boolean P_CheckCameraPosition(fixed_t x, fixed_t y, camera_t *thiscam) // We're inside it! Yess... polysec = po->lines[0]->backsector; - if (GETSECSPECIAL(polysec->special, 4) == 12) + if (polysec->flags & MSF_NOCLIPCAMERA) { // Camera noclip polyobj. plink = (polymaplink_t *)(plink->link.next); continue; diff --git a/src/p_maputl.c b/src/p_maputl.c index efcebe736..ee22578ef 100644 --- a/src/p_maputl.c +++ b/src/p_maputl.c @@ -374,7 +374,7 @@ void P_CameraLineOpening(line_t *linedef) for (rover = front->ffloors; rover; rover = rover->next) { fixed_t topheight, bottomheight; - if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_RENDERALL) || !(rover->flags & FF_EXISTS) || GETSECSPECIAL(rover->master->frontsector->special, 4) == 12) + if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_RENDERALL) || !(rover->flags & FF_EXISTS) || (rover->master->frontsector->flags & MSF_NOCLIPCAMERA)) continue; topheight = P_CameraGetFOFTopZ(mapcampointer, front, rover, tmx, tmy, linedef); @@ -398,7 +398,7 @@ void P_CameraLineOpening(line_t *linedef) for (rover = back->ffloors; rover; rover = rover->next) { fixed_t topheight, bottomheight; - if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_RENDERALL) || !(rover->flags & FF_EXISTS) || GETSECSPECIAL(rover->master->frontsector->special, 4) == 12) + if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_RENDERALL) || !(rover->flags & FF_EXISTS) || (rover->master->frontsector->flags & MSF_NOCLIPCAMERA)) continue; topheight = P_CameraGetFOFTopZ(mapcampointer, back, rover, tmx, tmy, linedef); diff --git a/src/p_setup.c b/src/p_setup.c index 70c6276d0..0f398c5bc 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1677,6 +1677,8 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) sectors[i].flags |= MSF_GRAVITYFLIP; else if (fastcmp(param, "heatwave") && fastcmp("true", val)) sectors[i].flags |= MSF_HEATWAVE; + else if (fastcmp(param, "noclipcamera") && fastcmp("true", val)) + sectors[i].flags |= MSF_NOCLIPCAMERA; else if (fastcmp(param, "friction")) sectors[i].friction = atol(val); else if (fastcmp(param, "gravity")) @@ -5017,6 +5019,18 @@ static void P_ConvertBinaryMap(void) } } + for (i = 0; i < numsectors; i++) + { + switch(GETSECSPECIAL(sectors[i].special, 4)) + { + case 12: //Intangible to the camera + sectors[i].flags |= MSF_NOCLIPCAMERA; + break; + default: + break; + } + } + for (i = 0; i < NUMMOBJTYPES; i++) { if (mobjinfo[i].doomednum < 0 || mobjinfo[i].doomednum >= 4096) diff --git a/src/p_spec.c b/src/p_spec.c index 2e6094ef2..9fe9ad8ef 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5017,7 +5017,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers if (isTouching) P_ProcessRopeHang(player, sector, sectag); break; - case 12: // Camera noclip + case 12: // Unused case 13: // Unused case 14: // Unused case 15: // Unused diff --git a/src/p_user.c b/src/p_user.c index 8adb6ef9b..d94b7556f 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -10057,7 +10057,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall for (rover = newsubsec->sector->ffloors; rover; rover = rover->next) { fixed_t topheight, bottomheight; - if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERALL) || GETSECSPECIAL(rover->master->frontsector->special, 4) == 12) + if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERALL) || (rover->master->frontsector->flags & MSF_NOCLIPCAMERA)) continue; topheight = P_CameraGetFOFTopZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); @@ -10121,7 +10121,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall // We're inside it! Yess... polysec = po->lines[0]->backsector; - if (GETSECSPECIAL(polysec->special, 4) == 12) + if (polysec->flags & MSF_NOCLIPCAMERA) { // Camera noclip polyobj. plink = (polymaplink_t *)(plink->link.next); continue; @@ -10183,7 +10183,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall for (rover = newsubsec->sector->ffloors; rover; rover = rover->next) { fixed_t topheight, bottomheight; - if ((rover->flags & FF_BLOCKOTHERS) && (rover->flags & FF_RENDERALL) && (rover->flags & FF_EXISTS) && GETSECSPECIAL(rover->master->frontsector->special, 4) != 12) + if ((rover->flags & FF_BLOCKOTHERS) && (rover->flags & FF_RENDERALL) && (rover->flags & FF_EXISTS) && !(rover->master->frontsector->flags & MSF_NOCLIPCAMERA)) { topheight = P_CameraGetFOFTopZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); bottomheight = P_CameraGetFOFBottomZ(thiscam, newsubsec->sector, rover, midx, midy, NULL); diff --git a/src/r_defs.h b/src/r_defs.h index c565473dd..833958ab1 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -286,6 +286,7 @@ typedef enum MSF_INVERTPRECIP = 1<<4, MSF_GRAVITYFLIP = 1<<5, MSF_HEATWAVE = 1<<6, + MSF_NOCLIPCAMERA = 1<<7, } sectorflags_t; From e1393954c7268dad64543aa249e20f8d33f0d16e Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 30 Dec 2021 21:27:09 +0100 Subject: [PATCH 267/377] Make deprecated sector types inaccessible in UDMF --- extras/conf/SRB2-22.cfg | 8 ++++---- extras/conf/udb/Includes/SRB222_sectors.cfg | 12 ++++++------ src/p_spec.c | 16 ++++++++++------ src/p_user.c | 2 +- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/extras/conf/SRB2-22.cfg b/extras/conf/SRB2-22.cfg index ec568e865..81d8ed193 100644 --- a/extras/conf/SRB2-22.cfg +++ b/extras/conf/SRB2-22.cfg @@ -435,8 +435,8 @@ sectortypes 112 = "Trigger Line Ex. (NiGHTS Mare) "; 128 = "Check for Linedef Executor on FOFs"; 144 = "Egg Capsule"; - 160 = "Special Stage Time/Spheres Parameters"; - 176 = "Custom Global Gravity"; + 160 = "Special Stage Time/Spheres Parameters "; + 176 = "Custom Global Gravity "; 512 = "Wind/Current"; 1024 = "Conveyor Belt"; 1280 = "Speed Pad"; @@ -490,8 +490,8 @@ gen_sectortypes 112 = "Trigger Line Ex. (NiGHTS Mare) "; 128 = "Check for Linedef Executor on FOFs"; 144 = "Egg Capsule"; - 160 = "Special Stage Time/Spheres Parameters"; - 176 = "Custom Global Gravity"; + 160 = "Special Stage Time/Spheres Parameters "; + 176 = "Custom Global Gravity "; } third diff --git a/extras/conf/udb/Includes/SRB222_sectors.cfg b/extras/conf/udb/Includes/SRB222_sectors.cfg index e02bfd7cc..412aed155 100644 --- a/extras/conf/udb/Includes/SRB222_sectors.cfg +++ b/extras/conf/udb/Includes/SRB222_sectors.cfg @@ -22,11 +22,11 @@ sectortypes 64 = "Trigger Line Ex. (Anywhere in Sector)"; 80 = "Trigger Line Ex. (Floor Touch)"; 96 = "Trigger Line Ex. (Emerald Check) "; - 112 = "Trigger Line Ex. (NiGHTS Mare)"; + 112 = "Trigger Line Ex. (NiGHTS Mare) "; 128 = "Check for Linedef Executor on FOFs"; 144 = "Egg Capsule"; - 160 = "Special Stage Time/Spheres Parameters"; - 176 = "Custom Global Gravity"; + 160 = "Special Stage Time/Spheres Parameters "; + 176 = "Custom Global Gravity "; 512 = "Wind/Current"; 1024 = "Conveyor Belt"; 1280 = "Speed Pad"; @@ -75,11 +75,11 @@ gen_sectortypes 64 = "Trigger Line Ex. (Anywhere in Sector)"; 80 = "Trigger Line Ex. (Floor Touch)"; 96 = "Trigger Line Ex. (Emerald Check) "; - 112 = "Trigger Line Ex. (NiGHTS Mare)"; + 112 = "Trigger Line Ex. (NiGHTS Mare) "; 128 = "Check for Linedef Executor on FOFs"; 144 = "Egg Capsule"; - 160 = "Special Stage Time/Spheres Parameters"; - 176 = "Custom Global Gravity"; + 160 = "Special Stage Time/Spheres Parameters "; + 176 = "Custom Global Gravity "; } third diff --git a/src/p_spec.c b/src/p_spec.c index 9fe9ad8ef..388440d75 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4871,6 +4871,8 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers break; /* FALLTHRU */ case 10: // Ring Drainer (No Floor Touch) + if (udmf) + break; if (leveltime % (TICRATE/2) == 0 && player->rings > 0) { player->rings--; @@ -6036,6 +6038,8 @@ void P_SpawnSpecials(boolean fromnetsave) sector->flags |= MSF_TRIGGERSPECIAL_TOUCH; break; case 15: // Bouncy FOF + if (udmf) + break; CONS_Alert(CONS_WARNING, M_GetText("Deprecated bouncy FOF sector type detected. Please use linedef type 76 instead.\n")); CheckForBouncySector = true; break; @@ -6045,21 +6049,21 @@ void P_SpawnSpecials(boolean fromnetsave) switch(GETSECSPECIAL(sector->special, 2)) { case 10: // Time for special stage + if (udmf) + break; + CONS_Alert(CONS_WARNING, M_GetText("Deprecated sector type for special stage requirements detected. Please use the SpecialStageTime and SpecialStageSpheres level header options instead.\n")); sstimer = (sector->floorheight>>FRACBITS) * TICRATE + 6; // Time to finish ssspheres = sector->ceilingheight>>FRACBITS; // Ring count for special stage break; case 11: // Custom global gravity! + if (udmf) + break; + CONS_Alert(CONS_WARNING, M_GetText("Deprecated sector type for global gravity detected. Please use the Gravity level header option instead.\n")); gravity = sector->floorheight/1000; break; } - // Process Section 3 -/* switch(GETSECSPECIAL(player->specialsector, 3)) - { - - }*/ - // Process Section 4 switch(GETSECSPECIAL(sector->special, 4)) { diff --git a/src/p_user.c b/src/p_user.c index d94b7556f..45c64500f 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2677,7 +2677,7 @@ static void P_CheckBouncySectors(player_t *player) continue; // FOFs should not be bouncy if they don't even "exist" // Handle deprecated bouncy FOF sector type - if (GETSECSPECIAL(rover->master->frontsector->special, 1) == 15) + if (!udmf && GETSECSPECIAL(rover->master->frontsector->special, 1) == 15) { rover->flags |= FF_BOUNCY; rover->bouncestrength = P_AproxDistance(rover->master->dx, rover->master->dy)/100; From feaa4f1273b42418718bb4f43a724f17536f66e4 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 31 Dec 2021 00:03:24 +0100 Subject: [PATCH 268/377] Replace most sector specials with sector special flags --- extras/conf/udb/Includes/SRB222_misc.cfg | 19 ++ src/deh_lua.c | 10 + src/deh_tables.c | 22 ++ src/deh_tables.h | 1 + src/lua_baselib.c | 26 ++ src/lua_maplib.c | 8 + src/p_inter.c | 3 +- src/p_map.c | 20 +- src/p_mobj.c | 2 +- src/p_saveg.c | 9 +- src/p_setup.c | 102 +++++++ src/p_spec.c | 363 +++++++++++++---------- src/p_spec.h | 2 + src/p_user.c | 7 +- src/r_defs.h | 23 ++ 15 files changed, 446 insertions(+), 171 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 709514df8..d6210e9f1 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -82,6 +82,25 @@ sectorflags gravityflip = "Flip Objects in Reverse Gravity"; heatwave = "Heat Wave"; noclipcamera = "Intangible to the Camera"; + outerspace = "Space Countdown"; + doublestepup = "Ramp Sector (double step-up/down)"; + nostepdown = "Non-Ramp Sector (No step-down)"; + windcurrent = "Wind/Current"; + conveyor = "Conveyor Belt"; + speedpad = "Speed Pad"; + starpostactivator = "Star Post Activator"; + exit = "Exit"; + specialstagepit = "Special Stage Pit"; + returnflag = "Return Flag"; + redteambase = "Red Team Base"; + blueteambase = "Blue Team Base"; + fan = "Fan Sector"; + supertransform = "Super Sonic Transform"; + forcespin = "Force Spin"; + zoomtubestart = "Zoom Tube Start"; + zoomtubeend = "Zoom Tube End"; + finishline = "Circuit Finish Line"; + ropehang = "Rope Hang"; } thingflags diff --git a/src/deh_lua.c b/src/deh_lua.c index 10f5eb46d..56d2ec1e9 100644 --- a/src/deh_lua.c +++ b/src/deh_lua.c @@ -353,6 +353,16 @@ static inline int lib_getenum(lua_State *L) if (mathlib) return luaL_error(L, "sector flag '%s' could not be found.\n", word); return 0; } + else if (fastncmp("SSF_", word, 3)) { + p = word + 4; + for (i = 0; i < 19; i++) + if (SSF_LIST[i] && fastcmp(p, SSF_LIST[i])) { + lua_pushinteger(L, ((lua_Integer)1 << i)); + return 1; + } + if (mathlib) return luaL_error(L, "sector special flag '%s' could not be found.\n", word); + return 0; + } else if (fastncmp("S_",word,2)) { p = word+2; for (i = 0; i < NUMSTATEFREESLOTS; i++) { diff --git a/src/deh_tables.c b/src/deh_tables.c index 276bfce18..26fa74c90 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4482,6 +4482,28 @@ const char *const MSF_LIST[7] = { "NOCLIPCAMERA", }; +// Sector special flags +const char* const SSF_LIST[19] = { + "OUTERSPACE", + "DOUBLESTEPUP", + "WINDCURRENT", + "CONVEYOR", + "SPEEDPAD", + "STARPOSTACTIVATOR", + "EXIT", + "SPECIALSTAGEPIT", + "RETURNFLAG", + "REDTEAMBASE", + "BLUETEAMBASE", + "FAN", + "SUPERTRANSFORM", + "FORCESPIN", + "ZOOMTUBESTART", + "ZOOMTUBEEND", + "FINISHLINE", + "ROPEHANG", +}; + const char *COLOR_ENUMS[] = { "NONE", // SKINCOLOR_NONE, diff --git a/src/deh_tables.h b/src/deh_tables.h index 8cabb2063..35f58c882 100644 --- a/src/deh_tables.h +++ b/src/deh_tables.h @@ -66,6 +66,7 @@ extern const char *const PLAYERFLAG_LIST[]; extern const char *const GAMETYPERULE_LIST[]; extern const char *const ML_LIST[16]; // Linedef flags extern const char* const MSF_LIST[7]; // Sector flags +extern const char* const SSF_LIST[19]; // Sector special flags extern const char *COLOR_ENUMS[]; extern const char *const POWERS_LIST[]; extern const char *const HUDITEMS_LIST[]; diff --git a/src/lua_baselib.c b/src/lua_baselib.c index d64f8abd2..27af76ed8 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -2215,6 +2215,18 @@ static int lib_pMobjTouchingSectorSpecial(lua_State *L) return 1; } +static int lib_pMobjTouchingSectorSpecialFlag(lua_State *L) +{ + mobj_t *mo = *((mobj_t**)luaL_checkudata(L, 1, META_MOBJ)); + sectorspecialflags_t flag = (INT32)luaL_checkinteger(L, 2); + //HUDSAFE + INLEVEL + if (!mo) + return LUA_ErrInvalid(L, "mobj_t"); + LUA_PushUserdata(L, P_MobjTouchingSectorSpecialFlag(mo, flag), META_SECTOR); + return 1; +} + static int lib_pPlayerTouchingSectorSpecial(lua_State *L) { player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); @@ -2228,6 +2240,18 @@ static int lib_pPlayerTouchingSectorSpecial(lua_State *L) return 1; } +static int lib_pPlayerTouchingSectorSpecialFlag(lua_State *L) +{ + player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + sectorspecialflags_t flag = (INT32)luaL_checkinteger(L, 2); + //HUDSAFE + INLEVEL + if (!player) + return LUA_ErrInvalid(L, "player_t"); + LUA_PushUserdata(L, P_PlayerTouchingSectorSpecialFlag(player, flag), META_SECTOR); + return 1; +} + static int lib_pFindLowestFloorSurrounding(lua_State *L) { sector_t *sector = *((sector_t **)luaL_checkudata(L, 1, META_SECTOR)); @@ -4059,7 +4083,9 @@ static luaL_Reg lib[] = { {"P_DoSuperTransformation",lib_pDoSuperTransformation}, {"P_ExplodeMissile",lib_pExplodeMissile}, {"P_MobjTouchingSectorSpecial",lib_pMobjTouchingSectorSpecial}, + {"P_MobjTouchingSectorSpecialFlag",lib_pMobjTouchingSectorSpecialFlag}, {"P_PlayerTouchingSectorSpecial",lib_pPlayerTouchingSectorSpecial}, + {"P_PlayerTouchingSectorSpecialFlag",lib_pPlayerTouchingSectorSpecialFlag}, {"P_FindLowestFloorSurrounding",lib_pFindLowestFloorSurrounding}, {"P_FindHighestFloorSurrounding",lib_pFindHighestFloorSurrounding}, {"P_FindNextHighestFloor",lib_pFindNextHighestFloor}, diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 74f45535f..8ab8c7e83 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -50,6 +50,7 @@ enum sector_e { sector_fslope, sector_cslope, sector_flags, + sector_specialflags, sector_friction, sector_gravity, }; @@ -76,6 +77,7 @@ static const char *const sector_opt[] = { "f_slope", "c_slope", "flags", + "specialflags", "friction", "gravity", NULL}; @@ -658,6 +660,9 @@ static int sector_get(lua_State *L) case sector_flags: // flags lua_pushinteger(L, sector->flags); return 1; + case sector_specialflags: // specialflags + lua_pushinteger(L, sector->specialflags); + return 1; case sector_friction: // friction lua_pushinteger(L, sector->friction); return 1; @@ -755,6 +760,9 @@ static int sector_set(lua_State *L) sector->flags = luaL_checkinteger(L, 3); CheckForReverseGravity |= (sector->flags & MSF_GRAVITYFLIP); break; + case sector_specialflags: + sector->specialflags = luaL_checkinteger(L, 3); + break; case sector_gravity: sector->gravity = luaL_checkfixed(L, 3); break; diff --git a/src/p_inter.c b/src/p_inter.c index 028ac0ef3..caf247f96 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -763,6 +763,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) // return; { UINT8 flagteam = (special->type == MT_REDFLAG) ? 1 : 2; + sectorspecialflags_t specialflag = (special->type == MT_REDFLAG) ? SSF_REDTEAMBASE : SSF_BLUETEAMBASE; const char *flagtext; char flagcolor; char plname[MAXPLAYERNAME+4]; @@ -792,7 +793,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) special->fuse = 1; special->flags2 |= MF2_JUSTATTACKED; - if (!P_PlayerTouchingSectorSpecial(player, 4, 2 + flagteam)) + if (!P_PlayerTouchingSectorSpecialFlag(player, specialflag)) { CONS_Printf(M_GetText("%s returned the %c%s%c to base.\n"), plname, flagcolor, flagtext, 0x80); diff --git a/src/p_map.c b/src/p_map.c index 8b236c7c3..beae1a8ea 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -2699,14 +2699,14 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff) if (thing->player) { - // If using type Section1:13, double the maxstep. - if (P_PlayerTouchingSectorSpecial(thing->player, 1, 13) - || GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1) == 13) + // If using SSF_DOUBLESTEPUP, double the maxstep. + if (P_PlayerTouchingSectorSpecialFlag(thing->player, SSF_DOUBLESTEPUP) + || (R_PointInSubsector(x, y)->sector->specialflags & SSF_DOUBLESTEPUP)) maxstep <<= 1; - // If using type Section1:14, no maxstep. - if (P_PlayerTouchingSectorSpecial(thing->player, 1, 14) - || GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1) == 14) + // If using SSF_NOSTEPDOWN, no maxstep. + if (P_PlayerTouchingSectorSpecialFlag(thing->player, SSF_NOSTEPDOWN) + || (R_PointInSubsector(x, y)->sector->specialflags & SSF_NOSTEPDOWN)) maxstep = 0; // Don't 'step up' while springing, @@ -2717,12 +2717,12 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff) } else if (thing->flags & MF_PUSHABLE) { - // If using type Section1:13, double the maxstep. - if (GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1) == 13) + // If using SSF_DOUBLESTEPUP, double the maxstep. + if (R_PointInSubsector(x, y)->sector->specialflags & SSF_DOUBLESTEPUP) maxstep <<= 1; - // If using type Section1:14, no maxstep. - if (GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1) == 14) + // If using SSF_NOSTEPDOWN, no maxstep. + if (R_PointInSubsector(x, y)->sector->specialflags & SSF_NOSTEPDOWN) maxstep = 0; } diff --git a/src/p_mobj.c b/src/p_mobj.c index bdfee2616..4b31307ef 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9738,7 +9738,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) break; case MT_BLUEFLAG: case MT_REDFLAG: - if (P_MobjTouchingSectorSpecial(mobj, 4, 2)) + if (P_MobjTouchingSectorSpecialFlag(mobj, SSF_RETURNFLAG)) mobj->fuse = 1; // Return to base. break; case MT_SPINDUST: // Spindash dust diff --git a/src/p_saveg.c b/src/p_saveg.c index d7a9750b7..1923fa576 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -853,7 +853,8 @@ static void P_NetUnArchiveWaypoints(void) #define SD_FLOORLIGHT 0x08 #define SD_CEILLIGHT 0x10 #define SD_FLAG 0x20 -#define SD_GRAVITY 0x40 +#define SD_SPECIALFLAG 0x40 +#define SD_GRAVITY 0x80 #define LD_FLAG 0x01 #define LD_SPECIAL 0x02 @@ -1041,6 +1042,8 @@ static void ArchiveSectors(void) diff3 |= SD_CEILLIGHT; if (ss->flags != spawnss->flags) diff3 |= SD_FLAG; + if (ss->specialflags != spawnss->specialflags) + diff3 |= SD_SPECIALFLAG; if (ss->gravity != spawnss->gravity) diff3 |= SD_GRAVITY; @@ -1109,6 +1112,8 @@ static void ArchiveSectors(void) } if (diff3 & SD_FLAG) WRITEUINT32(save_p, ss->flags); + if (diff3 & SD_SPECIALFLAG) + WRITEUINT32(save_p, ss->specialflags); if (diff3 & SD_GRAVITY) WRITEFIXED(save_p, ss->gravity); if (diff & SD_FFLOORS) @@ -1217,6 +1222,8 @@ static void UnArchiveSectors(void) sectors[i].flags = READUINT32(save_p); CheckForReverseGravity |= (sectors[i].flags & MSF_GRAVITYFLIP); } + if (diff3 & SD_SPECIALFLAG) + sectors[i].specialflags = READUINT32(save_p); if (diff3 & SD_GRAVITY) sectors[i].gravity = READFIXED(save_p); diff --git a/src/p_setup.c b/src/p_setup.c index 0f398c5bc..17fd5bb63 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1679,6 +1679,44 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) sectors[i].flags |= MSF_HEATWAVE; else if (fastcmp(param, "noclipcamera") && fastcmp("true", val)) sectors[i].flags |= MSF_NOCLIPCAMERA; + else if (fastcmp(param, "outerspace") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_OUTERSPACE; + else if (fastcmp(param, "doublestepup") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_DOUBLESTEPUP; + else if (fastcmp(param, "nostepdown") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_NOSTEPDOWN; + else if (fastcmp(param, "windcurrent") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_WINDCURRENT; + else if (fastcmp(param, "conveyor") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_CONVEYOR; + else if (fastcmp(param, "speedpad") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_SPEEDPAD; + else if (fastcmp(param, "starpostactivator") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_STARPOSTACTIVATOR; + else if (fastcmp(param, "exit") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_EXIT; + else if (fastcmp(param, "specialstagepit") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_SPECIALSTAGEPIT; + else if (fastcmp(param, "returnflag") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_RETURNFLAG; + else if (fastcmp(param, "redteambase") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_REDTEAMBASE; + else if (fastcmp(param, "blueteambase") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_BLUETEAMBASE; + else if (fastcmp(param, "fan") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_FAN; + else if (fastcmp(param, "supertransform") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_SUPERTRANSFORM; + else if (fastcmp(param, "forcespin") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_FORCESPIN; + else if (fastcmp(param, "zoomtubestart") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_ZOOMTUBESTART; + else if (fastcmp(param, "zoomtubeend") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_ZOOMTUBEEND; + else if (fastcmp(param, "finishline") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_FINISHLINE; + else if (fastcmp(param, "ropehang") && fastcmp("true", val)) + sectors[i].specialflags |= SSF_ROPEHANG; else if (fastcmp(param, "friction")) sectors[i].friction = atol(val); else if (fastcmp(param, "gravity")) @@ -5021,8 +5059,72 @@ static void P_ConvertBinaryMap(void) for (i = 0; i < numsectors; i++) { + + switch(GETSECSPECIAL(sectors[i].special, 1)) + { + case 12: //Space countdown + sectors[i].specialflags |= SSF_OUTERSPACE; + break; + case 13: //Ramp sector + sectors[i].specialflags |= SSF_DOUBLESTEPUP; + break; + case 14: //Non-ramp sector + sectors[i].specialflags |= SSF_NOSTEPDOWN; + break; + default: + break; + } + + switch(GETSECSPECIAL(sectors[i].special, 3)) + { + case 2: //Wind/Current + sectors[i].specialflags |= SSF_WINDCURRENT; + break; + case 4: //Conveyor belt + sectors[i].specialflags |= SSF_CONVEYOR; + break; + case 5: //Speed pad + sectors[i].specialflags |= SSF_SPEEDPAD; + break; + default: + break; + } + switch(GETSECSPECIAL(sectors[i].special, 4)) { + case 1: //Star post activator + sectors[i].specialflags |= SSF_STARPOSTACTIVATOR; + break; + case 2: //Exit/Special Stage pit/Return flag + sectors[i].specialflags |= SSF_EXIT|SSF_SPECIALSTAGEPIT|SSF_RETURNFLAG; + break; + case 3: //Red team base + sectors[i].specialflags |= SSF_REDTEAMBASE; + break; + case 4: //Blue team base + sectors[i].specialflags |= SSF_BLUETEAMBASE; + break; + case 5: //Fan sector + sectors[i].specialflags |= SSF_FAN; + break; + case 6: //Super Sonic transform + sectors[i].specialflags |= SSF_SUPERTRANSFORM; + break; + case 7: //Force spin + sectors[i].specialflags |= SSF_FORCESPIN; + break; + case 8: //Zoom tube start + sectors[i].specialflags |= SSF_ZOOMTUBESTART; + break; + case 9: //Zoom tube end + sectors[i].specialflags |= SSF_ZOOMTUBEEND; + break; + case 10: //Circuit finish line + sectors[i].specialflags |= SSF_FINISHLINE; + break; + case 11: //Rope hang + sectors[i].specialflags |= SSF_ROPEHANG; + break; case 12: //Intangible to the camera sectors[i].flags |= MSF_NOCLIPCAMERA; break; diff --git a/src/p_spec.c b/src/p_spec.c index 388440d75..2e4821972 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3933,7 +3933,7 @@ boolean P_IsFlagAtBase(mobjtype_t flag) { thinker_t *think; mobj_t *mo; - INT32 specialnum = (flag == MT_REDFLAG) ? 3 : 4; + sectorspecialflags_t specialflag = (flag == MT_REDFLAG) ? SSF_REDTEAMBASE : SSF_BLUETEAMBASE; for (think = thlist[THINK_MOBJ].next; think != &thlist[THINK_MOBJ]; think = think->next) { @@ -3945,7 +3945,7 @@ boolean P_IsFlagAtBase(mobjtype_t flag) if (mo->type != flag) continue; - if (GETSECSPECIAL(mo->subsector->sector->special, 4) == specialnum) + if (mo->subsector->sector->specialflags & specialflag) return true; else if (mo->subsector->sector->ffloors) // Check the 3D floors { @@ -3956,7 +3956,7 @@ boolean P_IsFlagAtBase(mobjtype_t flag) if (!(rover->flags & FF_EXISTS)) continue; - if (GETSECSPECIAL(rover->master->frontsector->special, 4) != specialnum) + if (!(rover->master->frontsector->specialflags & specialflag)) continue; if (!(mo->z <= P_GetSpecialTopZ(mo, sectors + rover->secnum, mo->subsector->sector) @@ -4041,6 +4041,30 @@ static sector_t *P_MobjTouching3DFloorSpecial(mobj_t *mo, sector_t *sector, INT3 return NULL; } +static sector_t *P_MobjTouching3DFloorSpecialFlag(mobj_t *mo, sector_t *sector, sectorspecialflags_t flag) +{ + ffloor_t *rover; + + for (rover = sector->ffloors; rover; rover = rover->next) + { + if (!(rover->master->frontsector->specialflags & flag)) + continue; + + if (!(rover->flags & FF_EXISTS)) + continue; + + if (!P_IsMobjTouching3DFloor(mo, rover, sector)) + continue; + + // This FOF has the special we're looking for, but are we allowed to touch it? + if (sector == mo->subsector->sector + || (rover->master->frontsector->flags & MSF_TRIGGERSPECIAL_TOUCH)) + return rover->master->frontsector; + } + + return NULL; +} + static sector_t *P_MobjTouchingPolyobjSpecial(mobj_t *mo, INT32 section, INT32 number) { polyobj_t *po; @@ -4073,6 +4097,38 @@ static sector_t *P_MobjTouchingPolyobjSpecial(mobj_t *mo, INT32 section, INT32 n return NULL; } +static sector_t *P_MobjTouchingPolyobjSpecialFlag(mobj_t *mo, sectorspecialflags_t flag) +{ + polyobj_t *po; + sector_t *polysec; + boolean touching = false; + boolean inside = false; + + for (po = mo->subsector->polyList; po; po = (polyobj_t *)(po->link.next)) + { + if (po->flags & POF_NOSPECIALS) + continue; + + polysec = po->lines[0]->backsector; + + if (!(polysec->specialflags & flag)) + continue; + + touching = (polysec->flags & MSF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, mo); + inside = P_MobjInsidePolyobj(po, mo); + + if (!(inside || touching)) + continue; + + if (!P_IsMobjTouchingPolyobj(mo, po, polysec)) + continue; + + return polysec; + } + + return NULL; +} + sector_t *P_MobjTouchingSectorSpecial(mobj_t *mo, INT32 section, INT32 number) { msecnode_t *node; @@ -4101,7 +4157,42 @@ sector_t *P_MobjTouchingSectorSpecial(mobj_t *mo, INT32 section, INT32 number) if (!(node->m_sector->flags & MSF_TRIGGERSPECIAL_TOUCH)) continue; - if (GETSECSPECIAL(mo->subsector->sector->special, section) == number) + if (GETSECSPECIAL(node->m_sector->special, section) == number) + return node->m_sector; + } + + return NULL; +} + +sector_t *P_MobjTouchingSectorSpecialFlag(mobj_t *mo, sectorspecialflags_t flag) +{ + msecnode_t *node; + sector_t *result; + + result = P_MobjTouching3DFloorSpecialFlag(mo, mo->subsector->sector, flag); + if (result) + return result; + + result = P_MobjTouchingPolyobjSpecialFlag(mo, flag); + if (result) + return result; + + if (mo->subsector->sector->specialflags & flag) + return mo->subsector->sector; + + for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next) + { + if (node->m_sector == mo->subsector->sector) // Don't duplicate + continue; + + result = P_MobjTouching3DFloorSpecialFlag(mo, node->m_sector, flag); + if (result) + return result; + + if (!(node->m_sector->flags & MSF_TRIGGERSPECIAL_TOUCH)) + continue; + + if (node->m_sector->specialflags & flag) return node->m_sector; } @@ -4127,6 +4218,14 @@ sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 n return P_MobjTouchingSectorSpecial(player->mo, section, number); } +sector_t *P_PlayerTouchingSectorSpecialFlag(player_t *player, sectorspecialflags_t flag) +{ + if (!player->mo) + return NULL; + + return P_MobjTouchingSectorSpecialFlag(player->mo, flag); +} + static sector_t *P_Check3DFloorTriggers(player_t *player, sector_t *sector, line_t *sourceline) { ffloor_t *rover; @@ -4371,7 +4470,7 @@ static void P_ProcessSpeedPad(player_t *player, sector_t *sector, sector_t *rove if (lineindex == -1) { - CONS_Debug(DBG_GAMELOGIC, "ERROR: Sector special %d missing line special #4.\n", sector->special); + CONS_Debug(DBG_GAMELOGIC, "ERROR: Speed pad missing line special #4.\n"); return; } @@ -4425,7 +4524,27 @@ static void P_ProcessSpeedPad(player_t *player, sector_t *sector, sector_t *rove S_StartSound(player->mo, sfxnum); } -static void P_ProcessExitSector(player_t *player, boolean isTouching, mtag_t sectag) +static void P_ProcessSpecialStagePit(player_t* player) +{ + if (!(gametyperules & GTR_ALLOWEXIT)) + return; + + if (player->bot) + return; + + if (!G_IsSpecialStage(gamemap)) + return; + + if (maptol & TOL_NIGHTS) + return; + + if (player->nightstime <= 6) + return; + + player->nightstime = 6; // Just let P_Ticker take care of the rest. +} + +static void P_ProcessExitSector(player_t *player, mtag_t sectag) { INT32 lineindex; @@ -4435,13 +4554,6 @@ static void P_ProcessExitSector(player_t *player, boolean isTouching, mtag_t sec if (player->bot) return; - if (!(maptol & TOL_NIGHTS) && G_IsSpecialStage(gamemap)) - { - if (player->nightstime > 6 && isTouching) - player->nightstime = 6; // Just let P_Ticker take care of the rest. - return; - } - // Exit (for FOF exits; others are handled in P_PlayerThink in p_user.c) P_DoPlayerFinish(player); @@ -4515,7 +4627,7 @@ static void P_ProcessTeamBase(player_t *player, boolean redteam) P_AddPlayerScore(player, 250); } -static void P_ProcessZoomTube(player_t *player, sector_t *sector, mtag_t sectag, boolean end) +static void P_ProcessZoomTube(player_t *player, mtag_t sectag, boolean end) { INT32 sequence; fixed_t speed; @@ -4534,7 +4646,7 @@ static void P_ProcessZoomTube(player_t *player, sector_t *sector, mtag_t sectag, if (lineindex == -1) { - CONS_Debug(DBG_GAMELOGIC, "ERROR: Sector special %d missing line special #3.\n", sector->special); + CONS_Debug(DBG_GAMELOGIC, "ERROR: Zoom tube missing line special #3.\n"); return; } @@ -4630,7 +4742,7 @@ static void P_ProcessFinishLine(player_t *player) } } -static void P_ProcessRopeHang(player_t *player, sector_t *sector, mtag_t sectag) +static void P_ProcessRopeHang(player_t *player, mtag_t sectag) { INT32 sequence; fixed_t speed; @@ -4668,7 +4780,7 @@ static void P_ProcessRopeHang(player_t *player, sector_t *sector, mtag_t sectag) if (lineindex == -1) { - CONS_Debug(DBG_GAMELOGIC, "ERROR: Sector special %d missing line special #11.\n", sector->special); + CONS_Debug(DBG_GAMELOGIC, "ERROR: Rope hang missing line special #11.\n"); return; } @@ -4801,18 +4913,13 @@ static void P_ProcessRopeHang(player_t *player, sector_t *sector, mtag_t sectag) */ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *roversector) { - INT32 section1, section2, section3, section4; + INT32 section1, section2; mtag_t sectag = Tag_FGet(§or->tags); boolean isTouching; - if (!sector->special) + if (!sector->special && sector->specialflags == 0) return; - section1 = GETSECSPECIAL(sector->special, 1); - section2 = GETSECSPECIAL(sector->special, 2); - section3 = GETSECSPECIAL(sector->special, 3); - section4 = GETSECSPECIAL(sector->special, 4); - // Ignore spectators if (player->spectator) return; @@ -4823,12 +4930,74 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers if (player->playerstate != PST_LIVE) return; - // Conveyor stuff - if (section3 == 2 || section3 == 4) - player->onconveyor = section3; - isTouching = roversector || P_IsMobjTouchingSectorPlane(player->mo, sector); + if (sector->specialflags & SSF_OUTERSPACE) + { + if (!(player->powers[pw_shield] & SH_PROTECTWATER) && !player->powers[pw_spacetime]) + player->powers[pw_spacetime] = spacetimetics + 1; + } + if (sector->specialflags & SSF_WINDCURRENT) + player->onconveyor = 2; + if (sector->specialflags & SSF_CONVEYOR) + player->onconveyor = 4; + if ((sector->specialflags & SSF_SPEEDPAD) && isTouching) + P_ProcessSpeedPad(player, sector, roversector, sectag); + if (sector->specialflags & SSF_STARPOSTACTIVATOR) + { + mobj_t *post = P_GetObjectTypeInSectorNum(MT_STARPOST, sector - sectors); + if (post) + P_TouchStarPost(post, player, false); + } + if (sector->specialflags & SSF_EXIT) + P_ProcessExitSector(player, sectag); + if ((sector->specialflags & SSF_SPECIALSTAGEPIT) && isTouching) + P_ProcessSpecialStagePit(player); + if ((sector->specialflags & SSF_REDTEAMBASE) && isTouching) + P_ProcessTeamBase(player, true); + if ((sector->specialflags & SSF_BLUETEAMBASE) && isTouching) + P_ProcessTeamBase(player, false); + if (sector->specialflags & SSF_FAN) + { + player->mo->momz += mobjinfo[MT_FAN].mass/4; + + if (player->mo->momz > mobjinfo[MT_FAN].mass) + player->mo->momz = mobjinfo[MT_FAN].mass; + + P_ResetPlayer(player); + if (player->panim != PA_FALL) + P_SetPlayerMobjState(player->mo, S_PLAY_FALL); + } + if (sector->specialflags & SSF_SUPERTRANSFORM) + { + if (player->mo->health > 0 && !player->bot && (player->charflags & SF_SUPER) && !player->powers[pw_super] && ALL7EMERALDS(emeralds)) + P_DoSuperTransformation(player, true); + } + if ((sector->specialflags & SSF_FORCESPIN) && isTouching) + { + if (!(player->pflags & PF_SPINNING)) + { + player->pflags |= PF_SPINNING; + P_SetPlayerMobjState(player->mo, S_PLAY_ROLL); + S_StartAttackSound(player->mo, sfx_spin); + + if (abs(player->rmomx) < FixedMul(5*FRACUNIT, player->mo->scale) + && abs(player->rmomy) < FixedMul(5*FRACUNIT, player->mo->scale)) + P_InstaThrust(player->mo, player->mo->angle, FixedMul(10*FRACUNIT, player->mo->scale)); + } + } + if (sector->specialflags & SSF_ZOOMTUBESTART) + P_ProcessZoomTube(player, sectag, false); + if (sector->specialflags & SSF_ZOOMTUBEEND) + P_ProcessZoomTube(player, sectag, true); + if (sector->specialflags & SSF_FINISHLINE) + P_ProcessFinishLine(player); + if ((sector->specialflags & SSF_ROPEHANG) && isTouching) + P_ProcessRopeHang(player, sectag); + + section1 = GETSECSPECIAL(sector->special, 1); + section2 = GETSECSPECIAL(sector->special, 2); + switch (section1) { case 1: // Damage (Generic) @@ -4891,20 +5060,10 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers P_SpecialStageDamage(player, NULL, NULL); break; - case 12: // Space Countdown - if (!(player->powers[pw_shield] & SH_PROTECTWATER) && !player->powers[pw_spacetime]) - player->powers[pw_spacetime] = spacetimetics + 1; - break; - case 13: // Ramp Sector (Increase step-up/down) - case 14: // Non-Ramp Sector (Don't step-down) - case 15: // Bouncy FOF (deprecated) - break; } switch (section2) { - case 1: // Trigger Linedef Exec (Pushable Objects) - break; case 2: // Linedef executor requires all players present+doesn't require touching floor case 3: // Linedef executor requires all players present if (!P_DoAllPlayersTrigger(sectag)) @@ -4919,111 +5078,10 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers if (!player->bot) P_LinedefExecute(sectag, player->mo, sector); break; - case 8: // Tells pushable things to check FOFs - break; case 9: // Egg trap capsule if (!udmf && roversector) P_ProcessEggCapsule(player, sector); break; - case 10: // Special Stage Time/Rings - case 11: // Custom Gravity - case 12: // Lua sector special - break; - } - - switch (section3) - { - case 1: // Unused - case 2: // Wind/Current - case 3: // Unused - case 4: // Conveyor Belt - break; - case 5: // Speed pad - if (isTouching) - P_ProcessSpeedPad(player, sector, roversector, sectag); - break; - case 6: // Unused - case 7: // Unused - case 8: // Unused - case 9: // Unused - case 10: // Unused - case 11: // Unused - case 12: // Unused - case 13: // Unused - case 14: // Unused - case 15: // Unused - break; - } - - switch (section4) - { - case 1: // Starpost Activator - { - mobj_t *post = P_GetObjectTypeInSectorNum(MT_STARPOST, sector - sectors); - - if (!post) - break; - - P_TouchStarPost(post, player, false); - break; - } - case 2: // Special stage GOAL sector / Exit Sector / CTF Flag Return - P_ProcessExitSector(player, isTouching, sectag); - break; - case 3: // Red Team's Base - if (isTouching) - P_ProcessTeamBase(player, true); - break; - case 4: // Blue Team's Base - if (isTouching) - P_ProcessTeamBase(player, false); - break; - case 5: // Fan sector - player->mo->momz += mobjinfo[MT_FAN].mass/4; - - if (player->mo->momz > mobjinfo[MT_FAN].mass) - player->mo->momz = mobjinfo[MT_FAN].mass; - - P_ResetPlayer(player); - if (player->panim != PA_FALL) - P_SetPlayerMobjState(player->mo, S_PLAY_FALL); - break; - case 6: // Super Sonic transformer - if (player->mo->health > 0 && !player->bot && (player->charflags & SF_SUPER) && !player->powers[pw_super] && ALL7EMERALDS(emeralds)) - P_DoSuperTransformation(player, true); - break; - case 7: // Make player spin - if (!isTouching) - break; - if (!(player->pflags & PF_SPINNING)) - { - player->pflags |= PF_SPINNING; - P_SetPlayerMobjState(player->mo, S_PLAY_ROLL); - S_StartAttackSound(player->mo, sfx_spin); - - if (abs(player->rmomx) < FixedMul(5*FRACUNIT, player->mo->scale) - && abs(player->rmomy) < FixedMul(5*FRACUNIT, player->mo->scale)) - P_InstaThrust(player->mo, player->mo->angle, FixedMul(10*FRACUNIT, player->mo->scale)); - } - break; - case 8: // Zoom Tube Start - P_ProcessZoomTube(player, sector, sectag, false); - break; - case 9: // Zoom Tube End - P_ProcessZoomTube(player, sector, sectag, true); - break; - case 10: // Finish Line - P_ProcessFinishLine(player); - break; - case 11: // Rope hang - if (isTouching) - P_ProcessRopeHang(player, sector, sectag); - break; - case 12: // Unused - case 13: // Unused - case 14: // Unused - case 15: // Unused - break; } } @@ -5042,7 +5100,7 @@ static void P_PlayerOnSpecial3DFloor(player_t *player, sector_t *sector) for (rover = sector->ffloors; rover; rover = rover->next) { - if (!rover->master->frontsector->special) + if (!rover->master->frontsector->special && rover->master->frontsector->specialflags == 0) continue; if (!(rover->flags & FF_EXISTS)) @@ -5076,7 +5134,7 @@ static void P_PlayerOnSpecialPolyobj(player_t *player) polysec = po->lines[0]->backsector; - if (!polysec->special) + if (!polysec->special && polysec->specialflags == 0) continue; touching = (polysec->flags & MSF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, player->mo); @@ -6025,6 +6083,12 @@ void P_SpawnSpecials(boolean fromnetsave) { CheckForReverseGravity |= (sector->flags & MSF_GRAVITYFLIP); + if (sector->specialflags & SSF_FINISHLINE) + { + if ((gametyperules & (GTR_RACE|GTR_LIVES)) == GTR_RACE) + circuitmap = true; + } + if (!sector->special) continue; @@ -6063,15 +6127,6 @@ void P_SpawnSpecials(boolean fromnetsave) gravity = sector->floorheight/1000; break; } - - // Process Section 4 - switch(GETSECSPECIAL(sector->special, 4)) - { - case 10: // Circuit finish line - if ((gametyperules & (GTR_RACE|GTR_LIVES)) == GTR_RACE) - circuitmap = true; - break; - } } P_SpawnScrollers(); // Add generalized scrollers @@ -8332,17 +8387,17 @@ void T_Pusher(pusher_t *p) sec = sectors + p->affectee; - // Be sure the special sector type is still turned on. If so, proceed. - // Else, bail out; the sector type has been changed on us. + // Be sure the sector special flag is still turned on. If so, proceed. + // Else, bail out; the flag has been changed on us. if (p->roverpusher) { referrer = §ors[p->referrer]; - if (GETSECSPECIAL(referrer->special, 3) != 2) + if (!(referrer->specialflags & SSF_WINDCURRENT)) return; } - else if (GETSECSPECIAL(sec->special, 3) != 2) + else if (!(sec->specialflags & SSF_WINDCURRENT)) return; // For constant pushers (wind/current) there are 3 situations: diff --git a/src/p_spec.h b/src/p_spec.h index c1f25b3d6..19d3bd103 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -480,7 +480,9 @@ void P_SpawnSpecials(boolean fromnetsave); // every tic void P_UpdateSpecials(void); sector_t *P_MobjTouchingSectorSpecial(mobj_t *mo, INT32 section, INT32 number); +sector_t *P_MobjTouchingSectorSpecialFlag(mobj_t *mo, sectorspecialflags_t flag); sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 number); +sector_t *P_PlayerTouchingSectorSpecialFlag(player_t *player, sectorspecialflags_t flag); void P_PlayerInSpecialSector(player_t *player); void P_CheckPushableTrigger(mobj_t *mobj, sector_t *sec); void P_CheckMobjTrigger(mobj_t *mobj); diff --git a/src/p_user.c b/src/p_user.c index 45c64500f..1006e21ed 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2166,13 +2166,12 @@ void P_DoPlayerExit(player_t *player) P_RestoreMusic(player); } -#define SPACESPECIAL 12 boolean P_InSpaceSector(mobj_t *mo) // Returns true if you are in space { sector_t *sector = mo->subsector->sector; fixed_t topheight, bottomheight; - if (GETSECSPECIAL(sector->special, 1) == SPACESPECIAL) + if (sector->specialflags & SSF_OUTERSPACE) return true; if (sector->ffloors) @@ -2184,7 +2183,7 @@ boolean P_InSpaceSector(mobj_t *mo) // Returns true if you are in space if (!(rover->flags & FF_EXISTS)) continue; - if (GETSECSPECIAL(rover->master->frontsector->special, 1) != SPACESPECIAL) + if (!(rover->master->frontsector->specialflags & SSF_OUTERSPACE)) continue; topheight = P_GetFFloorTopZAt (rover, mo->x, mo->y); bottomheight = P_GetFFloorBottomZAt(rover, mo->x, mo->y); @@ -4678,7 +4677,7 @@ static void P_DoSpinAbility(player_t *player, ticcmd_t *cmd) if (onground && player->pflags & PF_SPINNING && !(player->pflags & PF_STARTDASH) && player->speed < 5*player->mo->scale && canstand) { - if (GETSECSPECIAL(player->mo->subsector->sector->special, 4) == 7 || (player->mo->ceilingz - player->mo->floorz < P_GetPlayerHeight(player))) + if ((player->mo->subsector->sector->specialflags & SSF_FORCESPIN) || (player->mo->ceilingz - player->mo->floorz < P_GetPlayerHeight(player))) P_InstaThrust(player->mo, player->mo->angle, 10*player->mo->scale); else { diff --git a/src/r_defs.h b/src/r_defs.h index 833958ab1..2b1cbfa58 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -289,6 +289,28 @@ typedef enum MSF_NOCLIPCAMERA = 1<<7, } sectorflags_t; +typedef enum +{ + SSF_OUTERSPACE = 1, + SSF_DOUBLESTEPUP = 1<<1, + SSF_NOSTEPDOWN = 1<<2, + SSF_WINDCURRENT = 1<<3, + SSF_CONVEYOR = 1<<4, + SSF_SPEEDPAD = 1<<5, + SSF_STARPOSTACTIVATOR = 1<<6, + SSF_EXIT = 1<<7, + SSF_SPECIALSTAGEPIT = 1<<8, + SSF_RETURNFLAG = 1<<9, + SSF_REDTEAMBASE = 1<<10, + SSF_BLUETEAMBASE = 1<<11, + SSF_FAN = 1<<12, + SSF_SUPERTRANSFORM = 1<<13, + SSF_FORCESPIN = 1<<14, + SSF_ZOOMTUBESTART = 1<<15, + SSF_ZOOMTUBEEND = 1<<16, + SSF_FINISHLINE = 1<<17, + SSF_ROPEHANG = 1<<18, +} sectorspecialflags_t; typedef enum { @@ -371,6 +393,7 @@ typedef struct sector_s fixed_t gravity; // per-sector gravity factor fixed_t *gravityptr; // For binary format: Read gravity from floor height of master sector sectorflags_t flags; + sectorspecialflags_t specialflags; INT32 friction; From 417809f78e3b32e2d109bdb9a4582dcf2ee084fe Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 31 Dec 2021 00:05:47 +0100 Subject: [PATCH 269/377] Fix typo in P_MobjTouchingSectorSpecial --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index a1eb4183c..13facd78e 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4052,7 +4052,7 @@ sector_t *P_MobjTouchingSectorSpecial(mobj_t *mo, INT32 section, INT32 number) if (!(node->m_sector->flags & SF_TRIGGERSPECIAL_TOUCH)) continue; - if (GETSECSPECIAL(mo->subsector->sector->special, section) == number) + if (GETSECSPECIAL(node->m_sector->special, section) == number) return node->m_sector; } From b3be8d1f44bb09bff9d3a36235511393b2ab4f47 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 31 Dec 2021 08:53:00 +0100 Subject: [PATCH 270/377] Implement sector damagetype field --- extras/conf/udb/Includes/SRB222_common.cfg | 3 ++ src/deh_lua.c | 26 +++++++--- src/deh_tables.c | 32 +++++++++--- src/deh_tables.h | 7 +-- src/lua_maplib.c | 8 +++ src/p_map.c | 2 +- src/p_mobj.c | 14 ++--- src/p_saveg.c | 33 +++++++++--- src/p_setup.c | 53 ++++++++++++++++++- src/p_spec.c | 60 ++++++++++++---------- src/p_user.c | 4 +- src/r_defs.h | 15 ++++++ 12 files changed, 194 insertions(+), 63 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_common.cfg b/extras/conf/udb/Includes/SRB222_common.cfg index d5cf5a405..d15fbcdcb 100644 --- a/extras/conf/udb/Includes/SRB222_common.cfg +++ b/extras/conf/udb/Includes/SRB222_common.cfg @@ -258,6 +258,9 @@ mapformat_udmf include("SRB222_sectors.cfg", "gen_sectortypes"); } + damagetypes = "Generic Water Fire Electric Spike DeathPitTilt DeathPitNoTilt Instakill SpecialStage"; + + // LINEDEF FLAGS linedefflags { diff --git a/src/deh_lua.c b/src/deh_lua.c index 56d2ec1e9..e313c5888 100644 --- a/src/deh_lua.c +++ b/src/deh_lua.c @@ -330,18 +330,18 @@ static inline int lib_getenum(lua_State *L) } else if (fastncmp("ML_", word, 3)) { p = word+3; - for (i = 0; i < 16; i++) - if (ML_LIST[i] && fastcmp(p, ML_LIST[i])) { + for (i = 0; ML_LIST[i]; i++) + if (fastcmp(p, ML_LIST[i])) { lua_pushinteger(L, ((lua_Integer)1<specialflags); return 1; + case sector_damagetype: // damagetype + lua_pushinteger(L, (UINT8)sector->damagetype); + return 1; case sector_friction: // friction lua_pushinteger(L, sector->friction); return 1; @@ -763,6 +768,9 @@ static int sector_set(lua_State *L) case sector_specialflags: sector->specialflags = luaL_checkinteger(L, 3); break; + case sector_damagetype: + sector->damagetype = (UINT8)luaL_checkinteger(L, 3); + break; case sector_gravity: sector->gravity = luaL_checkfixed(L, 3); break; diff --git a/src/p_map.c b/src/p_map.c index beae1a8ea..c3271c10e 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3594,7 +3594,7 @@ static void P_CheckLavaWall(mobj_t *mo, sector_t *sec) if (!(rover->flags & FF_SWIMMABLE)) continue; - if (GETSECSPECIAL(rover->master->frontsector->special, 1) != 3) + if (rover->master->frontsector->damagetype != SD_FIRE) continue; if (rover->master->flags & ML_BLOCKMONSTERS) diff --git a/src/p_mobj.c b/src/p_mobj.c index 4b31307ef..004575a79 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2325,8 +2325,8 @@ boolean P_CheckDeathPitCollide(mobj_t *mo) && ((mo->subsector->sector->flags & MSF_TRIGGERSPECIAL_HEADBUMP) || !(mo->eflags & MFE_VERTICALFLIP)) && (mo->subsector->sector->flags & MSF_FLIPSPECIAL_FLOOR)) || (mo->z + mo->height >= mo->subsector->sector->ceilingheight && ((mo->subsector->sector->flags & MSF_TRIGGERSPECIAL_HEADBUMP) || (mo->eflags & MFE_VERTICALFLIP)) && (mo->subsector->sector->flags & MSF_FLIPSPECIAL_CEILING))) - && (GETSECSPECIAL(mo->subsector->sector->special, 1) == 6 - || GETSECSPECIAL(mo->subsector->sector->special, 1) == 7)) + && (mo->subsector->sector->damagetype == SD_DEATHPITTILT + || mo->subsector->sector->damagetype == SD_DEATHPITNOTILT)) return true; return false; @@ -2334,7 +2334,7 @@ boolean P_CheckDeathPitCollide(mobj_t *mo) boolean P_CheckSolidLava(ffloor_t *rover) { - if (rover->flags & FF_SWIMMABLE && GETSECSPECIAL(rover->master->frontsector->special, 1) == 3 + if (rover->flags & FF_SWIMMABLE && rover->master->frontsector->damagetype == SD_FIRE && !(rover->master->flags & ML_BLOCKMONSTERS)) return true; @@ -3305,7 +3305,7 @@ void P_MobjCheckWater(mobj_t *mobj) if (mobj->eflags & (MFE_TOUCHWATER|MFE_UNDERWATER)) { - if (GETSECSPECIAL(rover->master->frontsector->special, 1) == 3) + if (rover->master->frontsector->damagetype == SD_FIRE) mobj->eflags |= MFE_TOUCHLAVA; if (rover->flags & FF_GOOWATER && !(mobj->flags & MF_NOGRAVITY)) @@ -4097,7 +4097,7 @@ static void P_KillRingsInLava(mobj_t *mo) if (!(rover->flags & FF_EXISTS)) continue; // fof must be real if (!(rover->flags & FF_SWIMMABLE // fof must be water - && GETSECSPECIAL(rover->master->frontsector->special, 1) == 3)) // fof must be lava water + && rover->master->frontsector->damagetype == SD_FIRE)) // fof must be lava water continue; // find heights of FOF @@ -10985,8 +10985,8 @@ static precipmobj_t *P_SpawnPrecipMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype if (mobj->floorz != starting_floorz) mobj->precipflags |= PCF_FOF; - else if (GETSECSPECIAL(mobj->subsector->sector->special, 1) == 7 - || GETSECSPECIAL(mobj->subsector->sector->special, 1) == 6 + else if (mobj->subsector->sector->damagetype == SD_DEATHPITNOTILT + || mobj->subsector->sector->damagetype == SD_DEATHPITTILT || mobj->subsector->sector->floorpic == skyflatnum) mobj->precipflags |= PCF_PIT; diff --git a/src/p_saveg.c b/src/p_saveg.c index 1923fa576..1baa34582 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -854,7 +854,11 @@ static void P_NetUnArchiveWaypoints(void) #define SD_CEILLIGHT 0x10 #define SD_FLAG 0x20 #define SD_SPECIALFLAG 0x40 -#define SD_GRAVITY 0x80 +#define SD_DIFF4 0x80 + +//diff4 flags +#define SD_DAMAGETYPE 0x01 +#define SD_GRAVITY 0x02 #define LD_FLAG 0x01 #define LD_SPECIAL 0x02 @@ -993,11 +997,11 @@ static void ArchiveSectors(void) size_t i, j; const sector_t *ss = sectors; const sector_t *spawnss = spawnsectors; - UINT8 diff, diff2, diff3; + UINT8 diff, diff2, diff3, diff4; for (i = 0; i < numsectors; i++, ss++, spawnss++) { - diff = diff2 = diff3 = 0; + diff = diff2 = diff3 = diff4 = 0; if (ss->floorheight != spawnss->floorheight) diff |= SD_FLOORHT; if (ss->ceilingheight != spawnss->ceilingheight) @@ -1044,12 +1048,17 @@ static void ArchiveSectors(void) diff3 |= SD_FLAG; if (ss->specialflags != spawnss->specialflags) diff3 |= SD_SPECIALFLAG; + if (ss->damagetype != spawnss->damagetype) + diff4 |= SD_DAMAGETYPE; if (ss->gravity != spawnss->gravity) - diff3 |= SD_GRAVITY; + diff4 |= SD_GRAVITY; if (ss->ffloors && CheckFFloorDiff(ss)) diff |= SD_FFLOORS; + if (diff4) + diff3 |= SD_DIFF4; + if (diff3) diff2 |= SD_DIFF3; @@ -1064,6 +1073,8 @@ static void ArchiveSectors(void) WRITEUINT8(save_p, diff2); if (diff2 & SD_DIFF3) WRITEUINT8(save_p, diff3); + if (diff3 & SD_DIFF4) + WRITEUINT8(save_p, diff4); if (diff & SD_FLOORHT) WRITEFIXED(save_p, ss->floorheight); if (diff & SD_CEILHT) @@ -1114,7 +1125,9 @@ static void ArchiveSectors(void) WRITEUINT32(save_p, ss->flags); if (diff3 & SD_SPECIALFLAG) WRITEUINT32(save_p, ss->specialflags); - if (diff3 & SD_GRAVITY) + if (diff4 & SD_DAMAGETYPE) + WRITEUINT8(save_p, ss->damagetype); + if (diff4 & SD_GRAVITY) WRITEFIXED(save_p, ss->gravity); if (diff & SD_FFLOORS) ArchiveFFloors(ss); @@ -1127,7 +1140,7 @@ static void ArchiveSectors(void) static void UnArchiveSectors(void) { UINT16 i, j; - UINT8 diff, diff2, diff3; + UINT8 diff, diff2, diff3, diff4; for (;;) { i = READUINT16(save_p); @@ -1147,6 +1160,10 @@ static void UnArchiveSectors(void) diff3 = READUINT8(save_p); else diff3 = 0; + if (diff3 & SD_DIFF4) + diff4 = READUINT8(save_p); + else + diff4 = 0; if (diff & SD_FLOORHT) sectors[i].floorheight = READFIXED(save_p); @@ -1224,7 +1241,9 @@ static void UnArchiveSectors(void) } if (diff3 & SD_SPECIALFLAG) sectors[i].specialflags = READUINT32(save_p); - if (diff3 & SD_GRAVITY) + if (diff4 & SD_DAMAGETYPE) + sectors[i].damagetype = READUINT8(save_p); + if (diff4 & SD_GRAVITY) sectors[i].gravity = READFIXED(save_p); if (diff & SD_FFLOORS) diff --git a/src/p_setup.c b/src/p_setup.c index 17fd5bb63..4efbc4e4b 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1049,6 +1049,8 @@ static void P_LoadSectors(UINT8 *data) ss->gravity = FRACUNIT; ss->flags = MSF_FLIPSPECIAL_FLOOR; + ss->specialflags = 0; + ss->damagetype = SD_NONE; P_InitializeSector(ss); } @@ -1721,6 +1723,27 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) sectors[i].friction = atol(val); else if (fastcmp(param, "gravity")) sectors[i].gravity = FLOAT_TO_FIXED(atof(val)); + else if (fastcmp(param, "damagetype")) + { + if (fastcmp(val, "Generic")) + sectors[i].damagetype = SD_GENERIC; + if (fastcmp(val, "Water")) + sectors[i].damagetype = SD_WATER; + if (fastcmp(val, "Fire")) + sectors[i].damagetype = SD_FIRE; + if (fastcmp(val, "Electric")) + sectors[i].damagetype = SD_ELECTRIC; + if (fastcmp(val, "Spike")) + sectors[i].damagetype = SD_SPIKE; + if (fastcmp(val, "DeathPitTilt")) + sectors[i].damagetype = SD_DEATHPITTILT; + if (fastcmp(val, "DeathPitNoTilt")) + sectors[i].damagetype = SD_DEATHPITNOTILT; + if (fastcmp(val, "Instakill")) + sectors[i].damagetype = SD_INSTAKILL; + if (fastcmp(val, "SpecialStage")) + sectors[i].damagetype = SD_SPECIALSTAGE; + } } static void ParseTextmapSidedefParameter(UINT32 i, char *param, char *val) @@ -2000,6 +2023,8 @@ static void P_LoadTextmap(void) sc->gravity = FRACUNIT; sc->flags = MSF_FLIPSPECIAL_FLOOR; + sc->specialflags = 0; + sc->damagetype = SD_NONE; textmap_colormap.used = false; textmap_colormap.lightcolor = 0; @@ -5059,9 +5084,35 @@ static void P_ConvertBinaryMap(void) for (i = 0; i < numsectors; i++) { - switch(GETSECSPECIAL(sectors[i].special, 1)) { + case 1: //Damage + sectors[i].damagetype = SD_GENERIC; + break; + case 2: //Damage (Water) + sectors[i].damagetype = SD_WATER; + break; + case 3: //Damage (Fire) + sectors[i].damagetype = SD_FIRE; + break; + case 4: //Damage (Electric) + sectors[i].damagetype = SD_ELECTRIC; + break; + case 5: //Spikes + sectors[i].damagetype = SD_SPIKE; + break; + case 6: //Death pit (camera tilt) + sectors[i].damagetype = SD_DEATHPITTILT; + break; + case 7: //Death pit (no camera tilt) + sectors[i].damagetype = SD_DEATHPITNOTILT; + break; + case 8: //Instakill + sectors[i].damagetype = SD_INSTAKILL; + break; + case 11: //Special stage damage + sectors[i].damagetype = SD_SPECIALSTAGE; + break; case 12: //Space countdown sectors[i].specialflags |= SSF_OUTERSPACE; break; diff --git a/src/p_spec.c b/src/p_spec.c index 2e4821972..95c3a5118 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4917,7 +4917,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers mtag_t sectag = Tag_FGet(§or->tags); boolean isTouching; - if (!sector->special && sector->specialflags == 0) + if (!sector->special && sector->specialflags == 0 && sector->damagetype == SD_NONE) return; // Ignore spectators @@ -4995,33 +4995,30 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers if ((sector->specialflags & SSF_ROPEHANG) && isTouching) P_ProcessRopeHang(player, sectag); - section1 = GETSECSPECIAL(sector->special, 1); - section2 = GETSECSPECIAL(sector->special, 2); - - switch (section1) + switch (sector->damagetype) { - case 1: // Damage (Generic) + case SD_GENERIC: if (isTouching) P_DamageMobj(player->mo, NULL, NULL, 1, 0); break; - case 2: // Damage (Water) + case SD_WATER: if (isTouching && (player->powers[pw_underwater] || player->powers[pw_carry] == CR_NIGHTSMODE)) P_DamageMobj(player->mo, NULL, NULL, 1, DMG_WATER); break; - case 3: // Damage (Fire) + case SD_FIRE: if (isTouching) P_DamageMobj(player->mo, NULL, NULL, 1, DMG_FIRE); break; - case 4: // Damage (Electrical) + case SD_ELECTRIC: if (isTouching) P_DamageMobj(player->mo, NULL, NULL, 1, DMG_ELECTRIC); break; - case 5: // Spikes + case SD_SPIKE: if (isTouching) P_DamageMobj(player->mo, NULL, NULL, 1, DMG_SPIKE); break; - case 6: // Death Pit (Camera Mod) - case 7: // Death Pit (No Camera Mod) + case SD_DEATHPITTILT: + case SD_DEATHPITNOTILT: if (!isTouching) break; if (player->quittime) @@ -5029,12 +5026,33 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers else P_DamageMobj(player->mo, NULL, NULL, 1, DMG_DEATHPIT); break; - case 8: // Instant Kill + case SD_INSTAKILL: if (player->quittime) G_MovePlayerToSpawnOrStarpost(player - players); else P_DamageMobj(player->mo, NULL, NULL, 1, DMG_INSTAKILL); break; + case SD_SPECIALSTAGE: + if (!isTouching) + break; + + if (player->exiting || player->bot) // Don't do anything for bots or players who have just finished + break; + + if (!(player->powers[pw_shield] || player->spheres > 0)) // Don't do anything if no shield or spheres anyway + break; + + P_SpecialStageDamage(player, NULL, NULL); + break; + default: + break; + } + + section1 = GETSECSPECIAL(sector->special, 1); + section2 = GETSECSPECIAL(sector->special, 2); + + switch (section1) + { case 9: // Ring Drainer (Floor Touch) if (!isTouching) break; @@ -5048,18 +5066,6 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers S_StartSound(player->mo, sfx_antiri); } break; - case 11: // Special Stage Damage - if (!isTouching) - break; - - if (player->exiting || player->bot) // Don't do anything for bots or players who have just finished - break; - - if (!(player->powers[pw_shield] || player->spheres > 0)) // Don't do anything if no shield or spheres anyway - break; - - P_SpecialStageDamage(player, NULL, NULL); - break; } switch (section2) @@ -5100,7 +5106,7 @@ static void P_PlayerOnSpecial3DFloor(player_t *player, sector_t *sector) for (rover = sector->ffloors; rover; rover = rover->next) { - if (!rover->master->frontsector->special && rover->master->frontsector->specialflags == 0) + if (!rover->master->frontsector->special && rover->master->frontsector->specialflags == 0 && rover->master->frontsector->damagetype == SD_NONE) continue; if (!(rover->flags & FF_EXISTS)) @@ -5134,7 +5140,7 @@ static void P_PlayerOnSpecialPolyobj(player_t *player) polysec = po->lines[0]->backsector; - if (!polysec->special && polysec->specialflags == 0) + if (!polysec->special && polysec->specialflags == 0 && polysec->damagetype == SD_NONE) continue; touching = (polysec->flags & MSF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, player->mo); diff --git a/src/p_user.c b/src/p_user.c index 1006e21ed..7360d2ef9 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -10258,7 +10258,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall thiscam->momx = FixedMul(x - thiscam->x, camspeed); thiscam->momy = FixedMul(y - thiscam->y, camspeed); - if (GETSECSPECIAL(thiscam->subsector->sector->special, 1) == 6 + if (thiscam->subsector->sector->damagetype == SD_DEATHPITTILT && thiscam->z < thiscam->subsector->sector->floorheight + 256*FRACUNIT && FixedMul(z - thiscam->z, camspeed) < 0) { @@ -12230,7 +12230,7 @@ static boolean P_MobjAboveLava(mobj_t *mobj) for (rover = sector->ffloors; rover; rover = rover->next) { - if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_SWIMMABLE) || GETSECSPECIAL(rover->master->frontsector->special, 1) != 3) + if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_SWIMMABLE) || rover->master->frontsector->damagetype != SD_FIRE) continue; if (mobj->eflags & MFE_VERTICALFLIP) diff --git a/src/r_defs.h b/src/r_defs.h index 2b1cbfa58..4180af800 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -312,6 +312,20 @@ typedef enum SSF_ROPEHANG = 1<<18, } sectorspecialflags_t; +typedef enum +{ + SD_NONE = 0, + SD_GENERIC = 1, + SD_WATER = 2, + SD_FIRE = 3, + SD_ELECTRIC = 4, + SD_SPIKE = 5, + SD_DEATHPITTILT = 6, + SD_DEATHPITNOTILT = 7, + SD_INSTAKILL = 8, + SD_SPECIALSTAGE = 9, +} sectordamage_t; + typedef enum { CRUMBLE_NONE, // No crumble thinker @@ -394,6 +408,7 @@ typedef struct sector_s fixed_t *gravityptr; // For binary format: Read gravity from floor height of master sector sectorflags_t flags; sectorspecialflags_t specialflags; + UINT8 damagetype; INT32 friction; From 208395214a4e75852f5dcc53baafc4d64fdc81b0 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 31 Dec 2021 11:39:34 +0100 Subject: [PATCH 271/377] Implement sector fields for linedef executor triggering --- extras/conf/udb/Includes/SRB222_misc.cfg | 20 ++ src/deh_lua.c | 10 + src/deh_tables.c | 10 + src/deh_tables.h | 1 + src/lua_maplib.c | 16 ++ src/p_floor.c | 5 +- src/p_mobj.c | 6 +- src/p_saveg.c | 16 +- src/p_setup.c | 58 ++++++ src/p_spec.c | 240 ++++++++++++++--------- src/p_spec.h | 3 +- src/r_defs.h | 25 ++- 12 files changed, 299 insertions(+), 111 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index d6210e9f1..537214b58 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -78,6 +78,8 @@ sectorflags flipspecial_ceiling = "Trigger on Ceiling Touch"; triggerspecial_touch = "Trigger on Edge Touch"; triggerspecial_headbump = "Trigger on Headbump"; + triggerline_plane = "Linedef Trigger Requires Plane Touch"; + triggerline_mobj = "Non-Pushables Can Trigger Linedef"; invertprecip = "Invert Precipitation"; gravityflip = "Flip Objects in Reverse Gravity"; heatwave = "Heat Wave"; @@ -253,6 +255,24 @@ universalfields type = 0; default = 0; } + + triggertag + { + type = 15; + default = 0; + } + + triggerer + { + type = 0; + default = 0; + enum + { + 0 = "Player"; + 1 = "All players"; + 2 = "Object"; + } + } } linedef diff --git a/src/deh_lua.c b/src/deh_lua.c index e313c5888..9472c1e7b 100644 --- a/src/deh_lua.c +++ b/src/deh_lua.c @@ -373,6 +373,16 @@ static inline int lib_getenum(lua_State *L) if (mathlib) return luaL_error(L, "sector damagetype '%s' could not be found.\n", word); return 0; } + else if (fastncmp("TO_", word, 3)) { + p = word + 3; + for (i = 0; TO_LIST[i]; i++) + if (fastcmp(p, TO_LIST[i])) { + lua_pushinteger(L, i); + return 1; + } + if (mathlib) return luaL_error(L, "sector triggerer '%s' could not be found.\n", word); + return 0; + } else if (fastncmp("S_",word,2)) { p = word+2; for (i = 0; i < NUMSTATEFREESLOTS; i++) { diff --git a/src/deh_tables.c b/src/deh_tables.c index 1409fae58..bc3368e06 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4478,6 +4478,8 @@ const char *const MSF_LIST[] = { "FLIPSPECIAL_CEILING", "TRIGGERSPECIAL_TOUCH", "TRIGGERSPECIAL_HEADBUMP", + "TRIGGERLINE_PLANE", + "TRIGGERLINE_MOBJ", "GRAVITYFLIP", "HEATWAVE", "NOCLIPCAMERA", @@ -4522,6 +4524,14 @@ const char *const SD_LIST[] = { NULL }; +// Sector triggerer +const char *const TO_LIST[] = { + "PLAYER", + "ALLPLAYERS", + "MOBJ", + NULL +}; + const char *COLOR_ENUMS[] = { "NONE", // SKINCOLOR_NONE, diff --git a/src/deh_tables.h b/src/deh_tables.h index 3fbc6357b..dccf98252 100644 --- a/src/deh_tables.h +++ b/src/deh_tables.h @@ -68,6 +68,7 @@ extern const char *const ML_LIST[]; // Linedef flags extern const char *const MSF_LIST[]; // Sector flags extern const char *const SSF_LIST[]; // Sector special flags extern const char *const SD_LIST[]; // Sector damagetype +extern const char *const TO_LIST[]; // Sector triggerer extern const char *COLOR_ENUMS[]; extern const char *const POWERS_LIST[]; extern const char *const HUDITEMS_LIST[]; diff --git a/src/lua_maplib.c b/src/lua_maplib.c index b18f4a44f..4bbd826ef 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -52,6 +52,8 @@ enum sector_e { sector_flags, sector_specialflags, sector_damagetype, + sector_triggertag, + sector_triggerer, sector_friction, sector_gravity, }; @@ -80,6 +82,8 @@ static const char *const sector_opt[] = { "flags", "specialflags", "damagetype", + "triggertag", + "triggerer", "friction", "gravity", NULL}; @@ -668,6 +672,12 @@ static int sector_get(lua_State *L) case sector_damagetype: // damagetype lua_pushinteger(L, (UINT8)sector->damagetype); return 1; + case sector_triggertag: // triggertag + lua_pushinteger(L, (INT16)sector->triggertag); + return 1; + case sector_triggerer: // triggerer + lua_pushinteger(L, (UINT8)sector->triggerer); + return 1; case sector_friction: // friction lua_pushinteger(L, sector->friction); return 1; @@ -771,6 +781,12 @@ static int sector_set(lua_State *L) case sector_damagetype: sector->damagetype = (UINT8)luaL_checkinteger(L, 3); break; + case sector_triggertag: + sector->triggertag = (INT16)luaL_checkinteger(L, 3); + break; + case sector_triggerer: + sector->triggerer = (UINT8)luaL_checkinteger(L, 3); + break; case sector_gravity: sector->gravity = luaL_checkfixed(L, 3); break; diff --git a/src/p_floor.c b/src/p_floor.c index 85a1f54a8..5f71a1fbe 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -1276,7 +1276,6 @@ void T_EachTimeThinker(eachtime_t *eachtime) sector_t *caller[MAXPLAYERS]; boolean allPlayersChecked = false; boolean allPlayersTrigger = false; - mtag_t tag = Tag_FGet(&eachtime->sourceline->tags); for (i = 0; i < MAXPLAYERS; i++) { @@ -1300,7 +1299,7 @@ void T_EachTimeThinker(eachtime_t *eachtime) continue; // If sector has an "all players" trigger type, all players need to be in area - if (caller[i] && (GETSECSPECIAL(caller[i]->special, 2) == 2 || GETSECSPECIAL(caller[i]->special, 2) == 3)) + if (caller[i] && caller[i]->triggerer == TO_ALLPLAYERS) { if (!allPlayersChecked) { @@ -1312,7 +1311,7 @@ void T_EachTimeThinker(eachtime_t *eachtime) continue; } - CONS_Debug(DBG_GAMELOGIC, "Trying to activate each time executor with tag %d\n", tag); + CONS_Debug(DBG_GAMELOGIC, "Trying to activate each time executor with tag %d\n", Tag_FGet(&eachtime->sourceline->tags)); // 03/08/14 -Monster Iestyn // No more stupid hacks involving changing eachtime->sourceline's tag or special or whatever! diff --git a/src/p_mobj.c b/src/p_mobj.c index 004575a79..57ff8d4f1 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10161,8 +10161,8 @@ void P_MobjThinker(mobj_t *mobj) tmfloorthing = tmhitthing = NULL; - // Sector special (2,8) allows ANY mobj to trigger a linedef exec - P_CheckMobjTrigger(mobj); + // Sector flag MSF_TRIGGERLINE_MOBJ allows ANY mobj to trigger a linedef exec + P_CheckMobjTrigger(mobj, false); if (mobj->scale != mobj->destscale) P_MobjScaleThink(mobj); // Slowly scale up/down to reach your destscale. @@ -10382,7 +10382,7 @@ void P_PushableThinker(mobj_t *mobj) I_Assert(mobj != NULL); I_Assert(!P_MobjWasRemoved(mobj)); - P_CheckPushableTrigger(mobj, mobj->subsector->sector); + P_CheckMobjTrigger(mobj, true); // it has to be pushable RIGHT NOW for this part to happen if (mobj->flags & MF_PUSHABLE && !(mobj->momx || mobj->momy)) diff --git a/src/p_saveg.c b/src/p_saveg.c index 1baa34582..50608ad7a 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -858,7 +858,9 @@ static void P_NetUnArchiveWaypoints(void) //diff4 flags #define SD_DAMAGETYPE 0x01 -#define SD_GRAVITY 0x02 +#define SD_TRIGGERTAG 0x02 +#define SD_TRIGGERER 0x04 +#define SD_GRAVITY 0x08 #define LD_FLAG 0x01 #define LD_SPECIAL 0x02 @@ -1050,6 +1052,10 @@ static void ArchiveSectors(void) diff3 |= SD_SPECIALFLAG; if (ss->damagetype != spawnss->damagetype) diff4 |= SD_DAMAGETYPE; + if (ss->triggertag != spawnss->triggertag) + diff4 |= SD_TRIGGERTAG; + if (ss->triggerer != spawnss->triggerer) + diff4 |= SD_TRIGGERER; if (ss->gravity != spawnss->gravity) diff4 |= SD_GRAVITY; @@ -1127,6 +1133,10 @@ static void ArchiveSectors(void) WRITEUINT32(save_p, ss->specialflags); if (diff4 & SD_DAMAGETYPE) WRITEUINT8(save_p, ss->damagetype); + if (diff4 & SD_TRIGGERTAG) + WRITEINT16(save_p, ss->triggertag); + if (diff4 & SD_TRIGGERER) + WRITEUINT8(save_p, ss->triggerer); if (diff4 & SD_GRAVITY) WRITEFIXED(save_p, ss->gravity); if (diff & SD_FFLOORS) @@ -1243,6 +1253,10 @@ static void UnArchiveSectors(void) sectors[i].specialflags = READUINT32(save_p); if (diff4 & SD_DAMAGETYPE) sectors[i].damagetype = READUINT8(save_p); + if (diff4 & SD_TRIGGERTAG) + sectors[i].triggertag = READINT16(save_p); + if (diff4 & SD_TRIGGERER) + sectors[i].triggerer = READUINT8(save_p); if (diff4 & SD_GRAVITY) sectors[i].gravity = READFIXED(save_p); diff --git a/src/p_setup.c b/src/p_setup.c index 4efbc4e4b..f64bd842c 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1051,6 +1051,8 @@ static void P_LoadSectors(UINT8 *data) ss->flags = MSF_FLIPSPECIAL_FLOOR; ss->specialflags = 0; ss->damagetype = SD_NONE; + ss->triggertag = 0; + ss->triggerer = TO_PLAYER; P_InitializeSector(ss); } @@ -1673,6 +1675,10 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) sectors[i].flags |= MSF_TRIGGERSPECIAL_TOUCH; else if (fastcmp(param, "triggerspecial_headbump") && fastcmp("true", val)) sectors[i].flags |= MSF_TRIGGERSPECIAL_HEADBUMP; + else if (fastcmp(param, "triggerline_plane") && fastcmp("true", val)) + sectors[i].flags |= MSF_TRIGGERLINE_PLANE; + else if (fastcmp(param, "triggerline_mobj") && fastcmp("true", val)) + sectors[i].flags |= MSF_TRIGGERLINE_MOBJ; else if (fastcmp(param, "invertprecip") && fastcmp("true", val)) sectors[i].flags |= MSF_INVERTPRECIP; else if (fastcmp(param, "gravityflip") && fastcmp("true", val)) @@ -1744,6 +1750,10 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) if (fastcmp(val, "SpecialStage")) sectors[i].damagetype = SD_SPECIALSTAGE; } + else if (fastcmp(param, "triggertag")) + sectors[i].triggertag = atol(val); + else if (fastcmp(param, "triggerer")) + sectors[i].triggerer = atol(val); } static void ParseTextmapSidedefParameter(UINT32 i, char *param, char *val) @@ -2025,6 +2035,8 @@ static void P_LoadTextmap(void) sc->flags = MSF_FLIPSPECIAL_FLOOR; sc->specialflags = 0; sc->damagetype = SD_NONE; + sc->triggertag = 0; + sc->triggerer = TO_PLAYER; textmap_colormap.used = false; textmap_colormap.lightcolor = 0; @@ -5084,6 +5096,8 @@ static void P_ConvertBinaryMap(void) for (i = 0; i < numsectors; i++) { + mtag_t tag = Tag_FGet(§ors[i].tags); + switch(GETSECSPECIAL(sectors[i].special, 1)) { case 1: //Damage @@ -5126,6 +5140,50 @@ static void P_ConvertBinaryMap(void) break; } + switch(GETSECSPECIAL(sectors[i].special, 2)) + { + case 1: //Trigger linedef executor (pushable objects) + sectors[i].triggertag = tag; + sectors[i].flags |= MSF_TRIGGERLINE_PLANE; + sectors[i].triggerer = TO_MOBJ; + break; + case 2: //Trigger linedef executor (Anywhere in sector, all players) + sectors[i].triggertag = tag; + sectors[i].flags &= ~MSF_TRIGGERLINE_PLANE; + sectors[i].triggerer = TO_ALLPLAYERS; + break; + case 3: //Trigger linedef executor (Floor touch, all players) + sectors[i].triggertag = tag; + sectors[i].flags |= MSF_TRIGGERLINE_PLANE; + sectors[i].triggerer = TO_ALLPLAYERS; + break; + case 4: //Trigger linedef executor (Anywhere in sector) + sectors[i].triggertag = tag; + sectors[i].flags &= ~MSF_TRIGGERLINE_PLANE; + sectors[i].triggerer = TO_PLAYER; + break; + case 5: //Trigger linedef executor (Floor touch) + sectors[i].triggertag = tag; + sectors[i].flags |= MSF_TRIGGERLINE_PLANE; + sectors[i].triggerer = TO_PLAYER; + break; + case 6: //Trigger linedef executor (Emerald check) + sectors[i].triggertag = tag; + sectors[i].flags &= ~MSF_TRIGGERLINE_PLANE; + sectors[i].triggerer = TO_PLAYEREMERALDS; + break; + case 7: //Trigger linedef executor (NiGHTS mare) + sectors[i].triggertag = tag; + sectors[i].flags &= ~MSF_TRIGGERLINE_PLANE; + sectors[i].triggerer = TO_PLAYERNIGHTS; + break; + case 8: //Check for linedef executor on FOFs + sectors[i].flags |= MSF_TRIGGERLINE_MOBJ; + break; + default: + break; + } + switch(GETSECSPECIAL(sectors[i].special, 3)) { case 2: //Wind/Current diff --git a/src/p_spec.c b/src/p_spec.c index 95c3a5118..973c6ee3c 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1755,15 +1755,15 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller // Trigger conditions // //////////////////////// - if (caller) + if (caller && !udmf) { - if (GETSECSPECIAL(caller->special, 2) == 6) + if (caller->triggerer == TO_PLAYEREMERALDS) { CONS_Alert(CONS_WARNING, M_GetText("Deprecated emerald check sector type detected. Please use linedef types 337-339 instead.\n")); if (!(ALL7EMERALDS(emeralds))) return false; } - else if (GETSECSPECIAL(caller->special, 2) == 7) + else if (caller->triggerer == TO_PLAYERNIGHTS) { CONS_Alert(CONS_WARNING, M_GetText("Deprecated NiGHTS mare sector type detected. Please use linedef types 340-342 instead.\n")); if (!P_CheckPlayerMareOld(triggerline)) @@ -4226,20 +4226,23 @@ sector_t *P_PlayerTouchingSectorSpecialFlag(player_t *player, sectorspecialflags return P_MobjTouchingSectorSpecialFlag(player->mo, flag); } -static sector_t *P_Check3DFloorTriggers(player_t *player, sector_t *sector, line_t *sourceline) +static sector_t *P_CheckPlayer3DFloorTrigger(player_t *player, sector_t *sector, line_t *sourceline) { ffloor_t *rover; for (rover = sector->ffloors; rover; rover = rover->next) { - if (GETSECSPECIAL(rover->master->frontsector->special, 2) < 2 || GETSECSPECIAL(rover->master->frontsector->special, 2) > 7) + if (!rover->master->frontsector->triggertag) + continue; + + if (rover->master->frontsector->triggerer == TO_MOBJ) continue; if (!(rover->flags & FF_EXISTS)) continue; - if (!Tag_Find(&sourceline->tags, Tag_FGet(&rover->master->frontsector->tags))) - return false; + if (!Tag_Find(&sourceline->tags, rover->master->frontsector->triggertag)) + continue; if (!P_IsMobjTouching3DFloor(player->mo, rover, sector)) continue; @@ -4253,25 +4256,28 @@ static sector_t *P_Check3DFloorTriggers(player_t *player, sector_t *sector, line return NULL; } -static sector_t *P_CheckPolyobjTriggers(player_t *player, line_t *sourceline) +static sector_t *P_CheckPlayerPolyobjTrigger(player_t *player, line_t *sourceline) { polyobj_t *po; sector_t *polysec; boolean touching = false; boolean inside = false; - for (po = player->mo->subsector->polyList; po; po = (polyobj_t *)(po->link.next)) //TODO + for (po = player->mo->subsector->polyList; po; po = (polyobj_t *)(po->link.next)) { if (po->flags & POF_NOSPECIALS) continue; polysec = po->lines[0]->backsector; - if (GETSECSPECIAL(polysec->special, 2) < 2 || GETSECSPECIAL(polysec->special, 2) > 7) + if (!polysec->triggertag) continue; - if (!Tag_Find(&sourceline->tags, Tag_FGet(&polysec->tags))) - return false; + if (polysec->triggerer == TO_MOBJ) + continue; + + if (!Tag_Find(&sourceline->tags, polysec->triggertag)) + continue; touching = (polysec->flags & MSF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, player->mo); inside = P_MobjInsidePolyobj(po, player->mo); @@ -4288,16 +4294,19 @@ static sector_t *P_CheckPolyobjTriggers(player_t *player, line_t *sourceline) return NULL; } -static boolean P_CheckSectorTriggers(player_t *player, sector_t *sector, line_t *sourceline) +static boolean P_CheckPlayerSectorTrigger(player_t *player, sector_t *sector, line_t *sourceline) { - if (GETSECSPECIAL(sector->special, 2) < 2 || GETSECSPECIAL(sector->special, 2) > 7) + if (!sector->triggertag) return false; - if (!Tag_Find(&sourceline->tags, Tag_FGet(§or->tags))) + if (sector->triggerer == TO_MOBJ) return false; - if (GETSECSPECIAL(sector->special, 2) != 3 && GETSECSPECIAL(sector->special, 2) != 5) - return true; // "Anywhere in sector" types + if (!Tag_Find(&sourceline->tags, sector->triggertag)) + return false; + + if (!(sector->flags & MSF_TRIGGERLINE_PLANE)) + return true; // Don't require plane touch return P_IsMobjTouchingSectorPlane(player->mo, sector); @@ -4315,18 +4324,18 @@ sector_t *P_FindPlayerTrigger(player_t *player, line_t *sourceline) originalsector = player->mo->subsector->sector; - caller = P_Check3DFloorTriggers(player, originalsector, sourceline); // Handle FOFs first. + caller = P_CheckPlayer3DFloorTrigger(player, originalsector, sourceline); // Handle FOFs first. if (caller) return caller; // Allow sector specials to be applied to polyobjects! - caller = P_CheckPolyobjTriggers(player, sourceline); + caller = P_CheckPlayerPolyobjTrigger(player, sourceline); if (caller) return caller; - if (P_CheckSectorTriggers(player, originalsector, sourceline)) + if (P_CheckPlayerSectorTrigger(player, originalsector, sourceline)) return originalsector; // Iterate through touching_sectorlist for SF_TRIGGERSPECIAL_TOUCH @@ -4338,7 +4347,7 @@ sector_t *P_FindPlayerTrigger(player_t *player, line_t *sourceline) continue; // Check 3D floors... - caller = P_Check3DFloorTriggers(player, loopsector, sourceline); // Handle FOFs first. + caller = P_CheckPlayer3DFloorTrigger(player, loopsector, sourceline); // Handle FOFs first. if (caller) return caller; @@ -4346,7 +4355,7 @@ sector_t *P_FindPlayerTrigger(player_t *player, line_t *sourceline) if (!(loopsector->flags & MSF_TRIGGERSPECIAL_TOUCH)) continue; - if (P_CheckSectorTriggers(player, loopsector, sourceline)) + if (P_CheckPlayerSectorTrigger(player, loopsector, sourceline)) return loopsector; } @@ -4376,12 +4385,12 @@ boolean P_CanPlayerTrigger(size_t playernum) } /// \todo check continues for proper splitscreen support? -static boolean P_DoAllPlayersTrigger(mtag_t sectag) +static boolean P_DoAllPlayersTrigger(mtag_t triggertag) { INT32 i; line_t dummyline; dummyline.tags.count = 1; - dummyline.tags.tags = §ag; + dummyline.tags.tags = &triggertag; for (i = 0; i < MAXPLAYERS; i++) { @@ -4903,34 +4912,26 @@ static void P_ProcessRopeHang(player_t *player, mtag_t sectag) P_SetPlayerMobjState(player->mo, S_PLAY_RIDE); } -/** Applies a sector special to a player. - * - * \param player Player in the sector. - * \param sector Sector with the special. - * \param roversector If !NULL, sector is actually an FOF; otherwise, sector - * is being physically contacted by the player. - * \sa P_PlayerInSpecialSector, P_PlayerOnSpecial3DFloor - */ -void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *roversector) +static boolean P_SectorHasSpecial(sector_t *sec) +{ + if (sec->specialflags) + return true; + + if (sec->damagetype != SD_NONE) + return true; + + if (sec->triggertag) + return true; + + if (sec->special) + return true; + + return false; +} + +static void P_EvaluateSpecialFlags(player_t *player, sector_t *sector, sector_t *roversector, boolean isTouching) { - INT32 section1, section2; mtag_t sectag = Tag_FGet(§or->tags); - boolean isTouching; - - if (!sector->special && sector->specialflags == 0 && sector->damagetype == SD_NONE) - return; - - // Ignore spectators - if (player->spectator) - return; - - // Ignore dead players. - // If this strange phenomenon could be potentially used in levels, - // TODO: modify this to accommodate for it. - if (player->playerstate != PST_LIVE) - return; - - isTouching = roversector || P_IsMobjTouchingSectorPlane(player->mo, sector); if (sector->specialflags & SSF_OUTERSPACE) { @@ -4994,7 +4995,10 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers P_ProcessFinishLine(player); if ((sector->specialflags & SSF_ROPEHANG) && isTouching) P_ProcessRopeHang(player, sectag); +} +static void P_EvaluateDamageType(player_t *player, sector_t *sector, boolean isTouching) +{ switch (sector->damagetype) { case SD_GENERIC: @@ -5047,19 +5051,36 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers default: break; } +} - section1 = GETSECSPECIAL(sector->special, 1); - section2 = GETSECSPECIAL(sector->special, 2); +static void P_EvaluateLinedefExecutorTrigger(player_t *player, sector_t *sector, boolean isTouching) +{ + if (player->bot) + return; - switch (section1) + if (!sector->triggertag) + return; + + if (sector->triggerer == TO_MOBJ) + return; + else if (sector->triggerer == TO_ALLPLAYERS && !P_DoAllPlayersTrigger(sector->triggertag)) + return; + + if ((sector->flags & MSF_TRIGGERLINE_PLANE) && !isTouching) + return; + + P_LinedefExecute(sector->triggertag, player->mo, sector); +} + +static void P_EvaluateOldSectorSpecial(player_t *player, sector_t *sector, sector_t *roversector, boolean isTouching) +{ + switch (GETSECSPECIAL(sector->special, 1)) { case 9: // Ring Drainer (Floor Touch) if (!isTouching) break; /* FALLTHRU */ case 10: // Ring Drainer (No Floor Touch) - if (udmf) - break; if (leveltime % (TICRATE/2) == 0 && player->rings > 0) { player->rings--; @@ -5068,29 +5089,50 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers break; } - switch (section2) + switch (GETSECSPECIAL(sector->special, 2)) { - case 2: // Linedef executor requires all players present+doesn't require touching floor - case 3: // Linedef executor requires all players present - if (!P_DoAllPlayersTrigger(sectag)) - break; - /* FALLTHRU */ - case 4: // Linedef executor that doesn't require touching floor - case 5: // Linedef executor - case 6: // Linedef executor (7 Emeralds) - case 7: // Linedef executor (NiGHTS Mare) - if ((section2 == 3 || section2 == 5) && !isTouching) - break; - if (!player->bot) - P_LinedefExecute(sectag, player->mo, sector); - break; case 9: // Egg trap capsule - if (!udmf && roversector) + if (roversector) P_ProcessEggCapsule(player, sector); break; } } +/** Applies a sector special to a player. + * + * \param player Player in the sector. + * \param sector Sector with the special. + * \param roversector If !NULL, sector is actually an FOF; otherwise, sector + * is being physically contacted by the player. + * \sa P_PlayerInSpecialSector, P_PlayerOnSpecial3DFloor + */ +void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *roversector) +{ + boolean isTouching; + + if (!P_SectorHasSpecial(sector)) + return; + + // Ignore spectators + if (player->spectator) + return; + + // Ignore dead players. + // If this strange phenomenon could be potentially used in levels, + // TODO: modify this to accommodate for it. + if (player->playerstate != PST_LIVE) + return; + + isTouching = roversector || P_IsMobjTouchingSectorPlane(player->mo, sector); + + P_EvaluateSpecialFlags(player, sector, roversector, isTouching); + P_EvaluateDamageType(player, sector, isTouching); + P_EvaluateLinedefExecutorTrigger(player, sector, isTouching); + + if (!udmf) + P_EvaluateOldSectorSpecial(player, sector, roversector, isTouching); +} + #define TELEPORTED(mo) (mo->subsector->sector != originalsector) /** Checks if a player is standing on or is inside a 3D floor (e.g. water) and @@ -5106,7 +5148,7 @@ static void P_PlayerOnSpecial3DFloor(player_t *player, sector_t *sector) for (rover = sector->ffloors; rover; rover = rover->next) { - if (!rover->master->frontsector->special && rover->master->frontsector->specialflags == 0 && rover->master->frontsector->damagetype == SD_NONE) + if (!P_SectorHasSpecial(rover->master->frontsector)) continue; if (!(rover->flags & FF_EXISTS)) @@ -5140,7 +5182,7 @@ static void P_PlayerOnSpecialPolyobj(player_t *player) polysec = po->lines[0]->backsector; - if (!polysec->special && polysec->specialflags == 0 && polysec->damagetype == SD_NONE) + if (!P_SectorHasSpecial(polysec)) continue; touching = (polysec->flags & MSF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, player->mo); @@ -5203,25 +5245,26 @@ void P_PlayerInSpecialSector(player_t *player) } } -static void P_CheckMobj3DFloorTrigger(mobj_t *mo) +static void P_CheckMobj3DFloorTrigger(mobj_t *mo, sector_t *sec) { sector_t *originalsector = mo->subsector->sector; ffloor_t *rover; - mtag_t tag; - for (rover = mo->subsector->sector->ffloors; rover; rover = rover->next) + for (rover = sec->ffloors; rover; rover = rover->next) { - if (GETSECSPECIAL(rover->master->frontsector->special, 2) != 1) + if (!rover->master->frontsector->triggertag) + continue; + + if (rover->master->frontsector->triggerer != TO_MOBJ) continue; if (!(rover->flags & FF_EXISTS)) continue; - if (!P_IsMobjTouching3DFloor(mo, rover, mo->subsector->sector)) + if (!P_IsMobjTouching3DFloor(mo, rover, sec)) continue; - tag = Tag_FGet(&rover->master->frontsector->tags); - P_LinedefExecute(tag, mo, rover->master->frontsector); + P_LinedefExecute(rover->master->frontsector->triggertag, mo, rover->master->frontsector); if TELEPORTED(mo) return; } } @@ -5233,7 +5276,6 @@ static void P_CheckMobjPolyobjTrigger(mobj_t *mo) sector_t *polysec; boolean touching = false; boolean inside = false; - mtag_t tag; for (po = mo->subsector->polyList; po; po = (polyobj_t *)(po->link.next)) { @@ -5242,7 +5284,10 @@ static void P_CheckMobjPolyobjTrigger(mobj_t *mo) polysec = po->lines[0]->backsector; - if (!polysec->special) + if (!polysec->triggertag) + continue; + + if (polysec->triggerer != TO_MOBJ) continue; touching = (polysec->flags & MSF_TRIGGERSPECIAL_TOUCH) && P_MobjTouchingPolyobj(po, mo); @@ -5254,30 +5299,26 @@ static void P_CheckMobjPolyobjTrigger(mobj_t *mo) if (!P_IsMobjTouchingPolyobj(mo, po, polysec)) continue; - tag = Tag_FGet(&polysec->tags); - P_LinedefExecute(tag, mo, polysec); + P_LinedefExecute(polysec->triggertag, mo, polysec); if TELEPORTED(mo) return; } } -void P_CheckPushableTrigger(mobj_t *mobj, sector_t *sec) +static void P_CheckMobjSectorTrigger(mobj_t *mo, sector_t *sec) { - sector_t *originalsector = mobj->subsector->sector; + if (!sec->triggertag) + return; - P_CheckMobj3DFloorTrigger(mobj); - if TELEPORTED(mobj) return; + if (sec->triggerer != TO_MOBJ) + return; - P_CheckMobjPolyobjTrigger(mobj); - if TELEPORTED(mobj) return; + if ((sec->flags & MSF_TRIGGERLINE_PLANE) && !P_IsMobjTouchingSectorPlane(mo, sec)) + return; - if (GETSECSPECIAL(sec->special, 2) == 1 && P_IsMobjTouchingSectorPlane(mobj, sec)) - { - mtag_t tag = Tag_FGet(&sec->tags); - P_LinedefExecute(tag, mobj, sec); - } + P_LinedefExecute(sec->triggertag, mo, sec); } -void P_CheckMobjTrigger(mobj_t *mobj) +void P_CheckMobjTrigger(mobj_t *mobj, boolean pushable) { sector_t *originalsector; @@ -5286,13 +5327,16 @@ void P_CheckMobjTrigger(mobj_t *mobj) originalsector = mobj->subsector->sector; - if (GETSECSPECIAL(originalsector->special, 2) != 8) + if (!pushable && !(originalsector->flags & MSF_TRIGGERLINE_MOBJ)) return; - P_CheckMobj3DFloorTrigger(mobj); + P_CheckMobj3DFloorTrigger(mobj, originalsector); if TELEPORTED(mobj) return; P_CheckMobjPolyobjTrigger(mobj); + if TELEPORTED(mobj) return; + + P_CheckMobjSectorTrigger(mobj, originalsector); } #undef TELEPORTED diff --git a/src/p_spec.h b/src/p_spec.h index 19d3bd103..d02b5989f 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -484,8 +484,7 @@ sector_t *P_MobjTouchingSectorSpecialFlag(mobj_t *mo, sectorspecialflags_t flag) sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 number); sector_t *P_PlayerTouchingSectorSpecialFlag(player_t *player, sectorspecialflags_t flag); void P_PlayerInSpecialSector(player_t *player); -void P_CheckPushableTrigger(mobj_t *mobj, sector_t *sec); -void P_CheckMobjTrigger(mobj_t *mobj); +void P_CheckMobjTrigger(mobj_t *mobj, boolean pushable); sector_t *P_FindPlayerTrigger(player_t *player, line_t *sourceline); boolean P_IsPlayerValid(size_t playernum); boolean P_CanPlayerTrigger(size_t playernum); diff --git a/src/r_defs.h b/src/r_defs.h index 4180af800..cd632aeca 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -282,11 +282,14 @@ typedef enum // triggerspecial - conditions under which plane touch causes effect MSF_TRIGGERSPECIAL_TOUCH = 1<<2, MSF_TRIGGERSPECIAL_HEADBUMP = 1<<3, + // triggerline - conditions for linedef executor triggering + MSF_TRIGGERLINE_PLANE = 1<<4, // require plane touch + MSF_TRIGGERLINE_MOBJ = 1<<5, // allow non-pushable mobjs to trigger // invertprecip - inverts presence of precipitation - MSF_INVERTPRECIP = 1<<4, - MSF_GRAVITYFLIP = 1<<5, - MSF_HEATWAVE = 1<<6, - MSF_NOCLIPCAMERA = 1<<7, + MSF_INVERTPRECIP = 1<<6, + MSF_GRAVITYFLIP = 1<<7, + MSF_HEATWAVE = 1<<8, + MSF_NOCLIPCAMERA = 1<<9, } sectorflags_t; typedef enum @@ -326,6 +329,15 @@ typedef enum SD_SPECIALSTAGE = 9, } sectordamage_t; +typedef enum +{ + TO_PLAYER = 0, + TO_ALLPLAYERS = 1, + TO_MOBJ = 2, + TO_PLAYEREMERALDS = 3, // only for binary backwards compatibility: check player emeralds + TO_PLAYERNIGHTS = 4, // only for binary backwards compatibility: check NiGHTS mare +} triggerobject_t; + typedef enum { CRUMBLE_NONE, // No crumble thinker @@ -406,10 +418,15 @@ typedef struct sector_s fixed_t gravity; // per-sector gravity factor fixed_t *gravityptr; // For binary format: Read gravity from floor height of master sector + sectorflags_t flags; sectorspecialflags_t specialflags; UINT8 damagetype; + // Linedef executor triggering + mtag_t triggertag; // tag to call upon triggering + UINT8 triggerer; // who can trigger? + INT32 friction; // Sprite culling feature From e011962156e56c08374392a7e806cfcd9d718dfc Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 31 Dec 2021 11:44:05 +0100 Subject: [PATCH 272/377] Make the sector special field inaccessible in UDMF --- extras/conf/udb/Includes/SRB222_common.cfg | 13 ------------- src/p_setup.c | 2 -- 2 files changed, 15 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_common.cfg b/extras/conf/udb/Includes/SRB222_common.cfg index d15fbcdcb..b06b7bad7 100644 --- a/extras/conf/udb/Includes/SRB222_common.cfg +++ b/extras/conf/udb/Includes/SRB222_common.cfg @@ -246,21 +246,8 @@ mapformat_udmf include("SRB222_misc.cfg", "sectorbrightness"); } - // SECTOR TYPES - sectortypes - { - include("SRB222_sectors.cfg", "sectortypes"); - } - - // GENERALISED SECTOR TYPES - gen_sectortypes - { - include("SRB222_sectors.cfg", "gen_sectortypes"); - } - damagetypes = "Generic Water Fire Electric Spike DeathPitTilt DeathPitNoTilt Instakill SpecialStage"; - // LINEDEF FLAGS linedefflags { diff --git a/src/p_setup.c b/src/p_setup.c index f64bd842c..6fac64568 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1559,8 +1559,6 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) sectors[i].ceilinglightlevel = atol(val); else if (fastcmp(param, "lightceilingabsolute") && fastcmp("true", val)) sectors[i].ceilinglightabsolute = true; - else if (fastcmp(param, "special")) - sectors[i].special = atol(val); else if (fastcmp(param, "id")) Tag_FSet(§ors[i].tags, atol(val)); else if (fastcmp(param, "moreids")) From 2b4d32b37274d7caf4bcc3235205bf582757436f Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 31 Dec 2021 12:15:01 +0100 Subject: [PATCH 273/377] Turn solid lava into a damagetype --- extras/conf/udb/Includes/SRB222_common.cfg | 2 +- src/deh_tables.c | 1 + src/p_map.c | 5 +---- src/p_mobj.c | 16 ++++++-------- src/p_setup.c | 25 +++++++++++++++++++++- src/p_spec.c | 1 + src/p_user.c | 5 ++++- src/r_defs.h | 13 +++++------ 8 files changed, 46 insertions(+), 22 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_common.cfg b/extras/conf/udb/Includes/SRB222_common.cfg index b06b7bad7..0b35ec17c 100644 --- a/extras/conf/udb/Includes/SRB222_common.cfg +++ b/extras/conf/udb/Includes/SRB222_common.cfg @@ -246,7 +246,7 @@ mapformat_udmf include("SRB222_misc.cfg", "sectorbrightness"); } - damagetypes = "Generic Water Fire Electric Spike DeathPitTilt DeathPitNoTilt Instakill SpecialStage"; + damagetypes = "Generic Water Fire Lava Electric Spike DeathPitTilt DeathPitNoTilt Instakill SpecialStage"; // LINEDEF FLAGS linedefflags diff --git a/src/deh_tables.c b/src/deh_tables.c index bc3368e06..52718cc8b 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4515,6 +4515,7 @@ const char *const SD_LIST[] = { "GENERIC", "WATER", "FIRE", + "LAVA", "ELECTRIC", "SPIKE", "DEATHPITTILT", diff --git a/src/p_map.c b/src/p_map.c index c3271c10e..72775e5e6 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3594,10 +3594,7 @@ static void P_CheckLavaWall(mobj_t *mo, sector_t *sec) if (!(rover->flags & FF_SWIMMABLE)) continue; - if (rover->master->frontsector->damagetype != SD_FIRE) - continue; - - if (rover->master->flags & ML_BLOCKMONSTERS) + if (rover->master->frontsector->damagetype != SD_LAVA) continue; topheight = P_GetFFloorTopZAt(rover, mo->x, mo->y); diff --git a/src/p_mobj.c b/src/p_mobj.c index 57ff8d4f1..753d298a4 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2334,11 +2334,7 @@ boolean P_CheckDeathPitCollide(mobj_t *mo) boolean P_CheckSolidLava(ffloor_t *rover) { - if (rover->flags & FF_SWIMMABLE && rover->master->frontsector->damagetype == SD_FIRE - && !(rover->master->flags & ML_BLOCKMONSTERS)) - return true; - - return false; + return (rover->flags & FF_SWIMMABLE) && (rover->master->frontsector->damagetype == SD_LAVA); } // @@ -3305,7 +3301,7 @@ void P_MobjCheckWater(mobj_t *mobj) if (mobj->eflags & (MFE_TOUCHWATER|MFE_UNDERWATER)) { - if (rover->master->frontsector->damagetype == SD_FIRE) + if (rover->master->frontsector->damagetype == SD_FIRE || rover->master->frontsector->damagetype == SD_LAVA) mobj->eflags |= MFE_TOUCHLAVA; if (rover->flags & FF_GOOWATER && !(mobj->flags & MF_NOGRAVITY)) @@ -4096,9 +4092,11 @@ static void P_KillRingsInLava(mobj_t *mo) { if (!(rover->flags & FF_EXISTS)) continue; // fof must be real - if (!(rover->flags & FF_SWIMMABLE // fof must be water - && rover->master->frontsector->damagetype == SD_FIRE)) // fof must be lava water - continue; + if (!(rover->flags & FF_SWIMMABLE)) + continue; // fof must be water + + if (rover->master->frontsector->damagetype != SD_FIRE && rover->master->frontsector->damagetype != SD_LAVA) + continue; // fof must have fire or lava damage // find heights of FOF topheight = P_GetFOFTopZ(mo, node->m_sector, rover, mo->x, mo->y, NULL); diff --git a/src/p_setup.c b/src/p_setup.c index 6fac64568..b7afe6fb4 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1735,6 +1735,8 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) sectors[i].damagetype = SD_WATER; if (fastcmp(val, "Fire")) sectors[i].damagetype = SD_FIRE; + if (fastcmp(val, "Lava")) + sectors[i].damagetype = SD_LAVA; if (fastcmp(val, "Electric")) sectors[i].damagetype = SD_ELECTRIC; if (fastcmp(val, "Spike")) @@ -5105,8 +5107,29 @@ static void P_ConvertBinaryMap(void) sectors[i].damagetype = SD_WATER; break; case 3: //Damage (Fire) - sectors[i].damagetype = SD_FIRE; + { + size_t j; + boolean isLava = false; + + for (j = 0; j < sectors[i].linecount; j++) + { + line_t *line = sectors[i].lines[j]; + + if (line->frontsector != §ors[i]) + continue; + + if (line->flags & ML_BLOCKMONSTERS) + continue; + + if (line->special == 120 || (line->special == 259 && (line->args[2] & FF_SWIMMABLE))) + { + isLava = true; + break; + } + } + sectors[i].damagetype = isLava ? SD_LAVA : SD_FIRE; break; + } case 4: //Damage (Electric) sectors[i].damagetype = SD_ELECTRIC; break; diff --git a/src/p_spec.c b/src/p_spec.c index 973c6ee3c..e6b1e4ec5 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5010,6 +5010,7 @@ static void P_EvaluateDamageType(player_t *player, sector_t *sector, boolean isT P_DamageMobj(player->mo, NULL, NULL, 1, DMG_WATER); break; case SD_FIRE: + case SD_LAVA: if (isTouching) P_DamageMobj(player->mo, NULL, NULL, 1, DMG_FIRE); break; diff --git a/src/p_user.c b/src/p_user.c index 7360d2ef9..254bcc65e 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -12230,7 +12230,10 @@ static boolean P_MobjAboveLava(mobj_t *mobj) for (rover = sector->ffloors; rover; rover = rover->next) { - if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_SWIMMABLE) || rover->master->frontsector->damagetype != SD_FIRE) + if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_SWIMMABLE)) + continue; + + if (rover->master->frontsector->damagetype != SD_FIRE && rover->master->frontsector->damagetype != SD_LAVA) continue; if (mobj->eflags & MFE_VERTICALFLIP) diff --git a/src/r_defs.h b/src/r_defs.h index cd632aeca..c56abdbfd 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -321,12 +321,13 @@ typedef enum SD_GENERIC = 1, SD_WATER = 2, SD_FIRE = 3, - SD_ELECTRIC = 4, - SD_SPIKE = 5, - SD_DEATHPITTILT = 6, - SD_DEATHPITNOTILT = 7, - SD_INSTAKILL = 8, - SD_SPECIALSTAGE = 9, + SD_LAVA = 4, + SD_ELECTRIC = 5, + SD_SPIKE = 6, + SD_DEATHPITTILT = 7, + SD_DEATHPITNOTILT = 8, + SD_INSTAKILL = 9, + SD_SPECIALSTAGE = 10, } sectordamage_t; typedef enum From eef7763d68c4ee59b117d09465a14149e60ead3b Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 31 Dec 2021 13:58:41 +0100 Subject: [PATCH 274/377] Set SSF_WINDCURRENT and SSF_CONVEYOR automatically if there's a pusher/conveyor --- extras/conf/SRB2-22.cfg | 4 ---- extras/conf/udb/Includes/SRB222_misc.cfg | 2 -- extras/conf/udb/Includes/SRB222_sectors.cfg | 4 ---- src/p_setup.c | 10 ---------- src/p_spec.c | 22 +++++++++------------ 5 files changed, 9 insertions(+), 33 deletions(-) diff --git a/extras/conf/SRB2-22.cfg b/extras/conf/SRB2-22.cfg index 81d8ed193..1b36a47fa 100644 --- a/extras/conf/SRB2-22.cfg +++ b/extras/conf/SRB2-22.cfg @@ -437,8 +437,6 @@ sectortypes 144 = "Egg Capsule"; 160 = "Special Stage Time/Spheres Parameters "; 176 = "Custom Global Gravity "; - 512 = "Wind/Current"; - 1024 = "Conveyor Belt"; 1280 = "Speed Pad"; 4096 = "Star Post Activator"; 8192 = "Exit/Special Stage Pit/Return Flag"; @@ -497,8 +495,6 @@ gen_sectortypes third { 0 = "Normal"; - 512 = "Wind/Current"; - 1024 = "Conveyor Belt"; 1280 = "Speed Pad"; } diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 537214b58..bc284a3f9 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -87,8 +87,6 @@ sectorflags outerspace = "Space Countdown"; doublestepup = "Ramp Sector (double step-up/down)"; nostepdown = "Non-Ramp Sector (No step-down)"; - windcurrent = "Wind/Current"; - conveyor = "Conveyor Belt"; speedpad = "Speed Pad"; starpostactivator = "Star Post Activator"; exit = "Exit"; diff --git a/extras/conf/udb/Includes/SRB222_sectors.cfg b/extras/conf/udb/Includes/SRB222_sectors.cfg index 412aed155..f9df297e7 100644 --- a/extras/conf/udb/Includes/SRB222_sectors.cfg +++ b/extras/conf/udb/Includes/SRB222_sectors.cfg @@ -27,8 +27,6 @@ sectortypes 144 = "Egg Capsule"; 160 = "Special Stage Time/Spheres Parameters "; 176 = "Custom Global Gravity "; - 512 = "Wind/Current"; - 1024 = "Conveyor Belt"; 1280 = "Speed Pad"; 4096 = "Star Post Activator"; 8192 = "Exit/Special Stage Pit/Return Flag"; @@ -85,8 +83,6 @@ gen_sectortypes third { 0 = "Normal"; - 512 = "Wind/Current"; - 1024 = "Conveyor Belt"; 1280 = "Speed Pad"; } diff --git a/src/p_setup.c b/src/p_setup.c index b7afe6fb4..4383b77e1 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1691,10 +1691,6 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) sectors[i].specialflags |= SSF_DOUBLESTEPUP; else if (fastcmp(param, "nostepdown") && fastcmp("true", val)) sectors[i].specialflags |= SSF_NOSTEPDOWN; - else if (fastcmp(param, "windcurrent") && fastcmp("true", val)) - sectors[i].specialflags |= SSF_WINDCURRENT; - else if (fastcmp(param, "conveyor") && fastcmp("true", val)) - sectors[i].specialflags |= SSF_CONVEYOR; else if (fastcmp(param, "speedpad") && fastcmp("true", val)) sectors[i].specialflags |= SSF_SPEEDPAD; else if (fastcmp(param, "starpostactivator") && fastcmp("true", val)) @@ -5207,12 +5203,6 @@ static void P_ConvertBinaryMap(void) switch(GETSECSPECIAL(sectors[i].special, 3)) { - case 2: //Wind/Current - sectors[i].specialflags |= SSF_WINDCURRENT; - break; - case 4: //Conveyor belt - sectors[i].specialflags |= SSF_CONVEYOR; - break; case 5: //Speed pad sectors[i].specialflags |= SSF_SPEEDPAD; break; diff --git a/src/p_spec.c b/src/p_spec.c index e6b1e4ec5..f97e40cc4 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7471,9 +7471,12 @@ static void Add_Scroller(INT32 type, fixed_t dx, fixed_t dy, INT32 control, INT3 s->accel = accel; s->exclusive = exclusive; s->vdx = s->vdy = 0; - if ((s->control = control) != -1) + s->control = control; + if (s->control != -1) s->last_height = sectors[control].floorheight + sectors[control].ceilingheight; s->affectee = affectee; + if (type == sc_carry || type == sc_carry_ceiling) + sectors[affectee].specialflags |= SSF_CONVEYOR; P_AddThinker(THINK_MAIN, &s->thinker); } @@ -8407,9 +8410,13 @@ static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, fixed_t { p->roverpusher = true; p->referrer = referrer; + sectors[referrer].specialflags |= SSF_WINDCURRENT; } else + { p->roverpusher = false; + sectors[affectee].specialflags |= SSF_WINDCURRENT; + } p->affectee = affectee; P_AddThinker(THINK_MAIN, &p->thinker); @@ -8437,19 +8444,8 @@ void T_Pusher(pusher_t *p) z_mag = p->z_mag >> PUSH_FACTOR; sec = sectors + p->affectee; - - // Be sure the sector special flag is still turned on. If so, proceed. - // Else, bail out; the flag has been changed on us. - if (p->roverpusher) - { - referrer = §ors[p->referrer]; - - if (!(referrer->specialflags & SSF_WINDCURRENT)) - return; - } - else if (!(sec->specialflags & SSF_WINDCURRENT)) - return; + referrer = sectors + p->referrer; // For constant pushers (wind/current) there are 3 situations: // From 9b780f417e6664da349f80f21c105a4b6364beb5 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 31 Dec 2021 14:06:06 +0100 Subject: [PATCH 275/377] Fix a conversion oversight with linedef type 8 --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 5 +++++ src/p_setup.c | 1 + src/p_spec.c | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index e2e1d187a..62f7ec12e 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1725,6 +1725,11 @@ udmf { title = "Set Camera Collision Planes"; prefix = "(8)"; + arg0 + { + title = "Target sector tag"; + type = 13; + } } 11 diff --git a/src/p_setup.c b/src/p_setup.c index 4383b77e1..5d8bc9cc0 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3333,6 +3333,7 @@ static void P_ConvertBinaryMap(void) { INT32 s; + lines[i].args[0] = tag; TAG_ITER_SECTORS(tag, s) { if (lines[i].flags & ML_NOCLIMB) diff --git a/src/p_spec.c b/src/p_spec.c index f97e40cc4..4785b8866 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6295,7 +6295,7 @@ void P_SpawnSpecials(boolean fromnetsave) case 8: // Set camera collision planes if (lines[i].frontsector) - TAG_ITER_SECTORS(tag, s) + TAG_ITER_SECTORS(lines[i].args[0], s) sectors[s].camsec = lines[i].frontsector-sectors; break; From ee728126df0e3a5b9575ef654e27b08332840a1c Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 31 Dec 2021 14:09:22 +0100 Subject: [PATCH 276/377] Fix oversight with linedef type 604 --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index 27c35e9f0..b87f254d2 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6888,7 +6888,7 @@ void P_SpawnSpecials(boolean fromnetsave) case 604: // Adjustable Blinking Light sec = sides[*lines[i].sidenum].sector - sectors; - TAG_ITER_SECTORS(tag, s) + TAG_ITER_SECTORS(lines[i].args[0], s) P_SpawnAdjustableStrobeFlash(§ors[s], lines[i].args[3], (lines[i].args[4] & TMB_USETARGET) ? sectors[s].lightlevel : lines[i].args[5], lines[i].args[1], lines[i].args[2], lines[i].args[4] & TMB_SYNC); From e4d7b3df6cbc74e3c2c8a8866d4c0d0d81682e09 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 31 Dec 2021 14:17:17 +0100 Subject: [PATCH 277/377] Minor cleanup in P_SpawnSpecials --- src/p_spec.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index c18b5bd93..73a095fde 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6224,8 +6224,6 @@ void P_SpawnSpecials(boolean fromnetsave) // Init line EFFECTs for (i = 0; i < numlines; i++) { - mtag_t tag = Tag_FGet(&lines[i].tags); - // set line specials to 0 here too, same reason as above if (netgame || multiplayer) { @@ -6253,7 +6251,7 @@ void P_SpawnSpecials(boolean fromnetsave) break; sec = sides[*lines[i].sidenum].sector - sectors; - TAG_ITER_SECTORS(tag, s) + TAG_ITER_SECTORS(Tag_FGet(&lines[i].tags), s) { sectors[s].gravityptr = §ors[sec].floorheight; // This allows it to change in realtime! @@ -6271,7 +6269,7 @@ void P_SpawnSpecials(boolean fromnetsave) break; sec = sides[*lines[i].sidenum].sector - sectors; - TAG_ITER_SECTORS(tag, s) + TAG_ITER_SECTORS(Tag_FGet(&lines[i].tags), s) P_AddCameraScanner(§ors[sec], §ors[s], R_PointToAngle2(lines[i].v2->x, lines[i].v2->y, lines[i].v1->x, lines[i].v1->y)); break; From 8e4cbf8b76f662578425ea92d63602f74e17de84 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 31 Dec 2021 15:33:47 +0100 Subject: [PATCH 278/377] Disable ML_EFFECT5 on linedef executor triggers for UDMF maps (what a pointless feature) --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index 408b43478..c548a32ca 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1648,7 +1648,7 @@ static boolean P_ActivateLinedefExecutorsInSector(line_t *triggerline, mobj_t *a size_t linecnt = ctlsector->linecount; size_t i; - if (triggerline->flags & ML_EFFECT5) // disregard order for efficiency + if (!udmf && triggerline->flags & ML_EFFECT5) // disregard order for efficiency { for (i = 0; i < linecnt; i++) P_ActivateLinedefExecutor(ctlsector->lines[i], actor, caller); From afde568856948b9e07f2f52d569abca1aaeb1983 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 4 Jan 2022 19:33:17 +0100 Subject: [PATCH 279/377] Add blendmode support to FOFs --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 62 ++++- extras/conf/udb/Includes/SRB222_misc.cfg | 9 + src/p_setup.c | 201 +++++++-------- src/p_spec.c | 250 ++++++++++--------- src/p_spec.h | 10 +- 5 files changed, 302 insertions(+), 230 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 15e7685c3..d40f2a373 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2453,6 +2453,12 @@ udmf default = 255; } arg2 + { + title = "Blending mode"; + type = 11; + enum = "blendmodes"; + } + arg3 { title = "Appearance"; type = 12; @@ -2466,7 +2472,7 @@ udmf 32 = "Cut cyan flat pixels"; } } - arg3 + arg4 { title = "Tangibility"; type = 12; @@ -2489,6 +2495,12 @@ udmf default = 128; } arg2 + { + title = "Blending mode"; + type = 11; + enum = "blendmodes"; + } + arg3 { title = "Flags"; type = 12; @@ -2556,12 +2568,18 @@ udmf default = 255; } arg2 + { + title = "Blending mode"; + type = 11; + enum = "blendmodes"; + } + arg3 { title = "Tangibility"; type = 12; enum = "tangibility"; } - arg3 + arg4 { title = "Flags"; type = 12; @@ -2591,6 +2609,12 @@ udmf default = 255; } arg2 + { + title = "Blending mode"; + type = 11; + enum = "blendmodes"; + } + arg3 { title = "Appearance"; type = 12; @@ -2604,17 +2628,17 @@ udmf 32 = "Cut cyan flat pixels"; } } - arg3 + arg4 { title = "Tangibility"; type = 12; enum = "tangibility"; } - arg4 + arg5 { title = "Speed"; } - arg5 + arg6 { title = "Flags"; type = 12; @@ -2669,6 +2693,12 @@ udmf default = 255; } arg2 + { + title = "Blending mode"; + type = 11; + enum = "blendmodes"; + } + arg3 { title = "Appearance"; type = 12; @@ -2755,6 +2785,12 @@ udmf default = 255; } arg2 + { + title = "Blending mode"; + type = 11; + enum = "blendmodes"; + } + arg3 { title = "Bustable type"; type = 11; @@ -2766,7 +2802,7 @@ udmf 3 = "Strong"; } } - arg3 + arg4 { title = "Flags"; type = 12; @@ -2778,7 +2814,7 @@ udmf 8 = "Cut cyan flat pixels"; } } - arg4 + arg5 { title = "Linedef executor tag"; type = 15; @@ -2825,6 +2861,12 @@ udmf default = 128; } arg2 + { + title = "Blending mode"; + type = 11; + enum = "blendmodes"; + } + arg3 { title = "Flags"; type = 12; @@ -2851,6 +2893,12 @@ udmf default = 255; } arg2 + { + title = "Blending mode"; + type = 11; + enum = "blendmodes"; + } + arg3 { title = "Flags"; type = 12; diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index c46fff822..e392014c8 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -649,6 +649,15 @@ enums 1 = "Random (Weak)"; 2 = "Random (Strong)"; } + + blendmodes + { + 0 = "Translucent"; + 1 = "Add"; + 2 = "Subtract"; + 3 = "Reverse subtract"; + 4 = "Modulate"; + } } //Default things filters diff --git a/src/p_setup.c b/src/p_setup.c index dbbd99859..15e7c6d09 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3282,6 +3282,24 @@ static line_t *P_FindPointPushLine(taglist_t *list) return NULL; } +static void P_SetBinaryFOFAlpha(line_t *line) +{ + if (sides[line->sidenum[0]].toptexture > 0) + { + line->args[1] = sides[line->sidenum[0]].toptexture; + if (sides[line->sidenum[0]].toptexture >= 1001) + { + line->args[2] = (sides[line->sidenum[0]].toptexture/1000); + line->args[1] %= 1000; + } + } + else + { + line->args[1] = 128; + line->args[2] = TMB_TRANSLUCENT; + } +} + //For maps in binary format, converts setup of specials to UDMF format. static void P_ConvertBinaryMap(void) { @@ -3562,36 +3580,33 @@ static void P_ConvertBinaryMap(void) if (lines[i].special == 102) { if (lines[i].flags & ML_NOCLIMB) - lines[i].args[2] |= TMFA_INSIDES; - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; - else - lines[i].args[1] = 128; + lines[i].args[3] |= TMFA_INSIDES; + P_SetBinaryFOFAlpha(&lines[i]); //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].args[1] == 256) - lines[i].args[2] |= TMFA_SPLAT; + lines[i].args[3] |= TMFA_SPLAT; } else lines[i].args[1] = 255; //Appearance if (lines[i].special == 105) - lines[i].args[2] |= TMFA_NOPLANES|TMFA_NOSIDES; + lines[i].args[3] |= TMFA_NOPLANES|TMFA_NOSIDES; else if (lines[i].special == 104) - lines[i].args[2] |= TMFA_NOSIDES; + lines[i].args[3] |= TMFA_NOSIDES; else if (lines[i].special == 103) - lines[i].args[2] |= TMFA_NOPLANES; + lines[i].args[3] |= TMFA_NOPLANES; if (lines[i].special != 100 && (lines[i].special != 104 || !(lines[i].flags & ML_NOCLIMB))) - lines[i].args[2] |= TMFA_NOSHADE; + lines[i].args[3] |= TMFA_NOSHADE; if (lines[i].flags & ML_EFFECT6) - lines[i].args[2] |= TMFA_SPLAT; + lines[i].args[3] |= TMFA_SPLAT; //Tangibility if (lines[i].flags & ML_EFFECT1) - lines[i].args[3] |= TMFT_DONTBLOCKOTHERS; + lines[i].args[4] |= TMFT_DONTBLOCKOTHERS; if (lines[i].flags & ML_EFFECT2) - lines[i].args[3] |= TMFT_DONTBLOCKPLAYER; + lines[i].args[4] |= TMFT_DONTBLOCKPLAYER; lines[i].special = 100; break; @@ -3608,35 +3623,32 @@ static void P_ConvertBinaryMap(void) lines[i].args[1] = 255; else { - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; - else - lines[i].args[1] = 128; + P_SetBinaryFOFAlpha(&lines[i]); //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].args[1] == 256) - lines[i].args[2] |= TMFW_SPLAT; + lines[i].args[3] |= TMFW_SPLAT; } //No sides? if (lines[i].special == 122 || lines[i].special == 123 || lines[i].special == 125) - lines[i].args[2] |= TMFW_NOSIDES; + lines[i].args[3] |= TMFW_NOSIDES; //Flags if (lines[i].flags & ML_NOCLIMB) - lines[i].args[2] |= TMFW_DOUBLESHADOW; + lines[i].args[3] |= TMFW_DOUBLESHADOW; if (lines[i].flags & ML_EFFECT4) - lines[i].args[2] |= TMFW_COLORMAPONLY; + lines[i].args[3] |= TMFW_COLORMAPONLY; if (!(lines[i].flags & ML_EFFECT5)) - lines[i].args[2] |= TMFW_NORIPPLE; + lines[i].args[3] |= TMFW_NORIPPLE; //Goo? if (lines[i].special >= 124) - lines[i].args[2] |= TMFW_GOOWATER; + lines[i].args[3] |= TMFW_GOOWATER; //Splat rendering? if (lines[i].flags & ML_EFFECT6) - lines[i].args[2] |= TMFW_SPLAT; + lines[i].args[3] |= TMFW_SPLAT; lines[i].special = 120; break; @@ -3653,41 +3665,38 @@ static void P_ConvertBinaryMap(void) if (lines[i].special == 141 || lines[i].special == 142 || lines[i].special == 144 || lines[i].special == 145) { if (lines[i].flags & ML_NOCLIMB) - lines[i].args[2] |= TMFA_INSIDES; - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; - else - lines[i].args[1] = 128; + lines[i].args[3] |= TMFA_INSIDES; + P_SetBinaryFOFAlpha(&lines[i]); //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].args[1] == 256) - lines[i].args[2] |= TMFA_SPLAT; + lines[i].args[3] |= TMFA_SPLAT; } else lines[i].args[1] = 255; //Appearance if (lines[i].special == 142 || lines[i].special == 145) - lines[i].args[2] |= TMFA_NOSIDES; + lines[i].args[3] |= TMFA_NOSIDES; else if (lines[i].special == 146) - lines[i].args[2] |= TMFA_NOPLANES; + lines[i].args[3] |= TMFA_NOPLANES; if (lines[i].special != 146 && (lines[i].flags & ML_NOCLIMB)) - lines[i].args[2] |= TMFA_NOSHADE; + lines[i].args[3] |= TMFA_NOSHADE; if (lines[i].flags & ML_EFFECT6) - lines[i].args[2] |= TMFA_SPLAT; + lines[i].args[3] |= TMFA_SPLAT; //Tangibility if (lines[i].special <= 142) - lines[i].args[3] |= TMFT_INTANGIBLEBOTTOM; + lines[i].args[4] |= TMFT_INTANGIBLEBOTTOM; else if (lines[i].special <= 145) - lines[i].args[3] |= TMFT_INTANGIBLETOP; + lines[i].args[4] |= TMFT_INTANGIBLETOP; else - lines[i].args[3] |= TMFT_INTANGIBLEBOTTOM|TMFT_INTANGIBLETOP; + lines[i].args[4] |= TMFT_INTANGIBLEBOTTOM|TMFT_INTANGIBLETOP; if (lines[i].flags & ML_EFFECT1) - lines[i].args[3] |= TMFT_DONTBLOCKOTHERS; + lines[i].args[4] |= TMFT_DONTBLOCKOTHERS; if (lines[i].flags & ML_EFFECT2) - lines[i].args[3] |= TMFT_DONTBLOCKPLAYER; + lines[i].args[4] |= TMFT_DONTBLOCKPLAYER; lines[i].special = 100; break; @@ -3727,38 +3736,35 @@ static void P_ConvertBinaryMap(void) //Alpha if (lines[i].special >= 174 && lines[i].special <= 175) { - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; - else - lines[i].args[1] = 128; + P_SetBinaryFOFAlpha(&lines[i]); //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].args[1] == 256) - lines[i].args[3] |= TMFC_SPLAT; + lines[i].args[4] |= TMFC_SPLAT; } else lines[i].args[1] = 255; if (lines[i].special >= 172 && lines[i].special <= 175) { - lines[i].args[2] |= TMFT_INTANGIBLEBOTTOM; + lines[i].args[3] |= TMFT_INTANGIBLEBOTTOM; if (lines[i].flags & ML_NOCLIMB) - lines[i].args[3] |= TMFC_NOSHADE; + lines[i].args[4] |= TMFC_NOSHADE; } if (lines[i].special % 2 == 1) - lines[i].args[3] |= TMFC_NORETURN; + lines[i].args[4] |= TMFC_NORETURN; if (lines[i].special == 176 || lines[i].special == 177 || lines[i].special == 180) - lines[i].args[3] |= TMFC_AIRBOB; + lines[i].args[4] |= TMFC_AIRBOB; if (lines[i].special >= 176 && lines[i].special <= 179) - lines[i].args[3] |= TMFC_FLOATBOB; + lines[i].args[4] |= TMFC_FLOATBOB; if (lines[i].flags & ML_EFFECT6) - lines[i].args[3] |= TMFC_SPLAT; + lines[i].args[4] |= TMFC_SPLAT; if (lines[i].flags & ML_EFFECT1) - lines[i].args[2] |= TMFT_DONTBLOCKOTHERS; + lines[i].args[3] |= TMFT_DONTBLOCKOTHERS; if (lines[i].flags & ML_EFFECT2) - lines[i].args[2] |= TMFT_DONTBLOCKPLAYER; + lines[i].args[3] |= TMFT_DONTBLOCKPLAYER; lines[i].special = 170; break; @@ -3773,44 +3779,41 @@ static void P_ConvertBinaryMap(void) //Translucency if (lines[i].special == 192 || lines[i].special == 195) { - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; - else - lines[i].args[1] = 128; + P_SetBinaryFOFAlpha(&lines[i]); //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].args[1] == 256) - lines[i].args[2] |= TMFA_SPLAT; + lines[i].args[3] |= TMFA_SPLAT; } else lines[i].args[1] = 255; //Appearance if (lines[i].special == 193) - lines[i].args[2] |= TMFA_NOPLANES|TMFA_NOSIDES; + lines[i].args[3] |= TMFA_NOPLANES|TMFA_NOSIDES; if (lines[i].special >= 194) - lines[i].args[2] |= TMFA_INSIDES; + lines[i].args[3] |= TMFA_INSIDES; if (lines[i].special != 190 && (lines[i].special <= 193 || lines[i].flags & ML_NOCLIMB)) - lines[i].args[2] |= TMFA_NOSHADE; + lines[i].args[3] |= TMFA_NOSHADE; if (lines[i].flags & ML_EFFECT6) - lines[i].args[2] |= TMFA_SPLAT; + lines[i].args[3] |= TMFA_SPLAT; //Tangibility if (lines[i].flags & ML_EFFECT1) - lines[i].args[3] |= TMFT_DONTBLOCKOTHERS; + lines[i].args[4] |= TMFT_DONTBLOCKOTHERS; if (lines[i].flags & ML_EFFECT2) - lines[i].args[3] |= TMFT_DONTBLOCKPLAYER; + lines[i].args[4] |= TMFT_DONTBLOCKPLAYER; if (lines[i].special >= 194) - lines[i].args[3] |= TMFT_INTANGIBLEBOTTOM; + lines[i].args[4] |= TMFT_INTANGIBLEBOTTOM; //Speed - lines[i].args[4] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + lines[i].args[5] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; //Flags if (lines[i].flags & ML_BLOCKMONSTERS) - lines[i].args[5] |= TMFR_REVERSE; + lines[i].args[6] |= TMFR_REVERSE; if (lines[i].flags & ML_BLOCKMONSTERS) - lines[i].args[5] |= TMFR_SPINDASH; + lines[i].args[6] |= TMFR_SPINDASH; lines[i].special = 190; break; @@ -3833,27 +3836,24 @@ static void P_ConvertBinaryMap(void) //Alpha if (lines[i].special == 221) { - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; - else - lines[i].args[1] = 128; + P_SetBinaryFOFAlpha(&lines[i]); //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].args[1] == 256) - lines[i].args[2] |= TMFA_SPLAT; + lines[i].args[3] |= TMFA_SPLAT; } else lines[i].args[1] = 255; //Appearance if (lines[i].special == 222) - lines[i].args[2] |= TMFA_NOPLANES; + lines[i].args[3] |= TMFA_NOPLANES; if (lines[i].special == 221) - lines[i].args[2] |= TMFA_INSIDES; + lines[i].args[3] |= TMFA_INSIDES; if (lines[i].special != 220 && !(lines[i].flags & ML_NOCLIMB)) - lines[i].args[2] |= TMFA_NOSHADE; + lines[i].args[3] |= TMFA_NOSHADE; if (lines[i].flags & ML_EFFECT6) - lines[i].args[2] |= TMFA_SPLAT; + lines[i].args[3] |= TMFA_SPLAT; lines[i].special = 220; break; @@ -3889,40 +3889,37 @@ static void P_ConvertBinaryMap(void) //Alpha if (lines[i].special == 253 || lines[i].special == 256) { - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; - else - lines[i].args[1] = 128; + P_SetBinaryFOFAlpha(&lines[i]); //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].args[1] == 256) - lines[i].args[3] |= TMFB_SPLAT; + lines[i].args[4] |= TMFB_SPLAT; } else lines[i].args[1] = 255; //Bustable type if (lines[i].special <= 253) - lines[i].args[2] = TMFB_TOUCH; + lines[i].args[3] = TMFB_TOUCH; else if (lines[i].special >= 255) - lines[i].args[2] = TMFB_SPIN; + lines[i].args[3] = TMFB_SPIN; else if (lines[i].flags & ML_NOCLIMB) - lines[i].args[2] = TMFB_STRONG; + lines[i].args[3] = TMFB_STRONG; else - lines[i].args[2] = TMFB_REGULAR; + lines[i].args[3] = TMFB_REGULAR; //Flags if (lines[i].flags & ML_EFFECT4) - lines[i].args[3] |= TMFB_PUSHABLES; + lines[i].args[4] |= TMFB_PUSHABLES; if (lines[i].flags & ML_EFFECT5) { - lines[i].args[3] |= TMFB_EXECUTOR; - lines[i].args[4] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + lines[i].args[4] |= TMFB_EXECUTOR; + lines[i].args[5] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; } if (lines[i].special == 252 && lines[i].flags & ML_NOCLIMB) - lines[i].args[3] |= TMFB_ONLYBOTTOM; + lines[i].args[4] |= TMFB_ONLYBOTTOM; if (lines[i].flags & ML_EFFECT6) - lines[i].args[3] |= TMFB_SPLAT; + lines[i].args[4] |= TMFB_SPLAT; lines[i].special = 254; break; @@ -3937,17 +3934,14 @@ static void P_ConvertBinaryMap(void) lines[i].args[0] = tag; //Alpha - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; - else - lines[i].args[1] = 128; + P_SetBinaryFOFAlpha(&lines[i]); //Flags if (lines[i].flags & ML_EFFECT1) - lines[i].args[2] = TMFL_NOBOSSES; + lines[i].args[3] |= TMFL_NOBOSSES; //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].flags & ML_EFFECT6 || lines[i].args[1] == 256) - lines[i].args[2] = TMFL_SPLAT; + lines[i].args[3] |= TMFL_SPLAT; break; case 259: //Custom FOF @@ -3955,20 +3949,17 @@ static void P_ConvertBinaryMap(void) I_Error("Custom FOF (tag %d) found without a linedef back side!", tag); lines[i].args[0] = tag; - lines[i].args[2] = sides[lines[i].sidenum[1]].toptexture; + lines[i].args[3] = sides[lines[i].sidenum[1]].toptexture; if (lines[i].flags & ML_EFFECT6) - lines[i].args[2] |= FF_SPLAT; - lines[i].args[3] = sides[lines[i].sidenum[1]].midtexture; - if (lines[i].args[2] & FF_TRANSLUCENT) + lines[i].args[3] |= FF_SPLAT; + lines[i].args[4] = sides[lines[i].sidenum[1]].midtexture; + if (lines[i].args[3] & FF_TRANSLUCENT) { - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; - else - lines[i].args[1] = 128; + P_SetBinaryFOFAlpha(&lines[i]); //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].args[1] == 256) - lines[i].args[2] |= FF_SPLAT; + lines[i].args[3] |= FF_SPLAT; } else lines[i].args[1] = 255; diff --git a/src/p_spec.c b/src/p_spec.c index 1220edf8f..9358d6766 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -115,7 +115,7 @@ static void Add_ColormapFader(sector_t *sector, extracolormap_t *source_exc, ext static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, UINT16 tag, line_t *sourceline); //static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); -static void P_AddFakeFloorsByLine(size_t line, INT32 alpha, ffloortype_e ffloorflags, thinkerlist_t *secthinkers); +static void P_AddFakeFloorsByLine(size_t line, INT32 alpha, UINT8 blendmode, ffloortype_e ffloorflags, thinkerlist_t *secthinkers); static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec); static void Add_Friction(INT32 friction, INT32 movefactor, INT32 affectee, INT32 referrer); static void P_AddPlaneDisplaceThinker(INT32 type, fixed_t speed, INT32 control, INT32 affectee, UINT8 reverse); @@ -5490,12 +5490,13 @@ static inline void P_AddFFloorToList(sector_t *sec, ffloor_t *fflr) * \param sec2 Control sector. * \param master Control linedef. * \param alpha Alpha value (0-255). + * \param blendmode Blending mode. * \param flags Options affecting this 3Dfloor. * \param secthinkers List of relevant thinkers sorted by sector. May be NULL. * \return Pointer to the new 3Dfloor. * \sa P_AddFFloor, P_AddFakeFloorsByLine, P_SpawnSpecials */ -static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, INT32 alpha, ffloortype_e flags, thinkerlist_t *secthinkers) +static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, INT32 alpha, UINT8 blendmode, ffloortype_e flags, thinkerlist_t *secthinkers) { ffloor_t *fflr; thinker_t *th; @@ -5621,15 +5622,29 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, I { fflr->flags |= FF_TRANSLUCENT; fflr->spawnflags = fflr->flags; - - if (sides[master->sidenum[0]].toptexture >= 1001) - { - fflr->blend = (sides[master->sidenum[0]].toptexture/1000)+1; // becomes an AST - fflr->alpha %= 1000; - } } fflr->spawnalpha = fflr->alpha; // save for netgames + switch (blendmode) + { + case TMB_TRANSLUCENT: + default: + fflr->blend = AST_TRANSLUCENT; + break; + case TMB_ADD: + fflr->blend = AST_ADD; + break; + case TMB_SUBTRACT: + fflr->blend = AST_SUBTRACT; + break; + case TMB_REVERSESUBTRACT: + fflr->blend = AST_REVERSESUBTRACT; + break; + case TMB_MODULATE: + fflr->blend = AST_MODULATE; + break; + } + if (flags & FF_QUICKSAND) CheckForQuicksand = true; @@ -6455,29 +6470,81 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; //Appearance settings - if (lines[i].args[2] & TMFA_NOPLANES) + if (lines[i].args[3] & TMFA_NOPLANES) ffloorflags &= ~FF_RENDERPLANES; - if (lines[i].args[2] & TMFA_NOSIDES) + if (lines[i].args[3] & TMFA_NOSIDES) ffloorflags &= ~FF_RENDERSIDES; - if (lines[i].args[2] & TMFA_INSIDES) + if (lines[i].args[3] & TMFA_INSIDES) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_BOTHPLANES; if (ffloorflags & FF_RENDERSIDES) ffloorflags |= FF_ALLSIDES; } - if (lines[i].args[2] & TMFA_ONLYINSIDES) + if (lines[i].args[3] & TMFA_ONLYINSIDES) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_INVERTPLANES; if (ffloorflags & FF_RENDERSIDES) ffloorflags |= FF_INVERTSIDES; } - if (lines[i].args[2] & TMFA_NOSHADE) + if (lines[i].args[3] & TMFA_NOSHADE) ffloorflags |= FF_NOSHADE; - if (lines[i].args[2] & TMFA_SPLAT) + if (lines[i].args[3] & TMFA_SPLAT) ffloorflags |= FF_SPLAT; + //Tangibility settings + if (lines[i].args[4] & TMFT_INTANGIBLETOP) + ffloorflags |= FF_REVERSEPLATFORM; + if (lines[i].args[4] & TMFT_INTANGIBLEBOTTOM) + ffloorflags |= FF_PLATFORM; + if (lines[i].args[4] & TMFT_DONTBLOCKPLAYER) + ffloorflags &= ~FF_BLOCKPLAYER; + if (lines[i].args[4] & TMFT_DONTBLOCKOTHERS) + ffloorflags &= ~FF_BLOCKOTHERS; + + //Cutting options + if (ffloorflags & FF_RENDERALL) + { + //If translucent or player can enter it, cut inner walls + if ((lines[i].args[1] < 255) || (lines[i].args[4] & TMFT_VISIBLEFROMINSIDE)) + ffloorflags |= FF_CUTEXTRA|FF_EXTRA; + else + ffloorflags |= FF_CUTLEVEL; + } + + P_AddFakeFloorsByLine(i, lines[i].args[1], lines[i].args[2], ffloorflags, secthinkers); + break; + + case 120: // FOF (water) + ffloorflags = FF_EXISTS|FF_RENDERPLANES|FF_SWIMMABLE|FF_BOTHPLANES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; + if (!(lines[i].args[3] & TMFW_NOSIDES)) + ffloorflags |= FF_RENDERSIDES|FF_ALLSIDES; + if (lines[i].args[3] & TMFW_DOUBLESHADOW) + ffloorflags |= FF_DOUBLESHADOW; + if (lines[i].args[3] & TMFW_COLORMAPONLY) + ffloorflags |= FF_COLORMAPONLY; + if (!(lines[i].args[3] & TMFW_NORIPPLE)) + ffloorflags |= FF_RIPPLE; + if (lines[i].args[3] & TMFW_GOOWATER) + ffloorflags |= FF_GOOWATER; + if (lines[i].args[3] & TMFW_SPLAT) + ffloorflags |= FF_SPLAT; + P_AddFakeFloorsByLine(i, lines[i].args[1], lines[i].args[2], ffloorflags, secthinkers); + break; + + case 150: // FOF (Air bobbing) + P_AddFakeFloorsByLine(i, 0xff, AST_COPY, FF_EXISTS|FF_SOLID|FF_RENDERALL, secthinkers); + P_AddAirbob(lines[i].frontsector, lines[i].args[0], lines[i].args[1] << FRACBITS, !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); + break; + + case 160: // FOF (Water bobbing) + P_AddFakeFloorsByLine(i, 0xff, AST_COPY, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_FLOATBOB, secthinkers); + break; + + case 170: // FOF (Crumbling) + ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CRUMBLE; + //Tangibility settings if (lines[i].args[3] & TMFT_INTANGIBLETOP) ffloorflags |= FF_REVERSEPLATFORM; @@ -6488,76 +6555,24 @@ void P_SpawnSpecials(boolean fromnetsave) if (lines[i].args[3] & TMFT_DONTBLOCKOTHERS) ffloorflags &= ~FF_BLOCKOTHERS; - //Cutting options - if (ffloorflags & FF_RENDERALL) - { - //If translucent or player can enter it, cut inner walls - if ((lines[i].args[1] < 255) || (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE)) - ffloorflags |= FF_CUTEXTRA|FF_EXTRA; - else - ffloorflags |= FF_CUTLEVEL; - } - - P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); - break; - - case 120: // FOF (water) - ffloorflags = FF_EXISTS|FF_RENDERPLANES|FF_SWIMMABLE|FF_BOTHPLANES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; - if (!(lines[i].args[2] & TMFW_NOSIDES)) - ffloorflags |= FF_RENDERSIDES|FF_ALLSIDES; - if (lines[i].args[2] & TMFW_DOUBLESHADOW) - ffloorflags |= FF_DOUBLESHADOW; - if (lines[i].args[2] & TMFW_COLORMAPONLY) - ffloorflags |= FF_COLORMAPONLY; - if (!(lines[i].args[2] & TMFW_NORIPPLE)) - ffloorflags |= FF_RIPPLE; - if (lines[i].args[2] & TMFW_GOOWATER) - ffloorflags |= FF_GOOWATER; - if (lines[i].args[2] & TMFW_SPLAT) - ffloorflags |= FF_SPLAT; - P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); - break; - - case 150: // FOF (Air bobbing) - P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_SOLID|FF_RENDERALL, secthinkers); - P_AddAirbob(lines[i].frontsector, lines[i].args[0], lines[i].args[1] << FRACBITS, !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); - break; - - case 160: // FOF (Water bobbing) - P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_FLOATBOB, secthinkers); - break; - - case 170: // FOF (Crumbling) - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CRUMBLE; - - //Tangibility settings - if (lines[i].args[2] & TMFT_INTANGIBLETOP) - ffloorflags |= FF_REVERSEPLATFORM; - if (lines[i].args[2] & TMFT_INTANGIBLEBOTTOM) - ffloorflags |= FF_PLATFORM; - if (lines[i].args[2] & TMFT_DONTBLOCKPLAYER) - ffloorflags &= ~FF_BLOCKPLAYER; - if (lines[i].args[2] & TMFT_DONTBLOCKOTHERS) - ffloorflags &= ~FF_BLOCKOTHERS; - //Flags - if (lines[i].args[3] & TMFC_NOSHADE) + if (lines[i].args[4] & TMFC_NOSHADE) ffloorflags |= FF_NOSHADE; - if (lines[i].args[3] & TMFC_NORETURN) + if (lines[i].args[4] & TMFC_NORETURN) ffloorflags |= FF_NORETURN; - if (lines[i].args[3] & TMFC_FLOATBOB) + if (lines[i].args[4] & TMFC_FLOATBOB) ffloorflags |= FF_FLOATBOB; - if (lines[i].args[3] & TMFC_SPLAT) + if (lines[i].args[4] & TMFC_SPLAT) ffloorflags |= FF_SPLAT; //If translucent or player can enter it, cut inner walls - if (lines[i].args[1] < 0xff || (lines[i].args[2] & TMFT_VISIBLEFROMINSIDE)) + if (lines[i].args[1] < 0xff || (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE)) ffloorflags |= FF_CUTEXTRA|FF_EXTRA; else ffloorflags |= FF_CUTLEVEL; //If player can enter it, render insides - if (lines[i].args[2] & TMFT_VISIBLEFROMINSIDE) + if (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_BOTHPLANES; @@ -6565,8 +6580,8 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags |= FF_ALLSIDES; } - P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); - if (lines[i].args[3] & TMFC_AIRBOB) + P_AddFakeFloorsByLine(i, lines[i].args[1], lines[i].args[2], ffloorflags, secthinkers); + if (lines[i].args[4] & TMFC_AIRBOB) P_AddAirbob(lines[i].frontsector, lines[i].args[0], 16*FRACUNIT, false, false, false); break; @@ -6578,50 +6593,50 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; //Appearance settings - if (lines[i].args[2] & TMFA_NOPLANES) + if (lines[i].args[3] & TMFA_NOPLANES) ffloorflags &= ~FF_RENDERPLANES; - if (lines[i].args[2] & TMFA_NOSIDES) + if (lines[i].args[3] & TMFA_NOSIDES) ffloorflags &= ~FF_RENDERSIDES; - if (lines[i].args[2] & TMFA_INSIDES) + if (lines[i].args[3] & TMFA_INSIDES) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_BOTHPLANES; if (ffloorflags & FF_RENDERSIDES) ffloorflags |= FF_ALLSIDES; } - if (lines[i].args[2] & TMFA_ONLYINSIDES) + if (lines[i].args[3] & TMFA_ONLYINSIDES) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_INVERTPLANES; if (ffloorflags & FF_RENDERSIDES) ffloorflags |= FF_INVERTSIDES; } - if (lines[i].args[2] & TMFA_NOSHADE) + if (lines[i].args[3] & TMFA_NOSHADE) ffloorflags |= FF_NOSHADE; - if (lines[i].args[2] & TMFA_SPLAT) + if (lines[i].args[3] & TMFA_SPLAT) ffloorflags |= FF_SPLAT; //Tangibility settings - if (lines[i].args[3] & TMFT_INTANGIBLETOP) + if (lines[i].args[4] & TMFT_INTANGIBLETOP) ffloorflags |= FF_REVERSEPLATFORM; - if (lines[i].args[3] & TMFT_INTANGIBLEBOTTOM) + if (lines[i].args[4] & TMFT_INTANGIBLEBOTTOM) ffloorflags |= FF_PLATFORM; - if (lines[i].args[3] & TMFT_DONTBLOCKPLAYER) + if (lines[i].args[4] & TMFT_DONTBLOCKPLAYER) ffloorflags &= ~FF_BLOCKPLAYER; - if (lines[i].args[3] & TMFT_DONTBLOCKOTHERS) + if (lines[i].args[4] & TMFT_DONTBLOCKOTHERS) ffloorflags &= ~FF_BLOCKOTHERS; //Cutting options if (ffloorflags & FF_RENDERALL) { //If translucent or player can enter it, cut inner walls - if ((lines[i].args[1] < 255) || (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE)) + if ((lines[i].args[1] < 255) || (lines[i].args[4] & TMFT_VISIBLEFROMINSIDE)) ffloorflags |= FF_CUTEXTRA|FF_EXTRA; else ffloorflags |= FF_CUTLEVEL; } - P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, lines[i].args[1], lines[i].args[2], ffloorflags, secthinkers); P_AddRaiseThinker(lines[i].frontsector, lines[i].args[0], lines[i].args[4] << FRACBITS, ceilingtop, ceilingbottom, !!(lines[i].args[5] & TMFR_REVERSE), !!(lines[i].args[5] & TMFR_SPINDASH)); break; } @@ -6629,7 +6644,7 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags = FF_EXISTS|FF_CUTSPRITES; if (!lines[i].args[1]) ffloorflags |= FF_DOUBLESHADOW; - P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, AST_COPY, ffloorflags, secthinkers); break; case 202: // Fog @@ -6638,41 +6653,41 @@ void P_SpawnSpecials(boolean fromnetsave) // SoM: Because it's fog, check for an extra colormap and set the fog flag... if (sectors[sec].extra_colormap) sectors[sec].extra_colormap->flags = CMF_FOG; - P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, AST_COPY, ffloorflags, secthinkers); break; case 220: //Intangible ffloorflags = FF_EXISTS|FF_RENDERALL|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; //Appearance settings - if (lines[i].args[2] & TMFA_NOPLANES) + if (lines[i].args[3] & TMFA_NOPLANES) ffloorflags &= ~FF_RENDERPLANES; - if (lines[i].args[2] & TMFA_NOSIDES) + if (lines[i].args[3] & TMFA_NOSIDES) ffloorflags &= ~FF_RENDERSIDES; - if (!(lines[i].args[2] & TMFA_INSIDES)) + if (!(lines[i].args[3] & TMFA_INSIDES)) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_BOTHPLANES; if (ffloorflags & FF_RENDERSIDES) ffloorflags |= FF_ALLSIDES; } - if (lines[i].args[2] & TMFA_ONLYINSIDES) + if (lines[i].args[3] & TMFA_ONLYINSIDES) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_INVERTPLANES; if (ffloorflags & FF_RENDERSIDES) ffloorflags |= FF_INVERTSIDES; } - if (lines[i].args[2] & TMFA_NOSHADE) + if (lines[i].args[3] & TMFA_NOSHADE) ffloorflags |= FF_NOSHADE; - if (lines[i].args[2] & TMFA_SPLAT) + if (lines[i].args[3] & TMFA_SPLAT) ffloorflags |= FF_SPLAT; - P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, lines[i].args[1], lines[i].args[2], ffloorflags, secthinkers); break; case 223: // FOF (intangible, invisible) - for combining specials in a sector - P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_NOSHADE, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, AST_COPY, FF_EXISTS|FF_NOSHADE, secthinkers); break; case 250: // Mario Block @@ -6682,14 +6697,14 @@ void P_SpawnSpecials(boolean fromnetsave) if (lines[i].args[1] & TMFM_INVISIBLE) ffloorflags &= ~(FF_SOLID|FF_RENDERALL|FF_CUTLEVEL); - P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, AST_COPY, ffloorflags, secthinkers); break; case 251: // A THWOMP! { UINT16 sound = (lines[i].stringargs[0]) ? get_number(lines[i].stringargs[0]) : sfx_thwomp; P_AddThwompThinker(lines[i].frontsector, &lines[i], lines[i].args[1] << (FRACBITS - 3), lines[i].args[2] << (FRACBITS - 3), sound); - P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, AST_COPY, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); break; } @@ -6701,7 +6716,7 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags = FF_EXISTS|FF_BLOCKOTHERS|FF_RENDERALL|FF_BUSTUP; //Bustable type - switch (lines[i].args[2]) + switch (lines[i].args[3]) { case TMFB_TOUCH: busttype = BT_TOUCH; @@ -6718,13 +6733,13 @@ void P_SpawnSpecials(boolean fromnetsave) } //Flags - if (lines[i].args[3] & TMFB_PUSHABLES) + if (lines[i].args[4] & TMFB_PUSHABLES) bustflags |= FB_PUSHABLES; - if (lines[i].args[3] & TMFB_EXECUTOR) + if (lines[i].args[4] & TMFB_EXECUTOR) bustflags |= FB_EXECUTOR; - if (lines[i].args[3] & TMFB_ONLYBOTTOM) + if (lines[i].args[4] & TMFB_ONLYBOTTOM) bustflags |= FB_ONLYBOTTOM; - if (lines[i].args[3] & TMFB_SPLAT) + if (lines[i].args[4] & TMFB_SPLAT) ffloorflags |= FF_SPLAT; if (busttype != BT_TOUCH || bustflags & FB_ONLYBOTTOM) @@ -6732,12 +6747,12 @@ void P_SpawnSpecials(boolean fromnetsave) TAG_ITER_SECTORS(lines[i].args[0], s) { - ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], ffloorflags, secthinkers); + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], lines[i].args[2], ffloorflags, secthinkers); if (!fflr) continue; fflr->bustflags = bustflags; fflr->busttype = busttype; - fflr->busttag = lines[i].args[4]; + fflr->busttag = lines[i].args[5]; } break; } @@ -6748,7 +6763,7 @@ void P_SpawnSpecials(boolean fromnetsave) TAG_ITER_SECTORS(lines[i].args[0], s) { - ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, 0xff, ffloorflags, secthinkers); + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, 0xff, AST_COPY, ffloorflags, secthinkers); if (!fflr) continue; fflr->sinkspeed = abs(lines[i].args[2]) << (FRACBITS - 1); @@ -6758,28 +6773,28 @@ void P_SpawnSpecials(boolean fromnetsave) case 258: // Laser block ffloorflags = FF_EXISTS|FF_RENDERALL|FF_NOSHADE|FF_EXTRA|FF_CUTEXTRA|FF_TRANSLUCENT; - P_AddLaserThinker(lines[i].args[0], lines + i, !!(lines[i].args[2] & TMFL_NOBOSSES)); - if (lines[i].args[2] & TMFL_SPLAT) + P_AddLaserThinker(lines[i].args[0], lines + i, !!(lines[i].args[3] & TMFL_NOBOSSES)); + if (lines[i].args[3] & TMFL_SPLAT) ffloorflags |= FF_SPLAT; - P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, lines[i].args[1], lines[i].args[2], ffloorflags, secthinkers); break; case 259: // Custom FOF TAG_ITER_SECTORS(lines[i].args[0], s) { - ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], lines[i].args[2], secthinkers); + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], lines[i].args[2], lines[i].args[3], secthinkers); if (!fflr) continue; if (!udmf) // Ugly backwards compatibility stuff { - if (lines[i].args[2] & FF_QUICKSAND) + if (lines[i].args[3] & FF_QUICKSAND) { fflr->sinkspeed = abs(lines[i].dx) >> 1; fflr->friction = abs(lines[i].dy) >> 6; } - if (lines[i].args[2] & FF_BUSTUP) + if (lines[i].args[3] & FF_BUSTUP) { - switch (lines[i].args[3] % TMFB_ONLYBOTTOM) + switch (lines[i].args[4] % TMFB_ONLYBOTTOM) { case TMFB_TOUCH: fflr->busttype = BT_TOUCH; @@ -6795,7 +6810,7 @@ void P_SpawnSpecials(boolean fromnetsave) break; } - if (lines[i].args[3] & TMFB_ONLYBOTTOM) + if (lines[i].args[4] & TMFB_ONLYBOTTOM) fflr->bustflags |= FB_ONLYBOTTOM; if (lines[i].flags & ML_EFFECT4) fflr->bustflags |= FB_PUSHABLES; @@ -6870,7 +6885,7 @@ void P_SpawnSpecials(boolean fromnetsave) } } - P_AddFakeFloorsByLine(i, dopacity, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, dopacity, AST_TRANSLUCENT, ffloorflags, secthinkers); } break; @@ -7159,12 +7174,13 @@ void P_SpawnSpecials(boolean fromnetsave) * * \param line Control linedef to use. * \param alpha Alpha value (0-255). + * \param blendmode Blending mode. * \param ffloorflags 3Dfloor flags to use. * \param secthkiners Lists of thinkers sorted by sector. May be NULL. * \sa P_SpawnSpecials, P_AddFakeFloor * \author Graue */ -static void P_AddFakeFloorsByLine(size_t line, INT32 alpha, ffloortype_e ffloorflags, thinkerlist_t *secthinkers) +static void P_AddFakeFloorsByLine(size_t line, INT32 alpha, UINT8 blendmode, ffloortype_e ffloorflags, thinkerlist_t *secthinkers) { INT32 s; mtag_t tag = lines[line].args[0]; @@ -7172,7 +7188,7 @@ static void P_AddFakeFloorsByLine(size_t line, INT32 alpha, ffloortype_e ffloorf line_t* li = lines + line; TAG_ITER_SECTORS(tag, s) - P_AddFakeFloor(§ors[s], §ors[sec], li, alpha, ffloorflags, secthinkers); + P_AddFakeFloor(§ors[s], §ors[sec], li, alpha, blendmode, ffloorflags, secthinkers); } /* diff --git a/src/p_spec.h b/src/p_spec.h index d02b5989f..40d7197fb 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -448,7 +448,6 @@ typedef enum TMPF_NONEXCLUSIVE = 1<<1, } textmappusherflags_t; - typedef enum { TMPP_NOZFADE = 1, @@ -456,6 +455,15 @@ typedef enum TMPP_NONEXCLUSIVE = 1<<2, } textmappointpushflags_t; +typedef enum +{ + TMB_TRANSLUCENT = 0, + TMB_ADD = 1, + TMB_SUBTRACT = 2, + TMB_REVERSESUBTRACT = 3, + TMB_MODULATE = 4, +} textmapblendmodes_t; + // GETSECSPECIAL (specialval, section) // // Pulls out the special # from a particular section. From 7609f300bad0ed2b8cbfaa8dd63818b0d86dcc3e Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 4 Jan 2022 19:45:36 +0100 Subject: [PATCH 280/377] Fix typo in laser FOF conversion --- src/p_setup.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index fd8b19f1c..057ccb45e 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3557,10 +3557,10 @@ static void P_ConvertBinaryMap(void) //Flags if (lines[i].flags & ML_EFFECT1) - lines[i].args[2] = TMFL_NOBOSSES; + lines[i].args[2] |= TMFL_NOBOSSES; //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].flags & ML_EFFECT6 || lines[i].args[1] == 256) - lines[i].args[2] = TMFL_SPLAT; + lines[i].args[2] |= TMFL_SPLAT; break; case 259: //Custom FOF From e0ed58f577f1bd0662244cf1dc2e192a66232abd Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 4 Jan 2022 19:49:28 +0100 Subject: [PATCH 281/377] Fix UDB config typo --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 4169548cf..c99ed4bab 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -3384,7 +3384,7 @@ udmf 602 { - title = "Start Adjustable Pulsating Light"; + title = "Adjustable Pulsating Light"; prefix = "(602)"; arg0 { @@ -3442,7 +3442,7 @@ udmf 604 { - title = "Start Adjustable Blinking Light"; + title = "Adjustable Blinking Light"; prefix = "(604)"; arg0 { From 6cc7cc3276b8e256c7cf1ec836071fbbb9b6db9d Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 4 Jan 2022 19:50:34 +0100 Subject: [PATCH 282/377] Fix UDB config typo --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index cf51d9a9a..8c0b208a7 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -2731,7 +2731,7 @@ udmf type = 12; enum { - 1 = "Add to current translucency"; + 1 = "Add to current light level"; 2 = "Interrupt ongoing fades"; 4 = "Speed is duration"; } From 46ad1e4a5cf279891387eb2bc3d2ad442446ca45 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 4 Jan 2022 19:54:43 +0100 Subject: [PATCH 283/377] UDB config: Move thing type args from Doom section to UDMF section --- extras/conf/udb/Includes/SRB222_things.cfg | 30 +++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 0cb0287c5..28347c5e9 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -258,11 +258,6 @@ doom sprite = "TRETA1"; width = 16; height = 32; - arg0 - { - title = "Death trigger tag"; - type = 15; - } } 111 { @@ -2709,11 +2704,6 @@ doom sprite = "KOOPA0"; width = 16; height = 48; - arg0 - { - title = "Death trigger tag"; - type = 15; - } } 1807 { @@ -2721,11 +2711,6 @@ doom sprite = "MAXEA0"; width = 8; height = 16; - arg0 - { - title = "Death trigger tag"; - type = 15; - } } 1808 { @@ -3640,6 +3625,11 @@ udmf sprite = "TRETA1"; width = 16; height = 32; + arg0 + { + title = "Death trigger tag"; + type = 15; + } } 111 { @@ -7471,6 +7461,11 @@ udmf sprite = "KOOPA0"; width = 16; height = 48; + arg0 + { + title = "Death trigger tag"; + type = 15; + } } 1807 { @@ -7478,6 +7473,11 @@ udmf sprite = "MAXEA0"; width = 8; height = 16; + arg0 + { + title = "Death trigger tag"; + type = 15; + } } 1808 { From 9d67420e5caa4224894ce6932157fc484057815f Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 4 Jan 2022 19:57:14 +0100 Subject: [PATCH 284/377] Egg Slimer: Fix typo in binary-to-UDMF conversion and invert speed-up flag --- extras/conf/udb/Includes/SRB222_things.cfg | 2 +- src/p_mobj.c | 2 +- src/p_setup.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 28347c5e9..dea20c9c6 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -4031,7 +4031,7 @@ udmf { title = "Speed up when hit?"; type = 11; - enum = "noyes"; + enum = "yesno"; } } 202 diff --git a/src/p_mobj.c b/src/p_mobj.c index 46510200e..f70c11218 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12731,7 +12731,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean } break; case MT_EGGMOBILE2: - if (mthing->args[5]) + if (!mthing->args[5]) mobj->flags2 |= MF2_AMBUSH; break; case MT_EGGMOBILE3: diff --git a/src/p_setup.c b/src/p_setup.c index 77d009194..16faee251 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4989,8 +4989,8 @@ static void P_ConvertBinaryMap(void) case 136: //Pyre Fly mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); break; - case 202: //Egg Slimer - mapthings[i].args[5] = !!(mapthings[i].options & MTF_AMBUSH); + case 201: //Egg Slimer + mapthings[i].args[5] = !(mapthings[i].options & MTF_AMBUSH); break; case 203: //Egg Colosseum mapthings[i].args[5] = LE_BOSS4DROP + mapthings[i].extrainfo * LE_PARAMWIDTH; From 88fae019a2fece3af15f68b250f8e30253fbe954 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 4 Jan 2022 19:59:51 +0100 Subject: [PATCH 285/377] Fix typos in binary-to-UDMF conversion --- src/p_setup.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 16faee251..bed7291f3 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -5121,13 +5121,13 @@ static void P_ConvertBinaryMap(void) mapthings[i].args[0] = !(mapthings[i].options & MTF_AMBUSH); break; case 700: //Water ambience A - case 701: //Water ambience A - case 702: //Water ambience A - case 703: //Water ambience A - case 704: //Water ambience A - case 705: //Water ambience A - case 706: //Water ambience A - case 707: //Water ambience A + case 701: //Water ambience B + case 702: //Water ambience C + case 703: //Water ambience D + case 704: //Water ambience E + case 705: //Water ambience F + case 706: //Water ambience G + case 707: //Water ambience H mapthings[i].args[0] = 35; P_WriteConstant(sfx_amwtr1 + mapthings[i].type - 700, &mapthings[i].stringargs[0]); mapthings[i].type = 700; From 70a28bad9456e3085b6714d059259faefab7a6e4 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 4 Jan 2022 20:02:58 +0100 Subject: [PATCH 286/377] Gas jet: Fix typo in UDB config --- extras/conf/udb/Includes/SRB222_things.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index dea20c9c6..2ddf6c80a 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -5029,7 +5029,7 @@ udmf { title = "Play sound?"; type = 11; - enum = "noyes"; + enum = "yesno"; } } 542 From 8291d433cb65efc3cc7aa892978806b8f29a0c00 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 4 Jan 2022 20:05:21 +0100 Subject: [PATCH 287/377] Chained spring: Correct flag description in UDB config --- extras/conf/udb/Includes/SRB222_things.cfg | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 2ddf6c80a..c5a881c5c 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -5999,7 +5999,17 @@ udmf { title = "Flags"; type = 12; - enum = "maceflags"; + enum + { + 1 = "Red spring"; + 2 = "No sounds"; + 4 = "Player-turnable chain"; + 8 = "Swing instead of spin"; + 16 = "Make chain from end item"; + 32 = "Spawn link at origin"; + 64 = "Clip inside ground"; + 128 = "No distance check"; + } } } 1107 From 577ae68d6d3475258d95962cf7edc01800e05ec2 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 4 Jan 2022 21:25:34 +0100 Subject: [PATCH 288/377] Make sector friction a floating-point field --- extras/conf/udb/Includes/SRB222_misc.cfg | 4 ++-- src/lua_maplib.c | 2 +- src/p_setup.c | 20 ++++++++++++++++++-- src/p_spec.c | 12 ++---------- src/r_defs.h | 2 +- 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index bc284a3f9..e8da74e99 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -250,8 +250,8 @@ universalfields friction { - type = 0; - default = 0; + type = 1; + default = 0.90625; } triggertag diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 4bbd826ef..41ed0bbdc 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -679,7 +679,7 @@ static int sector_get(lua_State *L) lua_pushinteger(L, (UINT8)sector->triggerer); return 1; case sector_friction: // friction - lua_pushinteger(L, sector->friction); + lua_pushfixed(L, sector->friction); return 1; case sector_gravity: // gravity lua_pushfixed(L, sector->gravity); diff --git a/src/p_setup.c b/src/p_setup.c index 5d8bc9cc0..2e6b89ce1 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1054,6 +1054,8 @@ static void P_LoadSectors(UINT8 *data) ss->triggertag = 0; ss->triggerer = TO_PLAYER; + ss->friction = ORIG_FRICTION; + P_InitializeSector(ss); } } @@ -1720,7 +1722,7 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) else if (fastcmp(param, "ropehang") && fastcmp("true", val)) sectors[i].specialflags |= SSF_ROPEHANG; else if (fastcmp(param, "friction")) - sectors[i].friction = atol(val); + sectors[i].friction = FLOAT_TO_FIXED(atof(val)); else if (fastcmp(param, "gravity")) sectors[i].gravity = FLOAT_TO_FIXED(atof(val)); else if (fastcmp(param, "damagetype")) @@ -2034,6 +2036,8 @@ static void P_LoadTextmap(void) sc->triggertag = 0; sc->triggerer = TO_PLAYER; + sc->friction = ORIG_FRICTION; + textmap_colormap.used = false; textmap_colormap.lightcolor = 0; textmap_colormap.lightalpha = 25; @@ -4921,8 +4925,20 @@ static void P_ConvertBinaryMap(void) case 540: //Floor friction { INT32 s; + fixed_t strength; // friction value of sector + fixed_t friction; // friction value to be applied during movement + + strength = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + if (strength > 0) // sludge + strength = strength*2; // otherwise, the maximum sludginess value is +967... + + // The following might seem odd. At the time of movement, + // the move distance is multiplied by 'friction/0x10000', so a + // higher friction value actually means 'less friction'. + friction = ORIG_FRICTION - (0x1EB8*strength)/0x80; // ORIG_FRICTION is 0xE800 + TAG_ITER_SECTORS(tag, s) - sectors[s].friction = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + sectors[s].friction = friction; break; } case 541: //Wind diff --git a/src/p_spec.c b/src/p_spec.c index 73a095fde..4d6b83414 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -8337,23 +8337,15 @@ static void P_SpawnFriction(void) size_t i; sector_t *s = sectors; - fixed_t strength; // friction value of sector fixed_t friction; // friction value to be applied during movement INT32 movefactor; // applied to each player move to simulate inertia for (i = 0; i < numsectors; i++, s++) { - if (!s->friction) + if (s->friction == ORIG_FRICTION) continue; - strength = s->friction; - if (strength > 0) // sludge - strength = strength*2; // otherwise, the maximum sludginess value is +967... - - // The following might seem odd. At the time of movement, - // the move distance is multiplied by 'friction/0x10000', so a - // higher friction value actually means 'less friction'. - friction = ORIG_FRICTION - (0x1EB8*strength)/0x80; // ORIG_FRICTION is 0xE800 + friction = s->friction; if (friction > FRACUNIT) friction = FRACUNIT; diff --git a/src/r_defs.h b/src/r_defs.h index c56abdbfd..ce3ffaad9 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -428,7 +428,7 @@ typedef struct sector_s mtag_t triggertag; // tag to call upon triggering UINT8 triggerer; // who can trigger? - INT32 friction; + fixed_t friction; // Sprite culling feature struct line_s *cullheight; From a8e32cfe12914864677b3bef202df5de24c58db6 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 5 Jan 2022 00:26:10 +0100 Subject: [PATCH 289/377] Fix incorrect turnaround behavior for bounceFloor and bounceCeiling --- src/p_ceilng.c | 7 +++++-- src/p_floor.c | 6 ++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/p_ceilng.c b/src/p_ceilng.c index ed385be33..aa31e4301 100644 --- a/src/p_ceilng.c +++ b/src/p_ceilng.c @@ -86,14 +86,17 @@ void T_MoveCeiling(ceiling_t *ceiling) if (dest == lines[ceiling->sourceline].frontsector->ceilingheight) { dest = lines[ceiling->sourceline].backsector->ceilingheight; - ceiling->speed = ceiling->origspeed = lines[ceiling->sourceline].args[3] << (FRACBITS - 2); // return trip, use args[3] + ceiling->origspeed = lines[ceiling->sourceline].args[3] << (FRACBITS - 2); // return trip, use args[3] } else { dest = lines[ceiling->sourceline].frontsector->ceilingheight; - ceiling->speed = ceiling->origspeed = lines[ceiling->sourceline].args[2] << (FRACBITS - 2); // going frontways, use args[2] + ceiling->origspeed = lines[ceiling->sourceline].args[2] << (FRACBITS - 2); // going frontways, use args[2] } + if (ceiling->type == bounceCeilingCrush) + ceiling->speed = ceiling->origspeed; + if (dest < ceiling->sector->ceilingheight) // must move down { ceiling->direction = -1; diff --git a/src/p_floor.c b/src/p_floor.c index 7f1a7c2e0..1d7cc3f5b 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -206,13 +206,15 @@ void T_MoveFloor(floormove_t *movefloor) if (movefloor->floordestheight == lines[movefloor->sourceline].frontsector->floorheight) { movefloor->floordestheight = lines[movefloor->sourceline].backsector->floorheight; - movefloor->speed = movefloor->origspeed = lines[movefloor->sourceline].args[3] << (FRACBITS - 2); // return trip, use args[3] + movefloor->origspeed = lines[movefloor->sourceline].args[3] << (FRACBITS - 2); // return trip, use args[3] } else { movefloor->floordestheight = lines[movefloor->sourceline].frontsector->floorheight; - movefloor->speed = movefloor->origspeed = lines[movefloor->sourceline].args[2] << (FRACBITS - 2); // forward again, use args[2] + movefloor->origspeed = lines[movefloor->sourceline].args[2] << (FRACBITS - 2); // forward again, use args[2] } + if (movefloor->type == bounceFloorCrush) + movefloor->speed = movefloor->origspeed; movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1; movefloor->delaytimer = movefloor->delay; remove = false; From d25bc75a92769edc7e6e0e724d9d34c0580535cf Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 5 Jan 2022 09:22:13 +0100 Subject: [PATCH 290/377] Remove redundant UDMF check in P_LoadSidedefs --- src/p_setup.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 399f66c58..b89b38f5b 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1233,11 +1233,8 @@ static void P_LoadSidedefs(UINT8 *data) case 455: // Fade colormaps! mazmazz 9/12/2018 (:flag_us:) // SoM: R_CreateColormap will only create a colormap in software mode... // Perhaps we should just call it instead of doing the calculations here. - if (!udmf) - { - sd->colormap_data = R_CreateColormapFromLinedef(msd->toptexture, msd->midtexture, msd->bottomtexture); - sd->toptexture = sd->midtexture = sd->bottomtexture = 0; - } + sd->colormap_data = R_CreateColormapFromLinedef(msd->toptexture, msd->midtexture, msd->bottomtexture); + sd->toptexture = sd->midtexture = sd->bottomtexture = 0; break; case 413: // Change music From 06b7d7ceb80dc1664224e5334816ce80c75fd6ec Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 5 Jan 2022 18:05:47 +0100 Subject: [PATCH 291/377] Make only ML_EFFECT3 affect midtexture pegging in UDMF --- src/hardware/hw_main.c | 10 +++++----- src/p_maputl.c | 2 +- src/p_setup.c | 8 ++++++++ src/r_segs.c | 12 ++++++------ 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 291cabe9a..dece1deda 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -1330,7 +1330,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom if (gl_linedef->flags & ML_EFFECT2) { - if (!!(gl_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gl_linedef->flags & ML_EFFECT3)) + if (gl_linedef->flags & ML_EFFECT3) { polybottom = max(front->floorheight, back->floorheight) + gl_sidedef->rowoffset; polytop = polybottom + textureheight[gl_midtexture]*repeats; @@ -1341,7 +1341,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom polybottom = polytop - textureheight[gl_midtexture]*repeats; } } - else if (!!(gl_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gl_linedef->flags & ML_EFFECT3)) + else if (gl_linedef->flags & ML_EFFECT3) { polybottom = popenbottom + gl_sidedef->rowoffset; polytop = polybottom + textureheight[gl_midtexture]*repeats; @@ -1371,7 +1371,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom { // PEGGING - if (!!(gl_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gl_linedef->flags & ML_EFFECT3)) + if (gl_linedef->flags & ML_EFFECT3) texturevpeg = textureheight[gl_sidedef->midtexture]*repeats - h + polybottom; else texturevpeg = polytop - h; @@ -1396,7 +1396,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom if (gl_linedef->flags & ML_EFFECT2) midtextureslant = 0; - else if (!!(gl_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gl_linedef->flags & ML_EFFECT3)) + else if (gl_linedef->flags & ML_EFFECT3) midtextureslant = worldlow < worldbottom ? worldbottomslope-worldbottom : worldlowslope-worldlow; @@ -1421,7 +1421,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom { // PEGGING - if (!!(gl_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gl_linedef->flags & ML_EFFECT3)) + if (gl_linedef->flags & ML_EFFECT3) texturevpeg = textureheight[gl_sidedef->midtexture]*repeats - h + polybottom; else texturevpeg = polytop - h; diff --git a/src/p_maputl.c b/src/p_maputl.c index ee22578ef..0e10d1411 100644 --- a/src/p_maputl.c +++ b/src/p_maputl.c @@ -524,7 +524,7 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj) if (linedef->flags & ML_EFFECT5 && !side->repeatcnt) { // "infinite" repeat texbottom = openbottom + side->rowoffset; textop = opentop + side->rowoffset; - } else if (!!(linedef->flags & ML_DONTPEGBOTTOM) ^ !!(linedef->flags & ML_EFFECT3)) { + } else if (linedef->flags & ML_EFFECT3) { texbottom = openbottom + side->rowoffset; textop = texbottom + texheight*(side->repeatcnt+1); } else { diff --git a/src/p_setup.c b/src/p_setup.c index b89b38f5b..f92fd46a9 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -5852,6 +5852,14 @@ static void P_ConvertBinaryMap(void) break; } } + + for (i = 0; i < numlines; i++) + { + if (!!(lines[i].flags & ML_DONTPEGBOTTOM) ^ !!(lines[i].flags & ML_EFFECT3)) + lines[i].flags |= ML_EFFECT3; + else + lines[i].flags &= ~ML_EFFECT3; + } } /** Compute MD5 message digest for bytes read from memory source diff --git a/src/r_segs.c b/src/r_segs.c index 48d071b29..28968563e 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -345,7 +345,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) { dc_texturemid = ds->maskedtextureheight[dc_x]; - if (!!(curline->linedef->flags & ML_DONTPEGBOTTOM) ^ !!(curline->linedef->flags & ML_EFFECT3)) + if (curline->linedef->flags & ML_EFFECT3) dc_texturemid += (textureheight[texnum])*times + textureheight[texnum]; else dc_texturemid -= (textureheight[texnum])*times; @@ -1455,9 +1455,9 @@ static void R_RenderSegLoop (void) maskedtexturecol[rw_x] = (INT16)texturecolumn; if (maskedtextureheight != NULL) { - maskedtextureheight[rw_x] = (!!(curline->linedef->flags & ML_DONTPEGBOTTOM) ^ !!(curline->linedef->flags & ML_EFFECT3) ? + maskedtextureheight[rw_x] = (curline->linedef->flags & ML_EFFECT3) ? max(rw_midtexturemid, rw_midtextureback) : - min(rw_midtexturemid, rw_midtextureback)); + min(rw_midtexturemid, rw_midtextureback); } } @@ -2247,7 +2247,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) if (curline->polyseg) { // use REAL front and back floors please, so midtexture rendering isn't mucked up rw_midtextureslide = rw_midtexturebackslide = 0; - if (!!(linedef->flags & ML_DONTPEGBOTTOM) ^ !!(linedef->flags & ML_EFFECT3)) + if (linedef->flags & ML_EFFECT3) rw_midtexturemid = rw_midtextureback = max(curline->frontsector->floorheight, curline->backsector->floorheight) - viewz; else rw_midtexturemid = rw_midtextureback = min(curline->frontsector->ceilingheight, curline->backsector->ceilingheight) - viewz; @@ -2258,13 +2258,13 @@ void R_StoreWallRange(INT32 start, INT32 stop) if (linedef->flags & ML_EFFECT2) { // Ignore slopes when texturing rw_midtextureslide = rw_midtexturebackslide = 0; - if (!!(linedef->flags & ML_DONTPEGBOTTOM) ^ !!(linedef->flags & ML_EFFECT3)) + if (linedef->flags & ML_EFFECT3) rw_midtexturemid = rw_midtextureback = max(frontsector->floorheight, backsector->floorheight) - viewz; else rw_midtexturemid = rw_midtextureback = min(frontsector->ceilingheight, backsector->ceilingheight) - viewz; } - else if (!!(linedef->flags & ML_DONTPEGBOTTOM) ^ !!(linedef->flags & ML_EFFECT3)) + else if (linedef->flags & ML_EFFECT3) { rw_midtexturemid = worldbottom; rw_midtextureslide = floorfrontslide; From 55559a5f9841f6314307e9741760298949859bb7 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 5 Jan 2022 18:15:04 +0100 Subject: [PATCH 292/377] Split P_ConvertBinaryMap into multiple functions --- src/p_setup.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index f92fd46a9..18b12fee3 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3304,12 +3304,9 @@ static void P_SetBinaryFOFAlpha(line_t *line) } } -//For maps in binary format, converts setup of specials to UDMF format. -static void P_ConvertBinaryMap(void) +static void P_ConvertBinaryLinedefTypes(void) { size_t i; - mobjtype_t mobjtypeofthing[4096] = {0}; - mobjtype_t mobjtype; for (i = 0; i < numlines; i++) { @@ -5128,6 +5125,11 @@ static void P_ConvertBinaryMap(void) lines[i].executordelay = 1; } } +} + +static void P_ConvertBinarySectorTypes(void) +{ + size_t i; for (i = 0; i < numsectors; i++) { @@ -5291,6 +5293,13 @@ static void P_ConvertBinaryMap(void) break; } } +} + +static void P_ConvertBinaryThingTypes(void) +{ + size_t i; + mobjtype_t mobjtypeofthing[4096] = {0}; + mobjtype_t mobjtype; for (i = 0; i < NUMMOBJTYPES; i++) { @@ -5852,6 +5861,11 @@ static void P_ConvertBinaryMap(void) break; } } +} + +static void P_ConvertBinaryLinedefFlags(void) +{ + size_t i; for (i = 0; i < numlines; i++) { @@ -5862,6 +5876,15 @@ static void P_ConvertBinaryMap(void) } } +//For maps in binary format, converts setup of specials to UDMF format. +static void P_ConvertBinaryMap(void) +{ + P_ConvertBinaryLinedefTypes(); + P_ConvertBinarySectorTypes(); + P_ConvertBinaryThingTypes(); + P_ConvertBinaryLinedefFlags(); +} + /** Compute MD5 message digest for bytes read from memory source * * The resulting message digest number will be written into the 16 bytes From 5f97047b9673f908af370520a9a36f14a14cc9ee Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 5 Jan 2022 18:40:02 +0100 Subject: [PATCH 293/377] Rename linedef flags --- src/deh_lua.c | 26 ++++++ src/deh_tables.c | 10 +-- src/doomdata.h | 10 +-- src/p_maputl.c | 10 +-- src/p_setup.c | 212 +++++++++++++++++++++++------------------------ 5 files changed, 147 insertions(+), 121 deletions(-) diff --git a/src/deh_lua.c b/src/deh_lua.c index 9472c1e7b..bead7a325 100644 --- a/src/deh_lua.c +++ b/src/deh_lua.c @@ -335,6 +335,32 @@ static inline int lib_getenum(lua_State *L) lua_pushinteger(L, ((lua_Integer)1<z + mobj->height; // Check for collision with front side's midtexture if Effect 4 is set - if (linedef->flags & ML_EFFECT4 + if (linedef->flags & ML_MIDSOLID && !linedef->polyobj // don't do anything for polyobjects! ...for now ) { side_t *side = &sides[linedef->sidenum[0]]; @@ -508,10 +508,10 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj) // don't remove this code unless solid midtextures // on non-solid polyobjects should NEVER happen in the future if (linedef->polyobj && (linedef->polyobj->flags & POF_TESTHEIGHT)) { - if (linedef->flags & ML_EFFECT5 && !side->repeatcnt) { // "infinite" repeat + if (linedef->flags & ML_WRAPMIDTEX && !side->repeatcnt) { // "infinite" repeat texbottom = back->floorheight + side->rowoffset; textop = back->ceilingheight + side->rowoffset; - } else if (!!(linedef->flags & ML_DONTPEGBOTTOM) ^ !!(linedef->flags & ML_EFFECT3)) { + } else if (linedef->flags & ML_MIDTEX) { texbottom = back->floorheight + side->rowoffset; textop = texbottom + texheight*(side->repeatcnt+1); } else { @@ -521,10 +521,10 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj) } else #endif { - if (linedef->flags & ML_EFFECT5 && !side->repeatcnt) { // "infinite" repeat + if (linedef->flags & ML_WRAPMIDTEX && !side->repeatcnt) { // "infinite" repeat texbottom = openbottom + side->rowoffset; textop = opentop + side->rowoffset; - } else if (linedef->flags & ML_EFFECT3) { + } else if (linedef->flags & ML_MIDPEG) { texbottom = openbottom + side->rowoffset; textop = texbottom + texheight*(side->repeatcnt+1); } else { diff --git a/src/p_setup.c b/src/p_setup.c index 18b12fee3..fdd2f82d7 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1210,7 +1210,7 @@ static void P_LoadSidedefs(UINT8 *data) isfrontside = sd->line->sidenum[0] == i; // Repeat count for midtexture - if (((sd->line->flags & (ML_TWOSIDED|ML_EFFECT5)) == (ML_TWOSIDED|ML_EFFECT5)) + if (((sd->line->flags & (ML_TWOSIDED|ML_WRAPMIDTEX)) == (ML_TWOSIDED|ML_WRAPMIDTEX)) && !(sd->special >= 300 && sd->special < 500)) // exempt linedef exec specials { sd->repeatcnt = (INT16)(((UINT16)textureoffset) >> 12); @@ -1841,17 +1841,17 @@ static void ParseTextmapLinedefParameter(UINT32 i, char *param, char *val) else if (fastcmp(param, "dontpegbottom") && fastcmp("true", val)) lines[i].flags |= ML_DONTPEGBOTTOM; else if (fastcmp(param, "skewtd") && fastcmp("true", val)) - lines[i].flags |= ML_EFFECT1; + lines[i].flags |= ML_SKEWTD; else if (fastcmp(param, "noclimb") && fastcmp("true", val)) lines[i].flags |= ML_NOCLIMB; else if (fastcmp(param, "noskew") && fastcmp("true", val)) - lines[i].flags |= ML_EFFECT2; + lines[i].flags |= ML_NOSKEW; else if (fastcmp(param, "midpeg") && fastcmp("true", val)) - lines[i].flags |= ML_EFFECT3; + lines[i].flags |= ML_MIDPEG; else if (fastcmp(param, "midsolid") && fastcmp("true", val)) - lines[i].flags |= ML_EFFECT4; + lines[i].flags |= ML_MIDSOLID; else if (fastcmp(param, "wrapmidtex") && fastcmp("true", val)) - lines[i].flags |= ML_EFFECT5; + lines[i].flags |= ML_WRAPMIDTEX; else if (fastcmp(param, "effect6") && fastcmp("true", val)) lines[i].flags |= ML_EFFECT6; else if (fastcmp(param, "nonet") && fastcmp("true", val)) @@ -3217,7 +3217,7 @@ static void P_AddBinaryMapTags(void) boolean matches_target_tag = target_tag && Tag_Find(§ors[j].tags, target_tag); size_t k; for (k = 0; k < 4; k++) { - if (lines[i].flags & ML_EFFECT5) { + if (lines[i].flags & ML_WRAPMIDTEX) { if (matches_target_tag || (offset_tags[k] && Tag_Find(§ors[j].tags, offset_tags[k]))) { Tag_Add(§ors[j].tags, tag); break; @@ -3323,13 +3323,13 @@ static void P_ConvertBinaryLinedefTypes(void) case 3: //Zoom tube parameters lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; - lines[i].args[2] = !!(lines[i].flags & ML_EFFECT4); + lines[i].args[2] = !!(lines[i].flags & ML_MIDSOLID); break; case 4: //Speed pad parameters lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; - if (lines[i].flags & ML_EFFECT4) + if (lines[i].flags & ML_MIDSOLID) lines[i].args[1] |= TMSP_NOTELEPORT; - if (lines[i].flags & ML_EFFECT5) + if (lines[i].flags & ML_WRAPMIDTEX) lines[i].args[1] |= TMSP_FORCESPIN; P_WriteConstant(sides[lines[i].sidenum[0]].toptexture ? sides[lines[i].sidenum[0]].toptexture : sfx_spdpad, &lines[i].stringargs[0]); break; @@ -3378,15 +3378,15 @@ static void P_ConvertBinaryLinedefTypes(void) sectors[s].flags &= ~MSF_FLIPSPECIAL_FLOOR; sectors[s].flags |= MSF_FLIPSPECIAL_CEILING; } - else if (lines[i].flags & ML_EFFECT4) + else if (lines[i].flags & ML_MIDSOLID) sectors[s].flags |= MSF_FLIPSPECIAL_BOTH; - if (lines[i].flags & ML_EFFECT3) + if (lines[i].flags & ML_MIDPEG) sectors[s].flags |= MSF_TRIGGERSPECIAL_TOUCH; - if (lines[i].flags & ML_EFFECT2) + if (lines[i].flags & ML_NOSKEW) sectors[s].flags |= MSF_TRIGGERSPECIAL_HEADBUMP; - if (lines[i].flags & ML_EFFECT1) + if (lines[i].flags & ML_SKEWTD) sectors[s].flags |= MSF_INVERTPRECIP; } @@ -3402,7 +3402,7 @@ static void P_ConvertBinaryLinedefTypes(void) case 11: //Rope hang parameters lines[i].args[0] = (lines[i].flags & ML_NOCLIMB) ? 0 : sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; - lines[i].args[2] = !!(lines[i].flags & ML_EFFECT1); + lines[i].args[2] = !!(lines[i].flags & ML_SKEWTD); break; case 13: //Heat wave effect { @@ -3416,7 +3416,7 @@ static void P_ConvertBinaryLinedefTypes(void) case 14: //Bustable block parameters lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; - lines[i].args[2] = !!(lines[i].flags & ML_EFFECT1); + lines[i].args[2] = !!(lines[i].flags & ML_SKEWTD); P_WriteConstant(sides[lines[i].sidenum[0]].toptexture, &lines[i].stringargs[0]); break; case 16: //Minecart parameters @@ -3456,15 +3456,15 @@ static void P_ConvertBinaryLinedefTypes(void) : ((lines[paramline].frontsector->floorheight >> FRACBITS) / 100); //Flags - if (lines[paramline].flags & ML_EFFECT1) + if (lines[paramline].flags & ML_SKEWTD) lines[i].args[3] |= TMPF_NOINSIDES; - if (lines[paramline].flags & ML_EFFECT2) + if (lines[paramline].flags & ML_NOSKEW) lines[i].args[3] |= TMPF_INTANGIBLE; - if (lines[paramline].flags & ML_EFFECT3) + if (lines[paramline].flags & ML_MIDPEG) lines[i].args[3] |= TMPF_PUSHABLESTOP; - if (lines[paramline].flags & ML_EFFECT4) + if (lines[paramline].flags & ML_MIDSOLID) lines[i].args[3] &= ~TMPF_INVISIBLEPLANES; - /*if (lines[paramline].flags & ML_EFFECT5) + /*if (lines[paramline].flags & ML_WRAPMIDTEX) lines[i].args[3] |= TMPF_DONTCLIPPLANES;*/ if (lines[paramline].flags & ML_EFFECT6) lines[i].args[3] |= TMPF_SPLAT; @@ -3488,7 +3488,7 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[2] = sides[lines[i].sidenum[0]].rowoffset ? sides[lines[i].sidenum[0]].rowoffset >> FRACBITS : 90; if (lines[i].flags & ML_NOCLIMB) lines[i].args[3] |= TMPR_DONTROTATEOTHERS; - else if (lines[i].flags & ML_EFFECT4) + else if (lines[i].flags & ML_MIDSOLID) lines[i].args[3] |= TMPR_ROTATEPLAYERS; break; case 50: //Instantly lower floor on level load @@ -3534,7 +3534,7 @@ static void P_ConvertBinaryLinedefTypes(void) case 62: //Crusher (Floor to ceiling) lines[i].args[0] = tag; lines[i].args[1] = lines[i].special - 61; - if (lines[i].flags & ML_EFFECT4) + if (lines[i].flags & ML_MIDSOLID) { lines[i].args[2] = abs(lines[i].dx) >> FRACBITS; lines[i].args[3] = lines[i].args[2]; @@ -3604,9 +3604,9 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[3] |= TMFA_SPLAT; //Tangibility - if (lines[i].flags & ML_EFFECT1) + if (lines[i].flags & ML_SKEWTD) lines[i].args[4] |= TMFT_DONTBLOCKOTHERS; - if (lines[i].flags & ML_EFFECT2) + if (lines[i].flags & ML_NOSKEW) lines[i].args[4] |= TMFT_DONTBLOCKPLAYER; lines[i].special = 100; @@ -3638,9 +3638,9 @@ static void P_ConvertBinaryLinedefTypes(void) //Flags if (lines[i].flags & ML_NOCLIMB) lines[i].args[3] |= TMFW_DOUBLESHADOW; - if (lines[i].flags & ML_EFFECT4) + if (lines[i].flags & ML_MIDSOLID) lines[i].args[3] |= TMFW_COLORMAPONLY; - if (!(lines[i].flags & ML_EFFECT5)) + if (!(lines[i].flags & ML_WRAPMIDTEX)) lines[i].args[3] |= TMFW_NORIPPLE; //Goo? @@ -3694,9 +3694,9 @@ static void P_ConvertBinaryLinedefTypes(void) else lines[i].args[4] |= TMFT_INTANGIBLEBOTTOM|TMFT_INTANGIBLETOP; - if (lines[i].flags & ML_EFFECT1) + if (lines[i].flags & ML_SKEWTD) lines[i].args[4] |= TMFT_DONTBLOCKOTHERS; - if (lines[i].flags & ML_EFFECT2) + if (lines[i].flags & ML_NOSKEW) lines[i].args[4] |= TMFT_DONTBLOCKPLAYER; lines[i].special = 100; @@ -3762,9 +3762,9 @@ static void P_ConvertBinaryLinedefTypes(void) if (lines[i].flags & ML_EFFECT6) lines[i].args[4] |= TMFC_SPLAT; - if (lines[i].flags & ML_EFFECT1) + if (lines[i].flags & ML_SKEWTD) lines[i].args[3] |= TMFT_DONTBLOCKOTHERS; - if (lines[i].flags & ML_EFFECT2) + if (lines[i].flags & ML_NOSKEW) lines[i].args[3] |= TMFT_DONTBLOCKPLAYER; lines[i].special = 170; @@ -3800,9 +3800,9 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[3] |= TMFA_SPLAT; //Tangibility - if (lines[i].flags & ML_EFFECT1) + if (lines[i].flags & ML_SKEWTD) lines[i].args[4] |= TMFT_DONTBLOCKOTHERS; - if (lines[i].flags & ML_EFFECT2) + if (lines[i].flags & ML_NOSKEW) lines[i].args[4] |= TMFT_DONTBLOCKPLAYER; if (lines[i].special >= 194) lines[i].args[4] |= TMFT_INTANGIBLEBOTTOM; @@ -3862,12 +3862,12 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[0] = tag; if (lines[i].flags & ML_NOCLIMB) lines[i].args[1] |= TMFM_BRICK; - if (lines[i].flags & ML_EFFECT1) + if (lines[i].flags & ML_SKEWTD) lines[i].args[1] |= TMFM_INVISIBLE; break; case 251: //FOF: Thwomp block lines[i].args[0] = tag; - if (lines[i].flags & ML_EFFECT5) //Custom speeds + if (lines[i].flags & ML_WRAPMIDTEX) //Custom speeds { lines[i].args[1] = lines[i].dy >> FRACBITS; lines[i].args[2] = lines[i].dx >> FRACBITS; @@ -3877,7 +3877,7 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[1] = 80; lines[i].args[2] = 16; } - if (lines[i].flags & ML_EFFECT4) + if (lines[i].flags & ML_MIDSOLID) P_WriteConstant(sides[lines[i].sidenum[0]].textureoffset >> FRACBITS, &lines[i].stringargs[0]); break; case 252: //FOF: Shatter block @@ -3910,9 +3910,9 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[3] = TMFB_REGULAR; //Flags - if (lines[i].flags & ML_EFFECT4) + if (lines[i].flags & ML_MIDSOLID) lines[i].args[4] |= TMFB_PUSHABLES; - if (lines[i].flags & ML_EFFECT5) + if (lines[i].flags & ML_WRAPMIDTEX) { lines[i].args[4] |= TMFB_EXECUTOR; lines[i].args[5] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; @@ -3926,7 +3926,7 @@ static void P_ConvertBinaryLinedefTypes(void) break; case 257: //FOF: Quicksand lines[i].args[0] = tag; - if (!(lines[i].flags & ML_EFFECT5)) + if (!(lines[i].flags & ML_WRAPMIDTEX)) lines[i].args[1] = 1; //No ripple effect lines[i].args[2] = lines[i].dx >> FRACBITS; //Sinking speed lines[i].args[3] = lines[i].dy >> FRACBITS; //Friction @@ -3938,7 +3938,7 @@ static void P_ConvertBinaryLinedefTypes(void) P_SetBinaryFOFAlpha(&lines[i]); //Flags - if (lines[i].flags & ML_EFFECT1) + if (lines[i].flags & ML_SKEWTD) lines[i].args[3] |= TMFL_NOBOSSES; //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].flags & ML_EFFECT6 || lines[i].args[1] == 256) @@ -3986,7 +3986,7 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[2] = TMC_GTE; else lines[i].args[2] = TMC_EQUAL; - lines[i].args[3] = !!(lines[i].flags & ML_EFFECT4); + lines[i].args[3] = !!(lines[i].flags & ML_MIDSOLID); lines[i].special = 303; break; case 305: //Character ability - Continuous @@ -4026,7 +4026,7 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[1] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; if (lines[i].flags & ML_NOCLIMB) lines[i].args[2] = TMC_GTE; - else if (lines[i].flags & ML_EFFECT4) + else if (lines[i].flags & ML_MIDSOLID) lines[i].args[2] = TMC_LTE; else lines[i].args[2] = TMC_EQUAL; @@ -4077,15 +4077,15 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[3] = TMC_GTE; else lines[i].args[3] = TMC_EQUAL; - if (lines[i].flags & ML_EFFECT1) + if (lines[i].flags & ML_SKEWTD) lines[i].args[4] = TMC_LTE; - else if (lines[i].flags & ML_EFFECT2) + else if (lines[i].flags & ML_NOSKEW) lines[i].args[4] = TMC_GTE; else lines[i].args[4] = TMC_EQUAL; if (lines[i].flags & ML_DONTPEGBOTTOM) lines[i].args[5] = TMNP_SLOWEST; - else if (lines[i].flags & ML_EFFECT4) + else if (lines[i].flags & ML_MIDSOLID) lines[i].args[5] = TMNP_TRIGGERER; else lines[i].args[5] = TMNP_FASTEST; @@ -4100,7 +4100,7 @@ static void P_ConvertBinaryLinedefTypes(void) else lines[i].args[6] = TMN_ALWAYS; - if (lines[i].flags & ML_EFFECT3) + if (lines[i].flags & ML_MIDPEG) lines[i].args[7] |= TMN_BONUSLAPS; if (lines[i].flags & ML_BOUNCY) lines[i].args[7] |= TMN_LEVELCOMPLETION; @@ -4114,10 +4114,10 @@ static void P_ConvertBinaryLinedefTypes(void) else lines[i].args[6] = TMD_ALWAYS; - lines[i].args[7] = !!(lines[i].flags & ML_EFFECT3); + lines[i].args[7] = !!(lines[i].flags & ML_MIDPEG); } else if (lines[i].special == 327) - lines[i].args[6] = !!(lines[i].flags & ML_EFFECT3); + lines[i].args[6] = !!(lines[i].flags & ML_MIDPEG); else { if (lines[i].flags & ML_DONTPEGTOP) @@ -4127,7 +4127,7 @@ static void P_ConvertBinaryLinedefTypes(void) else lines[i].args[6] = TMS_IFENOUGH; - if (lines[i].flags & ML_EFFECT3) + if (lines[i].flags & ML_MIDPEG) lines[i].args[7] |= TMI_BONUSLAPS; if (lines[i].flags & ML_TFERLINE) lines[i].args[7] |= TMI_ENTER; @@ -4229,14 +4229,14 @@ static void P_ConvertBinaryLinedefTypes(void) break; case 408: //Set flats lines[i].args[0] = tag; - if ((lines[i].flags & (ML_NOCLIMB|ML_EFFECT4)) == (ML_NOCLIMB|ML_EFFECT4)) + if ((lines[i].flags & (ML_NOCLIMB|ML_MIDSOLID)) == (ML_NOCLIMB|ML_MIDSOLID)) { CONS_Alert(CONS_WARNING, M_GetText("Set flats linedef (tag %d) doesn't have anything to do.\nConsider changing the linedef's flag configuration or removing it entirely.\n"), tag); lines[i].special = 0; } else if (lines[i].flags & ML_NOCLIMB) lines[i].args[1] = TMP_CEILING; - else if (lines[i].flags & ML_EFFECT4) + else if (lines[i].flags & ML_MIDSOLID) lines[i].args[1] = TMP_FLOOR; else lines[i].args[1] = TMP_BOTH; @@ -4269,9 +4269,9 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[1] |= TMT_SILENT; if (lines[i].flags & ML_NOCLIMB) lines[i].args[1] |= TMT_KEEPANGLE; - if (lines[i].flags & ML_EFFECT4) + if (lines[i].flags & ML_MIDSOLID) lines[i].args[1] |= TMT_KEEPMOMENTUM; - if (lines[i].flags & ML_EFFECT3) + if (lines[i].flags & ML_MIDPEG) lines[i].args[1] |= TMT_RELATIVE; lines[i].args[2] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[3] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; @@ -4280,15 +4280,15 @@ static void P_ConvertBinaryLinedefTypes(void) case 413: //Change music if (lines[i].flags & ML_NOCLIMB) lines[i].args[0] |= TMM_ALLPLAYERS; - if (lines[i].flags & ML_EFFECT1) + if (lines[i].flags & ML_SKEWTD) lines[i].args[0] |= TMM_OFFSET; - if (lines[i].flags & ML_EFFECT2) + if (lines[i].flags & ML_NOSKEW) lines[i].args[0] |= TMM_FADE; if (lines[i].flags & ML_BLOCKMONSTERS) lines[i].args[0] |= TMM_NORELOAD; if (lines[i].flags & ML_BOUNCY) lines[i].args[0] |= TMM_FORCERESET; - if (lines[i].flags & ML_EFFECT4) + if (lines[i].flags & ML_MIDSOLID) lines[i].args[0] |= TMM_NOLOOP; lines[i].args[1] = sides[lines[i].sidenum[0]].midtexture; lines[i].args[2] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; @@ -4306,7 +4306,7 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[2] = tag; if (tag != 0) { - if (lines[i].flags & ML_EFFECT5) + if (lines[i].flags & ML_WRAPMIDTEX) { lines[i].args[0] = TMSS_TAGGEDSECTOR; lines[i].args[1] = TMSL_EVERYONE; @@ -4324,7 +4324,7 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[0] = TMSS_NOWHERE; lines[i].args[1] = TMSL_TRIGGERER; } - else if (lines[i].flags & ML_EFFECT4) + else if (lines[i].flags & ML_MIDSOLID) { lines[i].args[0] = TMSS_NOWHERE; lines[i].args[1] = TMSL_EVERYONE; @@ -4417,9 +4417,9 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[1] = lines[i].frontsector->lightlevel; lines[i].args[2] = abs(P_AproxDistance(lines[i].dx, lines[i].dy)) >> FRACBITS; } - if (lines[i].flags & ML_EFFECT4) + if (lines[i].flags & ML_MIDSOLID) lines[i].args[3] |= TMF_TICBASED; - if (lines[i].flags & ML_EFFECT5) + if (lines[i].flags & ML_WRAPMIDTEX) lines[i].args[3] |= TMF_OVERRIDE; break; case 421: //Stop lighting effect @@ -4460,7 +4460,7 @@ static void P_ConvertBinaryLinedefTypes(void) case 431: //Crush floor and ceiling once lines[i].args[0] = tag; lines[i].args[1] = (lines[i].special == 429) ? TMP_CEILING : ((lines[i].special == 430) ? TMP_FLOOR : TMP_BOTH); - if (lines[i].special == 430 || lines[i].flags & ML_EFFECT4) + if (lines[i].special == 430 || lines[i].flags & ML_MIDSOLID) { lines[i].args[2] = abs(lines[i].dx) >> FRACBITS; lines[i].args[3] = lines[i].args[2]; @@ -4563,19 +4563,19 @@ static void P_ConvertBinaryLinedefTypes(void) break; case 447: //Change colormap lines[i].args[0] = tag; - if (lines[i].flags & ML_EFFECT3) + if (lines[i].flags & ML_MIDPEG) lines[i].args[2] |= TMCF_RELATIVE; - if (lines[i].flags & ML_EFFECT1) + if (lines[i].flags & ML_SKEWTD) lines[i].args[2] |= TMCF_SUBLIGHTR|TMCF_SUBFADER; if (lines[i].flags & ML_NOCLIMB) lines[i].args[2] |= TMCF_SUBLIGHTG|TMCF_SUBFADEG; - if (lines[i].flags & ML_EFFECT2) + if (lines[i].flags & ML_NOSKEW) lines[i].args[2] |= TMCF_SUBLIGHTB|TMCF_SUBFADEB; break; case 448: //Change skybox lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; - if ((lines[i].flags & (ML_EFFECT4|ML_BLOCKMONSTERS)) == ML_EFFECT4) // Solid Midtexture is on but Block Enemies is off? + if ((lines[i].flags & (ML_MIDSOLID|ML_BLOCKMONSTERS)) == ML_MIDSOLID) // Solid Midtexture is on but Block Enemies is off? { CONS_Alert(CONS_WARNING, M_GetText("Skybox switch linedef (tag %d) doesn't have anything to do.\nConsider changing the linedef's flag configuration or removing it entirely.\n"), @@ -4583,7 +4583,7 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].special = 0; break; } - else if ((lines[i].flags & (ML_EFFECT4|ML_BLOCKMONSTERS)) == (ML_EFFECT4|ML_BLOCKMONSTERS)) + else if ((lines[i].flags & (ML_MIDSOLID|ML_BLOCKMONSTERS)) == (ML_MIDSOLID|ML_BLOCKMONSTERS)) lines[i].args[2] = TMS_CENTERPOINT; else if (lines[i].flags & ML_BLOCKMONSTERS) lines[i].args[2] = TMS_BOTH; @@ -4606,7 +4606,7 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; lines[i].args[2] = lines[i].sidenum[1] != 0xffff ? (sides[lines[i].sidenum[1]].textureoffset >> FRACBITS) : (P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS); - if (lines[i].flags & ML_EFFECT3) + if (lines[i].flags & ML_MIDPEG) lines[i].args[3] |= TMST_RELATIVE; if (lines[i].flags & ML_NOCLIMB) lines[i].args[3] |= TMST_DONTDOTRANSLUCENT; @@ -4616,21 +4616,21 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; lines[i].args[2] = lines[i].sidenum[1] != 0xffff ? (sides[lines[i].sidenum[1]].textureoffset >> FRACBITS) : (lines[i].dx >> FRACBITS); lines[i].args[3] = lines[i].sidenum[1] != 0xffff ? (sides[lines[i].sidenum[1]].rowoffset >> FRACBITS) : (abs(lines[i].dy) >> FRACBITS); - if (lines[i].flags & ML_EFFECT3) + if (lines[i].flags & ML_MIDPEG) lines[i].args[4] |= TMFT_RELATIVE; - if (lines[i].flags & ML_EFFECT5) + if (lines[i].flags & ML_WRAPMIDTEX) lines[i].args[4] |= TMFT_OVERRIDE; - if (lines[i].flags & ML_EFFECT4) + if (lines[i].flags & ML_MIDSOLID) lines[i].args[4] |= TMFT_TICBASED; if (lines[i].flags & ML_BOUNCY) lines[i].args[4] |= TMFT_IGNORECOLLISION; - if (lines[i].flags & ML_EFFECT1) + if (lines[i].flags & ML_SKEWTD) lines[i].args[4] |= TMFT_GHOSTFADE; if (lines[i].flags & ML_NOCLIMB) lines[i].args[4] |= TMFT_DONTDOTRANSLUCENT; if (lines[i].flags & ML_BLOCKMONSTERS) lines[i].args[4] |= TMFT_DONTDOEXISTS; - if (lines[i].flags & ML_EFFECT2) + if (lines[i].flags & ML_NOSKEW) lines[i].args[4] |= (TMFT_DONTDOLIGHTING|TMFT_DONTDOCOLORMAP); if (lines[i].flags & ML_TFERLINE) lines[i].args[4] |= TMFT_USEEXACTALPHA; @@ -4647,21 +4647,21 @@ static void P_ConvertBinaryLinedefTypes(void) : abs(sides[lines[i].sidenum[0]].rowoffset >> FRACBITS)); lines[i].args[0] = tag; - if (lines[i].flags & ML_EFFECT4) + if (lines[i].flags & ML_MIDSOLID) lines[i].args[2] = speed; else lines[i].args[2] = (256 + speed - 1)/speed; - if (lines[i].flags & ML_EFFECT3) + if (lines[i].flags & ML_MIDPEG) lines[i].args[3] |= TMCF_RELATIVE; - if (lines[i].flags & ML_EFFECT1) + if (lines[i].flags & ML_SKEWTD) lines[i].args[3] |= TMCF_SUBLIGHTR|TMCF_SUBFADER; if (lines[i].flags & ML_NOCLIMB) lines[i].args[3] |= TMCF_SUBLIGHTG|TMCF_SUBFADEG; - if (lines[i].flags & ML_EFFECT2) + if (lines[i].flags & ML_NOSKEW) lines[i].args[3] |= TMCF_SUBLIGHTB|TMCF_SUBFADEB; if (lines[i].flags & ML_BOUNCY) lines[i].args[3] |= TMCF_FROMBLACK; - if (lines[i].flags & ML_EFFECT5) + if (lines[i].flags & ML_WRAPMIDTEX) lines[i].args[3] |= TMCF_OVERRIDE; break; } @@ -4673,25 +4673,25 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[2] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; lines[i].args[3] = (lines[i].sidenum[1] != 0xffff) ? sides[lines[i].sidenum[1]].rowoffset >> FRACBITS : 0; - lines[i].args[4] = !!(lines[i].flags & ML_EFFECT2); + lines[i].args[4] = !!(lines[i].flags & ML_NOSKEW); break; case 459: //Control text prompt lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; if (lines[i].flags & ML_BLOCKMONSTERS) lines[i].args[2] |= TMP_CLOSE; - if (lines[i].flags & ML_EFFECT1) + if (lines[i].flags & ML_SKEWTD) lines[i].args[2] |= TMP_RUNPOSTEXEC; if (lines[i].flags & ML_TFERLINE) lines[i].args[2] |= TMP_CALLBYNAME; - if (lines[i].flags & ML_EFFECT2) + if (lines[i].flags & ML_NOSKEW) lines[i].args[2] |= TMP_KEEPCONTROLS; - if (lines[i].flags & ML_EFFECT3) + if (lines[i].flags & ML_MIDPEG) lines[i].args[2] |= TMP_KEEPREALTIME; /*if (lines[i].flags & ML_NOCLIMB) lines[i].args[2] |= TMP_ALLPLAYERS; - if (lines[i].flags & ML_EFFECT4) - lines[i].args[2] |= ML_EFFECT4;*/ + if (lines[i].flags & ML_MIDSOLID) + lines[i].args[2] |= TMP_FREEZETHINKERS;*/ lines[i].args[3] = (lines[i].sidenum[1] != 0xFFFF) ? sides[lines[i].sidenum[1]].textureoffset >> FRACBITS : tag; if (sides[lines[i].sidenum[0]].text) { @@ -4707,7 +4707,7 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[0] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; lines[i].args[2] = lines[i].frontsector->floorheight >> FRACBITS; - lines[i].args[3] = (lines[i].flags & ML_EFFECT1) ? AngleFixed(R_PointToAngle2(lines[i].v1->x, lines[i].v1->y, lines[i].v2->x, lines[i].v2->y)) >> FRACBITS : 0; + lines[i].args[3] = (lines[i].flags & ML_SKEWTD) ? AngleFixed(R_PointToAngle2(lines[i].v1->x, lines[i].v1->y, lines[i].v2->x, lines[i].v2->y)) >> FRACBITS : 0; if (lines[i].flags & ML_NOCLIMB) { if (lines[i].sidenum[1] != 0xffff) // Make sure the linedef has a back side @@ -4749,7 +4749,7 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[0] = tag; lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[2] = TML_SECTOR; - lines[i].args[3] = !!(lines[i].flags & ML_EFFECT3); + lines[i].args[3] = !!(lines[i].flags & ML_MIDPEG); break; case 480: //Polyobject - door slide case 481: //Polyobject - door move @@ -4782,7 +4782,7 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[2] *= -1; if (lines[i].flags & ML_NOCLIMB) lines[i].args[3] |= TMPR_DONTROTATEOTHERS; - else if (lines[i].flags & ML_EFFECT4) + else if (lines[i].flags & ML_MIDSOLID) lines[i].args[3] |= TMPR_ROTATEPLAYERS; if (lines[i].special % 2 == 1) lines[i].args[3] |= TMPR_OVERRIDE; @@ -4792,15 +4792,15 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[0] = tag; lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; lines[i].args[2] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; - if (lines[i].flags & ML_EFFECT3) + if (lines[i].flags & ML_MIDPEG) lines[i].args[3] = PWR_WRAP; - else if (lines[i].flags & ML_EFFECT2) + else if (lines[i].flags & ML_NOSKEW) lines[i].args[3] = PWR_COMEBACK; else lines[i].args[3] = PWR_STOP; - if (lines[i].flags & ML_EFFECT1) + if (lines[i].flags & ML_SKEWTD) lines[i].args[4] |= PWF_REVERSE; - if (lines[i].flags & ML_EFFECT4) + if (lines[i].flags & ML_MIDSOLID) lines[i].args[4] |= PWF_LOOP; break; case 489: //Polyobject - turn invisible, intangible @@ -4818,7 +4818,7 @@ static void P_ConvertBinaryLinedefTypes(void) // If DONTPEGBOTTOM, specify raw translucency value. Else, take it out of 1000. if (!(lines[i].flags & ML_DONTPEGBOTTOM)) lines[i].args[1] /= 100; - lines[i].args[2] = !!(lines[i].flags & ML_EFFECT3); + lines[i].args[2] = !!(lines[i].flags & ML_MIDPEG); break; case 492: //Polyobject - fade translucency lines[i].args[0] = tag; @@ -4831,15 +4831,15 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[2] = (lines[i].sidenum[1] != 0xffff && !sides[lines[i].sidenum[0]].rowoffset) ? abs(sides[lines[i].sidenum[1]].rowoffset >> FRACBITS) : abs(sides[lines[i].sidenum[0]].rowoffset >> FRACBITS); - if (lines[i].flags & ML_EFFECT3) + if (lines[i].flags & ML_MIDPEG) lines[i].args[3] |= TMPF_RELATIVE; - if (lines[i].flags & ML_EFFECT5) + if (lines[i].flags & ML_WRAPMIDTEX) lines[i].args[3] |= TMPF_OVERRIDE; - if (lines[i].flags & ML_EFFECT4) + if (lines[i].flags & ML_MIDSOLID) lines[i].args[3] |= TMPF_TICBASED; if (lines[i].flags & ML_BOUNCY) lines[i].args[3] |= TMPF_IGNORECOLLISION; - if (lines[i].flags & ML_EFFECT1) + if (lines[i].flags & ML_SKEWTD) lines[i].args[3] |= TMPF_GHOSTFADE; break; case 500: //Scroll front wall left @@ -4853,7 +4853,7 @@ static void P_ConvertBinaryLinedefTypes(void) case 503: //Scroll tagged wall (accelerative) case 504: //Scroll tagged wall (displacement) lines[i].args[0] = tag; - if (lines[i].flags & ML_EFFECT3) + if (lines[i].flags & ML_MIDPEG) { if (lines[i].sidenum[1] == 0xffff) { @@ -4865,7 +4865,7 @@ static void P_ConvertBinaryLinedefTypes(void) } else lines[i].args[1] = 0; - if (lines[i].flags & ML_EFFECT2) + if (lines[i].flags & ML_NOSKEW) { lines[i].args[2] = lines[i].dx >> (FRACBITS + SCROLL_SHIFT); lines[i].args[3] = lines[i].dy >> (FRACBITS + SCROLL_SHIFT); @@ -4955,7 +4955,7 @@ static void P_ConvertBinaryLinedefTypes(void) break; } lines[i].args[3] = (lines[i].special >= 544) ? p_current : p_wind; - if (lines[i].flags & ML_EFFECT4) + if (lines[i].flags & ML_MIDSOLID) lines[i].args[4] |= TMPF_SLIDE; if (!(lines[i].flags & ML_NOCLIMB)) lines[i].args[4] |= TMPF_NONEXCLUSIVE; @@ -5714,15 +5714,15 @@ static void P_ConvertBinaryThingTypes(void) mapthings[i].args[8] |= TMM_SILENT; if (lines[j].flags & ML_NOCLIMB) mapthings[i].args[8] |= TMM_ALLOWYAWCONTROL; - if (lines[j].flags & ML_EFFECT1) + if (lines[j].flags & ML_SKEWTD) mapthings[i].args[8] |= TMM_SWING; - if (lines[j].flags & ML_EFFECT2) + if (lines[j].flags & ML_NOSKEW) mapthings[i].args[8] |= TMM_MACELINKS; - if (lines[j].flags & ML_EFFECT3) + if (lines[j].flags & ML_MIDPEG) mapthings[i].args[8] |= TMM_CENTERLINK; - if (lines[j].flags & ML_EFFECT4) + if (lines[j].flags & ML_MIDSOLID) mapthings[i].args[8] |= TMM_CLIP; - if (lines[j].flags & ML_EFFECT5) + if (lines[j].flags & ML_WRAPMIDTEX) mapthings[i].args[8] |= TMM_ALWAYSTHINK; if (mapthings[i].type == 1110) { @@ -5869,10 +5869,10 @@ static void P_ConvertBinaryLinedefFlags(void) for (i = 0; i < numlines; i++) { - if (!!(lines[i].flags & ML_DONTPEGBOTTOM) ^ !!(lines[i].flags & ML_EFFECT3)) - lines[i].flags |= ML_EFFECT3; + if (!!(lines[i].flags & ML_DONTPEGBOTTOM) ^ !!(lines[i].flags & ML_MIDPEG)) + lines[i].flags |= ML_MIDPEG; else - lines[i].flags &= ~ML_EFFECT3; + lines[i].flags &= ~ML_MIDPEG; } } From 2bef8da42f964def4c40bacb7a7f5a144b73c82f Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 5 Jan 2022 18:42:53 +0100 Subject: [PATCH 294/377] Remove access to unused effect6 flag in UDMF --- extras/conf/udb/Includes/SRB222_misc.cfg | 1 - src/p_setup.c | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index e392014c8..544516f7d 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -58,7 +58,6 @@ linedefflags_udmf wrapmidtex = "Repeat Midtexture"; netonly = "Netgame Only"; nonet = "No Netgame"; - effect6 = "Effect 6"; bouncy = "Bouncy Wall"; transfer = "Transfer Line"; } diff --git a/src/p_setup.c b/src/p_setup.c index fdd2f82d7..7f1e00730 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1852,8 +1852,8 @@ static void ParseTextmapLinedefParameter(UINT32 i, char *param, char *val) lines[i].flags |= ML_MIDSOLID; else if (fastcmp(param, "wrapmidtex") && fastcmp("true", val)) lines[i].flags |= ML_WRAPMIDTEX; - else if (fastcmp(param, "effect6") && fastcmp("true", val)) - lines[i].flags |= ML_EFFECT6; + /*else if (fastcmp(param, "effect6") && fastcmp("true", val)) + lines[i].flags |= ML_EFFECT6;*/ else if (fastcmp(param, "nonet") && fastcmp("true", val)) lines[i].flags |= ML_NONET; else if (fastcmp(param, "netonly") && fastcmp("true", val)) From fcb69b9c2f10e9d0c3af6208a00381f36a122c4d Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 5 Jan 2022 19:43:40 +0100 Subject: [PATCH 295/377] Rename more linedef flags --- src/hardware/hw_main.c | 28 ++++++++++++++-------------- src/p_ceilng.c | 2 +- src/p_spec.c | 6 +++--- src/r_segs.c | 20 ++++++++++---------- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index dece1deda..bafe8ce7a 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -1146,7 +1146,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom // PEGGING if (gl_linedef->flags & ML_DONTPEGTOP) texturevpegtop = 0; - else if (gl_linedef->flags & ML_EFFECT1) + else if (gl_linedef->flags & ML_SKEWTD) texturevpegtop = worldhigh + textureheight[gl_sidedef->toptexture] - worldtop; else texturevpegtop = gl_backsector->ceilingheight + textureheight[gl_sidedef->toptexture] - gl_frontsector->ceilingheight; @@ -1162,7 +1162,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom wallVerts[2].s = wallVerts[1].s = cliphigh * grTex->scaleX; // Adjust t value for sloped walls - if (!(gl_linedef->flags & ML_EFFECT1)) + if (!(gl_linedef->flags & ML_SKEWTD)) { // Unskewed wallVerts[3].t -= (worldtop - gl_frontsector->ceilingheight) * grTex->scaleY; @@ -1212,7 +1212,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom // PEGGING if (!(gl_linedef->flags & ML_DONTPEGBOTTOM)) texturevpegbottom = 0; - else if (gl_linedef->flags & ML_EFFECT1) + else if (gl_linedef->flags & ML_SKEWTD) texturevpegbottom = worldbottom - worldlow; else texturevpegbottom = gl_frontsector->floorheight - gl_backsector->floorheight; @@ -1228,7 +1228,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom wallVerts[2].s = wallVerts[1].s = cliphigh * grTex->scaleX; // Adjust t value for sloped walls - if (!(gl_linedef->flags & ML_EFFECT1)) + if (!(gl_linedef->flags & ML_SKEWTD)) { // Unskewed wallVerts[0].t -= (worldbottom - gl_frontsector->floorheight) * grTex->scaleY; @@ -1286,7 +1286,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom if (gl_sidedef->repeatcnt) repeats = 1 + gl_sidedef->repeatcnt; - else if (gl_linedef->flags & ML_EFFECT5) + else if (gl_linedef->flags & ML_WRAPMIDTEX) { fixed_t high, low; @@ -1328,9 +1328,9 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom popenbottom = max(worldbottom, worldlow); } - if (gl_linedef->flags & ML_EFFECT2) + if (gl_linedef->flags & ML_NOSKEW) { - if (gl_linedef->flags & ML_EFFECT3) + if (gl_linedef->flags & ML_MIDPEG) { polybottom = max(front->floorheight, back->floorheight) + gl_sidedef->rowoffset; polytop = polybottom + textureheight[gl_midtexture]*repeats; @@ -1341,7 +1341,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom polybottom = polytop - textureheight[gl_midtexture]*repeats; } } - else if (gl_linedef->flags & ML_EFFECT3) + else if (gl_linedef->flags & ML_MIDPEG) { polybottom = popenbottom + gl_sidedef->rowoffset; polytop = polybottom + textureheight[gl_midtexture]*repeats; @@ -1371,7 +1371,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom { // PEGGING - if (gl_linedef->flags & ML_EFFECT3) + if (gl_linedef->flags & ML_MIDPEG) texturevpeg = textureheight[gl_sidedef->midtexture]*repeats - h + polybottom; else texturevpeg = polytop - h; @@ -1394,9 +1394,9 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom { fixed_t midtextureslant; - if (gl_linedef->flags & ML_EFFECT2) + if (gl_linedef->flags & ML_NOSKEW) midtextureslant = 0; - else if (gl_linedef->flags & ML_EFFECT3) + else if (gl_linedef->flags & ML_MIDPEG) midtextureslant = worldlow < worldbottom ? worldbottomslope-worldbottom : worldlowslope-worldlow; @@ -1421,7 +1421,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom { // PEGGING - if (gl_linedef->flags & ML_EFFECT3) + if (gl_linedef->flags & ML_MIDPEG) texturevpeg = textureheight[gl_sidedef->midtexture]*repeats - h + polybottom; else texturevpeg = polytop - h; @@ -1538,7 +1538,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom { fixed_t texturevpeg; // PEGGING - if ((gl_linedef->flags & (ML_DONTPEGBOTTOM|ML_EFFECT2)) == (ML_DONTPEGBOTTOM|ML_EFFECT2)) + if ((gl_linedef->flags & (ML_DONTPEGBOTTOM|ML_NOSKEW)) == (ML_DONTPEGBOTTOM|ML_NOSKEW)) texturevpeg = gl_frontsector->floorheight + textureheight[gl_sidedef->midtexture] - gl_frontsector->ceilingheight + gl_sidedef->rowoffset; else if (gl_linedef->flags & ML_DONTPEGBOTTOM) texturevpeg = worldbottom + textureheight[gl_sidedef->midtexture] - worldtop + gl_sidedef->rowoffset; @@ -1554,7 +1554,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom wallVerts[2].s = wallVerts[1].s = cliphigh * grTex->scaleX; // Texture correction for slopes - if (gl_linedef->flags & ML_EFFECT2) { + if (gl_linedef->flags & ML_NOSKEW) { wallVerts[3].t += (gl_frontsector->ceilingheight - worldtop) * grTex->scaleY; wallVerts[2].t += (gl_frontsector->ceilingheight - worldtopslope) * grTex->scaleY; wallVerts[0].t += (gl_frontsector->floorheight - worldbottom) * grTex->scaleY; diff --git a/src/p_ceilng.c b/src/p_ceilng.c index ed385be33..11d08724f 100644 --- a/src/p_ceilng.c +++ b/src/p_ceilng.c @@ -375,7 +375,7 @@ INT32 EV_DoCrush(mtag_t tag, line_t *line, ceiling_e type) ceiling->topheight = P_FindHighestCeilingSurrounding(sec); ceiling->direction = 1; // Retain stupid behavior for backwards compatibility - if (!udmf && !(line->flags & ML_EFFECT4)) + if (!udmf && !(line->flags & ML_MIDSOLID)) ceiling->speed /= 2; else ceiling->speed = line->args[3] << (FRACBITS - 2); diff --git a/src/p_spec.c b/src/p_spec.c index 9358d6766..53c7f9cc8 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1647,7 +1647,7 @@ static boolean P_ActivateLinedefExecutorsInSector(line_t *triggerline, mobj_t *a size_t linecnt = ctlsector->linecount; size_t i; - if (triggerline->flags & ML_EFFECT5) // disregard order for efficiency + if (triggerline->flags & ML_WRAPMIDTEX) // disregard order for efficiency { for (i = 0; i < linecnt; i++) P_ActivateLinedefExecutor(ctlsector->lines[i], actor, caller); @@ -6812,9 +6812,9 @@ void P_SpawnSpecials(boolean fromnetsave) if (lines[i].args[4] & TMFB_ONLYBOTTOM) fflr->bustflags |= FB_ONLYBOTTOM; - if (lines[i].flags & ML_EFFECT4) + if (lines[i].flags & ML_MIDSOLID) fflr->bustflags |= FB_PUSHABLES; - if (lines[i].flags & ML_EFFECT5) + if (lines[i].flags & ML_WRAPMIDTEX) { fflr->bustflags |= FB_EXECUTOR; fflr->busttag = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; diff --git a/src/r_segs.c b/src/r_segs.c index 28968563e..f1a0d9596 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -301,7 +301,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) if (ds->curline->sidedef->repeatcnt) repeats = 1 + ds->curline->sidedef->repeatcnt; - else if (ldef->flags & ML_EFFECT5) + else if (ldef->flags & ML_WRAPMIDTEX) { fixed_t high, low; @@ -345,7 +345,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) { dc_texturemid = ds->maskedtextureheight[dc_x]; - if (curline->linedef->flags & ML_EFFECT3) + if (curline->linedef->flags & ML_MIDPEG) dc_texturemid += (textureheight[texnum])*times + textureheight[texnum]; else dc_texturemid -= (textureheight[texnum])*times; @@ -1455,7 +1455,7 @@ static void R_RenderSegLoop (void) maskedtexturecol[rw_x] = (INT16)texturecolumn; if (maskedtextureheight != NULL) { - maskedtextureheight[rw_x] = (curline->linedef->flags & ML_EFFECT3) ? + maskedtextureheight[rw_x] = (curline->linedef->flags & ML_MIDPEG) ? max(rw_midtexturemid, rw_midtextureback) : min(rw_midtexturemid, rw_midtextureback); } @@ -1766,7 +1766,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) texheight = textureheight[midtexture]; // a single sided line is terminal, so it must mark ends markfloor = markceiling = true; - if (linedef->flags & ML_EFFECT2) { + if (linedef->flags & ML_NOSKEW) { if (linedef->flags & ML_DONTPEGBOTTOM) rw_midtexturemid = frontsector->floorheight + texheight - viewz; else @@ -1991,7 +1991,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) toptexture = R_GetTextureNum(sidedef->toptexture); texheight = textureheight[toptexture]; } - if (!(linedef->flags & ML_EFFECT1)) { // Ignore slopes for lower/upper textures unless flag is checked + if (!(linedef->flags & ML_SKEWTD)) { // Ignore slopes for lower/upper textures unless flag is checked if (linedef->flags & ML_DONTPEGTOP) rw_toptexturemid = frontsector->ceilingheight - viewz; else @@ -2016,7 +2016,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) // bottom texture bottomtexture = R_GetTextureNum(sidedef->bottomtexture); - if (!(linedef->flags & ML_EFFECT1)) { // Ignore slopes for lower/upper textures unless flag is checked + if (!(linedef->flags & ML_SKEWTD)) { // Ignore slopes for lower/upper textures unless flag is checked if (linedef->flags & ML_DONTPEGBOTTOM) rw_bottomtexturemid = frontsector->floorheight - viewz; else @@ -2247,7 +2247,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) if (curline->polyseg) { // use REAL front and back floors please, so midtexture rendering isn't mucked up rw_midtextureslide = rw_midtexturebackslide = 0; - if (linedef->flags & ML_EFFECT3) + if (linedef->flags & ML_MIDPEG) rw_midtexturemid = rw_midtextureback = max(curline->frontsector->floorheight, curline->backsector->floorheight) - viewz; else rw_midtexturemid = rw_midtextureback = min(curline->frontsector->ceilingheight, curline->backsector->ceilingheight) - viewz; @@ -2255,16 +2255,16 @@ void R_StoreWallRange(INT32 start, INT32 stop) else { // Set midtexture starting height - if (linedef->flags & ML_EFFECT2) + if (linedef->flags & ML_NOSKEW) { // Ignore slopes when texturing rw_midtextureslide = rw_midtexturebackslide = 0; - if (linedef->flags & ML_EFFECT3) + if (linedef->flags & ML_MIDPEG) rw_midtexturemid = rw_midtextureback = max(frontsector->floorheight, backsector->floorheight) - viewz; else rw_midtexturemid = rw_midtextureback = min(frontsector->ceilingheight, backsector->ceilingheight) - viewz; } - else if (linedef->flags & ML_EFFECT3) + else if (linedef->flags & ML_MIDPEG) { rw_midtexturemid = worldbottom; rw_midtextureslide = floorfrontslide; From e406a52446fa3a3fb774e3e2a75c289e1c33fa27 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 5 Jan 2022 22:33:14 +0100 Subject: [PATCH 296/377] Remove weird special behavior for two-sided upper textures in software --- src/r_segs.c | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/src/r_segs.c b/src/r_segs.c index f1a0d9596..34ac23e60 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -1975,22 +1975,9 @@ void R_StoreWallRange(INT32 start, INT32 stop) { fixed_t texheight; // top texture - if ((linedef->flags & (ML_DONTPEGTOP) && (linedef->flags & ML_DONTPEGBOTTOM)) - && linedef->sidenum[1] != 0xffff) - { - // Special case... use offsets from 2nd side but only if it has a texture. - side_t *def = &sides[linedef->sidenum[1]]; - toptexture = R_GetTextureNum(def->toptexture); + toptexture = R_GetTextureNum(sidedef->toptexture); + texheight = textureheight[toptexture]; - if (!toptexture) //Second side has no texture, use the first side's instead. - toptexture = R_GetTextureNum(sidedef->toptexture); - texheight = textureheight[toptexture]; - } - else - { - toptexture = R_GetTextureNum(sidedef->toptexture); - texheight = textureheight[toptexture]; - } if (!(linedef->flags & ML_SKEWTD)) { // Ignore slopes for lower/upper textures unless flag is checked if (linedef->flags & ML_DONTPEGTOP) rw_toptexturemid = frontsector->ceilingheight - viewz; From 659410dde1b9159004e4d4bfc60aaab5121847a8 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 5 Jan 2022 23:47:05 +0100 Subject: [PATCH 297/377] Use Slope Skew flag instead of Upper Unpegged for FOF skewing --- src/hardware/hw_main.c | 4 ++-- src/p_setup.c | 22 ++++++++++++++++++++++ src/r_segs.c | 4 ++-- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index bafe8ce7a..37b044e45 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -1703,13 +1703,13 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom { texturevpeg = sides[newline->sidenum[0]].rowoffset; attachtobottom = !!(newline->flags & ML_DONTPEGBOTTOM); - slopeskew = !!(newline->flags & ML_DONTPEGTOP); + slopeskew = !!(newline->flags & ML_SKEWTD); } else { texturevpeg = sides[rover->master->sidenum[0]].rowoffset; attachtobottom = !!(gl_linedef->flags & ML_DONTPEGBOTTOM); - slopeskew = !!(rover->master->flags & ML_DONTPEGTOP); + slopeskew = !!(rover->master->flags & ML_SKEWTD); } grTex = HWR_GetTexture(texnum); diff --git a/src/p_setup.c b/src/p_setup.c index 7f1e00730..717d2ddce 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -5873,6 +5873,28 @@ static void P_ConvertBinaryLinedefFlags(void) lines[i].flags |= ML_MIDPEG; else lines[i].flags &= ~ML_MIDPEG; + + if (lines[i].special >= 100 && lines[i].special < 300) + { + if (lines[i].flags & ML_DONTPEGTOP) + lines[i].flags |= ML_SKEWTD; + else + lines[i].flags = ~ML_SKEWTD; + + if ((lines[i].flags & ML_TFERLINE) && lines[i].frontsector) + { + size_t j; + + for (j = 0; j < lines[i].frontsector->linecount; j++) + { + if (lines[i].frontsector->lines[j]->flags & ML_DONTPEGTOP) + lines[i].frontsector->lines[j]->flags |= ML_SKEWTD; + else + lines[i].frontsector->lines[j]->flags = ~ML_SKEWTD; + } + } + } + } } diff --git a/src/r_segs.c b/src/r_segs.c index 34ac23e60..78b7a50de 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -765,10 +765,10 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) skewslope = *pfloor->t_slope; // skew using top slope by default if (newline) { - if (newline->flags & ML_DONTPEGTOP) + if (newline->flags & ML_SKEWTD) slopeskew = true; } - else if (pfloor->master->flags & ML_DONTPEGTOP) + else if (pfloor->master->flags & ML_SKEWTD) slopeskew = true; if (slopeskew) From 1de5b777101febf6bcd09326d5278cfc9c16cd4a Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 5 Jan 2022 23:47:05 +0100 Subject: [PATCH 298/377] Fix typo --- src/p_setup.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 717d2ddce..e3b71baef 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -5879,7 +5879,7 @@ static void P_ConvertBinaryLinedefFlags(void) if (lines[i].flags & ML_DONTPEGTOP) lines[i].flags |= ML_SKEWTD; else - lines[i].flags = ~ML_SKEWTD; + lines[i].flags &= ~ML_SKEWTD; if ((lines[i].flags & ML_TFERLINE) && lines[i].frontsector) { @@ -5890,7 +5890,7 @@ static void P_ConvertBinaryLinedefFlags(void) if (lines[i].frontsector->lines[j]->flags & ML_DONTPEGTOP) lines[i].frontsector->lines[j]->flags |= ML_SKEWTD; else - lines[i].frontsector->lines[j]->flags = ~ML_SKEWTD; + lines[i].frontsector->lines[j]->flags &= ~ML_SKEWTD; } } } From 8b5f6cca37b6179e363f14175ab52e19d627ac79 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 7 Jan 2022 12:45:40 +0100 Subject: [PATCH 299/377] Add command line parameter for saving the current map in TEXTMAP format --- src/p_setup.c | 410 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 409 insertions(+), 1 deletion(-) diff --git a/src/p_setup.c b/src/p_setup.c index e3b71baef..817bd8fec 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1983,6 +1983,406 @@ static INT32 P_ColorToRGBA(INT32 color, UINT8 alpha) return R_PutRgbaRGBA(r, g, b, alpha); } +static INT32 P_RGBAToColor(INT32 rgba) +{ + UINT8 r = R_GetRgbaR(rgba); + UINT8 g = R_GetRgbaG(rgba); + UINT8 b = R_GetRgbaB(rgba); + return (r << 16) | (g << 8) | b; +} + +static void P_WriteTextmap(void) +{ + size_t i, j; + FILE *f; + char *filepath = va(pandf, srb2home, "TEXTMAP"); + mtag_t firsttag; + + f = fopen(filepath, "w"); + if (!f) + { + CONS_Alert(CONS_ERROR, M_GetText("Couldn't save map file %s\n"), filepath); + return; + } + + fprintf(f, "namespace = \"srb2\";\n"); + for (i = 0; i < nummapthings; i++) + { + fprintf(f, "thing // %d\n", i); + fprintf(f, "{\n"); + firsttag = Tag_FGet(&mapthings[i].tags); + if (firsttag != 0) + fprintf(f, "id = %d;\n", firsttag); + if (mapthings[i].tags.count > 1) + { + fprintf(f, "moreids = \""); + for (j = 1; j < mapthings[i].tags.count; j++) + { + if (j > 1) + fprintf(f, " "); + fprintf(f, " %d", mapthings[i].tags.tags[j]); + } + fprintf(f, "\";\n"); + } + fprintf(f, "x = %d;\n", mapthings[i].x); + fprintf(f, "y = %d;\n", mapthings[i].y); + if (mapthings[i].z != 0) + fprintf(f, "height = %d;\n", mapthings[i].z); + if (mapthings[i].angle != 0) + fprintf(f, "angle = %d;\n", mapthings[i].angle); + if (mapthings[i].pitch != 0) + fprintf(f, "pitch = %d;\n", mapthings[i].pitch); + if (mapthings[i].roll != 0) + fprintf(f, "roll = %d;\n", mapthings[i].roll); + if (mapthings[i].type != 0) + fprintf(f, "type = %d;\n", mapthings[i].type); + if (mapthings[i].scale != FRACUNIT) + fprintf(f, "scale = %f;\n", FIXED_TO_FLOAT(mapthings[i].scale)); + if (mapthings[i].options & MTF_OBJECTFLIP) + fprintf(f, "flip = true;\n"); + for (j = 0; j < NUMMAPTHINGARGS; j++) + if (mapthings[i].args[j] != 0) + fprintf(f, "arg%d = %d;\n", j, mapthings[i].args[j]); + for (j = 0; j < NUMMAPTHINGSTRINGARGS; j++) + if (mapthings[i].stringargs[j]) + fprintf(f, "stringarg%d = \"%s\";\n", j, mapthings[i].stringargs[j]); + fprintf(f, "}\n"); + fprintf(f, "\n"); + } + + for (i = 0; i < numvertexes; i++) + { + fprintf(f, "vertex // %d\n", i); + fprintf(f, "{\n"); + fprintf(f, "x = %f;\n", FIXED_TO_FLOAT(vertexes[i].x)); + fprintf(f, "y = %f;\n", FIXED_TO_FLOAT(vertexes[i].y)); + if (vertexes[i].floorzset) + fprintf(f, "zfloor = %f;\n", FIXED_TO_FLOAT(vertexes[i].floorz)); + if (vertexes[i].ceilingzset) + fprintf(f, "zceiling = %f;\n", FIXED_TO_FLOAT(vertexes[i].ceilingz)); + fprintf(f, "}\n"); + fprintf(f, "\n"); + } + + for (i = 0; i < numlines; i++) + { + fprintf(f, "linedef // %d\n", i); + fprintf(f, "{\n"); + firsttag = Tag_FGet(&lines[i].tags); + if (firsttag != 0) + fprintf(f, "id = %d;\n", firsttag); + if (lines[i].tags.count > 1) + { + fprintf(f, "moreids = \""); + for (j = 1; j < lines[i].tags.count; j++) + { + if (j > 1) + fprintf(f, " "); + fprintf(f, " %d", lines[i].tags.tags[j]); + } + fprintf(f, "\";\n"); + } + if (lines[i].special != 0) + fprintf(f, "special = %d;\n", lines[i].special); + fprintf(f, "v1 = %d;\n", lines[i].v1 - vertexes); + fprintf(f, "v2 = %d;\n", lines[i].v2 - vertexes); + for (j = 0; j < NUMLINEARGS; j++) + if (lines[i].args[j] != 0) + fprintf(f, "arg%d = %d;\n", j, lines[i].args[j]); + for (j = 0; j < NUMLINESTRINGARGS; j++) + if (lines[i].stringargs[j]) + fprintf(f, "stringarg%d = \"%s\";\n", j, lines[i].stringargs[j]); + fprintf(f, "sidefront = %d;\n", lines[i].sidenum[0]); + if (lines[i].sidenum[1] != 0xffff) + fprintf(f, "sideback = %d;\n", lines[i].sidenum[1]); + if (lines[i].alpha != FRACUNIT) + fprintf(f, "alpha = %f;\n", FIXED_TO_FLOAT(lines[i].alpha)); + if (lines[i].blendmode != AST_COPY) + { + switch (lines[i].blendmode) + { + case AST_ADD: + fprintf(f, "renderstyle = \"add\";\n"); + break; + case AST_SUBTRACT: + fprintf(f, "renderstyle = \"subtract\";\n"); + break; + case AST_REVERSESUBTRACT: + fprintf(f, "renderstyle = \"reversesubtract\";\n"); + break; + case AST_MODULATE: + fprintf(f, "renderstyle = \"modulate\";\n"); + break; + case AST_FOG: + fprintf(f, "renderstyle = \"fog\";\n"); + break; + default: + break; + } + } + if (lines[i].executordelay != 0) + fprintf(f, "executordelay = %d;\n", lines[i].executordelay); + if (lines[i].flags & ML_IMPASSIBLE) + fprintf(f, "blocking = true;\n"); + if (lines[i].flags & ML_BLOCKMONSTERS) + fprintf(f, "blockmonsters = true;\n"); + if (lines[i].flags & ML_TWOSIDED) + fprintf(f, "twosided = true;\n"); + if (lines[i].flags & ML_DONTPEGTOP) + fprintf(f, "dontpegtop = true;\n"); + if (lines[i].flags & ML_DONTPEGBOTTOM) + fprintf(f, "dontpegbottom = true;\n"); + if (lines[i].flags & ML_SKEWTD) + fprintf(f, "skewtd = true;\n"); + if (lines[i].flags & ML_NOCLIMB) + fprintf(f, "noclimb = true;\n"); + if (lines[i].flags & ML_NOSKEW) + fprintf(f, "noskew = true;\n"); + if (lines[i].flags & ML_MIDPEG) + fprintf(f, "midpeg = true;\n"); + if (lines[i].flags & ML_MIDSOLID) + fprintf(f, "midsolid = true;\n"); + if (lines[i].flags & ML_WRAPMIDTEX) + fprintf(f, "wrapmidtex = true;\n"); + if (lines[i].flags & ML_NONET) + fprintf(f, "nonet = true;\n"); + if (lines[i].flags & ML_NETONLY) + fprintf(f, "netonly = true;\n"); + if (lines[i].flags & ML_BOUNCY) + fprintf(f, "bouncy = true;\n"); + if (lines[i].flags & ML_TFERLINE) + fprintf(f, "transfer = true;\n"); + fprintf(f, "}\n"); + fprintf(f, "\n"); + } + + for (i = 0; i < numsides; i++) + { + fprintf(f, "sidedef // %d\n", i); + fprintf(f, "{\n"); + if (sides[i].textureoffset != 0) + fprintf(f, "offsetx = %d;\n", sides[i].textureoffset >> FRACBITS); + if (sides[i].rowoffset != 0) + fprintf(f, "offsety = %d;\n", sides[i].rowoffset >> FRACBITS); + if (sides[i].toptexture != 0) + fprintf(f, "texturetop = \"%.*s\";\n", 8, textures[sides[i].toptexture]->name); + if (sides[i].bottomtexture != 0) + fprintf(f, "texturebottom = \"%.*s\";\n", 8, textures[sides[i].bottomtexture]->name); + if (sides[i].midtexture != 0) + fprintf(f, "texturemiddle = \"%.*s\";\n", 8, textures[sides[i].midtexture]->name); + fprintf(f, "sector = %d;\n", sides[i].sector - sectors); + if (sides[i].repeatcnt != 0) + fprintf(f, "repeatcnt = %d;\n", sides[i].repeatcnt); + fprintf(f, "}\n"); + fprintf(f, "\n"); + } + + for (i = 0; i < numsectors; i++) + { + fprintf(f, "sector // %d\n", i); + fprintf(f, "{\n"); + if (sectors[i].floorheight != 0) + fprintf(f, "heightfloor = %d;\n", sectors[i].floorheight >> FRACBITS); + if (sectors[i].ceilingheight != 0) + fprintf(f, "heightceiling = %d;\n", sectors[i].ceilingheight >> FRACBITS); + if (sectors[i].floorpic != -1) + fprintf(f, "texturefloor = \"%s\";\n", levelflats[sectors[i].floorpic].name); + if (sectors[i].ceilingpic != -1) + fprintf(f, "textureceiling = \"%s\";\n", levelflats[sectors[i].ceilingpic].name); + if (sectors[i].lightlevel != 255) + fprintf(f, "lightlevel = %d;\n", sectors[i].lightlevel); + if (sectors[i].floorlightlevel != 0) + fprintf(f, "lightfloor = %d;\n", sectors[i].floorlightlevel); + if (sectors[i].floorlightabsolute) + fprintf(f, "lightfloorabsolute = true;\n"); + if (sectors[i].ceilinglightlevel != 0) + fprintf(f, "lightceiling = %d;\n", sectors[i].ceilinglightlevel); + if (sectors[i].ceilinglightabsolute) + fprintf(f, "lightceilingabsolute = true;\n"); + firsttag = Tag_FGet(§ors[i].tags); + if (firsttag != 0) + fprintf(f, "id = %d;\n", firsttag); + if (sectors[i].tags.count > 1) + { + fprintf(f, "moreids = \""); + for (j = 1; j < sectors[i].tags.count; j++) + { + if (j > 1) + fprintf(f, " "); + fprintf(f, "%d", sectors[i].tags.tags[j]); + } + fprintf(f, "\";\n"); + } + //TODO: Un-fix offsets + if (sectors[i].floor_xoffs != 0) + fprintf(f, "xpanningfloor = %f;\n", FIXED_TO_FLOAT(sectors[i].floor_xoffs)); + if (sectors[i].floor_yoffs != 0) + fprintf(f, "ypanningfloor = %f;\n", FIXED_TO_FLOAT(sectors[i].floor_yoffs)); + if (sectors[i].ceiling_xoffs != 0) + fprintf(f, "xpanningceiling = %f;\n", FIXED_TO_FLOAT(sectors[i].ceiling_xoffs)); + if (sectors[i].ceiling_yoffs != 0) + fprintf(f, "ypanningceiling = %f;\n", FIXED_TO_FLOAT(sectors[i].ceiling_yoffs)); + if (sectors[i].floorpic_angle != 0) + fprintf(f, "rotationfloor = %f;\n", FIXED_TO_FLOAT(AngleFixed(sectors[i].floorpic_angle))); + if (sectors[i].ceilingpic_angle != 0) + fprintf(f, "rotationceiling = %f;\n", FIXED_TO_FLOAT(AngleFixed(sectors[i].ceilingpic_angle))); + //TODO: Only if slope was defined via equations + /*if (sectors[i].f_slope) + { + fixed_t a = sectors[i].f_slope->normal.x; + fixed_t b = sectors[i].f_slope->normal.y; + fixed_t c = sectors[i].f_slope->normal.z; + fixed_t d = -FV3_Dot(§ors[i].f_slope->normal, §ors[i].f_slope->o); + fprintf(f, "floorplane_a = %f;\n", FIXED_TO_FLOAT(a)); + fprintf(f, "floorplane_b = %f;\n", FIXED_TO_FLOAT(b)); + fprintf(f, "floorplane_c = %f;\n", FIXED_TO_FLOAT(c)); + fprintf(f, "floorplane_d = %f;\n", FIXED_TO_FLOAT(d)); + } + if (sectors[i].c_slope) + { + fixed_t a = sectors[i].c_slope->normal.x; + fixed_t b = sectors[i].c_slope->normal.y; + fixed_t c = sectors[i].c_slope->normal.z; + fixed_t d = -FV3_Dot(§ors[i].c_slope->normal, §ors[i].c_slope->o); + fprintf(f, "ceilingplane_a = %f;\n", FIXED_TO_FLOAT(a)); + fprintf(f, "ceilingplane_b = %f;\n", FIXED_TO_FLOAT(b)); + fprintf(f, "ceilingplane_c = %f;\n", FIXED_TO_FLOAT(c)); + fprintf(f, "ceilingplane_d = %f;\n", FIXED_TO_FLOAT(d)); + }*/ + if (sectors[i].extra_colormap) + { + INT32 lightcolor = P_RGBAToColor(sectors[i].extra_colormap->rgba); + UINT8 lightalpha = R_GetRgbaA(sectors[i].extra_colormap->rgba); + INT32 fadecolor = P_RGBAToColor(sectors[i].extra_colormap->fadergba); + UINT8 fadealpha = R_GetRgbaA(sectors[i].extra_colormap->fadergba); + + if (lightcolor != 0) + fprintf(f, "lightcolor = %d;\n", lightcolor); + if (lightalpha != 25) + fprintf(f, "lightalpha = %d;\n", lightalpha); + if (fadecolor != 0) + fprintf(f, "fadecolor = %d;\n", fadecolor); + if (fadealpha != 25) + fprintf(f, "fadealpha = %d;\n", fadealpha); + if (sectors[i].extra_colormap->fadestart != 0) + fprintf(f, "fadestart = %d;\n", sectors[i].extra_colormap->fadestart); + if (sectors[i].extra_colormap->fadeend != 31) + fprintf(f, "fadeend = %d;\n", sectors[i].extra_colormap->fadeend); + if (sectors[i].extra_colormap->flags & CMF_FOG) + fprintf(f, "colormapfog = true;\n"); + if (sectors[i].extra_colormap->flags & CMF_FADEFULLBRIGHTSPRITES) + fprintf(f, "colormapfadesprites = true;\n"); + } + if (sectors[i].colormap_protected) + fprintf(f, "colormapprotected = true;\n"); + if (!(sectors[i].flags & MSF_FLIPSPECIAL_FLOOR)) + fprintf(f, "flipspecial_nofloor = true;\n"); + if (sectors[i].flags & MSF_FLIPSPECIAL_CEILING) + fprintf(f, "flipspecial_ceiling = true;\n"); + if (sectors[i].flags & MSF_TRIGGERSPECIAL_TOUCH) + fprintf(f, "triggerspecial_touch = true;\n"); + if (sectors[i].flags & MSF_TRIGGERSPECIAL_HEADBUMP) + fprintf(f, "triggerspecial_headbump = true;\n"); + if (sectors[i].flags & MSF_TRIGGERLINE_PLANE) + fprintf(f, "triggerline_plane = true;\n"); + if (sectors[i].flags & MSF_TRIGGERLINE_MOBJ) + fprintf(f, "triggerline_mobj = true;\n"); + if (sectors[i].flags & MSF_INVERTPRECIP) + fprintf(f, "invertprecip = true;\n"); + if (sectors[i].flags & MSF_GRAVITYFLIP) + fprintf(f, "gravityflip = true;\n"); + if (sectors[i].flags & MSF_HEATWAVE) + fprintf(f, "heatwave = true;\n"); + if (sectors[i].flags & MSF_NOCLIPCAMERA) + fprintf(f, "noclipcamera = true;\n"); + if (sectors[i].specialflags & SSF_OUTERSPACE) + fprintf(f, "outerspace = true;\n"); + if (sectors[i].specialflags & SSF_DOUBLESTEPUP) + fprintf(f, "doublestepup = true;\n"); + if (sectors[i].specialflags & SSF_NOSTEPDOWN) + fprintf(f, "nostepdown = true;\n"); + if (sectors[i].specialflags & SSF_SPEEDPAD) + fprintf(f, "speedpad = true;\n"); + if (sectors[i].specialflags & SSF_STARPOSTACTIVATOR) + fprintf(f, "starpostactivator = true;\n"); + if (sectors[i].specialflags & SSF_EXIT) + fprintf(f, "exit = true;\n"); + if (sectors[i].specialflags & SSF_SPECIALSTAGEPIT) + fprintf(f, "specialstagepit = true;\n"); + if (sectors[i].specialflags & SSF_RETURNFLAG) + fprintf(f, "returnflag = true;\n"); + if (sectors[i].specialflags & SSF_REDTEAMBASE) + fprintf(f, "redteambase = true;\n"); + if (sectors[i].specialflags & SSF_BLUETEAMBASE) + fprintf(f, "blueteambase = true;\n"); + if (sectors[i].specialflags & SSF_FAN) + fprintf(f, "fan = true;\n"); + if (sectors[i].specialflags & SSF_SUPERTRANSFORM) + fprintf(f, "supertransform = true;\n"); + if (sectors[i].specialflags & SSF_FORCESPIN) + fprintf(f, "forcespin = true;\n"); + if (sectors[i].specialflags & SSF_ZOOMTUBESTART) + fprintf(f, "zoomtubestart = true;\n"); + if (sectors[i].specialflags & SSF_ZOOMTUBEEND) + fprintf(f, "zoomtubeend = true;\n"); + if (sectors[i].specialflags & SSF_FINISHLINE) + fprintf(f, "finishline = true;\n"); + if (sectors[i].specialflags & SSF_ROPEHANG) + fprintf(f, "ropehang = true;\n"); + //TODO: Float + if (sectors[i].friction != 0) + fprintf(f, "friction = %d;\n", sectors[i].friction); + if (sectors[i].gravity != FRACUNIT) + fprintf(f, "gravity = %f;\n", FIXED_TO_FLOAT(sectors[i].gravity)); + if (sectors[i].damagetype != SD_NONE) + { + switch (sectors[i].damagetype) + { + case SD_GENERIC: + fprintf(f, "damagetype = \"Generic\";\n"); + break; + case SD_WATER: + fprintf(f, "damagetype = \"Water\";\n"); + break; + case SD_FIRE: + fprintf(f, "damagetype = \"Fire\";\n"); + break; + case SD_LAVA: + fprintf(f, "damagetype = \"Lava\";\n"); + break; + case SD_ELECTRIC: + fprintf(f, "damagetype = \"Electric\";\n"); + break; + case SD_SPIKE: + fprintf(f, "damagetype = \"Spike\";\n"); + break; + case SD_DEATHPITTILT: + fprintf(f, "damagetype = \"DeathPitTilt\";\n"); + break; + case SD_DEATHPITNOTILT: + fprintf(f, "damagetype = \"DeathPitNoTilt\";\n"); + break; + case SD_INSTAKILL: + fprintf(f, "damagetype = \"Instakill\";\n"); + break; + case SD_SPECIALSTAGE: + fprintf(f, "damagetype = \"SpecialStage\";\n"); + break; + default: + break; + } + } + if (sectors[i].triggertag != 0) + fprintf(f, "triggertag = %d;\n", sectors[i].triggertag); + if (sectors[i].triggerer != 0) + fprintf(f, "triggerer = %d;\n", sectors[i].triggerer); + fprintf(f, "}\n"); + fprintf(f, "\n"); + } + + fclose(f); +} + /** Loads the textmap data, after obtaining the elements count and allocating their respective space. */ static void P_LoadTextmap(void) @@ -2587,11 +2987,17 @@ static boolean P_LoadExtendedSubsectorsAndSegs(UINT8 **data, nodetype_t nodetype linenum = (nodetype == NT_XGL3) ? READUINT32((*data)) : READUINT16((*data)); if (linenum != 0xFFFF && linenum >= numlines) - I_Error("P_LoadExtendedSubsectorsAndSegs: Seg %s in subsector %d has invalid linedef %d!\n", sizeu1(k), m, linenum); + I_Error("P_LoadExtendedSubsectorsAndSegs: Seg %s in subsector %d has invalid linedef %d!\n", sizeu1(k), i, linenum); segs[k].glseg = (linenum == 0xFFFF); segs[k].linedef = (linenum == 0xFFFF) ? NULL : &lines[linenum]; segs[k].side = READUINT8((*data)); } + while (segs[subsectors[i].firstline].glseg) + { + subsectors[i].firstline++; + if (subsectors[i].firstline == k) + I_Error("P_LoadExtendedSubsectorsAndSegs: Subsector %d does not have any valid segs!", i); + } break; case NT_XNOD: @@ -5905,6 +6311,8 @@ static void P_ConvertBinaryMap(void) P_ConvertBinarySectorTypes(); P_ConvertBinaryThingTypes(); P_ConvertBinaryLinedefFlags(); + if (M_CheckParm("-writetextmap")) + P_WriteTextmap(); } /** Compute MD5 message digest for bytes read from memory source From 95ce2aca9800f480b53a61370f90242576178e2c Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 7 Jan 2022 12:48:06 +0100 Subject: [PATCH 300/377] P_WriteTextmap: Update friction to float --- src/p_setup.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index e39675a55..e577dc340 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2331,9 +2331,8 @@ static void P_WriteTextmap(void) fprintf(f, "finishline = true;\n"); if (sectors[i].specialflags & SSF_ROPEHANG) fprintf(f, "ropehang = true;\n"); - //TODO: Float - if (sectors[i].friction != 0) - fprintf(f, "friction = %d;\n", sectors[i].friction); + if (sectors[i].friction != ORIG_FRICTION) + fprintf(f, "friction = %f;\n", FIXED_TO_FLOAT(sectors[i].friction)); if (sectors[i].gravity != FRACUNIT) fprintf(f, "gravity = %f;\n", FIXED_TO_FLOAT(sectors[i].gravity)); if (sectors[i].damagetype != SD_NONE) From 56b00fac54ec34c7bd653f5c4a666dd6870983dd Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 7 Jan 2022 13:39:25 +0100 Subject: [PATCH 301/377] P_WriteTextmap: Rearrange properties and remove some defaults --- src/p_setup.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index e577dc340..bfaaeab77 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2030,8 +2030,7 @@ static void P_WriteTextmap(void) fprintf(f, "y = %d;\n", mapthings[i].y); if (mapthings[i].z != 0) fprintf(f, "height = %d;\n", mapthings[i].z); - if (mapthings[i].angle != 0) - fprintf(f, "angle = %d;\n", mapthings[i].angle); + fprintf(f, "angle = %d;\n", mapthings[i].angle); if (mapthings[i].pitch != 0) fprintf(f, "pitch = %d;\n", mapthings[i].pitch); if (mapthings[i].roll != 0) @@ -2070,6 +2069,11 @@ static void P_WriteTextmap(void) { fprintf(f, "linedef // %d\n", i); fprintf(f, "{\n"); + fprintf(f, "v1 = %d;\n", lines[i].v1 - vertexes); + fprintf(f, "v2 = %d;\n", lines[i].v2 - vertexes); + fprintf(f, "sidefront = %d;\n", lines[i].sidenum[0]); + if (lines[i].sidenum[1] != 0xffff) + fprintf(f, "sideback = %d;\n", lines[i].sidenum[1]); firsttag = Tag_FGet(&lines[i].tags); if (firsttag != 0) fprintf(f, "id = %d;\n", firsttag); @@ -2086,17 +2090,12 @@ static void P_WriteTextmap(void) } if (lines[i].special != 0) fprintf(f, "special = %d;\n", lines[i].special); - fprintf(f, "v1 = %d;\n", lines[i].v1 - vertexes); - fprintf(f, "v2 = %d;\n", lines[i].v2 - vertexes); for (j = 0; j < NUMLINEARGS; j++) if (lines[i].args[j] != 0) fprintf(f, "arg%d = %d;\n", j, lines[i].args[j]); for (j = 0; j < NUMLINESTRINGARGS; j++) if (lines[i].stringargs[j]) fprintf(f, "stringarg%d = \"%s\";\n", j, lines[i].stringargs[j]); - fprintf(f, "sidefront = %d;\n", lines[i].sidenum[0]); - if (lines[i].sidenum[1] != 0xffff) - fprintf(f, "sideback = %d;\n", lines[i].sidenum[1]); if (lines[i].alpha != FRACUNIT) fprintf(f, "alpha = %f;\n", FIXED_TO_FLOAT(lines[i].alpha)); if (lines[i].blendmode != AST_COPY) @@ -2162,6 +2161,7 @@ static void P_WriteTextmap(void) { fprintf(f, "sidedef // %d\n", i); fprintf(f, "{\n"); + fprintf(f, "sector = %d;\n", sides[i].sector - sectors); if (sides[i].textureoffset != 0) fprintf(f, "offsetx = %d;\n", sides[i].textureoffset >> FRACBITS); if (sides[i].rowoffset != 0) @@ -2172,7 +2172,6 @@ static void P_WriteTextmap(void) fprintf(f, "texturebottom = \"%.*s\";\n", 8, textures[sides[i].bottomtexture]->name); if (sides[i].midtexture != 0) fprintf(f, "texturemiddle = \"%.*s\";\n", 8, textures[sides[i].midtexture]->name); - fprintf(f, "sector = %d;\n", sides[i].sector - sectors); if (sides[i].repeatcnt != 0) fprintf(f, "repeatcnt = %d;\n", sides[i].repeatcnt); fprintf(f, "}\n"); @@ -2183,16 +2182,13 @@ static void P_WriteTextmap(void) { fprintf(f, "sector // %d\n", i); fprintf(f, "{\n"); - if (sectors[i].floorheight != 0) - fprintf(f, "heightfloor = %d;\n", sectors[i].floorheight >> FRACBITS); - if (sectors[i].ceilingheight != 0) - fprintf(f, "heightceiling = %d;\n", sectors[i].ceilingheight >> FRACBITS); + fprintf(f, "heightfloor = %d;\n", sectors[i].floorheight >> FRACBITS); + fprintf(f, "heightceiling = %d;\n", sectors[i].ceilingheight >> FRACBITS); if (sectors[i].floorpic != -1) fprintf(f, "texturefloor = \"%s\";\n", levelflats[sectors[i].floorpic].name); if (sectors[i].ceilingpic != -1) fprintf(f, "textureceiling = \"%s\";\n", levelflats[sectors[i].ceilingpic].name); - if (sectors[i].lightlevel != 255) - fprintf(f, "lightlevel = %d;\n", sectors[i].lightlevel); + fprintf(f, "lightlevel = %d;\n", sectors[i].lightlevel); if (sectors[i].floorlightlevel != 0) fprintf(f, "lightfloor = %d;\n", sectors[i].floorlightlevel); if (sectors[i].floorlightabsolute) From b05bcc46577f585ff72575e6d1bcff89f069d767 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 7 Jan 2022 15:44:56 +0100 Subject: [PATCH 302/377] P_WriteTextmap: Correct flat offsets --- src/p_setup.c | 42 +++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 2ae303855..c6561a8a8 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1977,6 +1977,29 @@ static void TextmapFixFlatOffsets(sector_t *sec) } } +static void TextmapUnfixFlatOffsets(sector_t *sec) +{ + if (sec->floorpic_angle) + { + fixed_t pc = FINECOSINE(sec->floorpic_angle >> ANGLETOFINESHIFT); + fixed_t ps = FINESINE(sec->floorpic_angle >> ANGLETOFINESHIFT); + fixed_t xoffs = sec->floor_xoffs; + fixed_t yoffs = sec->floor_yoffs; + sec->floor_xoffs = (FixedMul(xoffs, ps) % MAXFLATSIZE) + (FixedMul(yoffs, pc) % MAXFLATSIZE); + sec->floor_yoffs = (FixedMul(xoffs, pc) % MAXFLATSIZE) - (FixedMul(yoffs, ps) % MAXFLATSIZE); + } + + if (sec->ceilingpic_angle) + { + fixed_t pc = FINECOSINE(sec->ceilingpic_angle >> ANGLETOFINESHIFT); + fixed_t ps = FINESINE(sec->ceilingpic_angle >> ANGLETOFINESHIFT); + fixed_t xoffs = sec->ceiling_xoffs; + fixed_t yoffs = sec->ceiling_yoffs; + sec->ceiling_xoffs = (FixedMul(xoffs, ps) % MAXFLATSIZE) + (FixedMul(yoffs, pc) % MAXFLATSIZE); + sec->ceiling_yoffs = (FixedMul(xoffs, pc) % MAXFLATSIZE) - (FixedMul(yoffs, ps) % MAXFLATSIZE); + } +} + static INT32 P_ColorToRGBA(INT32 color, UINT8 alpha) { UINT8 r = (color >> 16) & 0xFF; @@ -2211,15 +2234,16 @@ static void P_WriteTextmap(void) } fprintf(f, "\";\n"); } - //TODO: Un-fix offsets - if (sectors[i].floor_xoffs != 0) - fprintf(f, "xpanningfloor = %f;\n", FIXED_TO_FLOAT(sectors[i].floor_xoffs)); - if (sectors[i].floor_yoffs != 0) - fprintf(f, "ypanningfloor = %f;\n", FIXED_TO_FLOAT(sectors[i].floor_yoffs)); - if (sectors[i].ceiling_xoffs != 0) - fprintf(f, "xpanningceiling = %f;\n", FIXED_TO_FLOAT(sectors[i].ceiling_xoffs)); - if (sectors[i].ceiling_yoffs != 0) - fprintf(f, "ypanningceiling = %f;\n", FIXED_TO_FLOAT(sectors[i].ceiling_yoffs)); + sector_t tempsec = sectors[i]; + TextmapUnfixFlatOffsets(&tempsec); + if (tempsec.floor_xoffs != 0) + fprintf(f, "xpanningfloor = %f;\n", FIXED_TO_FLOAT(tempsec.floor_xoffs)); + if (tempsec.floor_yoffs != 0) + fprintf(f, "ypanningfloor = %f;\n", FIXED_TO_FLOAT(tempsec.floor_yoffs)); + if (tempsec.ceiling_xoffs != 0) + fprintf(f, "xpanningceiling = %f;\n", FIXED_TO_FLOAT(tempsec.ceiling_xoffs)); + if (tempsec.ceiling_yoffs != 0) + fprintf(f, "ypanningceiling = %f;\n", FIXED_TO_FLOAT(tempsec.ceiling_yoffs)); if (sectors[i].floorpic_angle != 0) fprintf(f, "rotationfloor = %f;\n", FIXED_TO_FLOAT(AngleFixed(sectors[i].floorpic_angle))); if (sectors[i].ceilingpic_angle != 0) From 1269fe6c0e1d9fa22062b8aa079b5c877385e65c Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 8 Jan 2022 13:17:15 +0100 Subject: [PATCH 303/377] Implement faster textmap parser --- src/doomdef.h | 7 ++- src/m_misc.c | 166 +++++++++++++++++++++++++++++++++++++++++++++++--- src/p_setup.c | 71 ++++++++++----------- 3 files changed, 194 insertions(+), 50 deletions(-) diff --git a/src/doomdef.h b/src/doomdef.h index 41ec9ef33..1b86cc954 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -483,8 +483,11 @@ extern void *(*M_Memcpy)(void* dest, const void* src, size_t n) FUNCNONNULL; char *va(const char *format, ...) FUNCPRINTF; char *M_GetToken(const char *inputString); void M_UnGetToken(void); -UINT32 M_GetTokenPos(void); -void M_SetTokenPos(UINT32 newPos); +void M_TokenizerOpen(const char *inputString); +void M_TokenizerClose(void); +const char *M_TokenizerRead(UINT32 i); +UINT32 M_TokenizerGetEndPos(void); +void M_TokenizerSetEndPos(UINT32 newPos); char *sizeu1(size_t num); char *sizeu2(size_t num); char *sizeu3(size_t num); diff --git a/src/m_misc.c b/src/m_misc.c index 59783d5d3..d49307c7f 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -1970,18 +1970,168 @@ void M_UnGetToken(void) endPos = oldendPos; } -/** Returns the current token's position. - */ -UINT32 M_GetTokenPos(void) +#define NUMTOKENS 2 +static const char *tokenizerInput = NULL; +static UINT32 tokenCapacity[NUMTOKENS] = {0}; +static char *tokenizerToken[NUMTOKENS] = {NULL}; +static UINT32 tokenizerStartPos = 0; +static UINT32 tokenizerEndPos = 0; +static UINT32 tokenizerInputLength = 0; +static UINT8 tokenizerInComment = 0; // 0 = not in comment, 1 = // Single-line, 2 = /* Multi-line */ + +void M_TokenizerOpen(const char *inputString) { - return endPos; + size_t i; + + tokenizerInput = inputString; + for (i = 0; i < NUMTOKENS; i++) + { + tokenCapacity[i] = 1024; + tokenizerToken[i] = (char*)Z_Malloc(tokenCapacity[i] * sizeof(char), PU_STATIC, NULL); + } + tokenizerInputLength = strlen(tokenizerInput); } -/** Sets the current token's position. - */ -void M_SetTokenPos(UINT32 newPos) +void M_TokenizerClose(void) { - endPos = newPos; + size_t i; + + tokenizerInput = NULL; + for (i = 0; i < NUMTOKENS; i++) + Z_Free(tokenizerToken[i]); + tokenizerStartPos = 0; + tokenizerEndPos = 0; + tokenizerInComment = 0; +} + +static void M_DetectComment(UINT32 *pos) +{ + if (tokenizerInComment) + return; + + if (*pos >= tokenizerInputLength - 1) + return; + + if (tokenizerInput[*pos] != '/') + return; + + //Single-line comment start + if (tokenizerInput[*pos + 1] == '/') + tokenizerInComment = 1; + //Multi-line comment start + else if (tokenizerInput[*pos + 1] == '*') + tokenizerInComment = 2; +} + +static void M_ReadTokenString(UINT32 i) +{ + UINT32 tokenLength = tokenizerEndPos - tokenizerStartPos; + if (tokenLength + 1 > tokenCapacity[i]) + { + tokenCapacity[i] = tokenLength + 1; + // Assign the memory. Don't forget an extra byte for the end of the string! + tokenizerToken[i] = (char *)Z_Malloc(tokenCapacity[i] * sizeof(char), PU_STATIC, NULL); + } + // Copy the string. + M_Memcpy(tokenizerToken[i], tokenizerInput + tokenizerStartPos, (size_t)tokenLength); + // Make the final character NUL. + tokenizerToken[i][tokenLength] = '\0'; +} + +const char *M_TokenizerRead(UINT32 i) +{ + if (!tokenizerInput) + return NULL; + + tokenizerStartPos = tokenizerEndPos; + + // Try to detect comments now, in case we're pointing right at one + M_DetectComment(&tokenizerStartPos); + + // Find the first non-whitespace char, or else the end of the string trying + while ((tokenizerInput[tokenizerStartPos] == ' ' + || tokenizerInput[tokenizerStartPos] == '\t' + || tokenizerInput[tokenizerStartPos] == '\r' + || tokenizerInput[tokenizerStartPos] == '\n' + || tokenizerInput[tokenizerStartPos] == '\0' + || tokenizerInput[tokenizerStartPos] == '=' || tokenizerInput[tokenizerStartPos] == ';' // UDMF TEXTMAP. + || tokenizerInComment != 0) + && tokenizerStartPos < tokenizerInputLength) + { + // Try to detect comment endings now + if (tokenizerInComment == 1 && tokenizerInput[tokenizerStartPos] == '\n') + tokenizerInComment = 0; // End of line for a single-line comment + else if (tokenizerInComment == 2 + && tokenizerStartPos < tokenizerInputLength - 1 + && tokenizerInput[tokenizerStartPos] == '*' + && tokenizerInput[tokenizerStartPos+1] == '/') + { + // End of multi-line comment + tokenizerInComment = 0; + tokenizerStartPos++; // Make damn well sure we're out of the comment ending at the end of it all + } + + tokenizerStartPos++; + M_DetectComment(&tokenizerStartPos); + } + + // If the end of the string is reached, no token is to be read + if (tokenizerStartPos == tokenizerInputLength) { + tokenizerEndPos = tokenizerInputLength; + return NULL; + } + // Else, if it's one of these three symbols, capture only this one character + else if (tokenizerInput[tokenizerStartPos] == ',' + || tokenizerInput[tokenizerStartPos] == '{' + || tokenizerInput[tokenizerStartPos] == '}') + { + tokenizerEndPos = tokenizerStartPos + 1; + tokenizerToken[i][0] = tokenizerInput[tokenizerStartPos]; + tokenizerToken[i][1] = '\0'; + return tokenizerToken[i]; + } + // Return entire string within quotes, except without the quotes. + else if (tokenizerInput[tokenizerStartPos] == '"') + { + tokenizerEndPos = ++tokenizerStartPos; + while (tokenizerInput[tokenizerEndPos] != '"' && tokenizerEndPos < tokenizerInputLength) + tokenizerEndPos++; + + M_ReadTokenString(i); + tokenizerEndPos++; + return tokenizerToken[i]; + } + + // Now find the end of the token. This includes several additional characters that are okay to capture as one character, but not trailing at the end of another token. + tokenizerEndPos = tokenizerStartPos + 1; + while ((tokenizerInput[tokenizerEndPos] != ' ' + && tokenizerInput[tokenizerEndPos] != '\t' + && tokenizerInput[tokenizerEndPos] != '\r' + && tokenizerInput[tokenizerEndPos] != '\n' + && tokenizerInput[tokenizerEndPos] != ',' + && tokenizerInput[tokenizerEndPos] != '{' + && tokenizerInput[tokenizerEndPos] != '}' + && tokenizerInput[tokenizerEndPos] != '=' && tokenizerInput[tokenizerEndPos] != ';' // UDMF TEXTMAP. + && tokenizerInComment == 0) + && tokenizerEndPos < tokenizerInputLength) + { + tokenizerEndPos++; + // Try to detect comment starts now; if it's in a comment, we don't want it in this token + M_DetectComment(&tokenizerEndPos); + } + + M_ReadTokenString(i); + return tokenizerToken[i]; +} + +UINT32 M_TokenizerGetEndPos(void) +{ + return tokenizerEndPos; +} + +void M_TokenizerSetEndPos(UINT32 newPos) +{ + tokenizerEndPos = newPos; } /** Count bits in a number. diff --git a/src/p_setup.c b/src/p_setup.c index c6561a8a8..74f761f24 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1428,9 +1428,9 @@ UINT32 vertexesPos[UINT16_MAX]; UINT32 sectorsPos[UINT16_MAX]; // Determine total amount of map data in TEXTMAP. -static boolean TextmapCount(UINT8 *data, size_t size) +static boolean TextmapCount(size_t size) { - char *tkn = M_GetToken((char *)data); + const char *tkn = M_TokenizerRead(0); UINT8 brackets = 0; nummapthings = 0; @@ -1442,20 +1442,16 @@ static boolean TextmapCount(UINT8 *data, size_t size) // Look for namespace at the beginning. if (!fastcmp(tkn, "namespace")) { - Z_Free(tkn); CONS_Alert(CONS_ERROR, "No namespace at beginning of lump!\n"); return false; } - Z_Free(tkn); // Check if namespace is valid. - tkn = M_GetToken(NULL); + tkn = M_TokenizerRead(0); if (!fastcmp(tkn, "srb2")) CONS_Alert(CONS_WARNING, "Invalid namespace '%s', only 'srb2' is supported.\n", tkn); - Z_Free(tkn); - tkn = M_GetToken(NULL); - while (tkn && M_GetTokenPos() < size) + while ((tkn = M_TokenizerRead(0)) && M_TokenizerGetEndPos() < size) { // Avoid anything inside bracketed stuff, only look for external keywords. if (brackets) @@ -1467,24 +1463,19 @@ static boolean TextmapCount(UINT8 *data, size_t size) brackets++; // Check for valid fields. else if (fastcmp(tkn, "thing")) - mapthingsPos[nummapthings++] = M_GetTokenPos(); + mapthingsPos[nummapthings++] = M_TokenizerGetEndPos(); else if (fastcmp(tkn, "linedef")) - linesPos[numlines++] = M_GetTokenPos(); + linesPos[numlines++] = M_TokenizerGetEndPos(); else if (fastcmp(tkn, "sidedef")) - sidesPos[numsides++] = M_GetTokenPos(); + sidesPos[numsides++] = M_TokenizerGetEndPos(); else if (fastcmp(tkn, "vertex")) - vertexesPos[numvertexes++] = M_GetTokenPos(); + vertexesPos[numvertexes++] = M_TokenizerGetEndPos(); else if (fastcmp(tkn, "sector")) - sectorsPos[numsectors++] = M_GetTokenPos(); + sectorsPos[numsectors++] = M_TokenizerGetEndPos(); else CONS_Alert(CONS_NOTICE, "Unknown field '%s'.\n", tkn); - - Z_Free(tkn); - tkn = M_GetToken(NULL); } - Z_Free(tkn); - if (brackets) { CONS_Alert(CONS_ERROR, "Unclosed brackets detected in textmap lump.\n"); @@ -1494,7 +1485,7 @@ static boolean TextmapCount(UINT8 *data, size_t size) return true; } -static void ParseTextmapVertexParameter(UINT32 i, char *param, char *val) +static void ParseTextmapVertexParameter(UINT32 i, const char *param, const char *val) { if (fastcmp(param, "x")) vertexes[i].x = FLOAT_TO_FIXED(atof(val)); @@ -1541,7 +1532,7 @@ typedef struct textmap_plane_s { textmap_plane_t textmap_planefloor = {0, 0, 0, 0, 0}; textmap_plane_t textmap_planeceiling = {0, 0, 0, 0, 0}; -static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) +static void ParseTextmapSectorParameter(UINT32 i, const char *param, const char *val) { if (fastcmp(param, "heightfloor")) sectors[i].floorheight = atol(val) << FRACBITS; @@ -1565,7 +1556,7 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) Tag_FSet(§ors[i].tags, atol(val)); else if (fastcmp(param, "moreids")) { - char* id = val; + const char* id = val; while (id) { Tag_Add(§ors[i].tags, atol(id)); @@ -1754,7 +1745,7 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) sectors[i].triggerer = atol(val); } -static void ParseTextmapSidedefParameter(UINT32 i, char *param, char *val) +static void ParseTextmapSidedefParameter(UINT32 i, const char *param, const char *val) { if (fastcmp(param, "offsetx")) sides[i].textureoffset = atol(val)<data, textmap->size)) + M_TokenizerOpen((char *)textmap->data); + if (!TextmapCount(textmap->size)) + { + M_TokenizerClose(); return false; + } } else { @@ -2704,7 +2692,10 @@ static boolean P_LoadMapData(const virtres_t *virt) // Load map data. if (udmf) + { P_LoadTextmap(); + M_TokenizerClose(); + } else { P_LoadVertices(virtvertexes->data); From 90cd009b23cbe8261c352e34bf4c363ddb65ec71 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 8 Jan 2022 16:58:55 +0100 Subject: [PATCH 304/377] Remove writethings because it no longer works properly with the binary-to-UDMF conversion --- src/d_netcmd.c | 2 +- src/m_cheat.c | 4 ++-- src/m_cheat.h | 2 +- src/p_setup.c | 4 ++-- src/p_setup.h | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index fe7e7678f..b0f776183 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -880,7 +880,7 @@ void D_RegisterClientCommands(void) // ingame object placing COM_AddCommand("objectplace", Command_ObjectPlace_f); - COM_AddCommand("writethings", Command_Writethings_f); + //COM_AddCommand("writethings", Command_Writethings_f); CV_RegisterVar(&cv_speed); CV_RegisterVar(&cv_opflags); CV_RegisterVar(&cv_ophoopflags); diff --git a/src/m_cheat.c b/src/m_cheat.c index 2f90b54ee..2b72905d5 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -1428,14 +1428,14 @@ void OP_ObjectplaceMovement(player_t *player) // // Objectplace related commands. // -void Command_Writethings_f(void) +/*void Command_Writethings_f(void) { REQUIRE_INLEVEL; REQUIRE_SINGLEPLAYER; REQUIRE_OBJECTPLACE; P_WriteThings(); -} +}*/ void Command_ObjectPlace_f(void) { diff --git a/src/m_cheat.h b/src/m_cheat.h index ee4ba5f55..5caeae59b 100644 --- a/src/m_cheat.h +++ b/src/m_cheat.h @@ -26,7 +26,7 @@ void cht_Init(void); // ObjectPlace // void Command_ObjectPlace_f(void); -void Command_Writethings_f(void); +//void Command_Writethings_f(void); extern consvar_t cv_opflags, cv_ophoopflags, cv_mapthingnum, cv_speed; //extern consvar_t cv_snapto, cv_grid; diff --git a/src/p_setup.c b/src/p_setup.c index 74f761f24..4ba794781 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -907,7 +907,7 @@ static void P_SpawnMapThings(boolean spawnemblems) } // Experimental groovy write function! -void P_WriteThings(void) +/*void P_WriteThings(void) { size_t i, length; mapthing_t *mt; @@ -942,7 +942,7 @@ void P_WriteThings(void) savebuf_p = NULL; CONS_Printf(M_GetText("newthings%d.lmp saved.\n"), gamemap); -} +}*/ // // MAP LOADING FUNCTIONS diff --git a/src/p_setup.h b/src/p_setup.h index c3c680fdd..0a7c2bd43 100644 --- a/src/p_setup.h +++ b/src/p_setup.h @@ -107,7 +107,7 @@ boolean P_AddFolder(const char *folderpath); boolean P_RunSOC(const char *socfilename); void P_LoadSoundsRange(UINT16 wadnum, UINT16 first, UINT16 num); void P_LoadMusicsRange(UINT16 wadnum, UINT16 first, UINT16 num); -void P_WriteThings(void); +//void P_WriteThings(void); size_t P_PrecacheLevelFlats(void); void P_AllocMapHeader(INT16 i); From 8615e86a0b6c8ecbf3e74b1a67cd190aeb7e057b Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 9 Jan 2022 09:27:39 +0100 Subject: [PATCH 305/377] P_WriteTextmap: Don't try to write invalid textures --- src/p_setup.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 4ba794781..32d3e93a4 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2173,11 +2173,11 @@ static void P_WriteTextmap(void) fprintf(f, "offsetx = %d;\n", sides[i].textureoffset >> FRACBITS); if (sides[i].rowoffset != 0) fprintf(f, "offsety = %d;\n", sides[i].rowoffset >> FRACBITS); - if (sides[i].toptexture != 0) + if (sides[i].toptexture > 0 && sides[i].toptexture < numtextures) fprintf(f, "texturetop = \"%.*s\";\n", 8, textures[sides[i].toptexture]->name); - if (sides[i].bottomtexture != 0) + if (sides[i].bottomtexture > 0 && sides[i].bottomtexture < numtextures) fprintf(f, "texturebottom = \"%.*s\";\n", 8, textures[sides[i].bottomtexture]->name); - if (sides[i].midtexture != 0) + if (sides[i].midtexture > 0 && sides[i].midtexture < numtextures) fprintf(f, "texturemiddle = \"%.*s\";\n", 8, textures[sides[i].midtexture]->name); if (sides[i].repeatcnt != 0) fprintf(f, "repeatcnt = %d;\n", sides[i].repeatcnt); From a46619684ff5d2c7fd9d19cbeabea4a47e7da582 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 9 Jan 2022 09:30:15 +0100 Subject: [PATCH 306/377] Disable NiGHTS objectplace, which serves no purpose anymore without writethings --- src/m_cheat.c | 4 ++-- src/m_cheat.h | 2 +- src/p_user.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/m_cheat.c b/src/m_cheat.c index 2b72905d5..8c8e48447 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -1137,7 +1137,7 @@ void OP_ResetObjectplace(void) // // Main meat of objectplace: handling functions // -void OP_NightsObjectplace(player_t *player) +/*void OP_NightsObjectplace(player_t *player) { ticcmd_t *cmd = &player->cmd; mapthing_t *mt; @@ -1290,7 +1290,7 @@ void OP_NightsObjectplace(player_t *player) else P_SpawnMapThing(mt); } -} +}*/ // // OP_ObjectplaceMovement diff --git a/src/m_cheat.h b/src/m_cheat.h index 5caeae59b..2707332d3 100644 --- a/src/m_cheat.h +++ b/src/m_cheat.h @@ -38,7 +38,7 @@ extern UINT32 op_displayflags; boolean OP_FreezeObjectplace(void); void OP_ResetObjectplace(void); -void OP_NightsObjectplace(player_t *player); +//void OP_NightsObjectplace(player_t *player); void OP_ObjectplaceMovement(player_t *player); // diff --git a/src/p_user.c b/src/p_user.c index a24848d51..658b97634 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -7520,8 +7520,8 @@ static void P_NiGHTSMovement(player_t *player) } } - if (objectplacing) - OP_NightsObjectplace(player); + //if (objectplacing) + // OP_NightsObjectplace(player); } // May be used in future for CTF From c1f03e77201d3c07f7c8d121866a6501bb19f1c0 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 9 Jan 2022 10:22:25 +0100 Subject: [PATCH 307/377] P_WriteTextmap: Convert colormaps --- src/p_setup.c | 323 ++++++++++++++++++++++++++++---------------------- 1 file changed, 181 insertions(+), 142 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 32d3e93a4..51ea552a8 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2006,6 +2006,11 @@ static void P_WriteTextmap(void) FILE *f; char *filepath = va(pandf, srb2home, "TEXTMAP"); mtag_t firsttag; + mapthing_t *wmapthings; + vertex_t *wvertexes; + sector_t *wsectors; + line_t *wlines; + side_t *wsides; f = fopen(filepath, "w"); if (!f) @@ -2014,6 +2019,34 @@ static void P_WriteTextmap(void) return; } + wmapthings = Z_Calloc(nummapthings * sizeof(*mapthings), PU_LEVEL, NULL); + wvertexes = Z_Calloc(numvertexes * sizeof(*vertexes), PU_LEVEL, NULL); + wsectors = Z_Calloc(numsectors * sizeof(*sectors), PU_LEVEL, NULL); + wlines = Z_Calloc(numlines * sizeof(*lines), PU_LEVEL, NULL); + wsides = Z_Calloc(numsides * sizeof(*sides), PU_LEVEL, NULL); + + memcpy(wmapthings, mapthings, nummapthings * sizeof(*mapthings)); + memcpy(wvertexes, vertexes, numvertexes * sizeof(*vertexes)); + memcpy(wsectors, sectors, numsectors * sizeof(*sectors)); + memcpy(wlines, lines, numlines * sizeof(*lines)); + memcpy(wsides, sides, numsides * sizeof(*sides)); + + for (i = 0; i < numlines; i++) + { + INT32 s; + + if (wlines[i].special != 606) + continue; + + TAG_ITER_SECTORS(wlines[i].args[0], s) + { + if (wsectors[s].colormap_protected) + continue; + + wsectors[s].extra_colormap = wsides[wlines[i].sidenum[0]].colormap_data; + } + } + fprintf(f, "namespace = \"srb2\";\n"); for (i = 0; i < nummapthings; i++) { @@ -2033,24 +2066,24 @@ static void P_WriteTextmap(void) } fprintf(f, "\";\n"); } - fprintf(f, "x = %d;\n", mapthings[i].x); - fprintf(f, "y = %d;\n", mapthings[i].y); - if (mapthings[i].z != 0) - fprintf(f, "height = %d;\n", mapthings[i].z); - fprintf(f, "angle = %d;\n", mapthings[i].angle); - if (mapthings[i].pitch != 0) - fprintf(f, "pitch = %d;\n", mapthings[i].pitch); - if (mapthings[i].roll != 0) - fprintf(f, "roll = %d;\n", mapthings[i].roll); - if (mapthings[i].type != 0) - fprintf(f, "type = %d;\n", mapthings[i].type); - if (mapthings[i].scale != FRACUNIT) - fprintf(f, "scale = %f;\n", FIXED_TO_FLOAT(mapthings[i].scale)); - if (mapthings[i].options & MTF_OBJECTFLIP) + fprintf(f, "x = %d;\n", wmapthings[i].x); + fprintf(f, "y = %d;\n", wmapthings[i].y); + if (wmapthings[i].z != 0) + fprintf(f, "height = %d;\n", wmapthings[i].z); + fprintf(f, "angle = %d;\n", wmapthings[i].angle); + if (wmapthings[i].pitch != 0) + fprintf(f, "pitch = %d;\n", wmapthings[i].pitch); + if (wmapthings[i].roll != 0) + fprintf(f, "roll = %d;\n", wmapthings[i].roll); + if (wmapthings[i].type != 0) + fprintf(f, "type = %d;\n", wmapthings[i].type); + if (wmapthings[i].scale != FRACUNIT) + fprintf(f, "scale = %f;\n", FIXED_TO_FLOAT(wmapthings[i].scale)); + if (wmapthings[i].options & MTF_OBJECTFLIP) fprintf(f, "flip = true;\n"); for (j = 0; j < NUMMAPTHINGARGS; j++) - if (mapthings[i].args[j] != 0) - fprintf(f, "arg%d = %d;\n", j, mapthings[i].args[j]); + if (wmapthings[i].args[j] != 0) + fprintf(f, "arg%d = %d;\n", j, wmapthings[i].args[j]); for (j = 0; j < NUMMAPTHINGSTRINGARGS; j++) if (mapthings[i].stringargs[j]) fprintf(f, "stringarg%d = \"%s\";\n", j, mapthings[i].stringargs[j]); @@ -2062,12 +2095,12 @@ static void P_WriteTextmap(void) { fprintf(f, "vertex // %d\n", i); fprintf(f, "{\n"); - fprintf(f, "x = %f;\n", FIXED_TO_FLOAT(vertexes[i].x)); - fprintf(f, "y = %f;\n", FIXED_TO_FLOAT(vertexes[i].y)); - if (vertexes[i].floorzset) - fprintf(f, "zfloor = %f;\n", FIXED_TO_FLOAT(vertexes[i].floorz)); - if (vertexes[i].ceilingzset) - fprintf(f, "zceiling = %f;\n", FIXED_TO_FLOAT(vertexes[i].ceilingz)); + fprintf(f, "x = %f;\n", FIXED_TO_FLOAT(wvertexes[i].x)); + fprintf(f, "y = %f;\n", FIXED_TO_FLOAT(wvertexes[i].y)); + if (wvertexes[i].floorzset) + fprintf(f, "zfloor = %f;\n", FIXED_TO_FLOAT(wvertexes[i].floorz)); + if (wvertexes[i].ceilingzset) + fprintf(f, "zceiling = %f;\n", FIXED_TO_FLOAT(wvertexes[i].ceilingz)); fprintf(f, "}\n"); fprintf(f, "\n"); } @@ -2076,11 +2109,11 @@ static void P_WriteTextmap(void) { fprintf(f, "linedef // %d\n", i); fprintf(f, "{\n"); - fprintf(f, "v1 = %d;\n", lines[i].v1 - vertexes); - fprintf(f, "v2 = %d;\n", lines[i].v2 - vertexes); - fprintf(f, "sidefront = %d;\n", lines[i].sidenum[0]); - if (lines[i].sidenum[1] != 0xffff) - fprintf(f, "sideback = %d;\n", lines[i].sidenum[1]); + fprintf(f, "v1 = %d;\n", wlines[i].v1 - vertexes); + fprintf(f, "v2 = %d;\n", wlines[i].v2 - vertexes); + fprintf(f, "sidefront = %d;\n", wlines[i].sidenum[0]); + if (wlines[i].sidenum[1] != 0xffff) + fprintf(f, "sideback = %d;\n", wlines[i].sidenum[1]); firsttag = Tag_FGet(&lines[i].tags); if (firsttag != 0) fprintf(f, "id = %d;\n", firsttag); @@ -2095,19 +2128,19 @@ static void P_WriteTextmap(void) } fprintf(f, "\";\n"); } - if (lines[i].special != 0) - fprintf(f, "special = %d;\n", lines[i].special); + if (wlines[i].special != 0) + fprintf(f, "special = %d;\n", wlines[i].special); for (j = 0; j < NUMLINEARGS; j++) - if (lines[i].args[j] != 0) - fprintf(f, "arg%d = %d;\n", j, lines[i].args[j]); + if (wlines[i].args[j] != 0) + fprintf(f, "arg%d = %d;\n", j, wlines[i].args[j]); for (j = 0; j < NUMLINESTRINGARGS; j++) if (lines[i].stringargs[j]) fprintf(f, "stringarg%d = \"%s\";\n", j, lines[i].stringargs[j]); - if (lines[i].alpha != FRACUNIT) - fprintf(f, "alpha = %f;\n", FIXED_TO_FLOAT(lines[i].alpha)); - if (lines[i].blendmode != AST_COPY) + if (wlines[i].alpha != FRACUNIT) + fprintf(f, "alpha = %f;\n", FIXED_TO_FLOAT(wlines[i].alpha)); + if (wlines[i].blendmode != AST_COPY) { - switch (lines[i].blendmode) + switch (wlines[i].blendmode) { case AST_ADD: fprintf(f, "renderstyle = \"add\";\n"); @@ -2128,37 +2161,37 @@ static void P_WriteTextmap(void) break; } } - if (lines[i].executordelay != 0) - fprintf(f, "executordelay = %d;\n", lines[i].executordelay); - if (lines[i].flags & ML_IMPASSIBLE) + if (wlines[i].executordelay != 0) + fprintf(f, "executordelay = %d;\n", wlines[i].executordelay); + if (wlines[i].flags & ML_IMPASSIBLE) fprintf(f, "blocking = true;\n"); - if (lines[i].flags & ML_BLOCKMONSTERS) + if (wlines[i].flags & ML_BLOCKMONSTERS) fprintf(f, "blockmonsters = true;\n"); - if (lines[i].flags & ML_TWOSIDED) + if (wlines[i].flags & ML_TWOSIDED) fprintf(f, "twosided = true;\n"); - if (lines[i].flags & ML_DONTPEGTOP) + if (wlines[i].flags & ML_DONTPEGTOP) fprintf(f, "dontpegtop = true;\n"); - if (lines[i].flags & ML_DONTPEGBOTTOM) + if (wlines[i].flags & ML_DONTPEGBOTTOM) fprintf(f, "dontpegbottom = true;\n"); - if (lines[i].flags & ML_SKEWTD) + if (wlines[i].flags & ML_SKEWTD) fprintf(f, "skewtd = true;\n"); - if (lines[i].flags & ML_NOCLIMB) + if (wlines[i].flags & ML_NOCLIMB) fprintf(f, "noclimb = true;\n"); - if (lines[i].flags & ML_NOSKEW) + if (wlines[i].flags & ML_NOSKEW) fprintf(f, "noskew = true;\n"); - if (lines[i].flags & ML_MIDPEG) + if (wlines[i].flags & ML_MIDPEG) fprintf(f, "midpeg = true;\n"); - if (lines[i].flags & ML_MIDSOLID) + if (wlines[i].flags & ML_MIDSOLID) fprintf(f, "midsolid = true;\n"); - if (lines[i].flags & ML_WRAPMIDTEX) + if (wlines[i].flags & ML_WRAPMIDTEX) fprintf(f, "wrapmidtex = true;\n"); - if (lines[i].flags & ML_NONET) + if (wlines[i].flags & ML_NONET) fprintf(f, "nonet = true;\n"); - if (lines[i].flags & ML_NETONLY) + if (wlines[i].flags & ML_NETONLY) fprintf(f, "netonly = true;\n"); - if (lines[i].flags & ML_BOUNCY) + if (wlines[i].flags & ML_BOUNCY) fprintf(f, "bouncy = true;\n"); - if (lines[i].flags & ML_TFERLINE) + if (wlines[i].flags & ML_TFERLINE) fprintf(f, "transfer = true;\n"); fprintf(f, "}\n"); fprintf(f, "\n"); @@ -2168,19 +2201,19 @@ static void P_WriteTextmap(void) { fprintf(f, "sidedef // %d\n", i); fprintf(f, "{\n"); - fprintf(f, "sector = %d;\n", sides[i].sector - sectors); - if (sides[i].textureoffset != 0) - fprintf(f, "offsetx = %d;\n", sides[i].textureoffset >> FRACBITS); - if (sides[i].rowoffset != 0) - fprintf(f, "offsety = %d;\n", sides[i].rowoffset >> FRACBITS); - if (sides[i].toptexture > 0 && sides[i].toptexture < numtextures) - fprintf(f, "texturetop = \"%.*s\";\n", 8, textures[sides[i].toptexture]->name); - if (sides[i].bottomtexture > 0 && sides[i].bottomtexture < numtextures) - fprintf(f, "texturebottom = \"%.*s\";\n", 8, textures[sides[i].bottomtexture]->name); - if (sides[i].midtexture > 0 && sides[i].midtexture < numtextures) - fprintf(f, "texturemiddle = \"%.*s\";\n", 8, textures[sides[i].midtexture]->name); - if (sides[i].repeatcnt != 0) - fprintf(f, "repeatcnt = %d;\n", sides[i].repeatcnt); + fprintf(f, "sector = %d;\n", wsides[i].sector - sectors); + if (wsides[i].textureoffset != 0) + fprintf(f, "offsetx = %d;\n", wsides[i].textureoffset >> FRACBITS); + if (wsides[i].rowoffset != 0) + fprintf(f, "offsety = %d;\n", wsides[i].rowoffset >> FRACBITS); + if (wsides[i].toptexture > 0 && wsides[i].toptexture < numtextures) + fprintf(f, "texturetop = \"%.*s\";\n", 8, textures[wsides[i].toptexture]->name); + if (wsides[i].bottomtexture > 0 && wsides[i].bottomtexture < numtextures) + fprintf(f, "texturebottom = \"%.*s\";\n", 8, textures[wsides[i].bottomtexture]->name); + if (wsides[i].midtexture > 0 && wsides[i].midtexture < numtextures) + fprintf(f, "texturemiddle = \"%.*s\";\n", 8, textures[wsides[i].midtexture]->name); + if (wsides[i].repeatcnt != 0) + fprintf(f, "repeatcnt = %d;\n", wsides[i].repeatcnt); fprintf(f, "}\n"); fprintf(f, "\n"); } @@ -2189,20 +2222,20 @@ static void P_WriteTextmap(void) { fprintf(f, "sector // %d\n", i); fprintf(f, "{\n"); - fprintf(f, "heightfloor = %d;\n", sectors[i].floorheight >> FRACBITS); - fprintf(f, "heightceiling = %d;\n", sectors[i].ceilingheight >> FRACBITS); - if (sectors[i].floorpic != -1) - fprintf(f, "texturefloor = \"%s\";\n", levelflats[sectors[i].floorpic].name); - if (sectors[i].ceilingpic != -1) - fprintf(f, "textureceiling = \"%s\";\n", levelflats[sectors[i].ceilingpic].name); - fprintf(f, "lightlevel = %d;\n", sectors[i].lightlevel); - if (sectors[i].floorlightlevel != 0) - fprintf(f, "lightfloor = %d;\n", sectors[i].floorlightlevel); - if (sectors[i].floorlightabsolute) + fprintf(f, "heightfloor = %d;\n", wsectors[i].floorheight >> FRACBITS); + fprintf(f, "heightceiling = %d;\n", wsectors[i].ceilingheight >> FRACBITS); + if (wsectors[i].floorpic != -1) + fprintf(f, "texturefloor = \"%s\";\n", levelflats[wsectors[i].floorpic].name); + if (wsectors[i].ceilingpic != -1) + fprintf(f, "textureceiling = \"%s\";\n", levelflats[wsectors[i].ceilingpic].name); + fprintf(f, "lightlevel = %d;\n", wsectors[i].lightlevel); + if (wsectors[i].floorlightlevel != 0) + fprintf(f, "lightfloor = %d;\n", wsectors[i].floorlightlevel); + if (wsectors[i].floorlightabsolute) fprintf(f, "lightfloorabsolute = true;\n"); - if (sectors[i].ceilinglightlevel != 0) - fprintf(f, "lightceiling = %d;\n", sectors[i].ceilinglightlevel); - if (sectors[i].ceilinglightabsolute) + if (wsectors[i].ceilinglightlevel != 0) + fprintf(f, "lightceiling = %d;\n", wsectors[i].ceilinglightlevel); + if (wsectors[i].ceilinglightabsolute) fprintf(f, "lightceilingabsolute = true;\n"); firsttag = Tag_FGet(§ors[i].tags); if (firsttag != 0) @@ -2218,7 +2251,7 @@ static void P_WriteTextmap(void) } fprintf(f, "\";\n"); } - sector_t tempsec = sectors[i]; + sector_t tempsec = wsectors[i]; TextmapUnfixFlatOffsets(&tempsec); if (tempsec.floor_xoffs != 0) fprintf(f, "xpanningfloor = %f;\n", FIXED_TO_FLOAT(tempsec.floor_xoffs)); @@ -2228,39 +2261,39 @@ static void P_WriteTextmap(void) fprintf(f, "xpanningceiling = %f;\n", FIXED_TO_FLOAT(tempsec.ceiling_xoffs)); if (tempsec.ceiling_yoffs != 0) fprintf(f, "ypanningceiling = %f;\n", FIXED_TO_FLOAT(tempsec.ceiling_yoffs)); - if (sectors[i].floorpic_angle != 0) - fprintf(f, "rotationfloor = %f;\n", FIXED_TO_FLOAT(AngleFixed(sectors[i].floorpic_angle))); - if (sectors[i].ceilingpic_angle != 0) - fprintf(f, "rotationceiling = %f;\n", FIXED_TO_FLOAT(AngleFixed(sectors[i].ceilingpic_angle))); + if (wsectors[i].floorpic_angle != 0) + fprintf(f, "rotationfloor = %f;\n", FIXED_TO_FLOAT(AngleFixed(wsectors[i].floorpic_angle))); + if (wsectors[i].ceilingpic_angle != 0) + fprintf(f, "rotationceiling = %f;\n", FIXED_TO_FLOAT(AngleFixed(wsectors[i].ceilingpic_angle))); //TODO: Only if slope was defined via equations - /*if (sectors[i].f_slope) + /*if (wsectors[i].f_slope) { - fixed_t a = sectors[i].f_slope->normal.x; - fixed_t b = sectors[i].f_slope->normal.y; - fixed_t c = sectors[i].f_slope->normal.z; - fixed_t d = -FV3_Dot(§ors[i].f_slope->normal, §ors[i].f_slope->o); + fixed_t a = wsectors[i].f_slope->normal.x; + fixed_t b = wsectors[i].f_slope->normal.y; + fixed_t c = wsectors[i].f_slope->normal.z; + fixed_t d = -FV3_Dot(&wsectors[i].f_slope->normal, &wsectors[i].f_slope->o); fprintf(f, "floorplane_a = %f;\n", FIXED_TO_FLOAT(a)); fprintf(f, "floorplane_b = %f;\n", FIXED_TO_FLOAT(b)); fprintf(f, "floorplane_c = %f;\n", FIXED_TO_FLOAT(c)); fprintf(f, "floorplane_d = %f;\n", FIXED_TO_FLOAT(d)); } - if (sectors[i].c_slope) + if (wsectors[i].c_slope) { - fixed_t a = sectors[i].c_slope->normal.x; - fixed_t b = sectors[i].c_slope->normal.y; - fixed_t c = sectors[i].c_slope->normal.z; - fixed_t d = -FV3_Dot(§ors[i].c_slope->normal, §ors[i].c_slope->o); + fixed_t a = wsectors[i].c_slope->normal.x; + fixed_t b = wsectors[i].c_slope->normal.y; + fixed_t c = wsectors[i].c_slope->normal.z; + fixed_t d = -FV3_Dot(&wsectors[i].c_slope->normal, &wsectors[i].c_slope->o); fprintf(f, "ceilingplane_a = %f;\n", FIXED_TO_FLOAT(a)); fprintf(f, "ceilingplane_b = %f;\n", FIXED_TO_FLOAT(b)); fprintf(f, "ceilingplane_c = %f;\n", FIXED_TO_FLOAT(c)); fprintf(f, "ceilingplane_d = %f;\n", FIXED_TO_FLOAT(d)); }*/ - if (sectors[i].extra_colormap) + if (wsectors[i].extra_colormap) { - INT32 lightcolor = P_RGBAToColor(sectors[i].extra_colormap->rgba); - UINT8 lightalpha = R_GetRgbaA(sectors[i].extra_colormap->rgba); - INT32 fadecolor = P_RGBAToColor(sectors[i].extra_colormap->fadergba); - UINT8 fadealpha = R_GetRgbaA(sectors[i].extra_colormap->fadergba); + INT32 lightcolor = P_RGBAToColor(wsectors[i].extra_colormap->rgba); + UINT8 lightalpha = R_GetRgbaA(wsectors[i].extra_colormap->rgba); + INT32 fadecolor = P_RGBAToColor(wsectors[i].extra_colormap->fadergba); + UINT8 fadealpha = R_GetRgbaA(wsectors[i].extra_colormap->fadergba); if (lightcolor != 0) fprintf(f, "lightcolor = %d;\n", lightcolor); @@ -2270,78 +2303,78 @@ static void P_WriteTextmap(void) fprintf(f, "fadecolor = %d;\n", fadecolor); if (fadealpha != 25) fprintf(f, "fadealpha = %d;\n", fadealpha); - if (sectors[i].extra_colormap->fadestart != 0) - fprintf(f, "fadestart = %d;\n", sectors[i].extra_colormap->fadestart); - if (sectors[i].extra_colormap->fadeend != 31) - fprintf(f, "fadeend = %d;\n", sectors[i].extra_colormap->fadeend); - if (sectors[i].extra_colormap->flags & CMF_FOG) + if (wsectors[i].extra_colormap->fadestart != 0) + fprintf(f, "fadestart = %d;\n", wsectors[i].extra_colormap->fadestart); + if (wsectors[i].extra_colormap->fadeend != 31) + fprintf(f, "fadeend = %d;\n", wsectors[i].extra_colormap->fadeend); + if (wsectors[i].extra_colormap->flags & CMF_FOG) fprintf(f, "colormapfog = true;\n"); - if (sectors[i].extra_colormap->flags & CMF_FADEFULLBRIGHTSPRITES) + if (wsectors[i].extra_colormap->flags & CMF_FADEFULLBRIGHTSPRITES) fprintf(f, "colormapfadesprites = true;\n"); } - if (sectors[i].colormap_protected) + if (wsectors[i].colormap_protected) fprintf(f, "colormapprotected = true;\n"); - if (!(sectors[i].flags & MSF_FLIPSPECIAL_FLOOR)) + if (!(wsectors[i].flags & MSF_FLIPSPECIAL_FLOOR)) fprintf(f, "flipspecial_nofloor = true;\n"); - if (sectors[i].flags & MSF_FLIPSPECIAL_CEILING) + if (wsectors[i].flags & MSF_FLIPSPECIAL_CEILING) fprintf(f, "flipspecial_ceiling = true;\n"); - if (sectors[i].flags & MSF_TRIGGERSPECIAL_TOUCH) + if (wsectors[i].flags & MSF_TRIGGERSPECIAL_TOUCH) fprintf(f, "triggerspecial_touch = true;\n"); - if (sectors[i].flags & MSF_TRIGGERSPECIAL_HEADBUMP) + if (wsectors[i].flags & MSF_TRIGGERSPECIAL_HEADBUMP) fprintf(f, "triggerspecial_headbump = true;\n"); - if (sectors[i].flags & MSF_TRIGGERLINE_PLANE) + if (wsectors[i].flags & MSF_TRIGGERLINE_PLANE) fprintf(f, "triggerline_plane = true;\n"); - if (sectors[i].flags & MSF_TRIGGERLINE_MOBJ) + if (wsectors[i].flags & MSF_TRIGGERLINE_MOBJ) fprintf(f, "triggerline_mobj = true;\n"); - if (sectors[i].flags & MSF_INVERTPRECIP) + if (wsectors[i].flags & MSF_INVERTPRECIP) fprintf(f, "invertprecip = true;\n"); - if (sectors[i].flags & MSF_GRAVITYFLIP) + if (wsectors[i].flags & MSF_GRAVITYFLIP) fprintf(f, "gravityflip = true;\n"); - if (sectors[i].flags & MSF_HEATWAVE) + if (wsectors[i].flags & MSF_HEATWAVE) fprintf(f, "heatwave = true;\n"); - if (sectors[i].flags & MSF_NOCLIPCAMERA) + if (wsectors[i].flags & MSF_NOCLIPCAMERA) fprintf(f, "noclipcamera = true;\n"); - if (sectors[i].specialflags & SSF_OUTERSPACE) + if (wsectors[i].specialflags & SSF_OUTERSPACE) fprintf(f, "outerspace = true;\n"); - if (sectors[i].specialflags & SSF_DOUBLESTEPUP) + if (wsectors[i].specialflags & SSF_DOUBLESTEPUP) fprintf(f, "doublestepup = true;\n"); - if (sectors[i].specialflags & SSF_NOSTEPDOWN) + if (wsectors[i].specialflags & SSF_NOSTEPDOWN) fprintf(f, "nostepdown = true;\n"); - if (sectors[i].specialflags & SSF_SPEEDPAD) + if (wsectors[i].specialflags & SSF_SPEEDPAD) fprintf(f, "speedpad = true;\n"); - if (sectors[i].specialflags & SSF_STARPOSTACTIVATOR) + if (wsectors[i].specialflags & SSF_STARPOSTACTIVATOR) fprintf(f, "starpostactivator = true;\n"); - if (sectors[i].specialflags & SSF_EXIT) + if (wsectors[i].specialflags & SSF_EXIT) fprintf(f, "exit = true;\n"); - if (sectors[i].specialflags & SSF_SPECIALSTAGEPIT) + if (wsectors[i].specialflags & SSF_SPECIALSTAGEPIT) fprintf(f, "specialstagepit = true;\n"); - if (sectors[i].specialflags & SSF_RETURNFLAG) + if (wsectors[i].specialflags & SSF_RETURNFLAG) fprintf(f, "returnflag = true;\n"); - if (sectors[i].specialflags & SSF_REDTEAMBASE) + if (wsectors[i].specialflags & SSF_REDTEAMBASE) fprintf(f, "redteambase = true;\n"); - if (sectors[i].specialflags & SSF_BLUETEAMBASE) + if (wsectors[i].specialflags & SSF_BLUETEAMBASE) fprintf(f, "blueteambase = true;\n"); - if (sectors[i].specialflags & SSF_FAN) + if (wsectors[i].specialflags & SSF_FAN) fprintf(f, "fan = true;\n"); - if (sectors[i].specialflags & SSF_SUPERTRANSFORM) + if (wsectors[i].specialflags & SSF_SUPERTRANSFORM) fprintf(f, "supertransform = true;\n"); - if (sectors[i].specialflags & SSF_FORCESPIN) + if (wsectors[i].specialflags & SSF_FORCESPIN) fprintf(f, "forcespin = true;\n"); - if (sectors[i].specialflags & SSF_ZOOMTUBESTART) + if (wsectors[i].specialflags & SSF_ZOOMTUBESTART) fprintf(f, "zoomtubestart = true;\n"); - if (sectors[i].specialflags & SSF_ZOOMTUBEEND) + if (wsectors[i].specialflags & SSF_ZOOMTUBEEND) fprintf(f, "zoomtubeend = true;\n"); - if (sectors[i].specialflags & SSF_FINISHLINE) + if (wsectors[i].specialflags & SSF_FINISHLINE) fprintf(f, "finishline = true;\n"); - if (sectors[i].specialflags & SSF_ROPEHANG) + if (wsectors[i].specialflags & SSF_ROPEHANG) fprintf(f, "ropehang = true;\n"); - if (sectors[i].friction != ORIG_FRICTION) - fprintf(f, "friction = %f;\n", FIXED_TO_FLOAT(sectors[i].friction)); - if (sectors[i].gravity != FRACUNIT) - fprintf(f, "gravity = %f;\n", FIXED_TO_FLOAT(sectors[i].gravity)); - if (sectors[i].damagetype != SD_NONE) + if (wsectors[i].friction != ORIG_FRICTION) + fprintf(f, "friction = %f;\n", FIXED_TO_FLOAT(wsectors[i].friction)); + if (wsectors[i].gravity != FRACUNIT) + fprintf(f, "gravity = %f;\n", FIXED_TO_FLOAT(wsectors[i].gravity)); + if (wsectors[i].damagetype != SD_NONE) { - switch (sectors[i].damagetype) + switch (wsectors[i].damagetype) { case SD_GENERIC: fprintf(f, "damagetype = \"Generic\";\n"); @@ -2377,15 +2410,21 @@ static void P_WriteTextmap(void) break; } } - if (sectors[i].triggertag != 0) - fprintf(f, "triggertag = %d;\n", sectors[i].triggertag); - if (sectors[i].triggerer != 0) - fprintf(f, "triggerer = %d;\n", sectors[i].triggerer); + if (wsectors[i].triggertag != 0) + fprintf(f, "triggertag = %d;\n", wsectors[i].triggertag); + if (wsectors[i].triggerer != 0) + fprintf(f, "triggerer = %d;\n", wsectors[i].triggerer); fprintf(f, "}\n"); fprintf(f, "\n"); } fclose(f); + + Z_Free(wmapthings); + Z_Free(wvertexes); + Z_Free(wsectors); + Z_Free(wlines); + Z_Free(wsides); } /** Loads the textmap data, after obtaining the elements count and allocating their respective space. From 5f6014223dd5fc30aaeeb3f7394e910c5ab0293a Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 9 Jan 2022 10:38:05 +0100 Subject: [PATCH 308/377] Don't convert global colormaps --- src/p_setup.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 51ea552a8..247741f0f 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2035,15 +2035,25 @@ static void P_WriteTextmap(void) { INT32 s; - if (wlines[i].special != 606) - continue; - - TAG_ITER_SECTORS(wlines[i].args[0], s) + switch (wlines[i].special) { - if (wsectors[s].colormap_protected) - continue; + case 606: + if (wlines[i].args[0] == MTAG_GLOBAL) + { + CONS_Printf("Linedef %d applies a global colormap which cannot be converted automatically. Please convert it manually.\n", i); + break; + } - wsectors[s].extra_colormap = wsides[wlines[i].sidenum[0]].colormap_data; + TAG_ITER_SECTORS(wlines[i].args[0], s) + { + if (wsectors[s].colormap_protected) + continue; + + wsectors[s].extra_colormap = wsides[wlines[i].sidenum[0]].colormap_data; + } + break; + default: + break; } } From 1fbfc9bea9b01425b97517e1937a5cce15ac10b3 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 9 Jan 2022 11:44:53 +0100 Subject: [PATCH 309/377] P_WriteTextmap: Convert custom gravity and custom exit --- src/p_setup.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/p_setup.c b/src/p_setup.c index 247741f0f..0b0345a51 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2037,10 +2037,27 @@ static void P_WriteTextmap(void) switch (wlines[i].special) { + case 1: + TAG_ITER_SECTORS(Tag_FGet(&lines[i].tags), s) + { + CONS_Alert(CONS_WARNING, M_GetText("Linedef %d applies custom gravity to sector %d. Changes to this gravity at runtime will not be reflected in the converted map. Use linedef type 469 for this.\n"), i, s); + wsectors[s].gravity = FixedDiv(lines[i].frontsector->floorheight >> FRACBITS, 1000); + } + break; + case 2: + CONS_Alert(CONS_WARNING, M_GetText("Custom exit linedef %d detected. Changes to the next map at runtime will not be reflected in the converted map. Use linedef type 465 for this.\n"), i); + wlines[i].args[0] = lines[i].frontsector->floorheight >> FRACBITS; + wlines[i].args[2] = lines[i].frontsector->ceilingheight >> FRACBITS; + break; + case 5: + case 50: + case 51: + CONS_Alert(CONS_WARNING, M_GetText("Linedef %d has type %d, which has been removed in UDMF.\n"), i, wlines[i].special); + break; case 606: if (wlines[i].args[0] == MTAG_GLOBAL) { - CONS_Printf("Linedef %d applies a global colormap which cannot be converted automatically. Please convert it manually.\n", i); + CONS_Alert(CONS_WARNING, M_GetText("Linedef %d applies a global colormap which cannot be converted automatically. Please convert it manually.\n"), i); break; } From 7276c6bef5c80e0f6b9254331d13944f5e8b7744 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 9 Jan 2022 12:37:46 +0100 Subject: [PATCH 310/377] P_WriteTextmap: Correctly write linedef executor delays --- src/p_setup.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 0b0345a51..7171ada81 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2045,7 +2045,7 @@ static void P_WriteTextmap(void) } break; case 2: - CONS_Alert(CONS_WARNING, M_GetText("Custom exit linedef %d detected. Changes to the next map at runtime will not be reflected in the converted map. Use linedef type 465 for this.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Custom exit linedef %d detected. Changes to the next map at runtime will not be reflected in the converted map. Use linedef type 468 for this.\n"), i); wlines[i].args[0] = lines[i].frontsector->floorheight >> FRACBITS; wlines[i].args[2] = lines[i].frontsector->ceilingheight >> FRACBITS; break; @@ -2188,8 +2188,11 @@ static void P_WriteTextmap(void) break; } } - if (wlines[i].executordelay != 0) - fprintf(f, "executordelay = %d;\n", wlines[i].executordelay); + if (wlines[i].executordelay != 0 && wlines[i].backsector) + { + CONS_Alert(CONS_WARNING, M_GetText("Linedef %d has an executor delay. Changes to the delay at runtime will not be reflected in the converted map. Use linedef type 465 for this.\n"), i); + fprintf(f, "executordelay = %d;\n", (wlines[i].backsector->ceilingheight >> FRACBITS) + (wlines[i].backsector->floorheight >> FRACBITS)); + } if (wlines[i].flags & ML_IMPASSIBLE) fprintf(f, "blocking = true;\n"); if (wlines[i].flags & ML_BLOCKMONSTERS) From b3ca6845c17fc2656991fd20ee0943530be1fdba Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 9 Jan 2022 12:38:49 +0100 Subject: [PATCH 311/377] P_WriteTextmap: Don't bother with equation slopes because binary maps can't have them anyway --- src/p_setup.c | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 7171ada81..06f101fce 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2295,29 +2295,6 @@ static void P_WriteTextmap(void) fprintf(f, "rotationfloor = %f;\n", FIXED_TO_FLOAT(AngleFixed(wsectors[i].floorpic_angle))); if (wsectors[i].ceilingpic_angle != 0) fprintf(f, "rotationceiling = %f;\n", FIXED_TO_FLOAT(AngleFixed(wsectors[i].ceilingpic_angle))); - //TODO: Only if slope was defined via equations - /*if (wsectors[i].f_slope) - { - fixed_t a = wsectors[i].f_slope->normal.x; - fixed_t b = wsectors[i].f_slope->normal.y; - fixed_t c = wsectors[i].f_slope->normal.z; - fixed_t d = -FV3_Dot(&wsectors[i].f_slope->normal, &wsectors[i].f_slope->o); - fprintf(f, "floorplane_a = %f;\n", FIXED_TO_FLOAT(a)); - fprintf(f, "floorplane_b = %f;\n", FIXED_TO_FLOAT(b)); - fprintf(f, "floorplane_c = %f;\n", FIXED_TO_FLOAT(c)); - fprintf(f, "floorplane_d = %f;\n", FIXED_TO_FLOAT(d)); - } - if (wsectors[i].c_slope) - { - fixed_t a = wsectors[i].c_slope->normal.x; - fixed_t b = wsectors[i].c_slope->normal.y; - fixed_t c = wsectors[i].c_slope->normal.z; - fixed_t d = -FV3_Dot(&wsectors[i].c_slope->normal, &wsectors[i].c_slope->o); - fprintf(f, "ceilingplane_a = %f;\n", FIXED_TO_FLOAT(a)); - fprintf(f, "ceilingplane_b = %f;\n", FIXED_TO_FLOAT(b)); - fprintf(f, "ceilingplane_c = %f;\n", FIXED_TO_FLOAT(c)); - fprintf(f, "ceilingplane_d = %f;\n", FIXED_TO_FLOAT(d)); - }*/ if (wsectors[i].extra_colormap) { INT32 lightcolor = P_RGBAToColor(wsectors[i].extra_colormap->rgba); From ce29d05be8eca83d8409527af2bb1f91c687ef6b Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 9 Jan 2022 12:53:12 +0100 Subject: [PATCH 312/377] Fix typo in wall scroller conversion --- src/p_setup.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 1ecd24471..01daa55f1 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3816,13 +3816,13 @@ static void P_ConvertBinaryMap(void) lines[i].special = 0; break; } - lines[i].args[1] = sides[lines[i].sidenum[1]].rowoffset >> FRACBITS; - lines[i].args[2] = sides[lines[i].sidenum[1]].textureoffset >> FRACBITS; + lines[i].args[1] = sides[lines[i].sidenum[1]].textureoffset >> FRACBITS; + lines[i].args[2] = sides[lines[i].sidenum[1]].rowoffset >> FRACBITS; } else { - lines[i].args[1] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; - lines[i].args[2] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; + lines[i].args[2] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; } lines[i].special = 500; break; From 576ded653776e3c08b67f64cb7351dc0b2ebb2bc Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 10 Jan 2022 20:59:57 +0100 Subject: [PATCH 313/377] Fix incorrectly applied FOF blendmodes --- src/p_spec.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 470595937..ce6bd6c0b 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5629,7 +5629,7 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, I { case TMB_TRANSLUCENT: default: - fflr->blend = AST_TRANSLUCENT; + fflr->blend = AST_COPY; break; case TMB_ADD: fflr->blend = AST_ADD; @@ -6534,12 +6534,12 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 150: // FOF (Air bobbing) - P_AddFakeFloorsByLine(i, 0xff, AST_COPY, FF_EXISTS|FF_SOLID|FF_RENDERALL, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, TMB_TRANSLUCENT, FF_EXISTS|FF_SOLID|FF_RENDERALL, secthinkers); P_AddAirbob(lines[i].frontsector, lines[i].args[0], lines[i].args[1] << FRACBITS, !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); break; case 160: // FOF (Water bobbing) - P_AddFakeFloorsByLine(i, 0xff, AST_COPY, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_FLOATBOB, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, TMB_TRANSLUCENT, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_FLOATBOB, secthinkers); break; case 170: // FOF (Crumbling) @@ -6644,7 +6644,7 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags = FF_EXISTS|FF_CUTSPRITES; if (!lines[i].args[1]) ffloorflags |= FF_DOUBLESHADOW; - P_AddFakeFloorsByLine(i, 0xff, AST_COPY, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, TMB_TRANSLUCENT, ffloorflags, secthinkers); break; case 202: // Fog @@ -6653,7 +6653,7 @@ void P_SpawnSpecials(boolean fromnetsave) // SoM: Because it's fog, check for an extra colormap and set the fog flag... if (sectors[sec].extra_colormap) sectors[sec].extra_colormap->flags = CMF_FOG; - P_AddFakeFloorsByLine(i, 0xff, AST_COPY, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, TMB_TRANSLUCENT, ffloorflags, secthinkers); break; case 220: //Intangible @@ -6687,7 +6687,7 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 223: // FOF (intangible, invisible) - for combining specials in a sector - P_AddFakeFloorsByLine(i, 0xff, AST_COPY, FF_EXISTS|FF_NOSHADE, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, TMB_TRANSLUCENT, FF_EXISTS|FF_NOSHADE, secthinkers); break; case 250: // Mario Block @@ -6697,14 +6697,14 @@ void P_SpawnSpecials(boolean fromnetsave) if (lines[i].args[1] & TMFM_INVISIBLE) ffloorflags &= ~(FF_SOLID|FF_RENDERALL|FF_CUTLEVEL); - P_AddFakeFloorsByLine(i, 0xff, AST_COPY, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, TMB_TRANSLUCENT, ffloorflags, secthinkers); break; case 251: // A THWOMP! { UINT16 sound = (lines[i].stringargs[0]) ? get_number(lines[i].stringargs[0]) : sfx_thwomp; P_AddThwompThinker(lines[i].frontsector, &lines[i], lines[i].args[1] << (FRACBITS - 3), lines[i].args[2] << (FRACBITS - 3), sound); - P_AddFakeFloorsByLine(i, 0xff, AST_COPY, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, TMB_TRANSLUCENT, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); break; } @@ -6763,7 +6763,7 @@ void P_SpawnSpecials(boolean fromnetsave) TAG_ITER_SECTORS(lines[i].args[0], s) { - ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, 0xff, AST_COPY, ffloorflags, secthinkers); + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, 0xff, TMB_TRANSLUCENT, ffloorflags, secthinkers); if (!fflr) continue; fflr->sinkspeed = abs(lines[i].args[2]) << (FRACBITS - 1); @@ -6885,7 +6885,7 @@ void P_SpawnSpecials(boolean fromnetsave) } } - P_AddFakeFloorsByLine(i, dopacity, AST_TRANSLUCENT, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, dopacity, TMB_TRANSLUCENT, ffloorflags, secthinkers); } break; From 3b4fad16dbb42aed5b873ff14600417a0852b284 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 10 Jan 2022 21:23:55 +0100 Subject: [PATCH 314/377] P_WriteTextmap: Convert global colormaps --- src/p_setup.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 41384bc97..4f6c98ab0 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2057,16 +2057,18 @@ static void P_WriteTextmap(void) case 606: if (wlines[i].args[0] == MTAG_GLOBAL) { - CONS_Alert(CONS_WARNING, M_GetText("Linedef %d applies a global colormap which cannot be converted automatically. Please convert it manually.\n"), i); - break; + sector_t *sec = wlines[i].frontsector - sectors + wsectors; + sec->extra_colormap = wsides[wlines[i].sidenum[0]].colormap_data; } - - TAG_ITER_SECTORS(wlines[i].args[0], s) + else { - if (wsectors[s].colormap_protected) - continue; + TAG_ITER_SECTORS(wlines[i].args[0], s) + { + if (wsectors[s].colormap_protected) + continue; - wsectors[s].extra_colormap = wsides[wlines[i].sidenum[0]].colormap_data; + wsectors[s].extra_colormap = wsides[wlines[i].sidenum[0]].colormap_data; + } } break; default: From 0b9876d61bdea36414a332034c3ed2b8ffc6be9f Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 10 Jan 2022 22:10:19 +0100 Subject: [PATCH 315/377] P_WriteTextmap: Clear out colormap linedef special after copying the colormap --- src/p_setup.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/p_setup.c b/src/p_setup.c index 4f6c98ab0..683ba5498 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2069,6 +2069,7 @@ static void P_WriteTextmap(void) wsectors[s].extra_colormap = wsides[wlines[i].sidenum[0]].colormap_data; } + lines[i].special = 0; } break; default: From 666833e64b4e32d72e841bc00aeeb40e1054bb24 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 11 Jan 2022 20:24:07 +0100 Subject: [PATCH 316/377] P_WriteTextmap: Add warnings for deprecated sector specials and reserved tags --- src/p_setup.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/p_setup.c b/src/p_setup.c index 683ba5498..f69789a6a 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2077,6 +2077,41 @@ static void P_WriteTextmap(void) } } + for (i = 0; i < numsectors; i++) + { + if (Tag_Find(§ors[i].tags, LE_CAPSULE0)) + CONS_Alert(CONS_WARNING, M_GetText("Sector %d has reserved tag %d, which has been removed in UDMF. Use arg3 of the boss mapthing instead.\n"), i, LE_CAPSULE0); + if (Tag_Find(§ors[i].tags, LE_CAPSULE1)) + CONS_Alert(CONS_WARNING, M_GetText("Sector %d has reserved tag %d, which has been removed in UDMF. Use arg3 of the boss mapthing instead.\n"), i, LE_CAPSULE1); + if (Tag_Find(§ors[i].tags, LE_CAPSULE2)) + CONS_Alert(CONS_WARNING, M_GetText("Sector %d has reserved tag %d, which has been removed in UDMF. Use arg3 of the boss mapthing instead.\n"), i, LE_CAPSULE2); + + switch (GETSECSPECIAL(wsectors[i].special, 1)) + { + case 9: + case 10: + CONS_Alert(CONS_WARNING, M_GetText("Sector %d has ring drainer effect, which has been removed in UDMF. Use linedef type 462 instead.\n"), i); + break; + default: + break; + } + + switch (GETSECSPECIAL(wsectors[i].special, 2)) + { + case 6: + CONS_Alert(CONS_WARNING, M_GetText("Sector %d has emerald check trigger type, which has been removed in UDMF. Please use linedef types 337-339 instead.\n"), i); + break; + case 7: + CONS_Alert(CONS_WARNING, M_GetText("Sector %d has NiGHTS mare trigger type, which has been removed in UDMF. Please use linedef types 340-342 instead.\n"), i); + break; + case 9: + CONS_Alert(CONS_WARNING, M_GetText("Sector %d has Egg Capsule type, which has been removed in UDMF. Please use linedef type 464 instead.\n"), i); + break; + default: + break; + } + } + fprintf(f, "namespace = \"srb2\";\n"); for (i = 0; i < nummapthings; i++) { From 25fe26badcf1063fc7d50e11b4afaa2dcb0e1657 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 12 Jan 2022 21:36:19 +0100 Subject: [PATCH 317/377] P_WriteTextmap: Add more warnings for unconvertable stuff --- src/p_setup.c | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index f69789a6a..92cf7dc1f 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2052,7 +2052,23 @@ static void P_WriteTextmap(void) case 5: case 50: case 51: - CONS_Alert(CONS_WARNING, M_GetText("Linedef %d has type %d, which has been removed in UDMF.\n"), i, wlines[i].special); + CONS_Alert(CONS_WARNING, M_GetText("Linedef %d has type %d, which is not supported in UDMF.\n"), i, wlines[i].special); + break; + case 259: + if (wlines[i].args[3] & FF_QUICKSAND) + CONS_Alert(CONS_WARNING, M_GetText("Quicksand properties of custom FOF on linedef %d cannot be converted. Use linedef type 75 instead.\n"), i); + if (wlines[i].args[3] & FF_BUSTUP) + CONS_Alert(CONS_WARNING, M_GetText("Bustable properties of custom FOF on linedef %d cannot be converted. Use linedef type 74 instead.\n"), i); + break; + case 447: + CONS_Alert(CONS_WARNING, M_GetText("Linedef %d has change colormap action, which cannot be converted automatically. Tag arg0 to a sector with the desired colormap.\n"), i); + if (wlines[i].flags & ML_TFERLINE) + CONS_Alert(CONS_WARNING, M_GetText("Linedef %d mixes front and back colormaps, which is not supported in UDMF. Copy one colormap to the target sector first, then mix in the second one.\n"), i); + break; + case 455: + CONS_Alert(CONS_WARNING, M_GetText("Linedef %d has fade colormap action, which cannot be converted automatically. Tag arg0 to a sector with the desired colormap.\n"), i); + if (wlines[i].flags & ML_TFERLINE) + CONS_Alert(CONS_WARNING, M_GetText("Linedef %d specifies starting colormap for the fade, which is not supported in UDMF. Change the colormap with linedef type 447 instead.\n"), i); break; case 606: if (wlines[i].args[0] == MTAG_GLOBAL) @@ -2075,22 +2091,25 @@ static void P_WriteTextmap(void) default: break; } + + if (wlines[i].special >= 300 && wlines[i].special < 400 && wlines[i].flags & ML_WRAPMIDTEX) + CONS_Alert(CONS_WARNING, M_GetText("Linedef executor trigger linedef %d has disregard order flag, which is not supported in UDMF.\n"), i); } for (i = 0; i < numsectors; i++) { if (Tag_Find(§ors[i].tags, LE_CAPSULE0)) - CONS_Alert(CONS_WARNING, M_GetText("Sector %d has reserved tag %d, which has been removed in UDMF. Use arg3 of the boss mapthing instead.\n"), i, LE_CAPSULE0); + CONS_Alert(CONS_WARNING, M_GetText("Sector %d has reserved tag %d, which is not supported in UDMF. Use arg3 of the boss mapthing instead.\n"), i, LE_CAPSULE0); if (Tag_Find(§ors[i].tags, LE_CAPSULE1)) - CONS_Alert(CONS_WARNING, M_GetText("Sector %d has reserved tag %d, which has been removed in UDMF. Use arg3 of the boss mapthing instead.\n"), i, LE_CAPSULE1); + CONS_Alert(CONS_WARNING, M_GetText("Sector %d has reserved tag %d, which is not supported in UDMF. Use arg3 of the boss mapthing instead.\n"), i, LE_CAPSULE1); if (Tag_Find(§ors[i].tags, LE_CAPSULE2)) - CONS_Alert(CONS_WARNING, M_GetText("Sector %d has reserved tag %d, which has been removed in UDMF. Use arg3 of the boss mapthing instead.\n"), i, LE_CAPSULE2); + CONS_Alert(CONS_WARNING, M_GetText("Sector %d has reserved tag %d, which is not supported in UDMF. Use arg3 of the boss mapthing instead.\n"), i, LE_CAPSULE2); switch (GETSECSPECIAL(wsectors[i].special, 1)) { case 9: case 10: - CONS_Alert(CONS_WARNING, M_GetText("Sector %d has ring drainer effect, which has been removed in UDMF. Use linedef type 462 instead.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Sector %d has ring drainer effect, which is not supported in UDMF. Use linedef type 462 instead.\n"), i); break; default: break; @@ -2099,13 +2118,13 @@ static void P_WriteTextmap(void) switch (GETSECSPECIAL(wsectors[i].special, 2)) { case 6: - CONS_Alert(CONS_WARNING, M_GetText("Sector %d has emerald check trigger type, which has been removed in UDMF. Please use linedef types 337-339 instead.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Sector %d has emerald check trigger type, which is not supported in UDMF. Use linedef types 337-339 instead.\n"), i); break; case 7: - CONS_Alert(CONS_WARNING, M_GetText("Sector %d has NiGHTS mare trigger type, which has been removed in UDMF. Please use linedef types 340-342 instead.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Sector %d has NiGHTS mare trigger type, which is not supported in UDMF. Use linedef types 340-342 instead.\n"), i); break; case 9: - CONS_Alert(CONS_WARNING, M_GetText("Sector %d has Egg Capsule type, which has been removed in UDMF. Please use linedef type 464 instead.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Sector %d has Egg Capsule type, which is not supported in UDMF. Use linedef type 464 instead.\n"), i); break; default: break; From 1dcee17fa4d74ea069ad45ad51c9c89727595671 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 13 Jan 2022 18:54:18 +0100 Subject: [PATCH 318/377] P_WriteTextmap: Convert linedef type 76 --- src/p_setup.c | 62 ++++++++++++++++++++++++++++++++++++++++----------- src/taglist.c | 13 +++++++++++ src/taglist.h | 2 ++ 3 files changed, 64 insertions(+), 13 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 92cf7dc1f..9fceacb07 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2011,6 +2011,7 @@ static void P_WriteTextmap(void) sector_t *wsectors; line_t *wlines; side_t *wsides; + mtag_t freetag; f = fopen(filepath, "w"); if (!f) @@ -2031,6 +2032,16 @@ static void P_WriteTextmap(void) memcpy(wlines, lines, numlines * sizeof(*lines)); memcpy(wsides, sides, numsides * sizeof(*sides)); + for (i = 0; i < numsectors; i++) + if (sectors[i].tags.count) + wsectors[i].tags.tags = memcpy(Z_Malloc(sectors[i].tags.count*sizeof(mtag_t), PU_LEVEL, NULL), sectors[i].tags.tags, sectors[i].tags.count*sizeof(mtag_t)); + + for (i = 0; i < numlines; i++) + if (lines[i].tags.count) + wlines[i].tags.tags = memcpy(Z_Malloc(lines[i].tags.count * sizeof(mtag_t), PU_LEVEL, NULL), lines[i].tags.tags, lines[i].tags.count * sizeof(mtag_t)); + + freetag = Tag_NextUnused(0); + for (i = 0; i < numlines; i++) { INT32 s; @@ -2038,7 +2049,7 @@ static void P_WriteTextmap(void) switch (wlines[i].special) { case 1: - TAG_ITER_SECTORS(Tag_FGet(&lines[i].tags), s) + TAG_ITER_SECTORS(Tag_FGet(&wlines[i].tags), s) { CONS_Alert(CONS_WARNING, M_GetText("Linedef %d applies custom gravity to sector %d. Changes to this gravity at runtime will not be reflected in the converted map. Use linedef type 469 for this.\n"), i, s); wsectors[s].gravity = FixedDiv(lines[i].frontsector->floorheight >> FRACBITS, 1000); @@ -2054,6 +2065,23 @@ static void P_WriteTextmap(void) case 51: CONS_Alert(CONS_WARNING, M_GetText("Linedef %d has type %d, which is not supported in UDMF.\n"), i, wlines[i].special); break; + case 76: + if (freetag == (mtag_t)MAXTAGS) + { + CONS_Alert(CONS_WARNING, M_GetText("No unused tag found. Linedef %d with type 76 cannot be converted.\n"), i); + break; + } + TAG_ITER_SECTORS(wlines[i].args[0], s) + for (j = 0; (unsigned)j < wsectors[s].linecount; j++) + { + line_t *line = wsectors[s].lines[j] - lines + wlines; + if (line->special < 100 || line->special >= 300) + continue; + Tag_Add(&line->tags, freetag); + } + wlines[i].args[0] = freetag; + freetag = Tag_NextUnused(freetag); + break; case 259: if (wlines[i].args[3] & FF_QUICKSAND) CONS_Alert(CONS_WARNING, M_GetText("Quicksand properties of custom FOF on linedef %d cannot be converted. Use linedef type 75 instead.\n"), i); @@ -2085,7 +2113,7 @@ static void P_WriteTextmap(void) wsectors[s].extra_colormap = wsides[wlines[i].sidenum[0]].colormap_data; } - lines[i].special = 0; + wlines[i].special = 0; } break; default: @@ -2098,11 +2126,11 @@ static void P_WriteTextmap(void) for (i = 0; i < numsectors; i++) { - if (Tag_Find(§ors[i].tags, LE_CAPSULE0)) + if (Tag_Find(&wsectors[i].tags, LE_CAPSULE0)) CONS_Alert(CONS_WARNING, M_GetText("Sector %d has reserved tag %d, which is not supported in UDMF. Use arg3 of the boss mapthing instead.\n"), i, LE_CAPSULE0); - if (Tag_Find(§ors[i].tags, LE_CAPSULE1)) + if (Tag_Find(&wsectors[i].tags, LE_CAPSULE1)) CONS_Alert(CONS_WARNING, M_GetText("Sector %d has reserved tag %d, which is not supported in UDMF. Use arg3 of the boss mapthing instead.\n"), i, LE_CAPSULE1); - if (Tag_Find(§ors[i].tags, LE_CAPSULE2)) + if (Tag_Find(&wsectors[i].tags, LE_CAPSULE2)) CONS_Alert(CONS_WARNING, M_GetText("Sector %d has reserved tag %d, which is not supported in UDMF. Use arg3 of the boss mapthing instead.\n"), i, LE_CAPSULE2); switch (GETSECSPECIAL(wsectors[i].special, 1)) @@ -2198,17 +2226,17 @@ static void P_WriteTextmap(void) fprintf(f, "sidefront = %d;\n", wlines[i].sidenum[0]); if (wlines[i].sidenum[1] != 0xffff) fprintf(f, "sideback = %d;\n", wlines[i].sidenum[1]); - firsttag = Tag_FGet(&lines[i].tags); + firsttag = Tag_FGet(&wlines[i].tags); if (firsttag != 0) fprintf(f, "id = %d;\n", firsttag); - if (lines[i].tags.count > 1) + if (wlines[i].tags.count > 1) { fprintf(f, "moreids = \""); - for (j = 1; j < lines[i].tags.count; j++) + for (j = 1; j < wlines[i].tags.count; j++) { if (j > 1) fprintf(f, " "); - fprintf(f, " %d", lines[i].tags.tags[j]); + fprintf(f, " %d", wlines[i].tags.tags[j]); } fprintf(f, "\";\n"); } @@ -2324,17 +2352,17 @@ static void P_WriteTextmap(void) fprintf(f, "lightceiling = %d;\n", wsectors[i].ceilinglightlevel); if (wsectors[i].ceilinglightabsolute) fprintf(f, "lightceilingabsolute = true;\n"); - firsttag = Tag_FGet(§ors[i].tags); + firsttag = Tag_FGet(&wsectors[i].tags); if (firsttag != 0) fprintf(f, "id = %d;\n", firsttag); - if (sectors[i].tags.count > 1) + if (wsectors[i].tags.count > 1) { fprintf(f, "moreids = \""); - for (j = 1; j < sectors[i].tags.count; j++) + for (j = 1; j < wsectors[i].tags.count; j++) { if (j > 1) fprintf(f, " "); - fprintf(f, "%d", sectors[i].tags.tags[j]); + fprintf(f, "%d", wsectors[i].tags.tags[j]); } fprintf(f, "\";\n"); } @@ -2484,6 +2512,14 @@ static void P_WriteTextmap(void) fclose(f); + for (i = 0; i < numsectors; i++) + if (wsectors[i].tags.count) + Z_Free(wsectors[i].tags.tags); + + for (i = 0; i < numlines; i++) + if (wlines[i].tags.count) + Z_Free(wlines[i].tags.tags); + Z_Free(wmapthings); Z_Free(wvertexes); Z_Free(wsectors); diff --git a/src/taglist.c b/src/taglist.c index a67c7f1c2..82ba25500 100644 --- a/src/taglist.c +++ b/src/taglist.c @@ -455,3 +455,16 @@ void Tag_SectorFSet (const size_t id, const mtag_t tag) Taggroup_Add(tags_sectors, tag, id); Tag_FSet(&sec->tags, tag); } + +mtag_t Tag_NextUnused(mtag_t start) +{ + while ((UINT16)start < MAXTAGS) + { + if (!in_bit_array(tags_available, (UINT16)start)) + return start; + + start++; + } + + return MAXTAGS; +} diff --git a/src/taglist.h b/src/taglist.h index 39f71ad43..7d58ec689 100644 --- a/src/taglist.h +++ b/src/taglist.h @@ -49,6 +49,8 @@ typedef struct extern bitarray_t tags_available[]; +extern mtag_t Tag_NextUnused(mtag_t start); + extern size_t num_tags; extern taggroup_t* tags_sectors[]; From 2d4aabe48ef1092324d6705f554fbb9bf97988a6 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 13 Jan 2022 18:57:41 +0100 Subject: [PATCH 319/377] P_WriteTextmap: Remove superfluous whitespaces in moreids --- src/p_setup.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 9fceacb07..cbe26f176 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2174,7 +2174,7 @@ static void P_WriteTextmap(void) { if (j > 1) fprintf(f, " "); - fprintf(f, " %d", mapthings[i].tags.tags[j]); + fprintf(f, "%d", mapthings[i].tags.tags[j]); } fprintf(f, "\";\n"); } @@ -2236,7 +2236,7 @@ static void P_WriteTextmap(void) { if (j > 1) fprintf(f, " "); - fprintf(f, " %d", wlines[i].tags.tags[j]); + fprintf(f, "%d", wlines[i].tags.tags[j]); } fprintf(f, "\";\n"); } From b8524fc74128d9f834a9efaa3011d52788cc8417 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 13 Jan 2022 21:59:00 +0100 Subject: [PATCH 320/377] P_WriteTextmap: Convert linedef executors that rely on mapthings --- src/p_setup.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 99 insertions(+), 4 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index cbe26f176..c1e557cc9 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2000,6 +2000,13 @@ static INT32 P_RGBAToColor(INT32 rgba) return (r << 16) | (g << 8) | b; } +typedef struct +{ + mapthing_t *teleport; + mapthing_t *altview; + mapthing_t *angleanchor; +} sectorspecialthings_t; + static void P_WriteTextmap(void) { size_t i, j; @@ -2012,6 +2019,7 @@ static void P_WriteTextmap(void) line_t *wlines; side_t *wsides; mtag_t freetag; + sectorspecialthings_t *specialthings; f = fopen(filepath, "w"); if (!f) @@ -2025,6 +2033,7 @@ static void P_WriteTextmap(void) wsectors = Z_Calloc(numsectors * sizeof(*sectors), PU_LEVEL, NULL); wlines = Z_Calloc(numlines * sizeof(*lines), PU_LEVEL, NULL); wsides = Z_Calloc(numsides * sizeof(*sides), PU_LEVEL, NULL); + specialthings = Z_Calloc(numsectors * sizeof(*sectors), PU_LEVEL, NULL); memcpy(wmapthings, mapthings, nummapthings * sizeof(*mapthings)); memcpy(wvertexes, vertexes, numvertexes * sizeof(*vertexes)); @@ -2032,6 +2041,10 @@ static void P_WriteTextmap(void) memcpy(wlines, lines, numlines * sizeof(*lines)); memcpy(wsides, sides, numsides * sizeof(*sides)); + for (i = 0; i < nummapthings; i++) + if (mapthings[i].tags.count) + wmapthings[i].tags.tags = memcpy(Z_Malloc(mapthings[i].tags.count * sizeof(mtag_t), PU_LEVEL, NULL), mapthings[i].tags.tags, mapthings[i].tags.count * sizeof(mtag_t)); + for (i = 0; i < numsectors; i++) if (sectors[i].tags.count) wsectors[i].tags.tags = memcpy(Z_Malloc(sectors[i].tags.count*sizeof(mtag_t), PU_LEVEL, NULL), sectors[i].tags.tags, sectors[i].tags.count*sizeof(mtag_t)); @@ -2042,6 +2055,40 @@ static void P_WriteTextmap(void) freetag = Tag_NextUnused(0); + for (i = 0; i < nummapthings; i++) + { + subsector_t *ss; + INT32 s; + + if (wmapthings[i].type != 751 && wmapthings[i].type != 752 && wmapthings[i].type != 758) + continue; + + ss = R_PointInSubsector(wmapthings[i].x << FRACBITS, wmapthings[i].y << FRACBITS); + + if (!ss) + continue; + + s = ss->sector - sectors; + + switch (wmapthings[i].type) + { + case 751: + if (!specialthings[s].teleport) + specialthings[s].teleport = &wmapthings[i]; + break; + case 752: + if (!specialthings[s].altview) + specialthings[s].altview = &wmapthings[i]; + break; + case 758: + if (!specialthings[s].angleanchor) + specialthings[s].angleanchor = &wmapthings[i]; + break; + default: + break; + } + } + for (i = 0; i < numlines; i++) { INT32 s; @@ -2088,6 +2135,35 @@ static void P_WriteTextmap(void) if (wlines[i].args[3] & FF_BUSTUP) CONS_Alert(CONS_WARNING, M_GetText("Bustable properties of custom FOF on linedef %d cannot be converted. Use linedef type 74 instead.\n"), i); break; + case 412: + if ((s = Tag_Iterate_Sectors(wlines[i].args[0], 0)) < 0) + break; + if (!specialthings[s].teleport) + break; + if (freetag == (mtag_t)MAXTAGS) + { + CONS_Alert(CONS_WARNING, M_GetText("No unused tag found. Linedef %d with type 412 cannot be converted.\n"), i); + break; + } + Tag_Add(&specialthings[s].teleport->tags, freetag); + wlines[i].args[0] = freetag; + freetag = Tag_NextUnused(freetag); + break; + case 422: + if ((s = Tag_Iterate_Sectors(wlines[i].args[0], 0)) < 0) + break; + if (!specialthings[s].altview) + break; + if (freetag == (mtag_t)MAXTAGS) + { + CONS_Alert(CONS_WARNING, M_GetText("No unused tag found. Linedef %d with type 422 cannot be converted.\n"), i); + break; + } + Tag_Add(&specialthings[s].altview->tags, freetag); + wlines[i].args[0] = freetag; + specialthings[s].altview->pitch = wlines[i].args[2]; + freetag = Tag_NextUnused(freetag); + break; case 447: CONS_Alert(CONS_WARNING, M_GetText("Linedef %d has change colormap action, which cannot be converted automatically. Tag arg0 to a sector with the desired colormap.\n"), i); if (wlines[i].flags & ML_TFERLINE) @@ -2098,6 +2174,20 @@ static void P_WriteTextmap(void) if (wlines[i].flags & ML_TFERLINE) CONS_Alert(CONS_WARNING, M_GetText("Linedef %d specifies starting colormap for the fade, which is not supported in UDMF. Change the colormap with linedef type 447 instead.\n"), i); break; + case 457: + if ((s = Tag_Iterate_Sectors(wlines[i].args[0], 0)) < 0) + break; + if (!specialthings[s].angleanchor) + break; + if (freetag == (mtag_t)MAXTAGS) + { + CONS_Alert(CONS_WARNING, M_GetText("No unused tag found. Linedef %d with type 457 cannot be converted.\n"), i); + break; + } + Tag_Add(&specialthings[s].angleanchor->tags, freetag); + wlines[i].args[0] = freetag; + freetag = Tag_NextUnused(freetag); + break; case 606: if (wlines[i].args[0] == MTAG_GLOBAL) { @@ -2164,17 +2254,17 @@ static void P_WriteTextmap(void) { fprintf(f, "thing // %d\n", i); fprintf(f, "{\n"); - firsttag = Tag_FGet(&mapthings[i].tags); + firsttag = Tag_FGet(&wmapthings[i].tags); if (firsttag != 0) fprintf(f, "id = %d;\n", firsttag); - if (mapthings[i].tags.count > 1) + if (wmapthings[i].tags.count > 1) { fprintf(f, "moreids = \""); - for (j = 1; j < mapthings[i].tags.count; j++) + for (j = 1; j < wmapthings[i].tags.count; j++) { if (j > 1) fprintf(f, " "); - fprintf(f, "%d", mapthings[i].tags.tags[j]); + fprintf(f, "%d", wmapthings[i].tags.tags[j]); } fprintf(f, "\";\n"); } @@ -2512,6 +2602,10 @@ static void P_WriteTextmap(void) fclose(f); + for (i = 0; i < nummapthings; i++) + if (wmapthings[i].tags.count) + Z_Free(wmapthings[i].tags.tags); + for (i = 0; i < numsectors; i++) if (wsectors[i].tags.count) Z_Free(wsectors[i].tags.tags); @@ -2525,6 +2619,7 @@ static void P_WriteTextmap(void) Z_Free(wsectors); Z_Free(wlines); Z_Free(wsides); + Z_Free(specialthings); } /** Loads the textmap data, after obtaining the elements count and allocating their respective space. From 1fdfb6ba6e84a5b8943282aede4d0cb0ff813451 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 13 Jan 2022 22:14:41 +0100 Subject: [PATCH 321/377] P_WriteTextmap: Add warning for linedef type 61 --- src/p_setup.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/p_setup.c b/src/p_setup.c index c1e557cc9..7f4c63cad 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2112,6 +2112,13 @@ static void P_WriteTextmap(void) case 51: CONS_Alert(CONS_WARNING, M_GetText("Linedef %d has type %d, which is not supported in UDMF.\n"), i, wlines[i].special); break; + case 61: + if (wlines[i].flags & ML_MIDSOLID) + continue; + if (!wlines[i].args[1]) + continue; + CONS_Alert(CONS_WARNING, M_GetText("Linedef %d with crusher type 61 rises twice as fast on spawn. This behavior is not supported in UDMF.\n"), i); + break; case 76: if (freetag == (mtag_t)MAXTAGS) { From 7c0687bc33970319667bebc1d38eed2aceb995dc Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 13 Jan 2022 23:02:38 +0100 Subject: [PATCH 322/377] P_WriteTextmap: Copy colormap only to first tagged sector and do the rest via the linedef --- src/p_setup.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/p_setup.c b/src/p_setup.c index 7f4c63cad..55268fa54 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2209,8 +2209,16 @@ static void P_WriteTextmap(void) continue; wsectors[s].extra_colormap = wsides[wlines[i].sidenum[0]].colormap_data; + if (freetag == (mtag_t)MAXTAGS) + { + CONS_Alert(CONS_WARNING, M_GetText("No unused tag found. Linedef %d with type 606 cannot be converted.\n"), i); + break; + } + Tag_Add(&wsectors[s].tags, freetag); + wlines[i].args[1] = freetag; + freetag = Tag_NextUnused(freetag); + break; } - wlines[i].special = 0; } break; default: From 37bb9d9c1157c255946ebe1e015534994303a8fd Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Thu, 13 Jan 2022 23:11:10 +0100 Subject: [PATCH 323/377] Fix oversight with rising FOFs --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index ce6bd6c0b..b6ae43025 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6637,7 +6637,7 @@ void P_SpawnSpecials(boolean fromnetsave) } P_AddFakeFloorsByLine(i, lines[i].args[1], lines[i].args[2], ffloorflags, secthinkers); - P_AddRaiseThinker(lines[i].frontsector, lines[i].args[0], lines[i].args[4] << FRACBITS, ceilingtop, ceilingbottom, !!(lines[i].args[5] & TMFR_REVERSE), !!(lines[i].args[5] & TMFR_SPINDASH)); + P_AddRaiseThinker(lines[i].frontsector, lines[i].args[0], lines[i].args[5] << FRACBITS, ceilingtop, ceilingbottom, !!(lines[i].args[6] & TMFR_REVERSE), !!(lines[i].args[6] & TMFR_SPINDASH)); break; } case 200: // Light block From 323cfaace966168473fdfe17859bb3249440576c Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 14 Jan 2022 19:40:45 +0100 Subject: [PATCH 324/377] Add blendmode support to FOFs --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 62 ++++- extras/conf/udb/Includes/SRB222_misc.cfg | 64 +++++ src/doomdata.h | 2 +- src/p_setup.c | 201 +++++++-------- src/p_spec.c | 252 ++++++++++--------- src/p_spec.h | 9 + src/r_defs.h | 2 +- 7 files changed, 360 insertions(+), 232 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index be0f3f0f3..e431de70c 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -1910,6 +1910,12 @@ udmf default = 255; } arg2 + { + title = "Blending mode"; + type = 11; + enum = "blendmodes"; + } + arg3 { title = "Appearance"; type = 12; @@ -1923,7 +1929,7 @@ udmf 32 = "Cut cyan flat pixels"; } } - arg3 + arg4 { title = "Tangibility"; type = 12; @@ -1946,6 +1952,12 @@ udmf default = 128; } arg2 + { + title = "Blending mode"; + type = 11; + enum = "blendmodes"; + } + arg3 { title = "Flags"; type = 12; @@ -2013,12 +2025,18 @@ udmf default = 255; } arg2 + { + title = "Blending mode"; + type = 11; + enum = "blendmodes"; + } + arg3 { title = "Tangibility"; type = 12; enum = "tangibility"; } - arg3 + arg4 { title = "Flags"; type = 12; @@ -2048,6 +2066,12 @@ udmf default = 255; } arg2 + { + title = "Blending mode"; + type = 11; + enum = "blendmodes"; + } + arg3 { title = "Appearance"; type = 12; @@ -2061,17 +2085,17 @@ udmf 32 = "Cut cyan flat pixels"; } } - arg3 + arg4 { title = "Tangibility"; type = 12; enum = "tangibility"; } - arg4 + arg5 { title = "Speed"; } - arg5 + arg6 { title = "Flags"; type = 12; @@ -2126,6 +2150,12 @@ udmf default = 255; } arg2 + { + title = "Blending mode"; + type = 11; + enum = "blendmodes"; + } + arg3 { title = "Appearance"; type = 12; @@ -2212,6 +2242,12 @@ udmf default = 255; } arg2 + { + title = "Blending mode"; + type = 11; + enum = "blendmodes"; + } + arg3 { title = "Bustable type"; type = 11; @@ -2223,7 +2259,7 @@ udmf 3 = "Strong"; } } - arg3 + arg4 { title = "Flags"; type = 12; @@ -2235,7 +2271,7 @@ udmf 8 = "Cut cyan flat pixels"; } } - arg4 + arg5 { title = "Linedef executor tag"; type = 15; @@ -2282,6 +2318,12 @@ udmf default = 128; } arg2 + { + title = "Blending mode"; + type = 11; + enum = "blendmodes"; + } + arg3 { title = "Flags"; type = 12; @@ -2308,6 +2350,12 @@ udmf default = 255; } arg2 + { + title = "Blending mode"; + type = 11; + enum = "blendmodes"; + } + arg3 { title = "Flags"; type = 12; diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 50c83e456..7fecf65f7 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -236,6 +236,26 @@ universalfields type = 0; default = 0; } + arg6 + { + type = 0; + default = 0; + } + arg7 + { + type = 0; + default = 0; + } + arg8 + { + type = 0; + default = 0; + } + arg9 + { + type = 0; + default = 0; + } stringarg0 { type = 2; @@ -264,6 +284,41 @@ universalfields thing { + arg5 + { + type = 0; + default = 0; + } + arg6 + { + type = 0; + default = 0; + } + arg7 + { + type = 0; + default = 0; + } + arg8 + { + type = 0; + default = 0; + } + arg9 + { + type = 0; + default = 0; + } + stringarg0 + { + type = 2; + default = ""; + } + stringarg1 + { + type = 2; + default = ""; + } } } @@ -448,6 +503,15 @@ enums 4 = "Don't block players"; 8 = "Don't block non-players"; } + + blendmodes + { + 0 = "Translucent"; + 1 = "Add"; + 2 = "Subtract"; + 3 = "Reverse subtract"; + 4 = "Modulate"; + } } //Default things filters diff --git a/src/doomdata.h b/src/doomdata.h index e317fec1b..630e18615 100644 --- a/src/doomdata.h +++ b/src/doomdata.h @@ -196,7 +196,7 @@ typedef struct #pragma pack() #endif -#define NUMMAPTHINGARGS 6 +#define NUMMAPTHINGARGS 10 #define NUMMAPTHINGSTRINGARGS 2 // Thing definition, position, orientation and type, diff --git a/src/p_setup.c b/src/p_setup.c index 694f15ef7..10bc1dfd3 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3117,6 +3117,24 @@ static void P_AddBinaryMapTags(void) } } +static void P_SetBinaryFOFAlpha(line_t *line) +{ + if (sides[line->sidenum[0]].toptexture > 0) + { + line->args[1] = sides[line->sidenum[0]].toptexture; + if (sides[line->sidenum[0]].toptexture >= 1001) + { + line->args[2] = (sides[line->sidenum[0]].toptexture/1000); + line->args[1] %= 1000; + } + } + else + { + line->args[1] = 128; + line->args[2] = TMB_TRANSLUCENT; + } +} + //For maps in binary format, converts setup of specials to UDMF format. static void P_ConvertBinaryMap(void) { @@ -3195,36 +3213,33 @@ static void P_ConvertBinaryMap(void) if (lines[i].special == 102) { if (lines[i].flags & ML_NOCLIMB) - lines[i].args[2] |= TMFA_INSIDES; - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; - else - lines[i].args[1] = 128; + lines[i].args[3] |= TMFA_INSIDES; + P_SetBinaryFOFAlpha(&lines[i]); //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].args[1] == 256) - lines[i].args[2] |= TMFA_SPLAT; + lines[i].args[3] |= TMFA_SPLAT; } else lines[i].args[1] = 255; //Appearance if (lines[i].special == 105) - lines[i].args[2] |= TMFA_NOPLANES|TMFA_NOSIDES; + lines[i].args[3] |= TMFA_NOPLANES|TMFA_NOSIDES; else if (lines[i].special == 104) - lines[i].args[2] |= TMFA_NOSIDES; + lines[i].args[3] |= TMFA_NOSIDES; else if (lines[i].special == 103) - lines[i].args[2] |= TMFA_NOPLANES; + lines[i].args[3] |= TMFA_NOPLANES; if (lines[i].special != 100 && (lines[i].special != 104 || !(lines[i].flags & ML_NOCLIMB))) - lines[i].args[2] |= TMFA_NOSHADE; + lines[i].args[3] |= TMFA_NOSHADE; if (lines[i].flags & ML_EFFECT6) - lines[i].args[2] |= TMFA_SPLAT; + lines[i].args[3] |= TMFA_SPLAT; //Tangibility if (lines[i].flags & ML_EFFECT1) - lines[i].args[3] |= TMFT_DONTBLOCKOTHERS; + lines[i].args[4] |= TMFT_DONTBLOCKOTHERS; if (lines[i].flags & ML_EFFECT2) - lines[i].args[3] |= TMFT_DONTBLOCKPLAYER; + lines[i].args[4] |= TMFT_DONTBLOCKPLAYER; lines[i].special = 100; break; @@ -3241,35 +3256,32 @@ static void P_ConvertBinaryMap(void) lines[i].args[1] = 255; else { - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; - else - lines[i].args[1] = 128; + P_SetBinaryFOFAlpha(&lines[i]); //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].args[1] == 256) - lines[i].args[2] |= TMFW_SPLAT; + lines[i].args[3] |= TMFW_SPLAT; } //No sides? if (lines[i].special == 122 || lines[i].special == 123 || lines[i].special == 125) - lines[i].args[2] |= TMFW_NOSIDES; + lines[i].args[3] |= TMFW_NOSIDES; //Flags if (lines[i].flags & ML_NOCLIMB) - lines[i].args[2] |= TMFW_DOUBLESHADOW; + lines[i].args[3] |= TMFW_DOUBLESHADOW; if (lines[i].flags & ML_EFFECT4) - lines[i].args[2] |= TMFW_COLORMAPONLY; + lines[i].args[3] |= TMFW_COLORMAPONLY; if (!(lines[i].flags & ML_EFFECT5)) - lines[i].args[2] |= TMFW_NORIPPLE; + lines[i].args[3] |= TMFW_NORIPPLE; //Goo? if (lines[i].special >= 124) - lines[i].args[2] |= TMFW_GOOWATER; + lines[i].args[3] |= TMFW_GOOWATER; //Splat rendering? if (lines[i].flags & ML_EFFECT6) - lines[i].args[2] |= TMFW_SPLAT; + lines[i].args[3] |= TMFW_SPLAT; lines[i].special = 120; break; @@ -3286,41 +3298,38 @@ static void P_ConvertBinaryMap(void) if (lines[i].special == 141 || lines[i].special == 142 || lines[i].special == 144 || lines[i].special == 145) { if (lines[i].flags & ML_NOCLIMB) - lines[i].args[2] |= TMFA_INSIDES; - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; - else - lines[i].args[1] = 128; + lines[i].args[3] |= TMFA_INSIDES; + P_SetBinaryFOFAlpha(&lines[i]); //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].args[1] == 256) - lines[i].args[2] |= TMFA_SPLAT; + lines[i].args[3] |= TMFA_SPLAT; } else lines[i].args[1] = 255; //Appearance if (lines[i].special == 142 || lines[i].special == 145) - lines[i].args[2] |= TMFA_NOSIDES; + lines[i].args[3] |= TMFA_NOSIDES; else if (lines[i].special == 146) - lines[i].args[2] |= TMFA_NOPLANES; + lines[i].args[3] |= TMFA_NOPLANES; if (lines[i].special != 146 && (lines[i].flags & ML_NOCLIMB)) - lines[i].args[2] |= TMFA_NOSHADE; + lines[i].args[3] |= TMFA_NOSHADE; if (lines[i].flags & ML_EFFECT6) - lines[i].args[2] |= TMFA_SPLAT; + lines[i].args[3] |= TMFA_SPLAT; //Tangibility if (lines[i].special <= 142) - lines[i].args[3] |= TMFT_INTANGIBLEBOTTOM; + lines[i].args[4] |= TMFT_INTANGIBLEBOTTOM; else if (lines[i].special <= 145) - lines[i].args[3] |= TMFT_INTANGIBLETOP; + lines[i].args[4] |= TMFT_INTANGIBLETOP; else - lines[i].args[3] |= TMFT_INTANGIBLEBOTTOM|TMFT_INTANGIBLETOP; + lines[i].args[4] |= TMFT_INTANGIBLEBOTTOM|TMFT_INTANGIBLETOP; if (lines[i].flags & ML_EFFECT1) - lines[i].args[3] |= TMFT_DONTBLOCKOTHERS; + lines[i].args[4] |= TMFT_DONTBLOCKOTHERS; if (lines[i].flags & ML_EFFECT2) - lines[i].args[3] |= TMFT_DONTBLOCKPLAYER; + lines[i].args[4] |= TMFT_DONTBLOCKPLAYER; lines[i].special = 100; break; @@ -3360,38 +3369,35 @@ static void P_ConvertBinaryMap(void) //Alpha if (lines[i].special >= 174 && lines[i].special <= 175) { - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; - else - lines[i].args[1] = 128; + P_SetBinaryFOFAlpha(&lines[i]); //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].args[1] == 256) - lines[i].args[3] |= TMFC_SPLAT; + lines[i].args[4] |= TMFC_SPLAT; } else lines[i].args[1] = 255; if (lines[i].special >= 172 && lines[i].special <= 175) { - lines[i].args[2] |= TMFT_INTANGIBLEBOTTOM; + lines[i].args[3] |= TMFT_INTANGIBLEBOTTOM; if (lines[i].flags & ML_NOCLIMB) - lines[i].args[3] |= TMFC_NOSHADE; + lines[i].args[4] |= TMFC_NOSHADE; } if (lines[i].special % 2 == 1) - lines[i].args[3] |= TMFC_NORETURN; + lines[i].args[4] |= TMFC_NORETURN; if (lines[i].special == 176 || lines[i].special == 177 || lines[i].special == 180) - lines[i].args[3] |= TMFC_AIRBOB; + lines[i].args[4] |= TMFC_AIRBOB; if (lines[i].special >= 176 && lines[i].special <= 179) - lines[i].args[3] |= TMFC_FLOATBOB; + lines[i].args[4] |= TMFC_FLOATBOB; if (lines[i].flags & ML_EFFECT6) - lines[i].args[3] |= TMFC_SPLAT; + lines[i].args[4] |= TMFC_SPLAT; if (lines[i].flags & ML_EFFECT1) - lines[i].args[2] |= TMFT_DONTBLOCKOTHERS; + lines[i].args[3] |= TMFT_DONTBLOCKOTHERS; if (lines[i].flags & ML_EFFECT2) - lines[i].args[2] |= TMFT_DONTBLOCKPLAYER; + lines[i].args[3] |= TMFT_DONTBLOCKPLAYER; lines[i].special = 170; break; @@ -3406,44 +3412,41 @@ static void P_ConvertBinaryMap(void) //Translucency if (lines[i].special == 192 || lines[i].special == 195) { - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; - else - lines[i].args[1] = 128; + P_SetBinaryFOFAlpha(&lines[i]); //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].args[1] == 256) - lines[i].args[2] |= TMFA_SPLAT; + lines[i].args[3] |= TMFA_SPLAT; } else lines[i].args[1] = 255; //Appearance if (lines[i].special == 193) - lines[i].args[2] |= TMFA_NOPLANES|TMFA_NOSIDES; + lines[i].args[3] |= TMFA_NOPLANES|TMFA_NOSIDES; if (lines[i].special >= 194) - lines[i].args[2] |= TMFA_INSIDES; + lines[i].args[3] |= TMFA_INSIDES; if (lines[i].special != 190 && (lines[i].special <= 193 || lines[i].flags & ML_NOCLIMB)) - lines[i].args[2] |= TMFA_NOSHADE; + lines[i].args[3] |= TMFA_NOSHADE; if (lines[i].flags & ML_EFFECT6) - lines[i].args[2] |= TMFA_SPLAT; + lines[i].args[3] |= TMFA_SPLAT; //Tangibility if (lines[i].flags & ML_EFFECT1) - lines[i].args[3] |= TMFT_DONTBLOCKOTHERS; + lines[i].args[4] |= TMFT_DONTBLOCKOTHERS; if (lines[i].flags & ML_EFFECT2) - lines[i].args[3] |= TMFT_DONTBLOCKPLAYER; + lines[i].args[4] |= TMFT_DONTBLOCKPLAYER; if (lines[i].special >= 194) - lines[i].args[3] |= TMFT_INTANGIBLEBOTTOM; + lines[i].args[4] |= TMFT_INTANGIBLEBOTTOM; //Speed - lines[i].args[4] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + lines[i].args[5] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; //Flags if (lines[i].flags & ML_BLOCKMONSTERS) - lines[i].args[5] |= TMFR_REVERSE; + lines[i].args[6] |= TMFR_REVERSE; if (lines[i].flags & ML_BLOCKMONSTERS) - lines[i].args[5] |= TMFR_SPINDASH; + lines[i].args[6] |= TMFR_SPINDASH; lines[i].special = 190; break; @@ -3466,27 +3469,24 @@ static void P_ConvertBinaryMap(void) //Alpha if (lines[i].special == 221) { - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; - else - lines[i].args[1] = 128; + P_SetBinaryFOFAlpha(&lines[i]); //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].args[1] == 256) - lines[i].args[2] |= TMFA_SPLAT; + lines[i].args[3] |= TMFA_SPLAT; } else lines[i].args[1] = 255; //Appearance if (lines[i].special == 222) - lines[i].args[2] |= TMFA_NOPLANES; + lines[i].args[3] |= TMFA_NOPLANES; if (lines[i].special == 221) - lines[i].args[2] |= TMFA_INSIDES; + lines[i].args[3] |= TMFA_INSIDES; if (lines[i].special != 220 && !(lines[i].flags & ML_NOCLIMB)) - lines[i].args[2] |= TMFA_NOSHADE; + lines[i].args[3] |= TMFA_NOSHADE; if (lines[i].flags & ML_EFFECT6) - lines[i].args[2] |= TMFA_SPLAT; + lines[i].args[3] |= TMFA_SPLAT; lines[i].special = 220; break; @@ -3527,40 +3527,37 @@ static void P_ConvertBinaryMap(void) //Alpha if (lines[i].special == 253 || lines[i].special == 256) { - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; - else - lines[i].args[1] = 128; + P_SetBinaryFOFAlpha(&lines[i]); //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].args[1] == 256) - lines[i].args[3] |= TMFB_SPLAT; + lines[i].args[4] |= TMFB_SPLAT; } else lines[i].args[1] = 255; //Bustable type if (lines[i].special <= 253) - lines[i].args[2] = TMFB_TOUCH; + lines[i].args[3] = TMFB_TOUCH; else if (lines[i].special >= 255) - lines[i].args[2] = TMFB_SPIN; + lines[i].args[3] = TMFB_SPIN; else if (lines[i].flags & ML_NOCLIMB) - lines[i].args[2] = TMFB_STRONG; + lines[i].args[3] = TMFB_STRONG; else - lines[i].args[2] = TMFB_REGULAR; + lines[i].args[3] = TMFB_REGULAR; //Flags if (lines[i].flags & ML_EFFECT4) - lines[i].args[3] |= TMFB_PUSHABLES; + lines[i].args[4] |= TMFB_PUSHABLES; if (lines[i].flags & ML_EFFECT5) { - lines[i].args[3] |= TMFB_EXECUTOR; - lines[i].args[4] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + lines[i].args[4] |= TMFB_EXECUTOR; + lines[i].args[5] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; } if (lines[i].special == 252 && lines[i].flags & ML_NOCLIMB) - lines[i].args[3] |= TMFB_ONLYBOTTOM; + lines[i].args[4] |= TMFB_ONLYBOTTOM; if (lines[i].flags & ML_EFFECT6) - lines[i].args[3] |= TMFB_SPLAT; + lines[i].args[4] |= TMFB_SPLAT; lines[i].special = 254; break; @@ -3575,17 +3572,14 @@ static void P_ConvertBinaryMap(void) lines[i].args[0] = tag; //Alpha - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; - else - lines[i].args[1] = 128; + P_SetBinaryFOFAlpha(&lines[i]); //Flags if (lines[i].flags & ML_EFFECT1) - lines[i].args[2] |= TMFL_NOBOSSES; + lines[i].args[3] |= TMFL_NOBOSSES; //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].flags & ML_EFFECT6 || lines[i].args[1] == 256) - lines[i].args[2] |= TMFL_SPLAT; + lines[i].args[3] |= TMFL_SPLAT; break; case 259: //Custom FOF @@ -3593,20 +3587,17 @@ static void P_ConvertBinaryMap(void) I_Error("Custom FOF (tag %d) found without a linedef back side!", tag); lines[i].args[0] = tag; - lines[i].args[2] = sides[lines[i].sidenum[1]].toptexture; + lines[i].args[3] = sides[lines[i].sidenum[1]].toptexture; if (lines[i].flags & ML_EFFECT6) - lines[i].args[2] |= FF_SPLAT; - lines[i].args[3] = sides[lines[i].sidenum[1]].midtexture; - if (lines[i].args[2] & FF_TRANSLUCENT) + lines[i].args[3] |= FF_SPLAT; + lines[i].args[4] = sides[lines[i].sidenum[1]].midtexture; + if (lines[i].args[3] & FF_TRANSLUCENT) { - if (sides[lines[i].sidenum[0]].toptexture > 0) - lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture; - else - lines[i].args[1] = 128; + P_SetBinaryFOFAlpha(&lines[i]); //Replicate old hack: Translucent FOFs set to full opacity cut cyan pixels if (lines[i].args[1] == 256) - lines[i].args[2] |= FF_SPLAT; + lines[i].args[3] |= FF_SPLAT; } else lines[i].args[1] = 255; diff --git a/src/p_spec.c b/src/p_spec.c index 56fe98154..2b3e5a000 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -118,7 +118,7 @@ static void Add_ColormapFader(sector_t *sector, extracolormap_t *source_exc, ext static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, UINT16 tag, line_t *sourceline); //static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); -static void P_AddFakeFloorsByLine(size_t line, INT32 alpha, ffloortype_e ffloorflags, thinkerlist_t *secthinkers); +static void P_AddFakeFloorsByLine(size_t line, INT32 alpha, UINT8 blendmode, ffloortype_e ffloorflags, thinkerlist_t *secthinkers); static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec); static void Add_Friction(INT32 friction, INT32 movefactor, INT32 affectee, INT32 referrer); static void P_AddPlaneDisplaceThinker(INT32 type, fixed_t speed, INT32 control, INT32 affectee, UINT8 reverse); @@ -5467,12 +5467,13 @@ static inline void P_AddFFloorToList(sector_t *sec, ffloor_t *fflr) * \param sec2 Control sector. * \param master Control linedef. * \param alpha Alpha value (0-255). + * \param blendmode Blending mode. * \param flags Options affecting this 3Dfloor. * \param secthinkers List of relevant thinkers sorted by sector. May be NULL. * \return Pointer to the new 3Dfloor. * \sa P_AddFFloor, P_AddFakeFloorsByLine, P_SpawnSpecials */ -static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, INT32 alpha, ffloortype_e flags, thinkerlist_t *secthinkers) +static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, INT32 alpha, UINT8 blendmode, ffloortype_e flags, thinkerlist_t *secthinkers) { ffloor_t *fflr; thinker_t *th; @@ -5598,15 +5599,29 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, I { fflr->flags |= FF_TRANSLUCENT; fflr->spawnflags = fflr->flags; - - if (sides[master->sidenum[0]].toptexture >= 1001) - { - fflr->blend = (sides[master->sidenum[0]].toptexture / 1000) + 1; // becomes an AST - fflr->alpha %= 1000; - } } fflr->spawnalpha = fflr->alpha; // save for netgames + switch (blendmode) + { + case TMB_TRANSLUCENT: + default: + fflr->blend = AST_COPY; + break; + case TMB_ADD: + fflr->blend = AST_ADD; + break; + case TMB_SUBTRACT: + fflr->blend = AST_SUBTRACT; + break; + case TMB_REVERSESUBTRACT: + fflr->blend = AST_REVERSESUBTRACT; + break; + case TMB_MODULATE: + fflr->blend = AST_MODULATE; + break; + } + if (flags & FF_QUICKSAND) CheckForQuicksand = true; @@ -6459,29 +6474,81 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; //Appearance settings - if (lines[i].args[2] & TMFA_NOPLANES) + if (lines[i].args[3] & TMFA_NOPLANES) ffloorflags &= ~FF_RENDERPLANES; - if (lines[i].args[2] & TMFA_NOSIDES) + if (lines[i].args[3] & TMFA_NOSIDES) ffloorflags &= ~FF_RENDERSIDES; - if (lines[i].args[2] & TMFA_INSIDES) + if (lines[i].args[3] & TMFA_INSIDES) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_BOTHPLANES; if (ffloorflags & FF_RENDERSIDES) ffloorflags |= FF_ALLSIDES; } - if (lines[i].args[2] & TMFA_ONLYINSIDES) + if (lines[i].args[3] & TMFA_ONLYINSIDES) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_INVERTPLANES; if (ffloorflags & FF_RENDERSIDES) ffloorflags |= FF_INVERTSIDES; } - if (lines[i].args[2] & TMFA_NOSHADE) + if (lines[i].args[3] & TMFA_NOSHADE) ffloorflags |= FF_NOSHADE; - if (lines[i].args[2] & TMFA_SPLAT) + if (lines[i].args[3] & TMFA_SPLAT) ffloorflags |= FF_SPLAT; + //Tangibility settings + if (lines[i].args[4] & TMFT_INTANGIBLETOP) + ffloorflags |= FF_REVERSEPLATFORM; + if (lines[i].args[4] & TMFT_INTANGIBLEBOTTOM) + ffloorflags |= FF_PLATFORM; + if (lines[i].args[4] & TMFT_DONTBLOCKPLAYER) + ffloorflags &= ~FF_BLOCKPLAYER; + if (lines[i].args[4] & TMFT_DONTBLOCKOTHERS) + ffloorflags &= ~FF_BLOCKOTHERS; + + //Cutting options + if (ffloorflags & FF_RENDERALL) + { + //If translucent or player can enter it, cut inner walls + if ((lines[i].args[1] < 255) || (lines[i].args[4] & TMFT_VISIBLEFROMINSIDE)) + ffloorflags |= FF_CUTEXTRA|FF_EXTRA; + else + ffloorflags |= FF_CUTLEVEL; + } + + P_AddFakeFloorsByLine(i, lines[i].args[1], lines[i].args[2], ffloorflags, secthinkers); + break; + + case 120: // FOF (water) + ffloorflags = FF_EXISTS|FF_RENDERPLANES|FF_SWIMMABLE|FF_BOTHPLANES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; + if (!(lines[i].args[3] & TMFW_NOSIDES)) + ffloorflags |= FF_RENDERSIDES|FF_ALLSIDES; + if (lines[i].args[3] & TMFW_DOUBLESHADOW) + ffloorflags |= FF_DOUBLESHADOW; + if (lines[i].args[3] & TMFW_COLORMAPONLY) + ffloorflags |= FF_COLORMAPONLY; + if (!(lines[i].args[3] & TMFW_NORIPPLE)) + ffloorflags |= FF_RIPPLE; + if (lines[i].args[3] & TMFW_GOOWATER) + ffloorflags |= FF_GOOWATER; + if (lines[i].args[3] & TMFW_SPLAT) + ffloorflags |= FF_SPLAT; + P_AddFakeFloorsByLine(i, lines[i].args[1], lines[i].args[2], ffloorflags, secthinkers); + break; + + case 150: // FOF (Air bobbing) + P_AddFakeFloorsByLine(i, 0xff, TMB_TRANSLUCENT, FF_EXISTS|FF_SOLID|FF_RENDERALL, secthinkers); + P_AddAirbob(lines[i].frontsector, lines[i].args[0], lines[i].args[1] << FRACBITS, !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); + break; + + case 160: // FOF (Water bobbing) + P_AddFakeFloorsByLine(i, 0xff, TMB_TRANSLUCENT, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_FLOATBOB, secthinkers); + break; + + case 170: // FOF (Crumbling) + ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CRUMBLE; + //Tangibility settings if (lines[i].args[3] & TMFT_INTANGIBLETOP) ffloorflags |= FF_REVERSEPLATFORM; @@ -6492,76 +6559,24 @@ void P_SpawnSpecials(boolean fromnetsave) if (lines[i].args[3] & TMFT_DONTBLOCKOTHERS) ffloorflags &= ~FF_BLOCKOTHERS; - //Cutting options - if (ffloorflags & FF_RENDERALL) - { - //If translucent or player can enter it, cut inner walls - if ((lines[i].args[1] < 255) || (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE)) - ffloorflags |= FF_CUTEXTRA|FF_EXTRA; - else - ffloorflags |= FF_CUTLEVEL; - } - - P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); - break; - - case 120: // FOF (water) - ffloorflags = FF_EXISTS|FF_RENDERPLANES|FF_SWIMMABLE|FF_BOTHPLANES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; - if (!(lines[i].args[2] & TMFW_NOSIDES)) - ffloorflags |= FF_RENDERSIDES|FF_ALLSIDES; - if (lines[i].args[2] & TMFW_DOUBLESHADOW) - ffloorflags |= FF_DOUBLESHADOW; - if (lines[i].args[2] & TMFW_COLORMAPONLY) - ffloorflags |= FF_COLORMAPONLY; - if (!(lines[i].args[2] & TMFW_NORIPPLE)) - ffloorflags |= FF_RIPPLE; - if (lines[i].args[2] & TMFW_GOOWATER) - ffloorflags |= FF_GOOWATER; - if (lines[i].args[2] & TMFW_SPLAT) - ffloorflags |= FF_SPLAT; - P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); - break; - - case 150: // FOF (Air bobbing) - P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_SOLID|FF_RENDERALL, secthinkers); - P_AddAirbob(lines[i].frontsector, lines[i].args[0], lines[i].args[1] << FRACBITS, !!(lines[i].args[2] & TMFB_REVERSE), !!(lines[i].args[2] & TMFB_SPINDASH), !!(lines[i].args[2] & TMFB_DYNAMIC)); - break; - - case 160: // FOF (Water bobbing) - P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_FLOATBOB, secthinkers); - break; - - case 170: // FOF (Crumbling) - ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CRUMBLE; - - //Tangibility settings - if (lines[i].args[2] & TMFT_INTANGIBLETOP) - ffloorflags |= FF_REVERSEPLATFORM; - if (lines[i].args[2] & TMFT_INTANGIBLEBOTTOM) - ffloorflags |= FF_PLATFORM; - if (lines[i].args[2] & TMFT_DONTBLOCKPLAYER) - ffloorflags &= ~FF_BLOCKPLAYER; - if (lines[i].args[2] & TMFT_DONTBLOCKOTHERS) - ffloorflags &= ~FF_BLOCKOTHERS; - //Flags - if (lines[i].args[3] & TMFC_NOSHADE) + if (lines[i].args[4] & TMFC_NOSHADE) ffloorflags |= FF_NOSHADE; - if (lines[i].args[3] & TMFC_NORETURN) + if (lines[i].args[4] & TMFC_NORETURN) ffloorflags |= FF_NORETURN; - if (lines[i].args[3] & TMFC_FLOATBOB) + if (lines[i].args[4] & TMFC_FLOATBOB) ffloorflags |= FF_FLOATBOB; - if (lines[i].args[3] & TMFC_SPLAT) + if (lines[i].args[4] & TMFC_SPLAT) ffloorflags |= FF_SPLAT; //If translucent or player can enter it, cut inner walls - if (lines[i].args[1] < 0xff || (lines[i].args[2] & TMFT_VISIBLEFROMINSIDE)) + if (lines[i].args[1] < 0xff || (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE)) ffloorflags |= FF_CUTEXTRA|FF_EXTRA; else ffloorflags |= FF_CUTLEVEL; //If player can enter it, render insides - if (lines[i].args[2] & TMFT_VISIBLEFROMINSIDE) + if (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_BOTHPLANES; @@ -6569,8 +6584,8 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags |= FF_ALLSIDES; } - P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); - if (lines[i].args[3] & TMFC_AIRBOB) + P_AddFakeFloorsByLine(i, lines[i].args[1], lines[i].args[2], ffloorflags, secthinkers); + if (lines[i].args[4] & TMFC_AIRBOB) P_AddAirbob(lines[i].frontsector, lines[i].args[0], 16*FRACUNIT, false, false, false); break; @@ -6582,58 +6597,58 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL; //Appearance settings - if (lines[i].args[2] & TMFA_NOPLANES) + if (lines[i].args[3] & TMFA_NOPLANES) ffloorflags &= ~FF_RENDERPLANES; - if (lines[i].args[2] & TMFA_NOSIDES) + if (lines[i].args[3] & TMFA_NOSIDES) ffloorflags &= ~FF_RENDERSIDES; - if (lines[i].args[2] & TMFA_INSIDES) + if (lines[i].args[3] & TMFA_INSIDES) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_BOTHPLANES; if (ffloorflags & FF_RENDERSIDES) ffloorflags |= FF_ALLSIDES; } - if (lines[i].args[2] & TMFA_ONLYINSIDES) + if (lines[i].args[3] & TMFA_ONLYINSIDES) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_INVERTPLANES; if (ffloorflags & FF_RENDERSIDES) ffloorflags |= FF_INVERTSIDES; } - if (lines[i].args[2] & TMFA_NOSHADE) + if (lines[i].args[3] & TMFA_NOSHADE) ffloorflags |= FF_NOSHADE; - if (lines[i].args[2] & TMFA_SPLAT) + if (lines[i].args[3] & TMFA_SPLAT) ffloorflags |= FF_SPLAT; //Tangibility settings - if (lines[i].args[3] & TMFT_INTANGIBLETOP) + if (lines[i].args[4] & TMFT_INTANGIBLETOP) ffloorflags |= FF_REVERSEPLATFORM; - if (lines[i].args[3] & TMFT_INTANGIBLEBOTTOM) + if (lines[i].args[4] & TMFT_INTANGIBLEBOTTOM) ffloorflags |= FF_PLATFORM; - if (lines[i].args[3] & TMFT_DONTBLOCKPLAYER) + if (lines[i].args[4] & TMFT_DONTBLOCKPLAYER) ffloorflags &= ~FF_BLOCKPLAYER; - if (lines[i].args[3] & TMFT_DONTBLOCKOTHERS) + if (lines[i].args[4] & TMFT_DONTBLOCKOTHERS) ffloorflags &= ~FF_BLOCKOTHERS; //Cutting options if (ffloorflags & FF_RENDERALL) { //If translucent or player can enter it, cut inner walls - if ((lines[i].args[1] < 255) || (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE)) + if ((lines[i].args[1] < 255) || (lines[i].args[4] & TMFT_VISIBLEFROMINSIDE)) ffloorflags |= FF_CUTEXTRA|FF_EXTRA; else ffloorflags |= FF_CUTLEVEL; } - P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); - P_AddRaiseThinker(lines[i].frontsector, lines[i].args[0], lines[i].args[4] << FRACBITS, ceilingtop, ceilingbottom, !!(lines[i].args[5] & TMFR_REVERSE), !!(lines[i].args[5] & TMFR_SPINDASH)); + P_AddFakeFloorsByLine(i, lines[i].args[1], lines[i].args[2], ffloorflags, secthinkers); + P_AddRaiseThinker(lines[i].frontsector, lines[i].args[0], lines[i].args[5] << FRACBITS, ceilingtop, ceilingbottom, !!(lines[i].args[6] & TMFR_REVERSE), !!(lines[i].args[6] & TMFR_SPINDASH)); break; } case 200: // Light block ffloorflags = FF_EXISTS|FF_CUTSPRITES; if (!lines[i].args[1]) ffloorflags |= FF_DOUBLESHADOW; - P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, TMB_TRANSLUCENT, ffloorflags, secthinkers); break; case 202: // Fog @@ -6642,41 +6657,41 @@ void P_SpawnSpecials(boolean fromnetsave) // SoM: Because it's fog, check for an extra colormap and set the fog flag... if (sectors[sec].extra_colormap) sectors[sec].extra_colormap->flags = CMF_FOG; - P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, TMB_TRANSLUCENT, ffloorflags, secthinkers); break; case 220: //Intangible ffloorflags = FF_EXISTS|FF_RENDERALL|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES; //Appearance settings - if (lines[i].args[2] & TMFA_NOPLANES) + if (lines[i].args[3] & TMFA_NOPLANES) ffloorflags &= ~FF_RENDERPLANES; - if (lines[i].args[2] & TMFA_NOSIDES) + if (lines[i].args[3] & TMFA_NOSIDES) ffloorflags &= ~FF_RENDERSIDES; - if (!(lines[i].args[2] & TMFA_INSIDES)) + if (!(lines[i].args[3] & TMFA_INSIDES)) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_BOTHPLANES; if (ffloorflags & FF_RENDERSIDES) ffloorflags |= FF_ALLSIDES; } - if (lines[i].args[2] & TMFA_ONLYINSIDES) + if (lines[i].args[3] & TMFA_ONLYINSIDES) { if (ffloorflags & FF_RENDERPLANES) ffloorflags |= FF_INVERTPLANES; if (ffloorflags & FF_RENDERSIDES) ffloorflags |= FF_INVERTSIDES; } - if (lines[i].args[2] & TMFA_NOSHADE) + if (lines[i].args[3] & TMFA_NOSHADE) ffloorflags |= FF_NOSHADE; - if (lines[i].args[2] & TMFA_SPLAT) + if (lines[i].args[3] & TMFA_SPLAT) ffloorflags |= FF_SPLAT; - P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, lines[i].args[1], lines[i].args[2], ffloorflags, secthinkers); break; case 223: // FOF (intangible, invisible) - for combining specials in a sector - P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_NOSHADE, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, TMB_TRANSLUCENT, FF_EXISTS|FF_NOSHADE, secthinkers); break; case 250: // Mario Block @@ -6686,14 +6701,14 @@ void P_SpawnSpecials(boolean fromnetsave) if (lines[i].args[1] & TMFM_INVISIBLE) ffloorflags &= ~(FF_SOLID|FF_RENDERALL|FF_CUTLEVEL); - P_AddFakeFloorsByLine(i, 0xff, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, TMB_TRANSLUCENT, ffloorflags, secthinkers); break; case 251: // A THWOMP! { UINT16 sound = (lines[i].stringargs[0]) ? get_number(lines[i].stringargs[0]) : sfx_thwomp; P_AddThwompThinker(lines[i].frontsector, &lines[i], lines[i].args[1] << (FRACBITS - 3), lines[i].args[2] << (FRACBITS - 3), sound); - P_AddFakeFloorsByLine(i, 0xff, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); + P_AddFakeFloorsByLine(i, 0xff, TMB_TRANSLUCENT, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL, secthinkers); break; } @@ -6705,7 +6720,7 @@ void P_SpawnSpecials(boolean fromnetsave) ffloorflags = FF_EXISTS|FF_BLOCKOTHERS|FF_RENDERALL|FF_BUSTUP; //Bustable type - switch (lines[i].args[2]) + switch (lines[i].args[3]) { case TMFB_TOUCH: busttype = BT_TOUCH; @@ -6722,13 +6737,13 @@ void P_SpawnSpecials(boolean fromnetsave) } //Flags - if (lines[i].args[3] & TMFB_PUSHABLES) + if (lines[i].args[4] & TMFB_PUSHABLES) bustflags |= FB_PUSHABLES; - if (lines[i].args[3] & TMFB_EXECUTOR) + if (lines[i].args[4] & TMFB_EXECUTOR) bustflags |= FB_EXECUTOR; - if (lines[i].args[3] & TMFB_ONLYBOTTOM) + if (lines[i].args[4] & TMFB_ONLYBOTTOM) bustflags |= FB_ONLYBOTTOM; - if (lines[i].args[3] & TMFB_SPLAT) + if (lines[i].args[4] & TMFB_SPLAT) ffloorflags |= FF_SPLAT; if (busttype != BT_TOUCH || bustflags & FB_ONLYBOTTOM) @@ -6736,12 +6751,12 @@ void P_SpawnSpecials(boolean fromnetsave) TAG_ITER_SECTORS(lines[i].args[0], s) { - ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], ffloorflags, secthinkers); + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], lines[i].args[2], ffloorflags, secthinkers); if (!fflr) continue; fflr->bustflags = bustflags; fflr->busttype = busttype; - fflr->busttag = lines[i].args[4]; + fflr->busttag = lines[i].args[5]; } break; } @@ -6752,7 +6767,7 @@ void P_SpawnSpecials(boolean fromnetsave) TAG_ITER_SECTORS(lines[i].args[0], s) { - ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, 0xff, ffloorflags, secthinkers); + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, 0xff, TMB_TRANSLUCENT, ffloorflags, secthinkers); if (!fflr) continue; fflr->sinkspeed = abs(lines[i].args[2]) << (FRACBITS - 1); @@ -6762,28 +6777,28 @@ void P_SpawnSpecials(boolean fromnetsave) case 258: // Laser block ffloorflags = FF_EXISTS|FF_RENDERALL|FF_NOSHADE|FF_EXTRA|FF_CUTEXTRA|FF_TRANSLUCENT; - P_AddLaserThinker(lines[i].args[0], lines + i, !!(lines[i].args[2] & TMFL_NOBOSSES)); - if (lines[i].args[2] & TMFL_SPLAT) + P_AddLaserThinker(lines[i].args[0], lines + i, !!(lines[i].args[3] & TMFL_NOBOSSES)); + if (lines[i].args[3] & TMFL_SPLAT) ffloorflags |= FF_SPLAT; - P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, lines[i].args[1], lines[i].args[2], ffloorflags, secthinkers); break; case 259: // Custom FOF TAG_ITER_SECTORS(lines[i].args[0], s) { - ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], lines[i].args[2], secthinkers); + ffloor_t *fflr = P_AddFakeFloor(§ors[s], lines[i].frontsector, lines + i, lines[i].args[1], lines[i].args[2], lines[i].args[3], secthinkers); if (!fflr) continue; if (!udmf) // Ugly backwards compatibility stuff { - if (lines[i].args[2] & FF_QUICKSAND) + if (lines[i].args[3] & FF_QUICKSAND) { fflr->sinkspeed = abs(lines[i].dx) >> 1; fflr->friction = abs(lines[i].dy) >> 6; } - if (lines[i].args[2] & FF_BUSTUP) + if (lines[i].args[3] & FF_BUSTUP) { - switch (lines[i].args[3] % TMFB_ONLYBOTTOM) + switch (lines[i].args[4] % TMFB_ONLYBOTTOM) { case TMFB_TOUCH: fflr->busttype = BT_TOUCH; @@ -6799,7 +6814,7 @@ void P_SpawnSpecials(boolean fromnetsave) break; } - if (lines[i].args[3] & TMFB_ONLYBOTTOM) + if (lines[i].args[4] & TMFB_ONLYBOTTOM) fflr->bustflags |= FB_ONLYBOTTOM; if (lines[i].flags & ML_EFFECT4) fflr->bustflags |= FB_PUSHABLES; @@ -6874,7 +6889,7 @@ void P_SpawnSpecials(boolean fromnetsave) } } - P_AddFakeFloorsByLine(i, dopacity, ffloorflags, secthinkers); + P_AddFakeFloorsByLine(i, dopacity, TMB_TRANSLUCENT, ffloorflags, secthinkers); } break; @@ -7280,12 +7295,13 @@ void P_SpawnSpecials(boolean fromnetsave) * * \param line Control linedef to use. * \param alpha Alpha value (0-255). + * \param blendmode Blending mode. * \param ffloorflags 3Dfloor flags to use. * \param secthkiners Lists of thinkers sorted by sector. May be NULL. * \sa P_SpawnSpecials, P_AddFakeFloor * \author Graue */ -static void P_AddFakeFloorsByLine(size_t line, INT32 alpha, ffloortype_e ffloorflags, thinkerlist_t *secthinkers) +static void P_AddFakeFloorsByLine(size_t line, INT32 alpha, UINT8 blendmode, ffloortype_e ffloorflags, thinkerlist_t *secthinkers) { INT32 s; mtag_t tag = lines[line].args[0]; @@ -7293,7 +7309,7 @@ static void P_AddFakeFloorsByLine(size_t line, INT32 alpha, ffloortype_e ffloorf line_t* li = lines + line; TAG_ITER_SECTORS(tag, s) - P_AddFakeFloor(§ors[s], §ors[sec], li, alpha, ffloorflags, secthinkers); + P_AddFakeFloor(§ors[s], §ors[sec], li, alpha, blendmode, ffloorflags, secthinkers); } /* diff --git a/src/p_spec.h b/src/p_spec.h index 536b6c313..a3dbb9322 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -102,6 +102,15 @@ typedef enum TMFL_SPLAT = 1<<1, } textmapfoflaserflags_t; +typedef enum +{ + TMB_TRANSLUCENT = 0, + TMB_ADD = 1, + TMB_SUBTRACT = 2, + TMB_REVERSESUBTRACT = 3, + TMB_MODULATE = 4, +} textmapblendmodes_t; + // GETSECSPECIAL (specialval, section) // // Pulls out the special # from a particular section. diff --git a/src/r_defs.h b/src/r_defs.h index 43caa3d79..8bb0b4b9f 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -402,7 +402,7 @@ typedef enum #define HORIZONSPECIAL 41 -#define NUMLINEARGS 6 +#define NUMLINEARGS 10 #define NUMLINESTRINGARGS 2 typedef struct line_s From 432f691852e256d00487a4cea32c308d2b365a96 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 14 Dec 2021 23:19:45 -0800 Subject: [PATCH 325/377] Free unused texture lumps in R_LoadTextures PU_CACHE never gets freed automatically and Z_Unlock does NOTHING. --- src/r_textures.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/r_textures.c b/src/r_textures.c index 793e5237f..86e8ae43c 100644 --- a/src/r_textures.c +++ b/src/r_textures.c @@ -814,7 +814,7 @@ Rloadflats (INT32 i, INT32 w) patch->lump = texstart + j; patch->flip = 0; - Z_Unlock(flatlump); + Z_Free(flatlump); texturewidth[i] = texture->width; textureheight[i] = texture->height << FRACBITS; @@ -915,7 +915,7 @@ Rloadtextures (INT32 i, INT32 w) patch->lump = texstart + j; patch->flip = 0; - Z_Unlock(patchlump); + Z_Free(patchlump); texturewidth[i] = texture->width; textureheight[i] = texture->height << FRACBITS; From 571e4753948b6297b55238962dd8bea6b5e5be62 Mon Sep 17 00:00:00 2001 From: James R Date: Wed, 15 Dec 2021 14:02:56 -0800 Subject: [PATCH 326/377] Read only header bytes when creating textures list R_LoadTextures was reading in the entirety of every texture lump, now it only reads the 8 byte PNG header. This saved more than 1 second for me (1.68 s -> 0.24 s). PNG still need to be read in entirely to check their dimensions; I didn't bother looking into optimizing it since we don't have many PNG textures right now. --- src/r_picformats.h | 1 + src/r_textures.c | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/r_picformats.h b/src/r_picformats.h index c74f8a13a..73010e092 100644 --- a/src/r_picformats.h +++ b/src/r_picformats.h @@ -105,6 +105,7 @@ typedef struct } spriteinfo_t; // Portable Network Graphics +#define PNG_HEADER_SIZE (8) boolean Picture_IsLumpPNG(const UINT8 *d, size_t s); #define Picture_ThrowPNGError(lumpname, wadfilename) I_Error("W_Wad: Lump \"%s\" in file \"%s\" is a .png - please convert to either Doom or Flat (raw) image format.", lumpname, wadfilename); // Fears Of LJ Sonic diff --git a/src/r_textures.c b/src/r_textures.c index 86e8ae43c..117192526 100644 --- a/src/r_textures.c +++ b/src/r_textures.c @@ -725,6 +725,7 @@ Rloadflats (INT32 i, INT32 w) UINT16 texstart, texend; texture_t *texture; texpatch_t *patch; + UINT8 header[PNG_HEADER_SIZE]; // Yes if (W_FileHasFolders(wadfiles[w])) @@ -743,7 +744,6 @@ Rloadflats (INT32 i, INT32 w) // Work through each lump between the markers in the WAD. for (j = 0; j < (texend - texstart); j++) { - UINT8 *flatlump; UINT16 wadnum = (UINT16)w; lumpnum_t lumpnum = texstart + j; size_t lumplength; @@ -755,7 +755,7 @@ Rloadflats (INT32 i, INT32 w) continue; // If it is then SKIP IT } - flatlump = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE); + W_ReadLumpHeaderPwad(wadnum, lumpnum, header, sizeof header, 0); lumplength = W_LumpLengthPwad(wadnum, lumpnum); switch (lumplength) @@ -790,12 +790,14 @@ Rloadflats (INT32 i, INT32 w) M_Memcpy(texture->name, W_CheckNameForNumPwad(wadnum, lumpnum), sizeof(texture->name)); #ifndef NO_PNG_LUMPS - if (Picture_IsLumpPNG((UINT8 *)flatlump, lumplength)) + if (Picture_IsLumpPNG(header, lumplength)) { + UINT8 *flatlump = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE); INT32 width, height; Picture_PNGDimensions((UINT8 *)flatlump, &width, &height, NULL, NULL, lumplength); texture->width = (INT16)width; texture->height = (INT16)height; + Z_Free(flatlump); } else #endif @@ -814,8 +816,6 @@ Rloadflats (INT32 i, INT32 w) patch->lump = texstart + j; patch->flip = 0; - Z_Free(flatlump); - texturewidth[i] = texture->width; textureheight[i] = texture->height << FRACBITS; i++; @@ -835,8 +835,8 @@ Rloadtextures (INT32 i, INT32 w) UINT16 j; UINT16 texstart, texend, texturesLumpPos; texture_t *texture; - softwarepatch_t *patchlump; texpatch_t *patch; + softwarepatch_t patchlump; // Get the lump numbers for the markers in the WAD, if they exist. if (W_FileHasFolders(wadfiles[w])) @@ -876,7 +876,7 @@ Rloadtextures (INT32 i, INT32 w) continue; // If it is then SKIP IT } - patchlump = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE); + W_ReadLumpHeaderPwad(wadnum, lumpnum, &patchlump, PNG_HEADER_SIZE, 0); #ifndef NO_PNG_LUMPS lumplength = W_LumpLengthPwad(wadnum, lumpnum); #endif @@ -888,18 +888,20 @@ Rloadtextures (INT32 i, INT32 w) M_Memcpy(texture->name, W_CheckNameForNumPwad(wadnum, lumpnum), sizeof(texture->name)); #ifndef NO_PNG_LUMPS - if (Picture_IsLumpPNG((UINT8 *)patchlump, lumplength)) + if (Picture_IsLumpPNG((UINT8 *)&patchlump, lumplength)) { + UINT8 *png = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE); INT32 width, height; - Picture_PNGDimensions((UINT8 *)patchlump, &width, &height, NULL, NULL, lumplength); + Picture_PNGDimensions(png, &width, &height, NULL, NULL, lumplength); texture->width = (INT16)width; texture->height = (INT16)height; + Z_Free(png); } else #endif { - texture->width = SHORT(patchlump->width); - texture->height = SHORT(patchlump->height); + texture->width = SHORT(patchlump.width); + texture->height = SHORT(patchlump.height); } texture->type = TEXTURETYPE_SINGLEPATCH; @@ -915,8 +917,6 @@ Rloadtextures (INT32 i, INT32 w) patch->lump = texstart + j; patch->flip = 0; - Z_Free(patchlump); - texturewidth[i] = texture->width; textureheight[i] = texture->height << FRACBITS; i++; From 2ebec5356187a17e01fe06e5c7c026ffd0c4c4bc Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 16 Dec 2021 18:34:51 -0800 Subject: [PATCH 327/377] P_AddWadFile: only load textures in current file --- src/p_setup.c | 2 +- src/r_textures.c | 229 +++++++++++++++++++++++++++-------------------- src/r_textures.h | 1 + 3 files changed, 133 insertions(+), 99 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 4f21922a0..5d70daeec 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4722,7 +4722,7 @@ static boolean P_LoadAddon(UINT16 wadnum, UINT16 numlumps) // Reload it all anyway, just in case they // added some textures but didn't insert a // TEXTURES/etc. list. - R_LoadTextures(); // numtexture changes + R_LoadTexturesPwad(wadnum); // numtexture changes // Reload ANIMDEFS P_InitPicAnims(); diff --git a/src/r_textures.c b/src/r_textures.c index 117192526..a53c2e738 100644 --- a/src/r_textures.c +++ b/src/r_textures.c @@ -926,27 +926,53 @@ Rloadtextures (INT32 i, INT32 w) return i; } -// -// R_LoadTextures -// Initializes the texture list with the textures from the world map. -// -void R_LoadTextures(void) +static INT32 +count_range +( const char * marker_start, + const char * marker_end, + const char * folder, + UINT16 wadnum) { - INT32 i, w; UINT16 j; - UINT16 texstart, texend, texturesLumpPos; + UINT16 texstart, texend; + INT32 count = 0; - // Free previous memory before numtextures change. - if (numtextures) + // Count flats + if (W_FileHasFolders(wadfiles[wadnum])) { - for (i = 0; i < numtextures; i++) - { - Z_Free(textures[i]); - Z_Free(texturecache[i]); - } - Z_Free(texturetranslation); - Z_Free(textures); + texstart = W_CheckNumForFolderStartPK3(folder, wadnum, 0); + texend = W_CheckNumForFolderEndPK3(folder, wadnum, texstart); } + else + { + texstart = W_CheckNumForMarkerStartPwad(marker_start, wadnum, 0); + texend = W_CheckNumForNamePwad(marker_end, wadnum, texstart); + } + + if (texstart != INT16_MAX && texend != INT16_MAX) + { + // PK3s have subfolders, so we can't just make a simple sum + if (W_FileHasFolders(wadfiles[wadnum])) + { + for (j = texstart; j < texend; j++) + { + if (!W_IsLumpFolder(wadnum, j)) // Check if lump is a folder; if not, then count it + count++; + } + } + else // Add all the textures between markers + { + count += (texend - texstart); + } + } + + return count; +} + +static INT32 R_CountTextures(UINT16 wadnum) +{ + UINT16 texturesLumpPos; + INT32 count = 0; // Load patches and textures. @@ -955,106 +981,76 @@ void R_LoadTextures(void) // the markers. // This system will allocate memory for all duplicate/patched textures even if it never uses them, // but the alternative is to spend a ton of time checking and re-checking all previous entries just to skip any potentially patched textures. - for (w = 0, numtextures = 0; w < numwadfiles; w++) - { + #ifdef WALLFLATS - // Count flats - if (W_FileHasFolders(wadfiles[w])) - { - texstart = W_CheckNumForFolderStartPK3("flats/", (UINT16)w, 0); - texend = W_CheckNumForFolderEndPK3("flats/", (UINT16)w, texstart); - } - else - { - texstart = W_CheckNumForMarkerStartPwad("F_START", (UINT16)w, 0); - texend = W_CheckNumForNamePwad("F_END", (UINT16)w, texstart); - } + count += count_range("F_START", "F_END", "flats/", wadnum); +#endif - if (!( texstart == INT16_MAX || texend == INT16_MAX )) - { - // PK3s have subfolders, so we can't just make a simple sum - if (W_FileHasFolders(wadfiles[w])) - { - for (j = texstart; j < texend; j++) - { - if (!W_IsLumpFolder((UINT16)w, j)) // Check if lump is a folder; if not, then count it - numtextures++; - } - } - else // Add all the textures between F_START and F_END - { - numtextures += (UINT32)(texend - texstart); - } - } -#endif/*WALLFLATS*/ + // Count the textures from TEXTURES lumps + texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", wadnum, 0); - // Count the textures from TEXTURES lumps - texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, 0); - while (texturesLumpPos != INT16_MAX) - { - numtextures += R_CountTexturesInTEXTURESLump((UINT16)w, (UINT16)texturesLumpPos); - texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, texturesLumpPos + 1); - } - - // Count single-patch textures - if (W_FileHasFolders(wadfiles[w])) - { - texstart = W_CheckNumForFolderStartPK3("textures/", (UINT16)w, 0); - texend = W_CheckNumForFolderEndPK3("textures/", (UINT16)w, texstart); - } - else - { - texstart = W_CheckNumForMarkerStartPwad(TX_START, (UINT16)w, 0); - texend = W_CheckNumForNamePwad(TX_END, (UINT16)w, 0); - } - - if (texstart == INT16_MAX || texend == INT16_MAX) - continue; - - // PK3s have subfolders, so we can't just make a simple sum - if (W_FileHasFolders(wadfiles[w])) - { - for (j = texstart; j < texend; j++) - { - if (!W_IsLumpFolder((UINT16)w, j)) // Check if lump is a folder; if not, then count it - numtextures++; - } - } - else // Add all the textures between TX_START and TX_END - { - numtextures += (UINT32)(texend - texstart); - } + while (texturesLumpPos != INT16_MAX) + { + count += R_CountTexturesInTEXTURESLump(wadnum, texturesLumpPos); + texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", wadnum, texturesLumpPos + 1); } - // If no textures found by this point, bomb out - if (!numtextures) - I_Error("No textures detected in any WADs!\n"); + // Count single-patch textures + count += count_range(TX_START, TX_END, "textures/", wadnum); + + return count; +} + +static void +recallocuser +( void * user, + size_t old, + size_t new) +{ + char *p = Z_Realloc(*(void**)user, + new, PU_STATIC, user); + + if (new > old) + memset(&p[old], 0, (new - old)); +} + +static void R_AllocateTextures(INT32 add) +{ + const INT32 newtextures = (numtextures + add); + const size_t newsize = newtextures * sizeof (void*); + const size_t oldsize = numtextures * sizeof (void*); + + INT32 i; // Allocate memory and initialize to 0 for all the textures we are initialising. - // There are actually 5 buffers allocated in one for convenience. - textures = Z_Calloc((numtextures * sizeof(void *)) * 5, PU_STATIC, NULL); + recallocuser(&textures, oldsize, newsize); // Allocate texture column offset table. - texturecolumnofs = (void *)((UINT8 *)textures + (numtextures * sizeof(void *))); + recallocuser(&texturecolumnofs, oldsize, newsize); // Allocate texture referencing cache. - texturecache = (void *)((UINT8 *)textures + ((numtextures * sizeof(void *)) * 2)); + recallocuser(&texturecache, oldsize, newsize); // Allocate texture width table. - texturewidth = (void *)((UINT8 *)textures + ((numtextures * sizeof(void *)) * 3)); + recallocuser(&texturewidth, oldsize, newsize); // Allocate texture height table. - textureheight = (void *)((UINT8 *)textures + ((numtextures * sizeof(void *)) * 4)); + recallocuser(&textureheight, oldsize, newsize); // Create translation table for global animation. - texturetranslation = Z_Malloc((numtextures + 1) * sizeof(*texturetranslation), PU_STATIC, NULL); + Z_Realloc(texturetranslation, (newtextures + 1) * sizeof(*texturetranslation), PU_STATIC, &texturetranslation); - for (i = 0; i < numtextures; i++) + for (i = numtextures; i < newtextures; ++i) texturetranslation[i] = i; +} - for (i = 0, w = 0; w < numwadfiles; w++) - { +static INT32 R_DefineTextures(INT32 i, UINT16 w) +{ #ifdef WALLFLATS - i = Rloadflats(i, w); + i = Rloadflats(i, w); #endif - i = Rloadtextures(i, w); - } + return Rloadtextures(i, w); +} + +static void R_FinishLoadingTextures(INT32 add) +{ + numtextures += add; #ifdef HWRENDER if (rendermode == render_opengl) @@ -1062,6 +1058,43 @@ void R_LoadTextures(void) #endif } +// +// R_LoadTextures +// Initializes the texture list with the textures from the world map. +// +void R_LoadTextures(void) +{ + INT32 i, w; + INT32 newtextures = 0; + + for (w = 0; w < numwadfiles; w++) + { + newtextures += R_CountTextures((UINT16)w); + } + + // If no textures found by this point, bomb out + if (!newtextures) + I_Error("No textures detected in any WADs!\n"); + + R_AllocateTextures(newtextures); + + for (i = 0, w = 0; w < numwadfiles; w++) + { + i = R_DefineTextures(i, w); + } + + R_FinishLoadingTextures(newtextures); +} + +void R_LoadTexturesPwad(UINT16 wadnum) +{ + INT32 newtextures = R_CountTextures(wadnum); + + R_AllocateTextures(newtextures); + R_DefineTextures(numtextures, wadnum); + R_FinishLoadingTextures(newtextures); +} + static texpatch_t *R_ParsePatch(boolean actuallyLoadPatch) { char *texturesToken; diff --git a/src/r_textures.h b/src/r_textures.h index dd286b6ac..95796d89c 100644 --- a/src/r_textures.h +++ b/src/r_textures.h @@ -76,6 +76,7 @@ extern UINT8 **texturecache; // graphics data for each generated full-size textu // Load TEXTURES definitions, create lookup tables void R_LoadTextures(void); +void R_LoadTexturesPwad(UINT16 wadnum); void R_FlushTextureCache(void); // Texture generation From 2aec4501eb4c742ba7830c2cce16bd64db7ac55d Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 16 Dec 2021 22:10:36 -0800 Subject: [PATCH 328/377] Hash name lookup for textures and lumps --- src/doomdef.h | 16 ++++++++++++++++ src/r_textures.c | 12 ++++++++++-- src/r_textures.h | 1 + src/w_wad.c | 19 ++++++++++++++++--- src/w_wad.h | 1 + 5 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/doomdef.h b/src/doomdef.h index 7e7e35599..e1a7a247a 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -530,6 +530,22 @@ extern boolean capslock; // i_system.c, replace getchar() once the keyboard has been appropriated INT32 I_GetKey(void); +/* http://www.cse.yorku.ca/~oz/hash.html */ +static inline +UINT32 quickncasehash (const char *p, size_t n) +{ + size_t i = 0; + UINT32 x = 5381; + + while (i < n && p[i]) + { + x = (x * 33) ^ tolower(p[i]); + i++; + } + + return x; +} + #ifndef min // Double-Check with WATTCP-32's cdefs.h #define min(x, y) (((x) < (y)) ? (x) : (y)) #endif diff --git a/src/r_textures.c b/src/r_textures.c index a53c2e738..645a57b9b 100644 --- a/src/r_textures.c +++ b/src/r_textures.c @@ -59,6 +59,7 @@ INT32 *texturetranslation; // Painfully simple texture id cacheing to make maps load faster. :3 static struct { char name[9]; + UINT32 hash; INT32 id; } *tidcache = NULL; static INT32 tidcachelen = 0; @@ -788,6 +789,7 @@ Rloadflats (INT32 i, INT32 w) // Set texture properties. M_Memcpy(texture->name, W_CheckNameForNumPwad(wadnum, lumpnum), sizeof(texture->name)); + texture->hash = quickncasehash(texture->name, 8); #ifndef NO_PNG_LUMPS if (Picture_IsLumpPNG(header, lumplength)) @@ -886,6 +888,7 @@ Rloadtextures (INT32 i, INT32 w) // Set texture properties. M_Memcpy(texture->name, W_CheckNameForNumPwad(wadnum, lumpnum), sizeof(texture->name)); + texture->hash = quickncasehash(texture->name, 8); #ifndef NO_PNG_LUMPS if (Picture_IsLumpPNG((UINT8 *)&patchlump, lumplength)) @@ -1401,6 +1404,7 @@ static texture_t *R_ParseTexture(boolean actuallyLoadTexture) // Allocate memory for a zero-patch texture. Obviously, we'll be adding patches momentarily. resultTexture = (texture_t *)Z_Calloc(sizeof(texture_t),PU_STATIC,NULL); M_Memcpy(resultTexture->name, newTextureName, 8); + resultTexture->hash = quickncasehash(newTextureName, 8); resultTexture->width = newTextureWidth; resultTexture->height = newTextureHeight; resultTexture->type = TEXTURETYPE_COMPOSITE; @@ -1627,19 +1631,22 @@ void R_ClearTextureNumCache(boolean btell) INT32 R_CheckTextureNumForName(const char *name) { INT32 i; + UINT32 hash; // "NoTexture" marker. if (name[0] == '-') return 0; + hash = quickncasehash(name, 8); + for (i = 0; i < tidcachelen; i++) - if (!strncasecmp(tidcache[i].name, name, 8)) + if (tidcache[i].hash == hash && !strncasecmp(tidcache[i].name, name, 8)) return tidcache[i].id; // Need to parse the list backwards, so textures loaded more recently are used in lieu of ones loaded earlier //for (i = 0; i < numtextures; i++) <- old for (i = (numtextures - 1); i >= 0; i--) // <- new - if (!strncasecmp(textures[i]->name, name, 8)) + if (textures[i]->hash == hash && !strncasecmp(textures[i]->name, name, 8)) { tidcachelen++; Z_Realloc(tidcache, tidcachelen * sizeof(*tidcache), PU_STATIC, &tidcache); @@ -1648,6 +1655,7 @@ INT32 R_CheckTextureNumForName(const char *name) #ifndef ZDEBUG CONS_Debug(DBG_SETUP, "texture #%s: %s\n", sizeu1(tidcachelen), tidcache[tidcachelen-1].name); #endif + tidcache[tidcachelen-1].hash = hash; tidcache[tidcachelen-1].id = i; return i; } diff --git a/src/r_textures.h b/src/r_textures.h index 95796d89c..69b59426a 100644 --- a/src/r_textures.h +++ b/src/r_textures.h @@ -54,6 +54,7 @@ typedef struct { // Keep name for switch changing, etc. char name[8]; + UINT32 hash; UINT8 type; // TEXTURETYPE_ INT16 width, height; boolean holes; diff --git a/src/w_wad.c b/src/w_wad.c index e49e0ce82..9c631da65 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -361,6 +361,7 @@ static lumpinfo_t* ResGetLumpsStandalone (FILE* handle, UINT16* numlumps, const lumpinfo->size = ftell(handle); fseek(handle, 0, SEEK_SET); strcpy(lumpinfo->name, lumpname); + lumpinfo->hash = quickncasehash(lumpname, 8); // Allocate the lump's long name. lumpinfo->longname = Z_Malloc(9 * sizeof(char), PU_STATIC, NULL); @@ -459,6 +460,7 @@ static lumpinfo_t* ResGetLumpsWad (FILE* handle, UINT16* nlmp, const char* filen lump_p->compression = CM_NOCOMPRESSION; memset(lump_p->name, 0x00, 9); strncpy(lump_p->name, fileinfo->name, 8); + lump_p->hash = quickncasehash(lump_p->name, 8); // Allocate the lump's long name. lump_p->longname = Z_Malloc(9 * sizeof(char), PU_STATIC, NULL); @@ -634,6 +636,7 @@ static lumpinfo_t* ResGetLumpsZip (FILE* handle, UINT16* nlmp) memset(lump_p->name, '\0', 9); // Making sure they're initialized to 0. Is it necessary? strncpy(lump_p->name, trimname, min(8, dotpos - trimname)); + lump_p->hash = quickncasehash(lump_p->name, 8); lump_p->longname = Z_Calloc(dotpos - trimname + 1, PU_STATIC, NULL); strlcpy(lump_p->longname, trimname, dotpos - trimname + 1); @@ -1225,12 +1228,14 @@ UINT16 W_CheckNumForNamePwad(const char *name, UINT16 wad, UINT16 startlump) { UINT16 i; static char uname[8 + 1]; + UINT32 hash; if (!TestValidLump(wad,0)) return INT16_MAX; strlcpy(uname, name, sizeof uname); strupr(uname); + hash = quickncasehash(uname, 8); // // scan forward @@ -1241,7 +1246,7 @@ UINT16 W_CheckNumForNamePwad(const char *name, UINT16 wad, UINT16 startlump) { lumpinfo_t *lump_p = wadfiles[wad]->lumpinfo + startlump; for (i = startlump; i < wadfiles[wad]->numlumps; i++, lump_p++) - if (!strncmp(lump_p->name, uname, sizeof(uname) - 1)) + if (lump_p->hash == hash && !strncmp(lump_p->name, uname, sizeof(uname) - 1)) return i; } @@ -1444,15 +1449,20 @@ lumpnum_t W_CheckNumForLongName(const char *name) // TODO: Make it search through cache first, maybe...? lumpnum_t W_CheckNumForMap(const char *name) { + UINT32 hash = quickncasehash(name, 8); UINT16 lumpNum, end; UINT32 i; + lumpinfo_t *p; for (i = numwadfiles - 1; i < numwadfiles; i--) { if (wadfiles[i]->type == RET_WAD) { for (lumpNum = 0; lumpNum < wadfiles[i]->numlumps; lumpNum++) - if (!strncmp(name, (wadfiles[i]->lumpinfo + lumpNum)->name, 8)) + { + p = wadfiles[i]->lumpinfo + lumpNum; + if (p->hash == hash && !strncmp(name, p->name, 8)) return (i<<16) + lumpNum; + } } else if (W_FileHasFolders(wadfiles[i])) { @@ -1463,8 +1473,11 @@ lumpnum_t W_CheckNumForMap(const char *name) continue; // Now look for the specified map. for (; lumpNum < end; lumpNum++) - if (!strnicmp(name, (wadfiles[i]->lumpinfo + lumpNum)->name, 8)) + { + p = wadfiles[i]->lumpinfo + lumpNum; + if (p->hash == hash && !strnicmp(name, p->name, 8)) return (i<<16) + lumpNum; + } } } return LUMPERROR; diff --git a/src/w_wad.h b/src/w_wad.h index a41ba1724..9b8a66aa7 100644 --- a/src/w_wad.h +++ b/src/w_wad.h @@ -67,6 +67,7 @@ typedef struct unsigned long position; // filelump_t filepos unsigned long disksize; // filelump_t size char name[9]; // filelump_t name[] e.g. "LongEntr" + UINT32 hash; char *longname; // e.g. "LongEntryName" char *fullname; // e.g. "Folder/Subfolder/LongEntryName.extension" char *diskpath; // path to the file e.g. "/usr/games/srb2/Addon/Folder/Subfolder/LongEntryName.extension" From 37add34b9c729b21e624e22d64159073c9258e25 Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 27 Jan 2022 00:28:36 -0800 Subject: [PATCH 329/377] Update texturecache user when reallocating --- src/r_textures.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/r_textures.c b/src/r_textures.c index 645a57b9b..3a7611365 100644 --- a/src/r_textures.c +++ b/src/r_textures.c @@ -1039,8 +1039,20 @@ static void R_AllocateTextures(INT32 add) // Create translation table for global animation. Z_Realloc(texturetranslation, (newtextures + 1) * sizeof(*texturetranslation), PU_STATIC, &texturetranslation); - for (i = numtextures; i < newtextures; ++i) + for (i = 0; i < numtextures; ++i) + { + // R_FlushTextureCache relies on the user for + // Z_Free, texturecache has been reallocated so the + // user is now garbage memory. + Z_SetUser(texturecache[i], + (void**)&texturecache[i]); + } + + while (i < newtextures) + { texturetranslation[i] = i; + i++; + } } static INT32 R_DefineTextures(INT32 i, UINT16 w) From e64775c8670b5d6e541027400e4ea744cac0698e Mon Sep 17 00:00:00 2001 From: spherallic Date: Wed, 2 Feb 2022 23:16:12 +0100 Subject: [PATCH 330/377] Check V_ThinStringWidth instead of strlen for level platter names. --- src/m_menu.c | 20 +++++++++++--------- src/m_menu.h | 4 ++-- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 3c1d8d7ca..367ee1590 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -5408,11 +5408,13 @@ static boolean M_PrepareLevelPlatter(INT32 gt, boolean nextmappick) if (actnum) sprintf(mapname, "%s %d", mapheaderinfo[headingIterate]->lvlttl, actnum); + else if (V_ThinStringWidth(mapheaderinfo[headingIterate]->lvlttl, 0) <= 80) + strlcpy(mapname, mapheaderinfo[headingIterate]->lvlttl, 22); else - strcpy(mapname, mapheaderinfo[headingIterate]->lvlttl); - - if (strlen(mapname) >= 17) - strcpy(mapname+17-3, "..."); + { + strlcpy(mapname, mapheaderinfo[headingIterate]->lvlttl, 15); + strcat(mapname, "..."); + } strcpy(levelselect.rows[row].mapnames[col], (const char *)mapname); } @@ -5747,7 +5749,7 @@ static void M_DrawLevelPlatterMap(UINT8 row, UINT8 col, INT32 x, INT32 y, boolea ? 159 : 63)); if (strlen(levelselect.rows[row].mapnames[col]) > 6) // "AERIAL GARDEN" vs "ACT 18" - "THE ACT" intentionally compressed - V_DrawThinString(x, y+50, (highlight ? V_YELLOWMAP : 0), levelselect.rows[row].mapnames[col]); + V_DrawThinString(x, y+50+1, (highlight ? V_YELLOWMAP : 0), levelselect.rows[row].mapnames[col]); else V_DrawString(x, y+50, (highlight ? V_YELLOWMAP : 0), levelselect.rows[row].mapnames[col]); } @@ -8748,12 +8750,12 @@ static void M_ReadSavegameInfo(UINT32 slot) if(!mapheaderinfo[(fake-1) & 8191]) savegameinfo[slot].levelname[0] = '\0'; + else if (V_ThinStringWidth(mapheaderinfo[(fake-1) & 8191]->lvlttl, 0) <= 78) + strlcpy(savegameinfo[slot].levelname, mapheaderinfo[(fake-1) & 8191]->lvlttl, 22); else { - strlcpy(savegameinfo[slot].levelname, mapheaderinfo[(fake-1) & 8191]->lvlttl, 17+1); - - if (strlen(mapheaderinfo[(fake-1) & 8191]->lvlttl) >= 17) - strcpy(savegameinfo[slot].levelname+17-3, "..."); + strlcpy(savegameinfo[slot].levelname, mapheaderinfo[(fake-1) & 8191]->lvlttl, 15); + strcat(savegameinfo[slot].levelname, "..."); } savegameinfo[slot].gamemap = fake; diff --git a/src/m_menu.h b/src/m_menu.h index ba9c326a0..e495f7f7c 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -389,9 +389,9 @@ typedef struct // level select platter typedef struct { - char header[22+5]; // mapheader_t lvltttl max length + " ZONE" + char header[22+5]; // mapheader_t lvlttl max length + " ZONE" INT32 maplist[3]; - char mapnames[3][17+1]; + char mapnames[3][22]; // lvlttl max length boolean mapavailable[4]; // mapavailable[3] == wide or not } levelselectrow_t; From 18361f5ed79279c199fb75be5c3110d5093c4db6 Mon Sep 17 00:00:00 2001 From: spherallic Date: Wed, 2 Feb 2022 23:40:10 +0100 Subject: [PATCH 331/377] Whitelist record attack, NiGHTS mode and SRB2BACK graphics. --- src/w_wad.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/w_wad.c b/src/w_wad.c index e49e0ce82..c5c6592a5 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -2481,9 +2481,15 @@ int W_VerifyNMUSlumps(const char *filename, boolean exit_on_error) {"YB_", 3}, // Intermission graphics, goes with the above {"RESULT", 6}, // Used in intermission for competitive modes, above too :3 {"RACE", 4}, // Race mode graphics, 321go + {"SRB2BACK", 8}, // MP intermission background {"M_", 2}, // Menu stuff {"LT", 2}, // Titlecard changes + {"RECATK", 6}, // Record Attack menu + {"RECCLOCK", 8}, + {"NTSATK", 6}, // NiGHTS Mode menu + {"NTSSONC", 7}, + {"SLID", 4}, // Continue {"CONT", 4}, From 61661dc900e8fd7edebb672bb9b55ed50a72e969 Mon Sep 17 00:00:00 2001 From: spherallic Date: Thu, 3 Feb 2022 11:34:05 +0100 Subject: [PATCH 332/377] Whitelist SPECTILE, NGRTIMER, and emblem/emerald hunt radar graphics. --- src/w_wad.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/w_wad.c b/src/w_wad.c index c5c6592a5..85bf0eb3d 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -2477,6 +2477,7 @@ int W_VerifyNMUSlumps(const char *filename, boolean exit_on_error) {"STLIVE", 6}, // Life graphics, background and the "X" that shows under skin's HUDNAME {"CROSHAI", 7}, // First person crosshairs {"INTERSC", 7}, // Default intermission backgrounds (co-op) + {"SPECTILE", 8}, // Special stage intermission background {"STT", 3}, // Acceptable HUD changes (Score Time Rings) {"YB_", 3}, // Intermission graphics, goes with the above {"RESULT", 6}, // Used in intermission for competitive modes, above too :3 @@ -2484,6 +2485,8 @@ int W_VerifyNMUSlumps(const char *filename, boolean exit_on_error) {"SRB2BACK", 8}, // MP intermission background {"M_", 2}, // Menu stuff {"LT", 2}, // Titlecard changes + {"HOMING", 6}, // Emerald hunt radar + {"HOMITM", 6}, // Emblem radar {"RECATK", 6}, // Record Attack menu {"RECCLOCK", 8}, @@ -2512,6 +2515,7 @@ int W_VerifyNMUSlumps(const char *filename, boolean exit_on_error) {"DRILL", 5}, {"GRADE", 5}, {"MINUS5", 6}, + {"NGRTIMER", 8}, // NiGHTS Mode timer {"MUSICDEF", 8}, // Song definitions (thanks kart) {"SHADERS", 7}, // OpenGL shader definitions From 52f3e00497ac020fcc63f50639d4d889138288a6 Mon Sep 17 00:00:00 2001 From: spherallic Date: Thu, 3 Feb 2022 14:38:45 +0100 Subject: [PATCH 333/377] Whitelist CHARFG, CHARFG, and level select graphics. --- src/w_wad.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/w_wad.c b/src/w_wad.c index 85bf0eb3d..eff1899bc 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -2466,6 +2466,10 @@ int W_VerifyNMUSlumps(const char *filename, boolean exit_on_error) {"STNONEX", 7}, // "X" graphic {"ULTIMATE", 8}, // Ultimate no-save + {"SLCT", 4}, // Level select "cursor" + {"LSSTATIC", 8}, // Level select static + {"BLANKLV", 7}, // "?" level images + {"CRFNT", 5}, // Sonic 1 font changes {"NTFNT", 5}, // Character Select font changes {"NTFNO", 5}, // Character Select font (outline) @@ -2488,6 +2492,8 @@ int W_VerifyNMUSlumps(const char *filename, boolean exit_on_error) {"HOMING", 6}, // Emerald hunt radar {"HOMITM", 6}, // Emblem radar + {"CHARFG", 6}, // Character select menu + {"CHARBG", 6}, {"RECATK", 6}, // Record Attack menu {"RECCLOCK", 8}, {"NTSATK", 6}, // NiGHTS Mode menu From 2033b77b46b55802dd9f5634fec2d5783d494348 Mon Sep 17 00:00:00 2001 From: SMS Alfredo <65426124+SMS-Alfredo@users.noreply.github.com> Date: Fri, 11 Feb 2022 00:33:49 -0600 Subject: [PATCH 334/377] Actually do the thing --- src/p_user.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/p_user.c b/src/p_user.c index 83eb4ea02..d69c57565 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2036,12 +2036,22 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj) ghost->angle = (mobj->player ? mobj->player->drawangle : mobj->angle); ghost->rollangle = mobj->rollangle; + ghost->sprite = mobj->sprite; ghost->sprite2 = mobj->sprite2; ghost->frame = mobj->frame; ghost->tics = -1; ghost->frame &= ~FF_TRANSMASK; ghost->frame |= tr_trans50<renderflags = mobj->renderflags; + ghost->blendmode = mobj->blendmode; + + ghost->spritexscale = mobj->spritexscale; + ghost->spriteyscale = mobj->spriteyscale; + ghost->spritexoffset = mobj->spritexoffset; + ghost->spriteyoffset = mobj->spriteyoffset; + ghost->fuse = ghost->info->damage; ghost->skin = mobj->skin; From 8c1991d6746a38462adb7a9e073afb3751304726 Mon Sep 17 00:00:00 2001 From: aiire <1050-aiire@users.noreply.git.do.srb2.org> Date: Fri, 4 Mar 2022 02:57:45 +0000 Subject: [PATCH 335/377] added FF_FULLBRIGHT to S_IVSP --- src/info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/info.c b/src/info.c index 20f0dfe4f..d21c881de 100644 --- a/src/info.c +++ b/src/info.c @@ -2941,7 +2941,7 @@ state_t states[NUMSTATES] = {SPR_SSPK, FF_ANIMATE, -1, {NULL}, 1, 2, S_NULL}, // S_THUNDERCOIN_SPARK // Invincibility Sparkles - {SPR_IVSP, FF_ANIMATE, 32, {NULL}, 31, 1, S_NULL}, // S_IVSP + {SPR_IVSP, FF_ANIMATE|FF_FULLBRIGHT, 32, {NULL}, 31, 1, S_NULL}, // S_IVSP // Super Sonic Spark {SPR_SSPK, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_SSPK2}, // S_SSPK1 From 6040f97dd583f64b6611751a13101b47ab1a2420 Mon Sep 17 00:00:00 2001 From: aiire <1050-aiire@users.noreply.git.do.srb2.org> Date: Fri, 4 Mar 2022 23:25:25 +0000 Subject: [PATCH 336/377] added FF_FULLBRIGHT to S_THUNDERCOIN_SPARK --- src/info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/info.c b/src/info.c index d21c881de..73cf22184 100644 --- a/src/info.c +++ b/src/info.c @@ -2938,7 +2938,7 @@ state_t states[NUMSTATES] = {SPR_NULL, 0, 15*2, {NULL}, 0, 0, S_ZAPSB2 }, // S_ZAPSB11 // Thunder spark - {SPR_SSPK, FF_ANIMATE, -1, {NULL}, 1, 2, S_NULL}, // S_THUNDERCOIN_SPARK + {SPR_SSPK, FF_ANIMATE|FF_FULLBRIGHT, -1, {NULL}, 1, 2, S_NULL}, // S_THUNDERCOIN_SPARK // Invincibility Sparkles {SPR_IVSP, FF_ANIMATE|FF_FULLBRIGHT, 32, {NULL}, 31, 1, S_NULL}, // S_IVSP From 6ef7221e38fa0f68a53936b0e841a8145ebd6f25 Mon Sep 17 00:00:00 2001 From: spherallic Date: Wed, 9 Mar 2022 00:49:24 +0100 Subject: [PATCH 337/377] A few drop shadow-related additions: - Added A_SetShadowScale - Added A_ShadowScream which combines the above with A_Scream, used for badnik explosions - Gave flickies drop shadows --- src/deh_tables.c | 2 ++ src/info.c | 26 +++++++++++++------------- src/info.h | 4 ++++ src/p_enemy.c | 41 +++++++++++++++++++++++++++++++++++++++++ src/p_mobj.c | 23 ++++++++++++++++++++++- 5 files changed, 82 insertions(+), 14 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index 4412206f8..8dbe314cc 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -91,6 +91,8 @@ actionpointer_t actionpointers[] = {{A_FaceTracer}, "A_FACETRACER"}, {{A_Scream}, "A_SCREAM"}, {{A_BossDeath}, "A_BOSSDEATH"}, + {{A_SetShadowScale}, "A_SETSHADOWSCALE"}, + {{A_ShadowScream}, "A_SHADOWSCREAM"}, {{A_CustomPower}, "A_CUSTOMPOWER"}, {{A_GiveWeapon}, "A_GIVEWEAPON"}, {{A_RingBox}, "A_RINGBOX"}, diff --git a/src/info.c b/src/info.c index 3f0f5361f..717ada313 100644 --- a/src/info.c +++ b/src/info.c @@ -3936,23 +3936,23 @@ state_t states[NUMSTATES] = {SPR_SPRK, FF_TRANS20|FF_ANIMATE|9, 18, {NULL}, 8, 2, S_NULL}, // S_SPRK3 // Robot Explosion - {SPR_BOM1, 0, 0, {A_FlickySpawn}, 0, 0, S_XPLD1}, // S_XPLD_FLICKY - {SPR_BOM1, 0, 2, {A_Scream}, 0, 0, S_XPLD2}, // S_XPLD1 - {SPR_BOM1, 1, 2, {NULL}, 0, 0, S_XPLD3}, // S_XPLD2 - {SPR_BOM1, 2, 3, {NULL}, 0, 0, S_XPLD4}, // S_XPLD3 - {SPR_BOM1, 3, 3, {NULL}, 0, 0, S_XPLD5}, // S_XPLD4 - {SPR_BOM1, 4, 4, {NULL}, 0, 0, S_XPLD6}, // S_XPLD5 - {SPR_BOM1, 5, 4, {NULL}, 0, 0, S_NULL}, // S_XPLD6 + {SPR_BOM1, 0, 0, {A_FlickySpawn}, 0, 0, S_XPLD1}, // S_XPLD_FLICKY + {SPR_BOM1, 0, 2, {A_ShadowScream}, 0, 0, S_XPLD2}, // S_XPLD1 + {SPR_BOM1, 1, 2, {NULL}, 0, 0, S_XPLD3}, // S_XPLD2 + {SPR_BOM1, 2, 3, {NULL}, 0, 0, S_XPLD4}, // S_XPLD3 + {SPR_BOM1, 3, 3, {NULL}, 0, 0, S_XPLD5}, // S_XPLD4 + {SPR_BOM1, 4, 4, {NULL}, 0, 0, S_XPLD6}, // S_XPLD5 + {SPR_BOM1, 5, 4, {NULL}, 0, 0, S_NULL}, // S_XPLD6 {SPR_BOM1, FF_ANIMATE, 21, {NULL}, 5, 4, S_INVISIBLE}, // S_XPLD_EGGTRAP // Underwater Explosion - {SPR_BOM4, 0, 3, {A_Scream}, 0, 0, S_WPLD2}, // S_WPLD1 - {SPR_BOM4, 1, 3, {NULL}, 0, 0, S_WPLD3}, // S_WPLD2 - {SPR_BOM4, 2, 3, {NULL}, 0, 0, S_WPLD4}, // S_WPLD3 - {SPR_BOM4, 3, 3, {NULL}, 0, 0, S_WPLD5}, // S_WPLD4 - {SPR_BOM4, 4, 3, {NULL}, 0, 0, S_WPLD6}, // S_WPLD5 - {SPR_BOM4, 5, 3, {NULL}, 0, 0, S_NULL}, // S_WPLD6 + {SPR_BOM4, 0, 3, {A_ShadowScream}, 0, 0, S_WPLD2}, // S_WPLD1 + {SPR_BOM4, 1, 3, {NULL}, 0, 0, S_WPLD3}, // S_WPLD2 + {SPR_BOM4, 2, 3, {NULL}, 0, 0, S_WPLD4}, // S_WPLD3 + {SPR_BOM4, 3, 3, {NULL}, 0, 0, S_WPLD5}, // S_WPLD4 + {SPR_BOM4, 4, 3, {NULL}, 0, 0, S_WPLD6}, // S_WPLD5 + {SPR_BOM4, 5, 3, {NULL}, 0, 0, S_NULL}, // S_WPLD6 {SPR_DUST, FF_TRANS40, 4, {NULL}, 0, 0, S_DUST2}, // S_DUST1 {SPR_DUST, 1|FF_TRANS50, 5, {NULL}, 0, 0, S_DUST3}, // S_DUST2 diff --git a/src/info.h b/src/info.h index 9aa26a97a..1b7a201ce 100644 --- a/src/info.h +++ b/src/info.h @@ -44,6 +44,8 @@ enum actionnum A_FACETRACER, A_SCREAM, A_BOSSDEATH, + A_SETSHADOWSCALE, + A_SHADOWSCREAM, A_CUSTOMPOWER, A_GIVEWEAPON, A_RINGBOX, @@ -312,6 +314,8 @@ void A_FaceTarget(); void A_FaceTracer(); void A_Scream(); void A_BossDeath(); +void A_SetShadowScale(); +void A_ShadowScream(); // MARIA!!!!!! void A_CustomPower(); // Use this for a custom power void A_GiveWeapon(); // Gives the player weapon(s) void A_RingBox(); // Obtained Ring Box Tails diff --git a/src/p_enemy.c b/src/p_enemy.c index 26682ee32..a4ba42c48 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -107,6 +107,8 @@ void A_GoldMonitorRestore(mobj_t *actor); void A_GoldMonitorSparkle(mobj_t *actor); void A_Explode(mobj_t *actor); void A_BossDeath(mobj_t *actor); +void A_SetShadowScale(mobj_t *actor); +void A_ShadowScream(mobj_t *actor); void A_CustomPower(mobj_t *actor); void A_GiveWeapon(mobj_t *actor); void A_RingBox(mobj_t *actor); @@ -4169,6 +4171,45 @@ bossjustdie: } } +// Function: A_SetShadowScale +// +// Description: Sets the target's shadowscale. +// +// var1 = new fixed_t shadowscale (default = FRACUNIT) +// var2 = unused +// +void A_SetShadowScale(mobj_t *actor) +{ + INT32 locvar1 = var1; + INT32 locvar2 = var2; + + if (LUA_CallAction(A_SETSHADOWSCALE, actor)) + return; + + actor->shadowscale = locvar1; +} + + +// Function: A_ShadowScream +// +// Description: Sets the target's shadowscale and starts the death sound of the object. +// +// var1 = new fixed_t shadowscale (default = FRACUNIT) +// var2 = unused +// +void A_ShadowScream(mobj_t *actor) +{ + INT32 locvar1 = var1; + INT32 locvar2 = var2; + + if (LUA_CallAction(A_SHADOWSCREAM, actor)) + return; + + A_SetShadowScale(actor); + A_Scream(actor); +} + + // Function: A_CustomPower // // Description: Provides a custom powerup. Target (must be a player) is awarded the powerup. Reactiontime of the object is used as an index to the powers array. diff --git a/src/p_mobj.c b/src/p_mobj.c index 17be0300a..301b7564d 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10456,6 +10456,27 @@ static fixed_t P_DefaultMobjShadowScale (mobj_t *thing) return 2*FRACUNIT/3; + case MT_FLICKY_01: + case MT_FLICKY_02: + case MT_FLICKY_03: + case MT_FLICKY_04: + case MT_FLICKY_05: + case MT_FLICKY_06: + case MT_FLICKY_07: + case MT_FLICKY_08: + case MT_FLICKY_09: + case MT_FLICKY_10: + case MT_FLICKY_11: + case MT_FLICKY_12: + case MT_FLICKY_13: + case MT_FLICKY_14: + case MT_FLICKY_15: + case MT_FLICKY_16: + case MT_SECRETFLICKY_01: + case MT_SECRETFLICKY_02: + + return FRACUNIT; + default: if (thing->flags & (MF_ENEMY|MF_BOSS)) @@ -10477,7 +10498,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) if (type == MT_NULL) { -#if 0 +#if 0 #ifdef PARANOIA I_Error("Tried to spawn MT_NULL\n"); #endif From 3eaae066ef891d9f81d5f787e88f89d89b5af4d5 Mon Sep 17 00:00:00 2001 From: SteelT Date: Tue, 8 Mar 2022 21:06:01 -0500 Subject: [PATCH 338/377] Show overall grade emblem requirement of a multi-mare NiGHTS stage in SP pause menu Fixes #71 --- src/m_menu.c | 2 +- src/p_setup.c | 11 +++++++++++ src/p_setup.h | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/m_menu.c b/src/m_menu.c index 5b85f65df..fdff4a0a1 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -4751,7 +4751,7 @@ static void M_DrawPauseMenu(void) emblemslot = 2; break; case ET_NGRADE: - snprintf(targettext, 9, "%u", P_GetScoreForGrade(gamemap, 0, emblem->var)); + snprintf(targettext, 9, "%u", P_GetScoreForGradeOverall(gamemap, emblem->var)); snprintf(currenttext, 9, "%u", G_GetBestNightsScore(gamemap, 0)); targettext[8] = 0; diff --git a/src/p_setup.c b/src/p_setup.c index a1c96bed3..bdcb3b217 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -508,6 +508,17 @@ UINT32 P_GetScoreForGrade(INT16 map, UINT8 mare, UINT8 grade) return mapheaderinfo[map-1]->grades[mare].grade[grade-1]; } +UINT32 P_GetScoreForGradeOverall(INT16 map, UINT8 grade) +{ + UINT8 mares; + INT32 i; + UINT32 score = 0; + mares = mapheaderinfo[map-1]->numGradedMares; + for (i = 0; i < mares; ++i) + score += P_GetScoreForGrade(map, i, grade); + return score; +} + // // levelflats // diff --git a/src/p_setup.h b/src/p_setup.h index 9cb44ed59..d0c47a521 100644 --- a/src/p_setup.h +++ b/src/p_setup.h @@ -122,5 +122,6 @@ void P_AddGradesForMare(INT16 i, UINT8 mare, char *gtext); UINT8 P_GetGrade(UINT32 pscore, INT16 map, UINT8 mare); UINT8 P_HasGrades(INT16 map, UINT8 mare); UINT32 P_GetScoreForGrade(INT16 map, UINT8 mare, UINT8 grade); +UINT32 P_GetScoreForGradeOverall(INT16 map, UINT8 grade); #endif From c782e817007dddc868f2104aa84b751f9ef89294 Mon Sep 17 00:00:00 2001 From: spherallic Date: Sat, 12 Mar 2022 17:44:37 +0100 Subject: [PATCH 339/377] Give MT_METALSONIC_RACE a drop shadow & removed unused vars. --- src/p_enemy.c | 4 ---- src/p_mobj.c | 1 + 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index a4ba42c48..87aa5ff2f 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -4181,7 +4181,6 @@ bossjustdie: void A_SetShadowScale(mobj_t *actor) { INT32 locvar1 = var1; - INT32 locvar2 = var2; if (LUA_CallAction(A_SETSHADOWSCALE, actor)) return; @@ -4199,9 +4198,6 @@ void A_SetShadowScale(mobj_t *actor) // void A_ShadowScream(mobj_t *actor) { - INT32 locvar1 = var1; - INT32 locvar2 = var2; - if (LUA_CallAction(A_SHADOWSCREAM, actor)) return; diff --git a/src/p_mobj.c b/src/p_mobj.c index 301b7564d..ad329a582 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10412,6 +10412,7 @@ static fixed_t P_DefaultMobjShadowScale (mobj_t *thing) switch (thing->type) { case MT_PLAYER: + case MT_METALSONIC_RACE: case MT_ROLLOUTROCK: case MT_EGGMOBILE4_MACE: From bd2d763bd0529458e711d8de02844bbe961d1cbb Mon Sep 17 00:00:00 2001 From: spherallic Date: Sun, 13 Mar 2022 12:34:17 +0100 Subject: [PATCH 340/377] Fix Minus & debris behavior in reverse gravity. --- src/p_mobj.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 17be0300a..9f8b11e7a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7864,7 +7864,8 @@ static void P_MobjSceneryThink(mobj_t *mobj) case MT_WOODDEBRIS: case MT_BRICKDEBRIS: case MT_BROKENROBOT: - if (mobj->z <= P_FloorzAtPos(mobj->x, mobj->y, mobj->z, mobj->height) + if (((!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z <= P_FloorzAtPos(mobj->x, mobj->y, mobj->z, mobj->height)) + || (mobj->eflags & MFE_VERTICALFLIP && mobj->z + mobj->height >= P_CeilingzAtPos(mobj->x, mobj->y, mobj->z, mobj->height))) && mobj->state != &states[mobj->info->deathstate]) { P_SetMobjState(mobj, mobj->info->deathstate); @@ -9723,7 +9724,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if (P_IsObjectOnGround(mobj)) mobj->rollangle = 0; else - mobj->rollangle = R_PointToAngle2(0, 0, mobj->momz, (mobj->scale << 1) - min(abs(mobj->momz), mobj->scale << 1)); + mobj->rollangle = R_PointToAngle2(0, 0, P_MobjFlip(mobj)*mobj->momz, (mobj->scale << 1) - min(abs(mobj->momz), mobj->scale << 1)); break; case MT_SPINFIRE: if (mobj->flags & MF_NOGRAVITY) From 29892a5f0c26f869e57587a524c9be1a02394c50 Mon Sep 17 00:00:00 2001 From: spherallic Date: Sun, 13 Mar 2022 14:22:22 +0100 Subject: [PATCH 341/377] Update README.txt again --- assets/README.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/assets/README.txt b/assets/README.txt index e84fa4b5e..5480cb7b0 100644 --- a/assets/README.txt +++ b/assets/README.txt @@ -2,7 +2,7 @@ SONIC ROBO BLAST 2 Sonic Robo Blast 2 (SRB2) is a 3D Sonic the Hedgehog fangame, based on a modified version of Doom Legacy. -https://srb2.org +https://www.srb2.org LICENSE @@ -43,6 +43,8 @@ Design and content in Sonic Robo Blast 2 is copyright 1998-2022 by Sonic Team Jr All original material in this game is copyrighted by their respective owners, and no copyright infringement is intended. Sonic Team Jr. is in no way affiliated with SEGA or Sonic Team, and we do not claim ownership of any of SEGA's intellectual property used in SRB2. -Sonic Robo Blast 2 is not commercial software. If you purchased this game, you have been scammed! Sonic Team Jr.'s staff makes no profit whatsoever (in fact, we lose money). +Sonic Robo Blast 2 is not commercial software. If you purchased this game, you have been scammed! Sonic Team Jr.'s staff makes no profit whatsoever (in fact, we lose money). + +The owner of the srb2.org domain is only acting as an ISP, and is therefore not responsible for any content on srb2.org under the 1998 DMCA. Sonic Team Jr. assumes no responsibility for the content on any Sonic Team Jr. fan sites. This software is provided as-is with no warranty whatsoever. From 9769ad48e0a4da797ba0c3aa0fd97bf332dff7d7 Mon Sep 17 00:00:00 2001 From: spherallic Date: Tue, 15 Mar 2022 13:12:56 +0100 Subject: [PATCH 342/377] Prevent Hangsters from sliding across the ceiling. --- src/p_mobj.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 17be0300a..8cc91c18e 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8433,7 +8433,10 @@ static boolean P_HangsterThink(mobj_t *mobj) } //after swooping back up, check for ceiling else if ((st == S_HANGSTER_RETURN1 || st == S_HANGSTER_RETURN2) && mobj->momz == 0 && mobj->ceilingz == (mobj->z + mobj->height)) + { P_SetMobjState(mobj, (st = S_HANGSTER_RETURN3)); + mobj->momx = mobj->momy = 0; + } //should you roost on a ceiling with F_SKY1 as its flat, disappear forever if (st == S_HANGSTER_RETURN3 && mobj->momz == 0 && mobj->ceilingz == (mobj->z + mobj->height) @@ -10477,7 +10480,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) if (type == MT_NULL) { -#if 0 +#if 0 #ifdef PARANOIA I_Error("Tried to spawn MT_NULL\n"); #endif From bca90893d27423e176c9a6136c354a2e1faffdb5 Mon Sep 17 00:00:00 2001 From: Zwip-Zwap Zapony Date: Sun, 20 Mar 2022 09:52:47 +0100 Subject: [PATCH 343/377] Fix Ideya Capture sometimes stealing extra spheres Also clean up redundant "startingspheres" variable --- src/p_user.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 1f14d96c1..1b16064ca 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -6695,7 +6695,7 @@ static void P_NightsTransferPoints(player_t *player, fixed_t xspeed, fixed_t rad // static void P_DoNiGHTSCapsule(player_t *player) { - INT32 i, spherecount, totalduration, popduration, deductinterval, deductquantity, sphereresult, firstpoptic, startingspheres; + INT32 i, spherecount, totalduration, popduration, deductinterval, deductquantity, sphereresult, firstpoptic; INT32 tictimer = ++player->capsule->extravalue2; if (abs(player->mo->x-player->capsule->x) <= 3*FRACUNIT) @@ -6820,13 +6820,19 @@ static void P_DoNiGHTSCapsule(player_t *player) { player->spheres -= deductquantity; player->capsule->health -= deductquantity; + + // If spherecount isn't a multiple of deductquantity, the final deduction might steal too many spheres from the player + // E.g. with 80 capsule health, deductquantity is 3, 3*26 is 78, 78+3=81, and then it'll have stolen more than the 80 that it was meant to! + // So let's check for that and unsteal the extra ones ~Zwip-Zwap Zapony, 2022-20-03 + if (player->capsule->health < sphereresult) + { + player->spheres += sphereresult - player->capsule->health; // Give the player the "stolen" spheres back + player->capsule->health = sphereresult; // Un-deduct the capsule health by the "stolen" spheres. Often, this just sets it to 0 + } + + if (player->spheres < 0) // This probably can't happen, since we give the "stolen" spheres back, but better safe than sorry + player->spheres = 0; } - - if (player->spheres < 0) - player->spheres = 0; - - if (player->capsule->health < sphereresult) - player->capsule->health = sphereresult; } // Spawn a 'pop' for every 2 tics @@ -6847,9 +6853,8 @@ static void P_DoNiGHTSCapsule(player_t *player) } else { - startingspheres = player->spheres - player->capsule->health; + player->spheres -= player->capsule->health; player->capsule->health = 0; - player->spheres = startingspheres; } } From 7fdebdcdb9fb0cf2378543f8e8f54ae4714756a3 Mon Sep 17 00:00:00 2001 From: Zwip-Zwap Zapony Date: Sun, 20 Mar 2022 13:18:22 +0100 Subject: [PATCH 344/377] Suggested optimization --- src/p_user.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 1b16064ca..f2ff7efc6 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -6818,20 +6818,19 @@ static void P_DoNiGHTSCapsule(player_t *player) if (player->capsule->health > sphereresult && player->spheres > 0) { + // If spherecount isn't a multiple of deductquantity, the final deduction might steal too many spheres from the player + // E.g. with 80 capsule health, deductquantity is 3, 3*26 is 78, 78+3=81, and then it'll have stolen more than the 80 that it was meant to! + // So let's adjust deductquantity accordingly for the final deduction + deductquantity = min(deductquantity, player->capsule->health - sphereresult); + player->spheres -= deductquantity; player->capsule->health -= deductquantity; - // If spherecount isn't a multiple of deductquantity, the final deduction might steal too many spheres from the player - // E.g. with 80 capsule health, deductquantity is 3, 3*26 is 78, 78+3=81, and then it'll have stolen more than the 80 that it was meant to! - // So let's check for that and unsteal the extra ones ~Zwip-Zwap Zapony, 2022-20-03 - if (player->capsule->health < sphereresult) - { - player->spheres += sphereresult - player->capsule->health; // Give the player the "stolen" spheres back - player->capsule->health = sphereresult; // Un-deduct the capsule health by the "stolen" spheres. Often, this just sets it to 0 - } - - if (player->spheres < 0) // This probably can't happen, since we give the "stolen" spheres back, but better safe than sorry + if (player->spheres < 0) // This can't happen... without Lua, setrings, et cetera player->spheres = 0; + + //if (player->capsule->health < sphereresult) // This can't happen + //player->capsule->health = sphereresult; } } From 4f9ac9edb818fa0035738d449847d46b6efe1412 Mon Sep 17 00:00:00 2001 From: Lactozilla <73-LZA@users.noreply.git.do.srb2.org> Date: Mon, 21 Mar 2022 22:40:24 +0000 Subject: [PATCH 345/377] Drop shadow fake floor/ceiling fix --- src/hardware/hw_main.c | 33 +++++++++-- src/r_things.c | 126 +++++++++++++++++++++++++++-------------- 2 files changed, 110 insertions(+), 49 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index e0851af85..2bf7025ec 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3614,6 +3614,7 @@ static void HWR_DrawDropShadow(mobj_t *thing, fixed_t scale) FBITFIELD blendmode = PF_Translucent|PF_Modulated; INT32 shader = SHADER_DEFAULT; UINT8 i; + INT32 heightsec, phs; SINT8 flip = P_MobjFlip(thing); INT32 light; @@ -3626,7 +3627,23 @@ static void HWR_DrawDropShadow(mobj_t *thing, fixed_t scale) groundz = R_GetShadowZ(thing, &groundslope); - //if (abs(groundz - gl_viewz) / tz > 4) return; // Prevent stretchy shadows and possible crashes + heightsec = thing->subsector->sector->heightsec; + if (viewplayer->mo && viewplayer->mo->subsector) + phs = viewplayer->mo->subsector->sector->heightsec; + else + phs = -1; + + if (heightsec != -1 && phs != -1) // only clip things which are in special sectors + { + if (gl_viewz < FIXED_TO_FLOAT(sectors[phs].floorheight) ? + thing->z >= sectors[heightsec].floorheight : + thing->z < sectors[heightsec].floorheight) + return; + if (gl_viewz > FIXED_TO_FLOAT(sectors[phs].ceilingheight) ? + thing->z < sectors[heightsec].ceilingheight && gl_viewz >= FIXED_TO_FLOAT(sectors[heightsec].ceilingheight) : + thing->z >= sectors[heightsec].ceilingheight) + return; + } floordiff = abs((flip < 0 ? thing->height : 0) + thing->z - groundz); @@ -5259,13 +5276,19 @@ static void HWR_ProjectSprite(mobj_t *thing) if (heightsec != -1 && phs != -1) // only clip things which are in special sectors { + float top = gzt; + float bottom = FIXED_TO_FLOAT(thing->z); + + if (R_ThingIsFloorSprite(thing)) + top = bottom; + if (gl_viewz < FIXED_TO_FLOAT(sectors[phs].floorheight) ? - FIXED_TO_FLOAT(thing->z) >= FIXED_TO_FLOAT(sectors[heightsec].floorheight) : - gzt < FIXED_TO_FLOAT(sectors[heightsec].floorheight)) + bottom >= FIXED_TO_FLOAT(sectors[heightsec].floorheight) : + top < FIXED_TO_FLOAT(sectors[heightsec].floorheight)) return; if (gl_viewz > FIXED_TO_FLOAT(sectors[phs].ceilingheight) ? - gzt < FIXED_TO_FLOAT(sectors[heightsec].ceilingheight) && gl_viewz >= FIXED_TO_FLOAT(sectors[heightsec].ceilingheight) : - FIXED_TO_FLOAT(thing->z) >= FIXED_TO_FLOAT(sectors[heightsec].ceilingheight)) + top < FIXED_TO_FLOAT(sectors[heightsec].ceilingheight) && gl_viewz >= FIXED_TO_FLOAT(sectors[heightsec].ceilingheight) : + bottom >= FIXED_TO_FLOAT(sectors[heightsec].ceilingheight)) return; } diff --git a/src/r_things.c b/src/r_things.c index ea57e4086..6c510c68d 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1265,6 +1265,7 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale, vissprite_t *shadow; patch_t *patch; fixed_t xscale, yscale, shadowxscale, shadowyscale, shadowskew, x1, x2; + INT32 heightsec, phs; INT32 light = 0; fixed_t scalemul; UINT8 trans; fixed_t floordiff; @@ -1276,6 +1277,24 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale, if (abs(groundz-viewz)/tz > 4) return; // Prevent stretchy shadows and possible crashes + heightsec = thing->subsector->sector->heightsec; + if (viewplayer->mo && viewplayer->mo->subsector) + phs = viewplayer->mo->subsector->sector->heightsec; + else + phs = -1; + + if (heightsec != -1 && phs != -1) // only clip things which are in special sectors + { + if (viewz < sectors[phs].floorheight ? + groundz >= sectors[heightsec].floorheight : + groundz < sectors[heightsec].floorheight) + return; + if (viewz > sectors[phs].ceilingheight ? + groundz < sectors[heightsec].ceilingheight && viewz >= sectors[heightsec].ceilingheight : + groundz >= sectors[heightsec].ceilingheight) + return; + } + floordiff = abs((isflipped ? thing->height : 0) + thing->z - groundz); trans = floordiff / (100*FRACUNIT) + 3; @@ -1926,13 +1945,19 @@ static void R_ProjectSprite(mobj_t *thing) if (heightsec != -1 && phs != -1) // only clip things which are in special sectors { + fixed_t top = gzt; + fixed_t bottom = thing->z; + + if (splat) + top = bottom; + if (viewz < sectors[phs].floorheight ? - thing->z >= sectors[heightsec].floorheight : - gzt < sectors[heightsec].floorheight) + bottom >= sectors[heightsec].floorheight : + top < sectors[heightsec].floorheight) return; if (viewz > sectors[phs].ceilingheight ? - gzt < sectors[heightsec].ceilingheight && viewz >= sectors[heightsec].ceilingheight : - thing->z >= sectors[heightsec].ceilingheight) + top < sectors[heightsec].ceilingheight && viewz >= sectors[heightsec].ceilingheight : + bottom >= sectors[heightsec].ceilingheight) return; } @@ -2801,6 +2826,57 @@ static void R_DrawPrecipitationSprite(vissprite_t *spr) R_DrawPrecipitationVisSprite(spr); } +//SoM: 3/17/2000: Clip sprites in water. +static void R_HeightSecClip(vissprite_t *spr, INT32 x1, INT32 x2) +{ + fixed_t mh, h; + INT32 x, phs; + + if (spr->heightsec == -1) + return; + + if (spr->cut & (SC_SPLAT | SC_SHADOW) || spr->renderflags & RF_SHADOWDRAW) + return; + + phs = viewplayer->mo->subsector->sector->heightsec; + + if ((mh = sectors[spr->heightsec].floorheight) > spr->gz && + (h = centeryfrac - FixedMul(mh -= viewz, spr->sortscale)) >= 0 && + (h >>= FRACBITS) < viewheight) + { + if (mh <= 0 || (phs != -1 && viewz > sectors[phs].floorheight)) + { // clip bottom + for (x = x1; x <= x2; x++) + if (spr->clipbot[x] == -2 || h < spr->clipbot[x]) + spr->clipbot[x] = (INT16)h; + } + else // clip top + { + for (x = x1; x <= x2; x++) + if (spr->cliptop[x] == -2 || h > spr->cliptop[x]) + spr->cliptop[x] = (INT16)h; + } + } + + if ((mh = sectors[spr->heightsec].ceilingheight) < spr->gzt && + (h = centeryfrac - FixedMul(mh-viewz, spr->sortscale)) >= 0 && + (h >>= FRACBITS) < viewheight) + { + if (phs != -1 && viewz >= sectors[phs].ceilingheight) + { // clip bottom + for (x = x1; x <= x2; x++) + if (spr->clipbot[x] == -2 || h < spr->clipbot[x]) + spr->clipbot[x] = (INT16)h; + } + else // clip top + { + for (x = x1; x <= x2; x++) + if (spr->cliptop[x] == -2 || h > spr->cliptop[x]) + spr->cliptop[x] = (INT16)h; + } + } +} + // R_ClipVisSprite // Clips vissprites without drawing, so that portals can work. -Red void R_ClipVisSprite(vissprite_t *spr, INT32 x1, INT32 x2, drawseg_t* dsstart, portal_t* portal) @@ -2902,47 +2978,9 @@ void R_ClipVisSprite(vissprite_t *spr, INT32 x1, INT32 x2, drawseg_t* dsstart, p } } } - //SoM: 3/17/2000: Clip sprites in water. - if (spr->heightsec != -1) // only things in specially marked sectors - { - fixed_t mh, h; - INT32 phs = viewplayer->mo->subsector->sector->heightsec; - if ((mh = sectors[spr->heightsec].floorheight) > spr->gz && - (h = centeryfrac - FixedMul(mh -= viewz, spr->sortscale)) >= 0 && - (h >>= FRACBITS) < viewheight) - { - if (mh <= 0 || (phs != -1 && viewz > sectors[phs].floorheight)) - { // clip bottom - for (x = x1; x <= x2; x++) - if (spr->clipbot[x] == -2 || h < spr->clipbot[x]) - spr->clipbot[x] = (INT16)h; - } - else // clip top - { - for (x = x1; x <= x2; x++) - if (spr->cliptop[x] == -2 || h > spr->cliptop[x]) - spr->cliptop[x] = (INT16)h; - } - } - if ((mh = sectors[spr->heightsec].ceilingheight) < spr->gzt && - (h = centeryfrac - FixedMul(mh-viewz, spr->sortscale)) >= 0 && - (h >>= FRACBITS) < viewheight) - { - if (phs != -1 && viewz >= sectors[phs].ceilingheight) - { // clip bottom - for (x = x1; x <= x2; x++) - if (spr->clipbot[x] == -2 || h < spr->clipbot[x]) - spr->clipbot[x] = (INT16)h; - } - else // clip top - { - for (x = x1; x <= x2; x++) - if (spr->cliptop[x] == -2 || h > spr->cliptop[x]) - spr->cliptop[x] = (INT16)h; - } - } - } + R_HeightSecClip(spr, x1, x2); + if (spr->cut & SC_TOP && spr->cut & SC_BOTTOM) { for (x = x1; x <= x2; x++) From 8c62a0d640c4e556db8018ac93cac5fb9578ff37 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Tue, 22 Mar 2022 05:53:21 -0400 Subject: [PATCH 346/377] Fix papersprites being rotated incorrectly in Software when viewing them on the flipped side --- src/r_things.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/r_things.c b/src/r_things.c index 1179b9f4d..db4263a6a 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1611,7 +1611,16 @@ static void R_ProjectSprite(mobj_t *thing) if (thing->rollangle && !(splat && !(thing->renderflags & RF_NOSPLATROLLANGLE))) { - rollangle = R_GetRollAngle(thing->rollangle); + if (papersprite && ang >= ANGLE_180) + { + // Makes Software act much more sane like OpenGL + rollangle = R_GetRollAngle(InvAngle(thing->rollangle)); + } + else + { + rollangle = R_GetRollAngle(thing->rollangle); + } + rotsprite = Patch_GetRotatedSprite(sprframe, (thing->frame & FF_FRAMEMASK), rot, flip, false, sprinfo, rollangle); if (rotsprite != NULL) From 3581d06012de1eda92ae4b7ea49c3698244bef1c Mon Sep 17 00:00:00 2001 From: Jaime Ita Passos Date: Fri, 8 Apr 2022 16:01:41 -0300 Subject: [PATCH 347/377] Fix frame blend flags not working with 3D models --- src/hardware/hw_md2.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index d546e2f7f..e765656ca 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1346,12 +1346,18 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) //if (tics > durs) //durs = tics; + INT32 blendmode; + if (spr->mobj->frame & FF_BLENDMASK) + blendmode = ((spr->mobj->frame & FF_BLENDMASK) >> FF_BLENDSHIFT) + 1; + else + blendmode = spr->mobj->blendmode; + if (spr->mobj->frame & FF_TRANSMASK) - Surf.PolyFlags = HWR_SurfaceBlend(spr->mobj->blendmode, (spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &Surf); + Surf.PolyFlags = HWR_SurfaceBlend(blendmode, (spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &Surf); else { Surf.PolyColor.s.alpha = (spr->mobj->flags2 & MF2_SHADOW) ? 0x40 : 0xff; - Surf.PolyFlags = HWR_GetBlendModeFlag(spr->mobj->blendmode); + Surf.PolyFlags = HWR_GetBlendModeFlag(blendmode); } // don't forget to enable the depth test because we can't do this From 5bdfb7ffc13e7b746267dd03e416463a98687835 Mon Sep 17 00:00:00 2001 From: spherallic Date: Sat, 9 Apr 2022 16:42:54 +0200 Subject: [PATCH 348/377] Fix semibright/fulldark frame flags for models --- src/hardware/hw_md2.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index e765656ca..a003163db 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1306,7 +1306,11 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) light = R_GetPlaneLight(sector, spr->mobj->z + spr->mobj->height, false); // Always use the light at the top instead of whatever I was doing before - if (!R_ThingIsFullBright(spr->mobj)) + if (R_ThingIsFullDark(spr->mobj)) + lightlevel = 0; + else if (R_ThingIsSemiBright(spr->mobj)) + lightlevel = 128 + (*sector->lightlist[light].lightlevel>>1); + else if (!R_ThingIsFullBright(spr->mobj)) lightlevel = *sector->lightlist[light].lightlevel > 255 ? 255 : *sector->lightlist[light].lightlevel; if (*sector->lightlist[light].extra_colormap) @@ -1314,7 +1318,11 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) } else { - if (!R_ThingIsFullBright(spr->mobj)) + if (R_ThingIsFullDark(spr->mobj)) + lightlevel = 0; + else if (R_ThingIsSemiBright(spr->mobj)) + lightlevel = 128 + (sector->lightlevel>>1); + else if (!R_ThingIsFullBright(spr->mobj)) lightlevel = sector->lightlevel > 255 ? 255 : sector->lightlevel; if (sector->extra_colormap) From 9815d40c2034be1630f129ebfdd5ce282dbb2e2a Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 20 Apr 2022 20:06:08 +0200 Subject: [PATCH 349/377] Adapt tutorial plant to UDMF --- extras/conf/udb/Includes/SRB222_things.cfg | 32 ++++++++++++++++++++++ src/p_mobj.c | 6 ++-- src/p_setup.c | 3 ++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index c5a881c5c..53d70647b 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -3044,6 +3044,20 @@ doom } } + tutorial + { + color = 10; // Green + title = "Tutorial"; + + 799 + { + title = "Tutorial Plant"; + sprite = "TUPFH0"; + width = 40; + height = 144; + } + } + flickies { color = 10; // Green @@ -7867,6 +7881,24 @@ udmf } } + tutorial + { + color = 10; // Green + title = "Tutorial"; + + 799 + { + title = "Tutorial Plant"; + sprite = "TUPFH0"; + width = 40; + height = 144; + arg0 + { + title = "Start frame"; + } + } + } + flickies { color = 10; // Green diff --git a/src/p_mobj.c b/src/p_mobj.c index ea53395ed..9056f5a3f 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12922,15 +12922,15 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean { segment = P_SpawnMobjFromMobj(mobj, 0, 0, 0, MT_TUTORIALLEAF); segment->angle = mobj->angle + FixedAngle(i*60*FRACUNIT); - P_SetMobjState(segment, S_TUTORIALLEAF1 + mthing->extrainfo); + P_SetMobjState(segment, S_TUTORIALLEAF1 + mthing->args[0]); } for (i = 0; i < 3; i++) { segment = P_SpawnMobjFromMobj(mobj, 0, 0, 112*FRACUNIT, MT_TUTORIALFLOWER); segment->angle = mobj->angle + FixedAngle(i*120*FRACUNIT); - P_SetMobjState(segment, S_TUTORIALFLOWER1 + mthing->extrainfo); + P_SetMobjState(segment, S_TUTORIALFLOWER1 + mthing->args[0]); } - P_SetMobjState(P_SpawnMobjFromMobj(mobj, 0, 0, 112*FRACUNIT, MT_TUTORIALFLOWERF), S_TUTORIALFLOWERF1 + mthing->extrainfo); + P_SetMobjState(P_SpawnMobjFromMobj(mobj, 0, 0, 112*FRACUNIT, MT_TUTORIALFLOWERF), S_TUTORIALFLOWERF1 + mthing->args[0]); } break; case MT_CEZPOLE1: diff --git a/src/p_setup.c b/src/p_setup.c index 45c5cc3b3..89e7175bc 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -5262,6 +5262,9 @@ static void P_ConvertBinaryMap(void) case 780: //Skybox mapthings[i].args[0] = !!(mapthings[i].options & MTF_OBJECTSPECIAL); break; + case 799: //Tutorial plant + mapthings[i].args[0] = mapthings[i].extrainfo; + break; case 1002: //Dripping water mapthings[i].args[0] = mapthings[i].angle; break; From 465327288c7be322bb71014693dac1d3e05754f5 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 20 Apr 2022 20:55:13 +0200 Subject: [PATCH 350/377] Fix int type error --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index 1ce965da9..d2f032c43 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2780,7 +2780,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (mo && mo->player) { powertype_t power = line->stringargs[0] ? get_number(line->stringargs[0]) : 0; - UINT16 value = line->stringargs[1] ? get_number(line->stringargs[1]) : 0; + INT32 value = line->stringargs[1] ? get_number(line->stringargs[1]) : 0; if (value == -1) // 'Infinite' value = UINT16_MAX; From d400a7186a2169411029fbc070874f6e6f841a82 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Wed, 20 Apr 2022 20:57:16 +0200 Subject: [PATCH 351/377] Fix int type error --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index d38ab2d4f..e645e0c16 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2724,7 +2724,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (mo && mo->player) { powertype_t power = line->stringargs[0] ? get_number(line->stringargs[0]) : 0; - UINT16 value = line->stringargs[1] ? get_number(line->stringargs[1]) : 0; + INT32 value = line->stringargs[1] ? get_number(line->stringargs[1]) : 0; if (value == -1) // 'Infinite' value = UINT16_MAX; From c4bb90fb0c1178835aca02fa21cf2b39269ed7f7 Mon Sep 17 00:00:00 2001 From: aiire <1050-aiire@users.noreply.git.do.srb2.org> Date: Thu, 21 Apr 2022 16:55:57 +0000 Subject: [PATCH 352/377] do the thing --- src/p_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index bbd268fc4..e8281e477 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -12001,7 +12001,7 @@ void P_PlayerThink(player_t *player) if (player->mo->movefactor != FRACUNIT) // Friction-scaled acceleration... acceleration = FixedMul(acceleration<mo->movefactor)>>FRACBITS; - P_Thrust(player->mo, moveAngle, -acceleration); + P_Thrust(player->mo, moveAngle, FixedMul(-acceleration, player->mo->scale)); } if (!(player->pflags & PF_AUTOBRAKE) From c3001ac42a4385a9392bb26cef9b53e7839d6da6 Mon Sep 17 00:00:00 2001 From: ashi Date: Sat, 30 Apr 2022 14:21:51 +0000 Subject: [PATCH 353/377] Fix description of A_ParentTriesToSleep --- src/p_enemy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index 87aa5ff2f..6615fd352 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -12662,7 +12662,7 @@ void A_WhoCaresIfYourSonIsABee(mobj_t *actor) // Function: A_ParentTriesToSleep // -// Description: If extravalue1 is less than or equal to var1, go to var2. +// Description: If extravalue1 is greater than 0 go to var1 // // var1 = state to go to when extravalue1 // var2 = unused From 28bdd7ef00bd9efef93b71a207c458c5bd295ff9 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 1 May 2022 19:27:10 +0200 Subject: [PATCH 354/377] Fix size_t compiler warnings in P_WriteTextmap --- src/p_setup.c | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index ea099e13e..b4fd9cf5e 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2111,31 +2111,31 @@ static void P_WriteTextmap(void) case 1: TAG_ITER_SECTORS(Tag_FGet(&wlines[i].tags), s) { - CONS_Alert(CONS_WARNING, M_GetText("Linedef %d applies custom gravity to sector %d. Changes to this gravity at runtime will not be reflected in the converted map. Use linedef type 469 for this.\n"), i, s); + CONS_Alert(CONS_WARNING, M_GetText("Linedef %s applies custom gravity to sector %d. Changes to this gravity at runtime will not be reflected in the converted map. Use linedef type 469 for this.\n"), sizeu1(i), s); wsectors[s].gravity = FixedDiv(lines[i].frontsector->floorheight >> FRACBITS, 1000); } break; case 2: - CONS_Alert(CONS_WARNING, M_GetText("Custom exit linedef %d detected. Changes to the next map at runtime will not be reflected in the converted map. Use linedef type 468 for this.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Custom exit linedef %s detected. Changes to the next map at runtime will not be reflected in the converted map. Use linedef type 468 for this.\n"), sizeu1(i)); wlines[i].args[0] = lines[i].frontsector->floorheight >> FRACBITS; wlines[i].args[2] = lines[i].frontsector->ceilingheight >> FRACBITS; break; case 5: case 50: case 51: - CONS_Alert(CONS_WARNING, M_GetText("Linedef %d has type %d, which is not supported in UDMF.\n"), i, wlines[i].special); + CONS_Alert(CONS_WARNING, M_GetText("Linedef %s has type %d, which is not supported in UDMF.\n"), sizeu1(i), wlines[i].special); break; case 61: if (wlines[i].flags & ML_MIDSOLID) continue; if (!wlines[i].args[1]) continue; - CONS_Alert(CONS_WARNING, M_GetText("Linedef %d with crusher type 61 rises twice as fast on spawn. This behavior is not supported in UDMF.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Linedef %s with crusher type 61 rises twice as fast on spawn. This behavior is not supported in UDMF.\n"), sizeu1(i)); break; case 76: if (freetag == (mtag_t)MAXTAGS) { - CONS_Alert(CONS_WARNING, M_GetText("No unused tag found. Linedef %d with type 76 cannot be converted.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("No unused tag found. Linedef %s with type 76 cannot be converted.\n"), sizeu1(i)); break; } TAG_ITER_SECTORS(wlines[i].args[0], s) @@ -2151,9 +2151,9 @@ static void P_WriteTextmap(void) break; case 259: if (wlines[i].args[3] & FF_QUICKSAND) - CONS_Alert(CONS_WARNING, M_GetText("Quicksand properties of custom FOF on linedef %d cannot be converted. Use linedef type 75 instead.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Quicksand properties of custom FOF on linedef %s cannot be converted. Use linedef type 75 instead.\n"), sizeu1(i)); if (wlines[i].args[3] & FF_BUSTUP) - CONS_Alert(CONS_WARNING, M_GetText("Bustable properties of custom FOF on linedef %d cannot be converted. Use linedef type 74 instead.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Bustable properties of custom FOF on linedef %s cannot be converted. Use linedef type 74 instead.\n"), sizeu1(i)); break; case 412: if ((s = Tag_Iterate_Sectors(wlines[i].args[0], 0)) < 0) @@ -2162,7 +2162,7 @@ static void P_WriteTextmap(void) break; if (freetag == (mtag_t)MAXTAGS) { - CONS_Alert(CONS_WARNING, M_GetText("No unused tag found. Linedef %d with type 412 cannot be converted.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("No unused tag found. Linedef %s with type 412 cannot be converted.\n"), sizeu1(i)); break; } Tag_Add(&specialthings[s].teleport->tags, freetag); @@ -2176,7 +2176,7 @@ static void P_WriteTextmap(void) break; if (freetag == (mtag_t)MAXTAGS) { - CONS_Alert(CONS_WARNING, M_GetText("No unused tag found. Linedef %d with type 422 cannot be converted.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("No unused tag found. Linedef %s with type 422 cannot be converted.\n"), sizeu1(i)); break; } Tag_Add(&specialthings[s].altview->tags, freetag); @@ -2185,14 +2185,14 @@ static void P_WriteTextmap(void) freetag = Tag_NextUnused(freetag); break; case 447: - CONS_Alert(CONS_WARNING, M_GetText("Linedef %d has change colormap action, which cannot be converted automatically. Tag arg0 to a sector with the desired colormap.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Linedef %s has change colormap action, which cannot be converted automatically. Tag arg0 to a sector with the desired colormap.\n"), sizeu1(i)); if (wlines[i].flags & ML_TFERLINE) - CONS_Alert(CONS_WARNING, M_GetText("Linedef %d mixes front and back colormaps, which is not supported in UDMF. Copy one colormap to the target sector first, then mix in the second one.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Linedef %s mixes front and back colormaps, which is not supported in UDMF. Copy one colormap to the target sector first, then mix in the second one.\n"), sizeu1(i)); break; case 455: - CONS_Alert(CONS_WARNING, M_GetText("Linedef %d has fade colormap action, which cannot be converted automatically. Tag arg0 to a sector with the desired colormap.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Linedef %s has fade colormap action, which cannot be converted automatically. Tag arg0 to a sector with the desired colormap.\n"), sizeu1(i)); if (wlines[i].flags & ML_TFERLINE) - CONS_Alert(CONS_WARNING, M_GetText("Linedef %d specifies starting colormap for the fade, which is not supported in UDMF. Change the colormap with linedef type 447 instead.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Linedef %s specifies starting colormap for the fade, which is not supported in UDMF. Change the colormap with linedef type 447 instead.\n"), sizeu1(i)); break; case 457: if ((s = Tag_Iterate_Sectors(wlines[i].args[0], 0)) < 0) @@ -2201,7 +2201,7 @@ static void P_WriteTextmap(void) break; if (freetag == (mtag_t)MAXTAGS) { - CONS_Alert(CONS_WARNING, M_GetText("No unused tag found. Linedef %d with type 457 cannot be converted.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("No unused tag found. Linedef %s with type 457 cannot be converted.\n"), sizeu1(i)); break; } Tag_Add(&specialthings[s].angleanchor->tags, freetag); @@ -2224,7 +2224,7 @@ static void P_WriteTextmap(void) wsectors[s].extra_colormap = wsides[wlines[i].sidenum[0]].colormap_data; if (freetag == (mtag_t)MAXTAGS) { - CONS_Alert(CONS_WARNING, M_GetText("No unused tag found. Linedef %d with type 606 cannot be converted.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("No unused tag found. Linedef %s with type 606 cannot be converted.\n"), sizeu1(i)); break; } Tag_Add(&wsectors[s].tags, freetag); @@ -2239,23 +2239,23 @@ static void P_WriteTextmap(void) } if (wlines[i].special >= 300 && wlines[i].special < 400 && wlines[i].flags & ML_WRAPMIDTEX) - CONS_Alert(CONS_WARNING, M_GetText("Linedef executor trigger linedef %d has disregard order flag, which is not supported in UDMF.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Linedef executor trigger linedef %s has disregard order flag, which is not supported in UDMF.\n"), sizeu1(i)); } for (i = 0; i < numsectors; i++) { if (Tag_Find(&wsectors[i].tags, LE_CAPSULE0)) - CONS_Alert(CONS_WARNING, M_GetText("Sector %d has reserved tag %d, which is not supported in UDMF. Use arg3 of the boss mapthing instead.\n"), i, LE_CAPSULE0); + CONS_Alert(CONS_WARNING, M_GetText("Sector %s has reserved tag %d, which is not supported in UDMF. Use arg3 of the boss mapthing instead.\n"), sizeu1(i), LE_CAPSULE0); if (Tag_Find(&wsectors[i].tags, LE_CAPSULE1)) - CONS_Alert(CONS_WARNING, M_GetText("Sector %d has reserved tag %d, which is not supported in UDMF. Use arg3 of the boss mapthing instead.\n"), i, LE_CAPSULE1); + CONS_Alert(CONS_WARNING, M_GetText("Sector %s has reserved tag %d, which is not supported in UDMF. Use arg3 of the boss mapthing instead.\n"), sizeu1(i), LE_CAPSULE1); if (Tag_Find(&wsectors[i].tags, LE_CAPSULE2)) - CONS_Alert(CONS_WARNING, M_GetText("Sector %d has reserved tag %d, which is not supported in UDMF. Use arg3 of the boss mapthing instead.\n"), i, LE_CAPSULE2); + CONS_Alert(CONS_WARNING, M_GetText("Sector %s has reserved tag %d, which is not supported in UDMF. Use arg3 of the boss mapthing instead.\n"), sizeu1(i), LE_CAPSULE2); switch (GETSECSPECIAL(wsectors[i].special, 1)) { case 9: case 10: - CONS_Alert(CONS_WARNING, M_GetText("Sector %d has ring drainer effect, which is not supported in UDMF. Use linedef type 462 instead.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Sector %s has ring drainer effect, which is not supported in UDMF. Use linedef type 462 instead.\n"), sizeu1(i)); break; default: break; @@ -2264,13 +2264,13 @@ static void P_WriteTextmap(void) switch (GETSECSPECIAL(wsectors[i].special, 2)) { case 6: - CONS_Alert(CONS_WARNING, M_GetText("Sector %d has emerald check trigger type, which is not supported in UDMF. Use linedef types 337-339 instead.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Sector %s has emerald check trigger type, which is not supported in UDMF. Use linedef types 337-339 instead.\n"), sizeu1(i)); break; case 7: - CONS_Alert(CONS_WARNING, M_GetText("Sector %d has NiGHTS mare trigger type, which is not supported in UDMF. Use linedef types 340-342 instead.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Sector %s has NiGHTS mare trigger type, which is not supported in UDMF. Use linedef types 340-342 instead.\n"), sizeu1(i)); break; case 9: - CONS_Alert(CONS_WARNING, M_GetText("Sector %d has Egg Capsule type, which is not supported in UDMF. Use linedef type 464 instead.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Sector %s has Egg Capsule type, which is not supported in UDMF. Use linedef type 464 instead.\n"), sizeu1(i)); break; default: break; @@ -2393,7 +2393,7 @@ static void P_WriteTextmap(void) } if (wlines[i].executordelay != 0 && wlines[i].backsector) { - CONS_Alert(CONS_WARNING, M_GetText("Linedef %d has an executor delay. Changes to the delay at runtime will not be reflected in the converted map. Use linedef type 465 for this.\n"), i); + CONS_Alert(CONS_WARNING, M_GetText("Linedef %s has an executor delay. Changes to the delay at runtime will not be reflected in the converted map. Use linedef type 465 for this.\n"), sizeu1(i)); fprintf(f, "executordelay = %d;\n", (wlines[i].backsector->ceilingheight >> FRACBITS) + (wlines[i].backsector->floorheight >> FRACBITS)); } if (wlines[i].flags & ML_IMPASSIBLE) From 35a5c82c42834cd5fc86fc9ccea007ba44f3cd70 Mon Sep 17 00:00:00 2001 From: Eidolon Date: Fri, 27 May 2022 13:36:55 -0500 Subject: [PATCH 355/377] Update triggertag on sector tag fset Fixes STJr/SRB2#865 --- src/taglist.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/taglist.c b/src/taglist.c index 9bc6021b0..e933b71fd 100644 --- a/src/taglist.c +++ b/src/taglist.c @@ -14,6 +14,7 @@ #include "taglist.h" #include "z_zone.h" #include "r_data.h" +#include "r_defs.h" // Bit array of whether a tag exists for sectors/lines/things. bitarray_t tags_available[BIT_ARRAY_SIZE (MAXTAGS)]; @@ -454,6 +455,13 @@ void Tag_SectorFSet (const size_t id, const mtag_t tag) Taggroup_Remove(tags_sectors, curtag, id); Taggroup_Add(tags_sectors, tag, id); Tag_FSet(&sec->tags, tag); + + // Sectors with linedef trigger effects need to have their trigger tag updated too + // This is a bit of a hack... + if (sec->flags & MSF_TRIGGERLINE_PLANE || sec->flags & MSF_TRIGGERLINE_MOBJ) + { + sec->triggertag = tag; + } } mtag_t Tag_NextUnused(mtag_t start) From fd2a097c3410eeec9a4f12ed8b88ccd147b27d04 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 28 May 2022 10:29:35 +0200 Subject: [PATCH 356/377] Fix more size_t mishaps --- src/p_setup.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index b4fd9cf5e..0f7cc29ac 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2280,7 +2280,7 @@ static void P_WriteTextmap(void) fprintf(f, "namespace = \"srb2\";\n"); for (i = 0; i < nummapthings; i++) { - fprintf(f, "thing // %d\n", i); + fprintf(f, "thing // %s\n", sizeu1(i)); fprintf(f, "{\n"); firsttag = Tag_FGet(&wmapthings[i].tags); if (firsttag != 0) @@ -2323,7 +2323,7 @@ static void P_WriteTextmap(void) for (i = 0; i < numvertexes; i++) { - fprintf(f, "vertex // %d\n", i); + fprintf(f, "vertex // %s\n", sizeu1(i)); fprintf(f, "{\n"); fprintf(f, "x = %f;\n", FIXED_TO_FLOAT(wvertexes[i].x)); fprintf(f, "y = %f;\n", FIXED_TO_FLOAT(wvertexes[i].y)); @@ -2337,10 +2337,10 @@ static void P_WriteTextmap(void) for (i = 0; i < numlines; i++) { - fprintf(f, "linedef // %d\n", i); + fprintf(f, "linedef // %s\n", sizeu1(i)); fprintf(f, "{\n"); - fprintf(f, "v1 = %d;\n", wlines[i].v1 - vertexes); - fprintf(f, "v2 = %d;\n", wlines[i].v2 - vertexes); + fprintf(f, "v1 = %s;\n", sizeu1(wlines[i].v1 - vertexes)); + fprintf(f, "v2 = %s;\n", sizeu1(wlines[i].v2 - vertexes)); fprintf(f, "sidefront = %d;\n", wlines[i].sidenum[0]); if (wlines[i].sidenum[1] != 0xffff) fprintf(f, "sideback = %d;\n", wlines[i].sidenum[1]); @@ -2432,9 +2432,9 @@ static void P_WriteTextmap(void) for (i = 0; i < numsides; i++) { - fprintf(f, "sidedef // %d\n", i); + fprintf(f, "sidedef // %s\n", sizeu1(i)); fprintf(f, "{\n"); - fprintf(f, "sector = %d;\n", wsides[i].sector - sectors); + fprintf(f, "sector = %s;\n", sizeu1(wsides[i].sector - sectors)); if (wsides[i].textureoffset != 0) fprintf(f, "offsetx = %d;\n", wsides[i].textureoffset >> FRACBITS); if (wsides[i].rowoffset != 0) @@ -2453,7 +2453,7 @@ static void P_WriteTextmap(void) for (i = 0; i < numsectors; i++) { - fprintf(f, "sector // %d\n", i); + fprintf(f, "sector // %s\n", sizeu1(i)); fprintf(f, "{\n"); fprintf(f, "heightfloor = %d;\n", wsectors[i].floorheight >> FRACBITS); fprintf(f, "heightceiling = %d;\n", wsectors[i].ceilingheight >> FRACBITS); From e1a5f48c51cb3f8274ef11501f0c840e0c5a987b Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 28 May 2022 14:08:19 +0200 Subject: [PATCH 357/377] Fix even more size_t printfs --- src/p_setup.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 0f7cc29ac..5e3b071ac 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2313,10 +2313,10 @@ static void P_WriteTextmap(void) fprintf(f, "flip = true;\n"); for (j = 0; j < NUMMAPTHINGARGS; j++) if (wmapthings[i].args[j] != 0) - fprintf(f, "arg%d = %d;\n", j, wmapthings[i].args[j]); + fprintf(f, "arg%s = %d;\n", sizeu1(j), wmapthings[i].args[j]); for (j = 0; j < NUMMAPTHINGSTRINGARGS; j++) if (mapthings[i].stringargs[j]) - fprintf(f, "stringarg%d = \"%s\";\n", j, mapthings[i].stringargs[j]); + fprintf(f, "stringarg%s = \"%s\";\n", sizeu1(j), mapthings[i].stringargs[j]); fprintf(f, "}\n"); fprintf(f, "\n"); } @@ -2362,10 +2362,10 @@ static void P_WriteTextmap(void) fprintf(f, "special = %d;\n", wlines[i].special); for (j = 0; j < NUMLINEARGS; j++) if (wlines[i].args[j] != 0) - fprintf(f, "arg%d = %d;\n", j, wlines[i].args[j]); + fprintf(f, "arg%s = %d;\n", sizeu1(j), wlines[i].args[j]); for (j = 0; j < NUMLINESTRINGARGS; j++) if (lines[i].stringargs[j]) - fprintf(f, "stringarg%d = \"%s\";\n", j, lines[i].stringargs[j]); + fprintf(f, "stringarg%s = \"%s\";\n", sizeu1(j), lines[i].stringargs[j]); if (wlines[i].alpha != FRACUNIT) fprintf(f, "alpha = %f;\n", FIXED_TO_FLOAT(wlines[i].alpha)); if (wlines[i].blendmode != AST_COPY) @@ -3263,7 +3263,7 @@ static boolean P_LoadExtendedSubsectorsAndSegs(UINT8 **data, nodetype_t nodetype linenum = (nodetype == NT_XGL3) ? READUINT32((*data)) : READUINT16((*data)); if (linenum != 0xFFFF && linenum >= numlines) - I_Error("P_LoadExtendedSubsectorsAndSegs: Seg %s in subsector %d has invalid linedef %d!\n", sizeu1(k), i, linenum); + I_Error("P_LoadExtendedSubsectorsAndSegs: Seg %s in subsector %s has invalid linedef %d!\n", sizeu1(k), sizeu1(i), linenum); segs[k].glseg = (linenum == 0xFFFF); segs[k].linedef = (linenum == 0xFFFF) ? NULL : &lines[linenum]; segs[k].side = READUINT8((*data)); @@ -3272,7 +3272,7 @@ static boolean P_LoadExtendedSubsectorsAndSegs(UINT8 **data, nodetype_t nodetype { subsectors[i].firstline++; if (subsectors[i].firstline == k) - I_Error("P_LoadExtendedSubsectorsAndSegs: Subsector %d does not have any valid segs!", i); + I_Error("P_LoadExtendedSubsectorsAndSegs: Subsector %s does not have any valid segs!", sizeu1(i)); } break; @@ -6316,7 +6316,7 @@ static void P_ConvertBinaryThingTypes(void) if (j == -1) { - CONS_Debug(DBG_GAMELOGIC, "Particle generator (mapthing #%d) needs to be tagged to a #15 parameter line (trying to find tag %d).\n", i, mapthings[i].angle); + CONS_Debug(DBG_GAMELOGIC, "Particle generator (mapthing #%s) needs to be tagged to a #15 parameter line (trying to find tag %d).\n", sizeu1(i), mapthings[i].angle); break; } mapthings[i].args[0] = mapthings[i].z; From d10ca13eb912330684320cd8ad3a4e4f763ca057 Mon Sep 17 00:00:00 2001 From: Zwip-Zwap Zapony Date: Sat, 28 May 2022 12:18:09 +0000 Subject: [PATCH 358/377] Apply 1 suggestion(s) to 1 file(s) --- src/p_setup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_setup.c b/src/p_setup.c index 5e3b071ac..1b518d2d7 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3263,7 +3263,7 @@ static boolean P_LoadExtendedSubsectorsAndSegs(UINT8 **data, nodetype_t nodetype linenum = (nodetype == NT_XGL3) ? READUINT32((*data)) : READUINT16((*data)); if (linenum != 0xFFFF && linenum >= numlines) - I_Error("P_LoadExtendedSubsectorsAndSegs: Seg %s in subsector %s has invalid linedef %d!\n", sizeu1(k), sizeu1(i), linenum); + I_Error("P_LoadExtendedSubsectorsAndSegs: Seg %s in subsector %s has invalid linedef %d!\n", sizeu1(k), sizeu2(i), linenum); segs[k].glseg = (linenum == 0xFFFF); segs[k].linedef = (linenum == 0xFFFF) ? NULL : &lines[linenum]; segs[k].side = READUINT8((*data)); From f94c25c05c5b990bd233717acea2b9f32d7f9198 Mon Sep 17 00:00:00 2001 From: Eidolon Date: Thu, 26 May 2022 23:38:50 -0500 Subject: [PATCH 359/377] Change UDMF wall scroll scale to SCROLL_SHIFT UDMF special 502 now must scale arg 2 and 3 in the same scale space as line length scrolling in binary format. This is to ensure compatibility with the binary format. Fixes STJr/SRB2#862 Co-Authored-By: MascaraSnake --- src/p_setup.c | 8 ++++---- src/p_spec.c | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index ea099e13e..89b419953 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -5552,13 +5552,13 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[1] = 0; if (lines[i].flags & ML_NOSKEW) { - lines[i].args[2] = lines[i].dx >> (FRACBITS + SCROLL_SHIFT); - lines[i].args[3] = lines[i].dy >> (FRACBITS + SCROLL_SHIFT); + lines[i].args[2] = sides[lines[i].sidenum[0]].textureoffset >> (FRACBITS - SCROLL_SHIFT); + lines[i].args[3] = sides[lines[i].sidenum[0]].rowoffset >> (FRACBITS - SCROLL_SHIFT); } else { - lines[i].args[2] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS; - lines[i].args[3] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS; + lines[i].args[2] = lines[i].dx >> FRACBITS; + lines[i].args[3] = lines[i].dy >> FRACBITS; } lines[i].args[4] = lines[i].special - 502; lines[i].special = 502; diff --git a/src/p_spec.c b/src/p_spec.c index 69e1e3925..c000960b5 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7563,9 +7563,9 @@ static void P_SpawnScrollers(void) if (s != (INT32)i) { if (l->args[1] != TMSD_BACK) - Add_Scroller(sc_side, l->args[2] << FRACBITS, l->args[3] << FRACBITS, control, lines[s].sidenum[0], accel, 0); + Add_Scroller(sc_side, l->args[2] << (FRACBITS - SCROLL_SHIFT), l->args[3] << (FRACBITS - SCROLL_SHIFT), control, lines[s].sidenum[0], accel, 0); if (l->args[1] != TMSD_FRONT && lines[s].sidenum[1] != 0xffff) - Add_Scroller(sc_side, l->args[2] << FRACBITS, l->args[3] << FRACBITS, control, lines[s].sidenum[1], accel, 0); + Add_Scroller(sc_side, l->args[2] << (FRACBITS - SCROLL_SHIFT), l->args[3] << (FRACBITS - SCROLL_SHIFT), control, lines[s].sidenum[1], accel, 0); } break; } From 37da148996f5c32966f47d2b46bc7eb9935ddb0b Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 29 May 2022 11:56:30 +0200 Subject: [PATCH 360/377] Update triggertag on Tag_SectorFSet if in binary map and the sector has a trigger special --- src/taglist.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/taglist.c b/src/taglist.c index e933b71fd..305b05f04 100644 --- a/src/taglist.c +++ b/src/taglist.c @@ -14,7 +14,7 @@ #include "taglist.h" #include "z_zone.h" #include "r_data.h" -#include "r_defs.h" +#include "p_spec.h" // Bit array of whether a tag exists for sectors/lines/things. bitarray_t tags_available[BIT_ARRAY_SIZE (MAXTAGS)]; @@ -458,10 +458,8 @@ void Tag_SectorFSet (const size_t id, const mtag_t tag) // Sectors with linedef trigger effects need to have their trigger tag updated too // This is a bit of a hack... - if (sec->flags & MSF_TRIGGERLINE_PLANE || sec->flags & MSF_TRIGGERLINE_MOBJ) - { + if (!udmf && GETSECSPECIAL(sec->special, 2) >= 1 && GETSECSPECIAL(sec->special, 2) <= 7) sec->triggertag = tag; - } } mtag_t Tag_NextUnused(mtag_t start) From af7c0f4d6c3dae2fdc463c162431b82d5030f2e7 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sun, 29 May 2022 12:24:14 +0200 Subject: [PATCH 361/377] Allow linedef types 409/410 to change the trigger tag --- extras/conf/udb/Includes/SRB222_linedefs.cfg | 2 ++ src/p_spec.c | 6 ++++++ src/p_spec.h | 1 + 3 files changed, 9 insertions(+) diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg index 0aa7ea629..fff9edf10 100644 --- a/extras/conf/udb/Includes/SRB222_linedefs.cfg +++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg @@ -3677,6 +3677,7 @@ udmf 0 = "Add tag"; 1 = "Remove tag"; 2 = "Replace first tag"; + 3 = "Change trigger tag"; } } } @@ -3699,6 +3700,7 @@ udmf 0 = "Add tag"; 1 = "Remove tag"; 2 = "Replace first tag"; + 3 = "Change trigger tag"; } } } diff --git a/src/p_spec.c b/src/p_spec.c index 69e1e3925..cd36053c9 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2396,6 +2396,9 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) default: Tag_SectorFSet(secnum, newtag); break; + case TMT_TRIGGERTAG: + sectors[secnum].triggertag = newtag; + break; } } break; @@ -2418,6 +2421,9 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) default: Tag_SectorFSet(secnum, newtag); break; + case TMT_TRIGGERTAG: + sectors[secnum].triggertag = newtag; + break; } break; } diff --git a/src/p_spec.h b/src/p_spec.h index bdc912c34..33d18d63e 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -306,6 +306,7 @@ typedef enum TMT_ADD = 0, TMT_REMOVE = 1, TMT_REPLACEFIRST = 2, + TMT_TRIGGERTAG = 3, } textmaptagoptions_t; typedef enum From 9971592dc6f8479ce0ee099006444447ef1ef84d Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 4 Jun 2022 11:14:31 +0200 Subject: [PATCH 362/377] UDMF conversion: Fix noclimb flag not being applied to linedef types 66-68 --- src/p_setup.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/p_setup.c b/src/p_setup.c index 89b419953..083b8f236 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4248,6 +4248,8 @@ static void P_ConvertBinaryLinedefTypes(void) lines[i].args[0] = tag; lines[i].args[1] = lines[i].special - 66; lines[i].args[2] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS; + if (lines[i].flags & ML_NOCLIMB) + lines[i].args[2] *= -1; lines[i].special = 66; break; case 76: //Make FOF bouncy From c9536ff4dc9409eb99c5951c390ca021d55cd820 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 4 Jun 2022 17:46:00 +0200 Subject: [PATCH 363/377] Fix copypaste error in P_GetMobjGravity --- src/p_mobj.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 9017c2f16..36253569b 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1456,7 +1456,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo) if ((rover->flags & (FF_SWIMMABLE|FF_GOOWATER)) == (FF_SWIMMABLE|FF_GOOWATER)) goopgravity = true; - gravfactor = P_GetSectorGravityFactor(mo->subsector->sector); + gravfactor = P_GetSectorGravityFactor(rover->master->frontsector); if (gravfactor == FRACUNIT) continue; From a3ffd042239878dccc844e660a5c8bd0f58308b1 Mon Sep 17 00:00:00 2001 From: Eidolon Date: Thu, 14 Jul 2022 18:33:40 -0500 Subject: [PATCH 364/377] cmake: Adjust linkage for macOS This properly links dylibs set during build instead of expecting the libraries to be in the system path. --- src/sdl/CMakeLists.txt | 49 +++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 29 deletions(-) diff --git a/src/sdl/CMakeLists.txt b/src/sdl/CMakeLists.txt index 4f19d93df..7fece1647 100644 --- a/src/sdl/CMakeLists.txt +++ b/src/sdl/CMakeLists.txt @@ -87,39 +87,30 @@ if(${SDL2_FOUND}) endif() if(${CMAKE_SYSTEM} MATCHES Darwin) - find_library(CORE_LIB CoreFoundation) + find_library(CORE_FOUNDATION_LIBRARY "CoreFoundation") target_link_libraries(SRB2SDL2 PRIVATE - ${CORE_LIB} - SDL2 - SDL2_mixer - ${GME_LIBRARIES} - ${OPENMPT_LIBRARIES} - ${MIXERX_LIBRARIES} - ${PNG_LIBRARIES} - ${ZLIB_LIBRARIES} - ${OPENGL_LIBRARIES} - ${CURL_LIBRARIES} + ${CORE_FOUNDATION_LIBRARY} ) set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}") - else() - target_link_libraries(SRB2SDL2 PRIVATE - ${SDL2_LIBRARIES} - ${SDL2_MIXER_LIBRARIES} - ${GME_LIBRARIES} - ${OPENMPT_LIBRARIES} - ${MIXERX_LIBRARIES} - ${PNG_LIBRARIES} - ${ZLIB_LIBRARIES} - ${OPENGL_LIBRARIES} - ${CURL_LIBRARIES} - ) + endif() - if(${CMAKE_SYSTEM} MATCHES Linux) - target_link_libraries(SRB2SDL2 PRIVATE - m - rt - ) - endif() + target_link_libraries(SRB2SDL2 PRIVATE + ${SDL2_LIBRARIES} + ${SDL2_MIXER_LIBRARIES} + ${GME_LIBRARIES} + ${OPENMPT_LIBRARIES} + ${MIXERX_LIBRARIES} + ${PNG_LIBRARIES} + ${ZLIB_LIBRARIES} + ${OPENGL_LIBRARIES} + ${CURL_LIBRARIES} + ) + + if(${CMAKE_SYSTEM} MATCHES Linux) + target_link_libraries(SRB2SDL2 PRIVATE + m + rt + ) endif() #target_link_libraries(SRB2SDL2 PRIVATE SRB2Core) From 66ab96363c2d7e621e559b258da2df9421a6265a Mon Sep 17 00:00:00 2001 From: Eidolon Date: Thu, 14 Jul 2022 23:32:34 -0500 Subject: [PATCH 365/377] cmake: Fix rpath issues in macOS bundle fixup --- src/sdl/CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sdl/CMakeLists.txt b/src/sdl/CMakeLists.txt index 7fece1647..11c0f8398 100644 --- a/src/sdl/CMakeLists.txt +++ b/src/sdl/CMakeLists.txt @@ -127,8 +127,6 @@ if(${SDL2_FOUND}) endif() endif() - set_target_properties(SRB2SDL2 PROPERTIES VERSION ${SRB2_VERSION}) - if(${CMAKE_SYSTEM} MATCHES Windows) target_link_libraries(SRB2SDL2 PRIVATE ws2_32 @@ -179,6 +177,7 @@ if(${SDL2_FOUND}) install(TARGETS SRB2SDL2 BUNDLE DESTINATION . ) + set_property(TARGET SRB2SDL2 PROPERTY INSTALL_RPATH_USE_LINK_PATH ON) else() install(TARGETS SRB2SDL2 SRB2SDL2 RUNTIME DESTINATION . From 0e5b5bf5d9a33e1f44d0dbb876b0b26c7be83cec Mon Sep 17 00:00:00 2001 From: Eidolon Date: Thu, 14 Jul 2022 23:57:53 -0500 Subject: [PATCH 366/377] cmake: Set plist properties for macOS bundle yay icon --- src/sdl/CMakeLists.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/sdl/CMakeLists.txt b/src/sdl/CMakeLists.txt index 11c0f8398..d369d11c0 100644 --- a/src/sdl/CMakeLists.txt +++ b/src/sdl/CMakeLists.txt @@ -92,6 +92,16 @@ if(${SDL2_FOUND}) ${CORE_FOUNDATION_LIBRARY} ) set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}") + + # Configure the app bundle icon and plist properties + target_sources(SRB2SDL2 PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/macosx/Srb2mac.icns") + set_target_properties(SRB2SDL2 PROPERTIES + MACOSX_BUNDLE_ICON_FILE "Srb2mac" + MACOSX_BUNDLE_BUNDLE_NAME "Sonic Robo Blast 2" + MACOSX_BUNDLE_BUNDLE_VERSION ${SRB2_VERSION} + + RESOURCE "${CMAKE_CURRENT_SOURCE_DIR}/macosx/Srb2mac.icns" + ) endif() target_link_libraries(SRB2SDL2 PRIVATE From 955259d5c12ac36ad8c625746c326846d64b4ae8 Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sun, 17 Jul 2022 19:34:19 -0500 Subject: [PATCH 367/377] Remove win32 backend-specific files --- src/win32/CMakeLists.txt | 18 - src/win32/Srb2win-vc10.vcxproj | 517 --- src/win32/Srb2win-vc10.vcxproj.filters | 943 ----- src/win32/Srb2win-vc9.vcproj | 4914 ------------------------ src/win32/Srb2win.dsp | 1008 ----- src/win32/Srb2win.dsw | 77 - src/win32/Srb2win.props | 19 - src/win32/dx_error.c | 276 -- src/win32/dx_error.h | 39 - src/win32/fabdxlib.c | 677 ---- src/win32/fabdxlib.h | 82 - src/win32/win_cd.c | 539 --- src/win32/win_dll.c | 238 -- src/win32/win_dll.h | 31 - src/win32/win_main.c | 674 ---- src/win32/win_main.h | 45 - src/win32/win_net.c | 42 - src/win32/win_snd.c | 959 ----- src/win32/win_sys.c | 3707 ------------------ src/win32/win_vid.c | 1113 ------ 20 files changed, 15918 deletions(-) delete mode 100644 src/win32/CMakeLists.txt delete mode 100644 src/win32/Srb2win-vc10.vcxproj delete mode 100644 src/win32/Srb2win-vc10.vcxproj.filters delete mode 100644 src/win32/Srb2win-vc9.vcproj delete mode 100644 src/win32/Srb2win.dsp delete mode 100644 src/win32/Srb2win.dsw delete mode 100644 src/win32/Srb2win.props delete mode 100644 src/win32/dx_error.c delete mode 100644 src/win32/dx_error.h delete mode 100644 src/win32/fabdxlib.c delete mode 100644 src/win32/fabdxlib.h delete mode 100644 src/win32/win_cd.c delete mode 100644 src/win32/win_dll.c delete mode 100644 src/win32/win_dll.h delete mode 100644 src/win32/win_main.c delete mode 100644 src/win32/win_main.h delete mode 100644 src/win32/win_net.c delete mode 100644 src/win32/win_snd.c delete mode 100644 src/win32/win_sys.c delete mode 100644 src/win32/win_vid.c diff --git a/src/win32/CMakeLists.txt b/src/win32/CMakeLists.txt deleted file mode 100644 index 39b01588b..000000000 --- a/src/win32/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -file(GLOB SRB2_WIN_SOURCES *.c *.h *.rc) - -if(${SRB2_CONFIG_HWRENDER}) - set(SRB2_WIN_SOURCES ${SRB2_WIN_SOURCES} ${SRB2_HWRENDER_SOURCES} ${SRB2_HWRENDER_HEADERS}) - set(SRB2_WIN_SOURCES ${SRB2_WIN_SOURCES} ${SRB2_R_OPENGL_SOURCES} ${SRB2_R_OPENGL_HEADERS}) -endif() - -add_executable(SRB2DD EXCLUDE_FROM_ALL WIN32 - ${SRB2_WIN_SOURCES} -) - -target_compile_definitions(SRB2DD PRIVATE - -D_WINDOWS -) - -set_target_properties(SRB2DD PROPERTIES OUTPUT_NAME ${SRB2_WIN_EXE_NAME}) - -target_link_libraries(SRB2DD PRIVATE SRB2Core) diff --git a/src/win32/Srb2win-vc10.vcxproj b/src/win32/Srb2win-vc10.vcxproj deleted file mode 100644 index 3e8af3b0e..000000000 --- a/src/win32/Srb2win-vc10.vcxproj +++ /dev/null @@ -1,517 +0,0 @@ - - - - - Debug - ARM - - - Debug - ARM64 - - - Debug - Win32 - - - Release - ARM - - - Release - ARM64 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - Srb2DD - {0F554F1D-ED49-4D65-A9A7-F63C57F277BE} - Win32Proj - Srb2win - 10.0.17763.0 - - - - v140 - true - - - true - true - v141 - - - v140 - false - true - - - false - true - true - v141 - - - v140 - true - - - true - true - v141 - - - v140 - false - true - - - false - true - true - v141 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - false - - - - true - gdi32.lib;%(AdditionalDependencies) - - - ProgramDatabase - false - - - - - true - gdi32.lib;%(AdditionalDependencies) - - - - - ProgramDatabase - false - - - gdi32.lib;%(AdditionalDependencies) - - - - - gdi32.lib;%(AdditionalDependencies) - - - - - gdi32.lib;%(AdditionalDependencies) - - - - - gdi32.lib;%(AdditionalDependencies) - - - - - gdi32.lib;%(AdditionalDependencies) - - - - - gdi32.lib;%(AdditionalDependencies) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - true - - - true - - - - - - - - - - - - - - - - - - - - true - - - true - - - true - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {72b01aca-7a1a-4f7b-acef-2607299cf052} - - - {73a5729c-7323-41d4-ab48-8a03c9f81603} - - - - - - - Document - - - Document - - - Document - - - - - - diff --git a/src/win32/Srb2win-vc10.vcxproj.filters b/src/win32/Srb2win-vc10.vcxproj.filters deleted file mode 100644 index 7279368f1..000000000 --- a/src/win32/Srb2win-vc10.vcxproj.filters +++ /dev/null @@ -1,943 +0,0 @@ - - - - - {20cba664-c3ef-48f1-85dd-42aafd5345cc} - - - {d3817a65-82f5-4989-9217-e5a7f43380a0} - - - {9c3ed4ae-dbed-4d00-a164-b8bb7fc1710c} - - - {4b8a8fb6-7c84-48c2-85d1-0583e6b8cacd} - - - {1907eee5-0ebf-4325-a2fa-793f089ed2e3} - - - {b9e78a3f-3e2b-4f89-9817-b77c7a26d2aa} - - - {3f336df5-a1d7-4610-9728-4525e42c0abc} - - - {b5090aa0-6645-4091-aa1a-ffc3bf4dc422} - - - {d59e82c9-68e5-44bf-827e-f7bb1676cd6c} - - - {29e746a2-3d91-4b69-af6e-5e03895516b7} - - - {b295d364-61c3-4ebb-9b68-7d6c0bb891be} - - - {ba258ec5-13d7-4083-98bd-c2ee58700b66} - - - {6163f1e5-da5d-4af2-b92c-753452f9e1d0} - - - {077b0966-1151-4afa-a533-120a4c931322} - - - {bded90bc-8019-42b1-ba19-32166743d3e3} - - - {c0ddfdb5-7494-4cca-b2ad-cb048be9cbdf} - - - {d5157f99-43ef-49cc-ad76-658a1168fc0d} - - - {2cedf139-53a1-40ea-b4de-19e9f4505a1f} - - - - - Win32app - - - Win32app - - - Win32app - - - Win32app - - - Win32app - - - Win32app - - - Win32app - - - Win32app - - - Win32app - - - Win32app - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - D_Doom - - - D_Doom - - - D_Doom - - - D_Doom - - - D_Doom - - - D_Doom - - - G_Game - - - G_Game - - - F_Frame - - - F_Frame - - - I_Interface - - - I_Interface - - - LUA - - - LUA - - - LUA - - - LUA - - - LUA - - - LUA - - - LUA - - - LUA - - - LUA - - - LUA - - - LUA - - - LUA - - - LUA - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - H_Hud - - - B_Bots - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - S_Sounds - - - W_Wad - - - W_Wad - - - S_Sounds - - - O_Other - - - H_Hud - - - H_Hud - - - I_Interface - - - H_Hud - - - P_Play - - - I_Interface - - - H_Hud - - - R_Rend - - - R_Rend - - - H_Hud - - - D_Doom - - - M_Misc - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - - - Win32app - - - Win32app - - - Win32app - - - Win32app - - - Win32app - - - Win32app - - - Win32app - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - Hw_Hardware - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - BLUA - - - D_Doom - - - D_Doom - - - D_Doom - - - D_Doom - - - D_Doom - - - D_Doom - - - D_Doom - - - D_Doom - - - D_Doom - - - D_Doom - - - D_Doom - - - D_Doom - - - D_Doom - - - D_Doom - - - G_Game - - - G_Game - - - G_Game - - - F_Frame - - - I_Interface - - - I_Interface - - - I_Interface - - - I_Interface - - - I_Interface - - - I_Interface - - - I_Interface - - - LUA - - - LUA - - - LUA - - - LUA - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - M_Misc - - - H_Hud - - - B_Bots - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - P_Play - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - P_Play - - - S_Sounds - - - W_Wad - - - W_Wad - - - I_Interface - - - S_Sounds - - - O_Other - - - I_Interface - - - H_Hud - - - H_Hud - - - I_Interface - - - I_Interface - - - H_Hud - - - P_Play - - - I_Interface - - - A_Asm - - - H_Hud - - - R_Rend - - - R_Rend - - - H_Hud - - - D_Doom - - - O_Other - - - Hw_Hardware - - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - R_Rend - - - - - Win32app - - - - - Win32app - - - - - A_Asm - - - O_Other - - - - - A_Asm - - - A_Asm - - - A_Asm - - - diff --git a/src/win32/Srb2win-vc9.vcproj b/src/win32/Srb2win-vc9.vcproj deleted file mode 100644 index c1c6b5bc4..000000000 --- a/src/win32/Srb2win-vc9.vcproj +++ /dev/null @@ -1,4914 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/win32/Srb2win.dsp b/src/win32/Srb2win.dsp deleted file mode 100644 index 661f3eaf9..000000000 --- a/src/win32/Srb2win.dsp +++ /dev/null @@ -1,1008 +0,0 @@ -# Microsoft Developer Studio Project File - Name="Srb2win" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Application" 0x0101 - -CFG=Srb2win - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "Srb2win.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "Srb2win.mak" CFG="Srb2win - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "Srb2win - Win32 Release" (based on "Win32 (x86) Application") -!MESSAGE "Srb2win - Win32 Debug" (based on "Win32 (x86) Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "Srb2win - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "..\..\objs\Release" -# PROP BASE Intermediate_Dir "..\..\objs\Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\..\bin\VC\Release\Win32" -# PROP Intermediate_Dir "..\..\objs\VC\Release\Win32" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /G5 /W3 /GX /Zi /Ot /Og /Oi /Op /Oy /Ob1 /Gy /I "..\..\libs\libpng-src" /I "..\..\libs\zlib" /D "NDEBUG" /D "_WINDOWS" /D "USEASM" /D "HAVE_PNG" /FR /FD /GF /Gs /GF /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 -# ADD MTL /nologo /D "NDEBUG" /o "NUL" /win32 -# SUBTRACT MTL /mktyplib203 -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo /o"..\..\objs\Release\Srb2win.bsc" -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 -# ADD LINK32 dxguid.lib user32.lib gdi32.lib winmm.lib advapi32.lib ws2_32.lib dinput.lib /nologo /subsystem:windows /pdb:"C:\srb2demo2\srb2.pdb" /debug /machine:I386 /out:"C:\srb2demo2\srb2win.exe" -# SUBTRACT LINK32 /profile /pdb:none /incremental:yes /nodefaultlib - -!ELSEIF "$(CFG)" == "Srb2win - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "..\..\objs\Debug" -# PROP BASE Intermediate_Dir "..\..\objs\Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\..\bin\VC\Debug\Win32" -# PROP Intermediate_Dir "..\..\objs\VC\Debug\Win32" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /G6 /W4 /Gm /GX /ZI /Od /Op /Oy /I "libs\libpng-src" /I "..\..\libs\libpng-src" /I "..\..\libs\zlib" /D "_DEBUG" /D "_WINDOWS" /D "USEASM" /D "HAVE_PNG" /FAcs /FR /FD /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept -# ADD LINK32 dxguid.lib user32.lib gdi32.lib winmm.lib advapi32.lib ws2_32.lib dinput.lib /nologo /subsystem:windows /profile /debug /machine:I386 /out:"C:\srb2demo2\srb2debug.exe" -# SUBTRACT LINK32 /nodefaultlib - -!ENDIF - -# Begin Target - -# Name "Srb2win - Win32 Release" -# Name "Srb2win - Win32 Debug" -# Begin Group "Win32app" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\afxres.h -# End Source File -# Begin Source File - -SOURCE=.\dx_error.c -# End Source File -# Begin Source File - -SOURCE=.\dx_error.h -# End Source File -# Begin Source File - -SOURCE=.\fabdxlib.c -# End Source File -# Begin Source File - -SOURCE=.\fabdxlib.h -# End Source File -# Begin Source File - -SOURCE=..\filesrch.c -# End Source File -# Begin Source File - -SOURCE=..\filesrch.h -# End Source File -# Begin Source File - -SOURCE=.\mid2strm.c -# End Source File -# Begin Source File - -SOURCE=.\mid2strm.h -# End Source File -# Begin Source File - -SOURCE=.\midstuff.h -# End Source File -# Begin Source File - -SOURCE=.\resource.h -# End Source File -# Begin Source File - -SOURCE=.\Srb2win.rc - -!IF "$(CFG)" == "Srb2win - Win32 Release" - -# ADD BASE RSC /l 0x40c /i "win32" -# ADD RSC /l 0x409 /i "win32" - -!ELSEIF "$(CFG)" == "Srb2win - Win32 Debug" - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=.\win_cd.c -# End Source File -# Begin Source File - -SOURCE=.\win_dbg.c -# End Source File -# Begin Source File - -SOURCE=.\win_dbg.h -# End Source File -# Begin Source File - -SOURCE=.\win_dll.c -# End Source File -# Begin Source File - -SOURCE=.\win_dll.h -# End Source File -# Begin Source File - -SOURCE=.\win_main.c -# End Source File -# Begin Source File - -SOURCE=.\win_main.h -# End Source File -# Begin Source File - -SOURCE=.\win_net.c -# End Source File -# Begin Source File - -SOURCE=.\win_snd.c -# End Source File -# Begin Source File - -SOURCE=.\win_sys.c -# End Source File -# Begin Source File - -SOURCE=.\win_vid.c -# End Source File -# End Group -# Begin Group "A_Asm" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\p5prof.h -# End Source File -# Begin Source File - -SOURCE=..\tmap.nas - -!IF "$(CFG)" == "Srb2win - Win32 Release" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Compiling $(InputName).nas with NASM... -IntDir=.\..\..\objs\VC\Release\Win32 -InputPath=..\tmap.nas -InputName=tmap - -"$(IntDir)/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - nasm -g -o $(IntDir)/$(InputName).obj -f win32 $(InputPath) - -# End Custom Build - -!ELSEIF "$(CFG)" == "Srb2win - Win32 Debug" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Compiling $(InputName).nas with NASM... -IntDir=.\..\..\objs\VC\Debug\Win32 -InputPath=..\tmap.nas -InputName=tmap - -"$(IntDir)/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - nasm -g -o $(IntDir)/$(InputName).obj -f win32 $(InputPath) - -# End Custom Build - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\tmap_mmx.nas - -!IF "$(CFG)" == "Srb2win - Win32 Release" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Compiling $(InputName).nas with NASM... -IntDir=.\..\..\objs\VC\Release\Win32 -InputPath=..\tmap_mmx.nas -InputName=tmap_mmx - -"$(IntDir)/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - nasm -g -o $(IntDir)/$(InputName).obj -f win32 $(InputPath) - -# End Custom Build - -!ELSEIF "$(CFG)" == "Srb2win - Win32 Debug" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Compiling $(InputName).nas with NASM... -IntDir=.\..\..\objs\VC\Debug\Win32 -InputPath=..\tmap_mmx.nas -InputName=tmap_mmx - -"$(IntDir)/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - nasm -g -o $(IntDir)/$(InputName).obj -f win32 $(InputPath) - -# End Custom Build - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\tmap_vc.nas - -!IF "$(CFG)" == "Srb2win - Win32 Release" - -# Begin Custom Build - Compiling $(InputName).nas with NASM... -IntDir=.\..\..\objs\VC\Release\Win32 -InputPath=..\tmap_vc.nas -InputName=tmap_vc - -"$(IntDir)/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - nasm -g -o $(IntDir)/$(InputName).obj -f win32 $(InputPath) - -# End Custom Build - -!ELSEIF "$(CFG)" == "Srb2win - Win32 Debug" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Compiling $(InputName).nas with NASM... -IntDir=.\..\..\objs\VC\Debug\Win32 -InputPath=..\tmap_vc.nas -InputName=tmap_vc - -"$(IntDir)/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - nasm -g -o $(IntDir)/$(InputName).obj -f win32 $(InputPath) - -# End Custom Build - -!ENDIF - -# End Source File -# End Group -# Begin Group "D_Doom" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\comptime.c -# End Source File -# Begin Source File - -SOURCE=..\d_clisrv.c -# End Source File -# Begin Source File - -SOURCE=..\d_clisrv.h -# End Source File -# Begin Source File - -SOURCE=..\d_event.h -# End Source File -# Begin Source File - -SOURCE=..\d_main.c -# End Source File -# Begin Source File - -SOURCE=..\d_main.h -# End Source File -# Begin Source File - -SOURCE=..\d_net.c -# End Source File -# Begin Source File - -SOURCE=..\d_net.h -# End Source File -# Begin Source File - -SOURCE=..\d_netcmd.c -# End Source File -# Begin Source File - -SOURCE=..\d_netcmd.h -# End Source File -# Begin Source File - -SOURCE=..\d_netfil.c -# End Source File -# Begin Source File - -SOURCE=..\d_netfil.h -# End Source File -# Begin Source File - -SOURCE=..\d_player.h -# End Source File -# Begin Source File - -SOURCE=..\d_think.h -# End Source File -# Begin Source File - -SOURCE=..\d_ticcmd.h -# End Source File -# Begin Source File - -SOURCE=..\dehacked.c -# End Source File -# Begin Source File - -SOURCE=..\dehacked.h -# End Source File -# Begin Source File - -SOURCE=..\doomdata.h -# End Source File -# Begin Source File - -SOURCE=..\doomdef.h -# End Source File -# Begin Source File - -SOURCE=..\doomstat.h -# End Source File -# Begin Source File - -SOURCE=..\doomtype.h -# End Source File -# Begin Source File - -SOURCE=..\z_zone.c -# End Source File -# Begin Source File - -SOURCE=..\z_zone.h -# End Source File -# End Group -# Begin Group "F_Frame" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\f_finale.c -# End Source File -# Begin Source File - -SOURCE=..\f_finale.h -# End Source File -# Begin Source File - -SOURCE=..\f_wipe.c -# End Source File -# End Group -# Begin Group "G_Game" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\g_game.c -# End Source File -# Begin Source File - -SOURCE=..\g_game.h -# End Source File -# Begin Source File - -SOURCE=..\g_input.c -# End Source File -# Begin Source File - -SOURCE=..\g_input.h -# End Source File -# Begin Source File - -SOURCE=..\g_state.h -# End Source File -# End Group -# Begin Group "H_Hud" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\am_map.c -# End Source File -# Begin Source File - -SOURCE=..\am_map.h -# End Source File -# Begin Source File - -SOURCE=..\command.c -# End Source File -# Begin Source File - -SOURCE=..\command.h -# End Source File -# Begin Source File - -SOURCE=..\console.c -# End Source File -# Begin Source File - -SOURCE=..\console.h -# End Source File -# Begin Source File - -SOURCE=..\hu_stuff.c -# End Source File -# Begin Source File - -SOURCE=..\hu_stuff.h -# End Source File -# Begin Source File - -SOURCE=..\st_stuff.c -# End Source File -# Begin Source File - -SOURCE=..\st_stuff.h -# End Source File -# Begin Source File - -SOURCE=..\y_inter.c -# End Source File -# Begin Source File - -SOURCE=..\y_inter.h -# End Source File -# End Group -# Begin Group "Hw_Hardware" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\hardware\hw3dsdrv.h -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw3sound.c -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw3sound.h -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw_bsp.c -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw_cache.c -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw_data.h -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw_defs.h -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw_dll.h -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw_draw.c -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw_drv.h -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw_glob.h -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw_light.c -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw_light.h -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw_main.c -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw_main.h -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw_md2.c -# End Source File -# Begin Source File - -SOURCE=..\hardware\hw_md2.h -# End Source File -# Begin Source File - -SOURCE=..\hardware\hws_data.h -# End Source File -# End Group -# Begin Group "I_Interface" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\byteptr.h -# End Source File -# Begin Source File - -SOURCE=..\i_joy.h -# End Source File -# Begin Source File - -SOURCE=..\i_net.h -# End Source File -# Begin Source File - -SOURCE=..\i_sound.h -# End Source File -# Begin Source File - -SOURCE=..\i_system.h -# End Source File -# Begin Source File - -SOURCE=..\i_tcp.c -# End Source File -# Begin Source File - -SOURCE=..\i_tcp.h -# End Source File -# Begin Source File - -SOURCE=..\i_video.h -# End Source File -# Begin Source File - -SOURCE=..\keys.h -# End Source File -# Begin Source File - -SOURCE=..\mserv.c -# End Source File -# Begin Source File - -SOURCE=..\mserv.h -# End Source File -# End Group -# Begin Group "M_Misc" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\m_argv.c -# End Source File -# Begin Source File - -SOURCE=..\m_argv.h -# End Source File -# Begin Source File - -SOURCE=..\m_bbox.c -# End Source File -# Begin Source File - -SOURCE=..\m_bbox.h -# End Source File -# Begin Source File - -SOURCE=..\m_cheat.c -# End Source File -# Begin Source File - -SOURCE=..\m_cheat.h -# End Source File -# Begin Source File - -SOURCE=..\m_dllist.h -# End Source File -# Begin Source File - -SOURCE=..\m_fixed.c -# End Source File -# Begin Source File - -SOURCE=..\m_fixed.h -# End Source File -# Begin Source File - -SOURCE=..\m_menu.c -# End Source File -# Begin Source File - -SOURCE=..\m_menu.h -# End Source File -# Begin Source File - -SOURCE=..\m_misc.c -# End Source File -# Begin Source File - -SOURCE=..\m_misc.h -# End Source File -# Begin Source File - -SOURCE=..\m_queue.c -# End Source File -# Begin Source File - -SOURCE=..\m_queue.h -# End Source File -# Begin Source File - -SOURCE=..\m_random.c -# End Source File -# Begin Source File - -SOURCE=..\m_random.h -# End Source File -# Begin Source File - -SOURCE=..\m_swap.h -# End Source File -# Begin Source File - -SOURCE=..\string.c -# End Source File -# End Group -# Begin Group "P_Play" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\info.c -# End Source File -# Begin Source File - -SOURCE=..\info.h -# End Source File -# Begin Source File - -SOURCE=..\p_ceilng.c -# End Source File -# Begin Source File - -SOURCE=..\p_enemy.c -# End Source File -# Begin Source File - -SOURCE=..\p_fab.c -# End Source File -# Begin Source File - -SOURCE=..\p_floor.c -# End Source File -# Begin Source File - -SOURCE=..\p_inter.c -# End Source File -# Begin Source File - -SOURCE=..\p_lights.c -# End Source File -# Begin Source File - -SOURCE=..\p_local.h -# End Source File -# Begin Source File - -SOURCE=..\p_map.c -# End Source File -# Begin Source File - -SOURCE=..\p_maputl.c -# End Source File -# Begin Source File - -SOURCE=..\p_maputl.h -# End Source File -# Begin Source File - -SOURCE=..\p_mobj.c -# End Source File -# Begin Source File - -SOURCE=..\p_mobj.h -# End Source File -# Begin Source File - -SOURCE=..\p_polyobj.c -# End Source File -# Begin Source File - -SOURCE=..\p_polyobj.h -# End Source File -# Begin Source File - -SOURCE=..\p_pspr.h -# End Source File -# Begin Source File - -SOURCE=..\p_saveg.c -# End Source File -# Begin Source File - -SOURCE=..\p_saveg.h -# End Source File -# Begin Source File - -SOURCE=..\p_setup.c -# End Source File -# Begin Source File - -SOURCE=..\p_setup.h -# End Source File -# Begin Source File - -SOURCE=..\p_sight.c -# End Source File -# Begin Source File - -SOURCE=..\p_spec.c -# End Source File -# Begin Source File - -SOURCE=..\p_spec.h -# End Source File -# Begin Source File - -SOURCE=..\p_telept.c -# End Source File -# Begin Source File - -SOURCE=..\p_tick.c -# End Source File -# Begin Source File - -SOURCE=..\p_tick.h -# End Source File -# Begin Source File - -SOURCE=..\p_user.c -# End Source File -# Begin Source File - -SOURCE=..\tables.c -# End Source File -# Begin Source File - -SOURCE=..\tables.h -# End Source File -# End Group -# Begin Group "R_Rend" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\r_bsp.c -# End Source File -# Begin Source File - -SOURCE=..\r_bsp.h -# End Source File -# Begin Source File - -SOURCE=..\r_data.c -# End Source File -# Begin Source File - -SOURCE=..\r_data.h -# End Source File -# Begin Source File - -SOURCE=..\r_defs.h -# End Source File -# Begin Source File - -SOURCE=..\r_draw.c -# End Source File -# Begin Source File - -SOURCE=..\r_draw.h -# End Source File -# Begin Source File - -SOURCE=..\r_draw16.c -# PROP Exclude_From_Build 1 -# End Source File -# Begin Source File - -SOURCE=..\r_draw8.c -# PROP Exclude_From_Build 1 -# End Source File -# Begin Source File - -SOURCE=..\r_local.h -# End Source File -# Begin Source File - -SOURCE=..\r_main.c -# End Source File -# Begin Source File - -SOURCE=..\r_main.h -# End Source File -# Begin Source File - -SOURCE=..\r_plane.c -# End Source File -# Begin Source File - -SOURCE=..\r_plane.h -# End Source File -# Begin Source File - -SOURCE=..\r_segs.c -# End Source File -# Begin Source File - -SOURCE=..\r_segs.h -# End Source File -# Begin Source File - -SOURCE=..\r_sky.c -# End Source File -# Begin Source File - -SOURCE=..\r_sky.h -# End Source File -# Begin Source File - -SOURCE=..\r_splats.c -# End Source File -# Begin Source File - -SOURCE=..\r_splats.h -# End Source File -# Begin Source File - -SOURCE=..\r_state.h -# End Source File -# Begin Source File - -SOURCE=..\r_things.c -# End Source File -# Begin Source File - -SOURCE=..\r_things.h -# End Source File -# Begin Source File - -SOURCE=..\screen.c -# End Source File -# Begin Source File - -SOURCE=..\screen.h -# End Source File -# Begin Source File - -SOURCE=..\v_video.c -# End Source File -# Begin Source File - -SOURCE=..\v_video.h -# End Source File -# End Group -# Begin Group "S_Sounds" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\s_sound.c -# End Source File -# Begin Source File - -SOURCE=..\s_sound.h -# End Source File -# Begin Source File - -SOURCE=..\sounds.c -# End Source File -# Begin Source File - -SOURCE=..\sounds.h -# End Source File -# End Group -# Begin Group "W_Wad" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\lzf.c -# End Source File -# Begin Source File - -SOURCE=..\lzf.h -# End Source File -# Begin Source File - -SOURCE=..\md5.c -# End Source File -# Begin Source File - -SOURCE=..\md5.h -# End Source File -# Begin Source File - -SOURCE=..\w_wad.c -# End Source File -# Begin Source File - -SOURCE=..\w_wad.h -# End Source File -# End Group -# Begin Group "Docs" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\doc\copying -# End Source File -# Begin Source File - -SOURCE=..\..\doc\faq.txt -# End Source File -# Begin Source File - -SOURCE=..\..\readme.txt -# End Source File -# Begin Source File - -SOURCE=..\..\doc\source.txt -# End Source File -# End Group -# Begin Source File - -SOURCE=.\Srb2win.ico -# End Source File -# End Target -# End Project diff --git a/src/win32/Srb2win.dsw b/src/win32/Srb2win.dsw deleted file mode 100644 index f20998142..000000000 --- a/src/win32/Srb2win.dsw +++ /dev/null @@ -1,77 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "Srb2win"=.\Srb2win.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libpng - End Project Dependency - Begin Project Dependency - Project_Dep_Name zlib - End Project Dependency -}}} - -############################################################################### - -Project: "libpng"="..\..\libs\libpng-src\projects\visualc6\libpng.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name zlib - End Project Dependency -}}} - -############################################################################### - -Project: "r_opengl"=..\hardware\r_opengl\r_opengl.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name Srb2win - End Project Dependency -}}} - -############################################################################### - -Project: "zlib"=..\..\libs\zlib\projects\visualc6\zlib.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/src/win32/Srb2win.props b/src/win32/Srb2win.props deleted file mode 100644 index fa152f0c9..000000000 --- a/src/win32/Srb2win.props +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - HAVE_ZLIB;HAVE_LIBGME;_WINDOWS;%(PreprocessorDefinitions) - - _WINDOWS;%(PreprocessorDefinitions) - - - - dxguid.lib;winmm.lib;dinput8.lib;%(AdditionalDependencies) - - - - \ No newline at end of file diff --git a/src/win32/dx_error.c b/src/win32/dx_error.c deleted file mode 100644 index 8e14539a3..000000000 --- a/src/win32/dx_error.c +++ /dev/null @@ -1,276 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 1998-2000 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// 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. -//----------------------------------------------------------------------------- -/// \file -/// \brief DirectX error messages -/// adapted from DirectX6 sample code - -#include - -//#define WIN32_LEAN_AND_MEAN -#define RPC_NO_WINDOWS_H -#include -#define DIRECTSOUND_VERSION 0x0600 /* version 6.0 */ -#define DXVERSION_NTCOMPATIBLE 0x0300 -#ifdef _MSC_VER -#pragma warning(disable : 4201) -#endif -#include -#include -#include - -#include "dx_error.h" - -// ----------------- -// DXErrorMessageBox -// Displays a message box containing the given formatted string. -// ----------------- -/* -VOID DXErrorMessageBox (HRESULT error) LPSTR fmt, ...) -{ - char buff[256]; - va_list args; - - va_start(args, fmt); - wvsprintf(buff, fmt, args); - va_end(args); - - lstrcat(buff, "\r\n"); - MessageBoxA(NULL, buff, "DirectX Error:", MB_ICONEXCLAMATION + MB_OK); -}*/ - - -// --------------- -// DXErrorToString -// Returns a pointer to a string describing the given DD, D3D or D3DRM error code. -// --------------- -LPCSTR DXErrorToString (HRESULT error) -{ - switch (error) { - case DD_OK: - /* Also includes D3D_OK and D3DRM_OK */ - return "No error."; - case DDERR_ALREADYINITIALIZED: - return "This object is already initialized."; - case DDERR_BLTFASTCANTCLIP: - return "Return if a clipper object is attached to the source surface passed into a BltFast call."; - case DDERR_CANNOTATTACHSURFACE: - return "This surface can not be attached to the requested surface."; - case DDERR_CANNOTDETACHSURFACE: - return "This surface can not be detached from the requested surface."; - case DDERR_CANTCREATEDC: - return "Windows can not create any more DCs."; - case DDERR_CANTDUPLICATE: - return "Can't duplicate primary & 3D surfaces, or surfaces that are implicitly created."; - case DDERR_CLIPPERISUSINGHWND: - return "An attempt was made to set a cliplist for a clipper object that is already monitoring an hwnd."; - case DDERR_COLORKEYNOTSET: - return "No src color key specified for this operation."; - case DDERR_CURRENTLYNOTAVAIL: - return "Support is currently not available."; - case DDERR_DIRECTDRAWALREADYCREATED: - return "A DirectDraw object representing this driver has already been created for this process."; - case DDERR_EXCEPTION: - return "An exception was encountered while performing the requested operation."; - case DDERR_EXCLUSIVEMODEALREADYSET: - return "An attempt was made to set the cooperative level when it was already set to exclusive."; - case DDERR_GENERIC: - return "Generic failure."; - case DDERR_HEIGHTALIGN: - return "Height of rectangle provided is not a multiple of reqd alignment."; - case DDERR_HWNDALREADYSET: - return "The CooperativeLevel HWND has already been set. It can not be reset while the process has surfaces or palettes created."; - case DDERR_HWNDSUBCLASSED: - return "HWND used by DirectDraw CooperativeLevel has been subclassed, this prevents DirectDraw from restoring state."; - case DDERR_IMPLICITLYCREATED: - return "This surface can not be restored because it is an implicitly created surface."; - case DDERR_INCOMPATIBLEPRIMARY: - return "Unable to match primary surface creation request with existing primary surface."; - case DDERR_INVALIDCAPS: - return "One or more of the caps bits passed to the callback are incorrect."; - case DDERR_INVALIDCLIPLIST: - return "DirectDraw does not support the provided cliplist."; - case DDERR_INVALIDDIRECTDRAWGUID: - return "The GUID passed to DirectDrawCreate is not a valid DirectDraw driver identifier."; - case DDERR_INVALIDMODE: - return "DirectDraw does not support the requested mode."; - case DDERR_INVALIDOBJECT: - return "DirectDraw received a pointer that was an invalid DIRECTDRAW object."; - case DDERR_INVALIDPARAMS: - return "One or more of the parameters passed to the function are incorrect."; - case DDERR_INVALIDPIXELFORMAT: - return "The pixel format was invalid as specified."; - case DDERR_INVALIDPOSITION: - return "Returned when the position of the overlay on the destination is no longer legal for that destination."; - case DDERR_INVALIDRECT: - return "Rectangle provided was invalid."; - case DDERR_LOCKEDSURFACES: - return "Operation could not be carried out because one or more surfaces are locked."; - case DDERR_NO3D: - return "There is no 3D present."; - case DDERR_NOALPHAHW: - return "Operation could not be carried out because there is no alpha accleration hardware present or available."; - case DDERR_NOBLTHW: - return "No blitter hardware present."; - case DDERR_NOCLIPLIST: - return "No cliplist available."; - case DDERR_NOCLIPPERATTACHED: - return "No clipper object attached to surface object."; - case DDERR_NOCOLORCONVHW: - return "Operation could not be carried out because there is no color conversion hardware present or available."; - case DDERR_NOCOLORKEY: - return "Surface doesn't currently have a color key"; - case DDERR_NOCOLORKEYHW: - return "Operation could not be carried out because there is no hardware support of the destination color key."; - case DDERR_NOCOOPERATIVELEVELSET: - return "Create function called without DirectDraw object method SetCooperativeLevel being called."; - case DDERR_NODC: - return "No DC was ever created for this surface."; - case DDERR_NODDROPSHW: - return "No DirectDraw ROP hardware."; - case DDERR_NODIRECTDRAWHW: - return "A hardware-only DirectDraw object creation was attempted but the driver did not support any hardware."; - case DDERR_NOEMULATION: - return "Software emulation not available."; - case DDERR_NOEXCLUSIVEMODE: - return "Operation requires the application to have exclusive mode but the application does not have exclusive mode."; - case DDERR_NOFLIPHW: - return "Flipping visible surfaces is not supported."; - case DDERR_NOGDI: - return "There is no GDI present."; - case DDERR_NOHWND: - return "Clipper notification requires an HWND or no HWND has previously been set as the CooperativeLevel HWND."; - case DDERR_NOMIRRORHW: - return "Operation could not be carried out because there is no hardware present or available."; - case DDERR_NOOVERLAYDEST: - return "Returned when GetOverlayPosition is called on an overlay that UpdateOverlay has never been called on to establish a destination."; - case DDERR_NOOVERLAYHW: - return "Operation could not be carried out because there is no overlay hardware present or available."; - case DDERR_NOPALETTEATTACHED: - return "No palette object attached to this surface."; - case DDERR_NOPALETTEHW: - return "No hardware support for 16 or 256 color palettes."; - case DDERR_NORASTEROPHW: - return "Operation could not be carried out because there is no appropriate raster op hardware present or available."; - case DDERR_NOROTATIONHW: - return "Operation could not be carried out because there is no rotation hardware present or available."; - case DDERR_NOSTRETCHHW: - return "Operation could not be carried out because there is no hardware support for stretching."; - case DDERR_NOT4BITCOLOR: - return "DirectDrawSurface is not in 4 bit color palette and the requested operation requires 4 bit color palette."; - case DDERR_NOT4BITCOLORINDEX: - return "DirectDrawSurface is not in 4 bit color index palette and the requested operation requires 4 bit color index palette."; - case DDERR_NOT8BITCOLOR: - return "DirectDrawSurface is not in 8 bit color mode and the requested operation requires 8 bit color."; - case DDERR_NOTAOVERLAYSURFACE: - return "Returned when an overlay member is called for a non-overlay surface."; - case DDERR_NOTEXTUREHW: - return "Operation could not be carried out because there is no texture mapping hardware present or available."; - case DDERR_NOTFLIPPABLE: - return "An attempt has been made to flip a surface that is not flippable."; - case DDERR_NOTFOUND: - return "Requested item was not found."; - case DDERR_NOTLOCKED: - return "Surface was not locked. An attempt to unlock a surface that was not locked at all, or by this process, has been attempted."; - case DDERR_NOTPALETTIZED: - return "The surface being used is not a palette-based surface."; - case DDERR_NOVSYNCHW: - return "Operation could not be carried out because there is no hardware support for vertical blank synchronized operations."; - case DDERR_NOZBUFFERHW: - return "Operation could not be carried out because there is no hardware support for zbuffer blitting."; - case DDERR_NOZOVERLAYHW: - return "Overlay surfaces could not be z layered based on their BltOrder because the hardware does not support z layering of overlays."; - case DDERR_OUTOFCAPS: - return "The hardware needed for the requested operation has already been allocated."; - case DDERR_OUTOFMEMORY: - return "There is not enough memory to perform the operation."; - case DDERR_OUTOFVIDEOMEMORY: - return "DirectDraw does not have enough memory to perform the operation."; - case DDERR_OVERLAYCANTCLIP: - return "The hardware does not support clipped overlays."; - case DDERR_OVERLAYCOLORKEYONLYONEACTIVE: - return "Can only have ony color key active at one time for overlays."; - case DDERR_OVERLAYNOTVISIBLE: - return "Returned when GetOverlayPosition is called on a hidden overlay."; - case DDERR_PALETTEBUSY: - return "Access to this palette is being refused because the palette is already locked by another thread."; - case DDERR_PRIMARYSURFACEALREADYEXISTS: - return "This process already has created a primary surface."; - case DDERR_REGIONTOOSMALL: - return "Region passed to Clipper::GetClipList is too small."; - case DDERR_SURFACEALREADYATTACHED: - return "This surface is already attached to the surface it is being attached to."; - case DDERR_SURFACEALREADYDEPENDENT: - return "This surface is already a dependency of the surface it is being made a dependency of."; - case DDERR_SURFACEBUSY: - return "Access to this surface is being refused because the surface is already locked by another thread."; - case DDERR_SURFACEISOBSCURED: - return "Access to surface refused because the surface is obscured."; - case DDERR_SURFACELOST: - return "Access to this surface is being refused because the surface memory is gone. The DirectDrawSurface object representing this surface should have Restore called on it."; - case DDERR_SURFACENOTATTACHED: - return "The requested surface is not attached."; - case DDERR_TOOBIGHEIGHT: - return "Height requested by DirectDraw is too large."; - case DDERR_TOOBIGSIZE: - return "Size requested by DirectDraw is too large, but the individual height and width are OK."; - case DDERR_TOOBIGWIDTH: - return "Width requested by DirectDraw is too large."; - case DDERR_UNSUPPORTED: - return "Function call not supported."; - case DDERR_UNSUPPORTEDFORMAT: - return "FOURCC format requested is unsupported by DirectDraw."; - case DDERR_UNSUPPORTEDMASK: - return "Bitmask in the pixel format requested is unsupported by DirectDraw."; - case DDERR_VERTICALBLANKINPROGRESS: - return "Vertical blank is in progress."; - case DDERR_WASSTILLDRAWING: - return "Informs DirectDraw that the previous Blt which is transfering information to or from this Surface is incomplete."; - case DDERR_WRONGMODE: - return "This surface can not be restored because it was created in a different mode."; - case DDERR_XALIGN: - return "Rectangle provided was not horizontally aligned on required boundary."; - - // - // DirectSound errors - // - case DSERR_ALLOCATED: - return "The request failed because resources, such as a priority level, were already in use by another caller."; - case DSERR_ALREADYINITIALIZED: - return "The object is already initialized."; - case DSERR_BADFORMAT: - return "The specified wave format is not supported."; - case DSERR_BUFFERLOST: - return "The buffer memory has been lost and must be restored."; - case DSERR_CONTROLUNAVAIL: - return "The control (volume, pan, and so forth) requested by the caller is not available."; - case DSERR_INVALIDCALL: - return "This function is not valid for the current state of this object."; - case DSERR_NOAGGREGATION: - return "The object does not support aggregation."; - case DSERR_NODRIVER: - return "No sound driver is available for use."; - case DSERR_NOINTERFACE: - return "The requested COM interface is not available."; - case DSERR_OTHERAPPHASPRIO: - return "Another application has a higher priority level, preventing this call from succeeding"; - case DSERR_PRIOLEVELNEEDED: - return "The caller does not have the priority level required for the function to succeed."; - case DSERR_UNINITIALIZED: - return "The IDirectSound::Initialize method has not been called or has not been called successfully before other methods were called."; - default: - return "Unrecognized error value."; - } -} diff --git a/src/win32/dx_error.h b/src/win32/dx_error.h deleted file mode 100644 index 3af4220de..000000000 --- a/src/win32/dx_error.h +++ /dev/null @@ -1,39 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 1998-2000 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// 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. -//----------------------------------------------------------------------------- -/// \file -/// \brief transform an unreadable DirectX error code -/// into a meaningful error message. - -#ifndef __DX_ERROR_H__ -#define __DX_ERROR_H__ - -//#define WIN32_LEAN_AND_MEAN -#include - -#ifdef __cplusplus -extern "C" { -#endif - -// Displays a message box containing the given formatted string. -//VOID DXErrorMessageBox (LPSTR fmt, ...); - -// Returns a pointer to a string describing the given DD, D3D or D3DRM error code. -LPCSTR DXErrorToString (HRESULT error); - -#ifdef __cplusplus -}; -#endif -#endif // __DX_ERROR_H__ diff --git a/src/win32/fabdxlib.c b/src/win32/fabdxlib.c deleted file mode 100644 index 45ec5d0d3..000000000 --- a/src/win32/fabdxlib.c +++ /dev/null @@ -1,677 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 1998-2000 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// 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. -// -//----------------------------------------------------------------------------- -/// \file -/// \brief faB's DirectX library v1.0 -/// - converted to C for Doom Legacy - -#include "../doomdef.h" - -#ifdef _WINDOWS - -//#define WIN32_LEAN_AND_MEAN -#define RPC_NO_WINDOWS_H -#include -#include -#include "../i_system.h" -#include "dx_error.h" - -#include "fabdxlib.h" - -#define NT4COMPAT //always defined, always compatible - - -// globals - -IDirectDraw2* DDr2 = NULL; -IDirectDrawSurface* ScreenReal = NULL; // DirectDraw primary surface -IDirectDrawSurface* ScreenVirtual = NULL; // DirectDraw back surface -IDirectDrawPalette* DDPalette = NULL; // The primary surface palette -static IDirectDrawClipper *windclip = NULL; // clipper for windowed mode - -BOOL bAppFullScreen; // true for fullscreen exclusive mode, - -int windowPosX = 0; // current position in windowed mode -int windowPosY = 0; - -int ScreenWidth; -int ScreenHeight; -BOOL ScreenLocked; // Screen surface is being locked -int ScreenPitch; // offset from one line to the next -LPBYTE ScreenPtr; // memory of the surface - - -// -// CreateNewSurface -// -static inline IDirectDrawSurface* CreateNewSurface(int dwWidth, - int dwHeight, - int dwSurfaceCaps) -{ - DDSURFACEDESC ddsd; - HRESULT hr; - LPDIRECTDRAWSURFACE psurf; - - ZeroMemory(&ddsd, sizeof (ddsd)); - ddsd.dwSize = sizeof (ddsd); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH; - - ddsd.ddsCaps.dwCaps = dwSurfaceCaps; - - ddsd.dwHeight = dwHeight; - ddsd.dwWidth = dwWidth; - - hr = IDirectDraw2_CreateSurface (DDr2, &ddsd, &psurf, NULL); - - if (hr == DD_OK) - { - //DDCOLORKEY ddck; - IDirectDrawSurface_Restore(psurf); - - //hr = IDirectDrawSurface_GetColorKey(DDCKEY_SRCBLT, &ddck); - //psurf->SetColorKey(DDCKEY_SRCBLT, &ddck); - } - else - psurf = NULL; - - return psurf; -} - -// -// wow! from 320x200x8 up to 1600x1200x32 thanks Banshee! :) -// -static HRESULT WINAPI myEnumModesCallback (LPDDSURFACEDESC surf, LPVOID lpContext) -{ - APPENUMMODESCALLBACK pfnContext = lpContext; - - if (pfnContext) pfnContext(surf->dwWidth, - surf->dwHeight,surf->ddpfPixelFormat. -#ifdef DUMMYUNIONNAMEN - DUMMYUNIONNAMEN(1). -#endif - dwRGBBitCount - ); - - /*I_OutputMsg("%dx%dx%d bpp %d refresh\n", - surf->dwWidth, - surf->dwHeight, - surf->ddpfPixelFormat.dwRGBBitCount, - surf->dwRefreshRate);*/ - - return DDENUMRET_OK; -} - - -// -// Application call here to enumerate display modes -// -BOOL EnumDirectDrawDisplayModes (APPENUMMODESCALLBACK appFunc) -{ - LPVOID lpappFunc = appFunc; - - if (DDr2 == NULL) - return FALSE; - - // enumerate display modes - // Carl: DirectX 3.x apparently does not support VGA modes. Who cares. :) - // faB: removed DDEDM_REFRESHRATES, detects too many modes, plus we don't care of refresh rate. - if (bDX0300) - IDirectDraw2_EnumDisplayModes (DDr2, 0 /*| DDEDM_REFRESHRATES*/, - NULL, lpappFunc, myEnumModesCallback); - else - IDirectDraw2_EnumDisplayModes (DDr2, DDEDM_STANDARDVGAMODES /*| DDEDM_REFRESHRATES*/, - NULL, lpappFunc, myEnumModesCallback); - return TRUE; -} - -static HINSTANCE DDrawDLL = NULL; -typedef HRESULT(WINAPI *DDCreate)(GUID FAR *lpGUID, LPDIRECTDRAW FAR *lplpDD, IUnknown FAR *pUnkOuter); -static DDCreate pfnDirectDrawCreate = NULL; - -static inline BOOL LoadDirectDraw(VOID) -{ - // load ddraw.dll - DDrawDLL = LoadLibraryA("DDRAW.DLL"); - if (DDrawDLL == NULL) - return false; - pfnDirectDrawCreate = (DDCreate)(LPVOID)GetProcAddress(DDrawDLL, "DirectDrawCreate"); - if (pfnDirectDrawCreate == NULL) - return false; - return true; -} - -static inline VOID UnLoadDirectDraw(VOID) -{ - if (!DDrawDLL) - return; - FreeLibrary(DDrawDLL); - pfnDirectDrawCreate = NULL; - DDrawDLL = NULL; -} - -// -// Create the DirectDraw object for later -// -BOOL CreateDirectDrawInstance (VOID) -{ - HRESULT hr; - IDirectDraw* DDr; - IDirectDraw** rp = &DDr; - IDirectDraw2** rp2 = &DDr2; - LPVOID *tp = (LPVOID *)rp2; - - if (!LoadDirectDraw()) - return FALSE; - // - // create an instance of DirectDraw object - // - if (FAILED(hr = pfnDirectDrawCreate(NULL, rp, NULL))) - I_Error("DirectDrawCreate FAILED: %s", DXErrorToString(hr)); - - // change interface to IDirectDraw2 - if (FAILED(hr = IDirectDraw_QueryInterface(DDr, &IID_IDirectDraw2, tp))) - I_Error("Failed to query DirectDraw2 interface: %s", DXErrorToString(hr)); - - // release the interface we don't need - IDirectDraw_Release (DDr); - return TRUE; -} - - -// -// - returns true if DirectDraw was initialized properly -// -int InitDirectDrawe (HWND appWin, int width, int height, int bpp, int fullScr) -{ - DDSURFACEDESC ddsd; // DirectDraw surface description for allocating - DDSCAPS ddscaps; - HRESULT ddrval; - - DWORD dwStyle; - RECT rect; - - // enumerate directdraw devices - //if (FAILED(DirectDrawEnumerate (myEnumDDDevicesCallback, NULL))) - // I_Error("Error with DirectDrawEnumerate"); - - if (!DDr2) - CreateDirectDrawInstance(); - - // remember what screen mode we are in - bAppFullScreen = fullScr; - ScreenHeight = height; - ScreenWidth = width; - - if (bAppFullScreen) - { - // Change window attributes - dwStyle = WS_POPUP | WS_VISIBLE; - SetWindowLong (appWin, GWL_STYLE, dwStyle); - SetWindowPos(appWin, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | - SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER); - - // Get exclusive mode - ddrval = IDirectDraw2_SetCooperativeLevel(DDr2, appWin, DDSCL_EXCLUSIVE | - DDSCL_FULLSCREEN | - DDSCL_ALLOWREBOOT); - if (ddrval != DD_OK) - I_Error("SetCooperativeLevel FAILED: %s\n", DXErrorToString(ddrval)); - - // Switch from windows desktop to fullscreen - -#ifdef NT4COMPAT - ddrval = IDirectDraw2_SetDisplayMode(DDr2, width, height, bpp, 0, 0); -#else - ddrval = IDirectDraw2_SetDisplayMode(DDr2, width, height, bpp, 0, DDSDM_STANDARDVGAMODE); -#endif - if (ddrval != DD_OK) - I_Error("SetDisplayMode FAILED: %s\n", DXErrorToString(ddrval)); - - // This is not really needed, except in certain cases. One case - // is while using MFC. When the desktop is initally at 16bpp, a mode - // switch to 8bpp somehow causes the MFC window to not fully initialize - // and a CreateSurface will fail with DDERR_NOEXCLUSIVEMODE. This will - // ensure that the window is initialized properly after a mode switch. - - ShowWindow(appWin, SW_SHOW); - - // Create the primary surface with 1 back buffer. Always zero the - // DDSURFACEDESC structure and set the dwSize member! - - ZeroMemory(&ddsd, sizeof (ddsd)); - ddsd.dwSize = sizeof (ddsd); - ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX; - - // for fullscreen we use page flipping, for windowed mode, we blit the hidden surface to - // the visible surface, in both cases we have a visible (or 'real') surface, and a hidden - // (or 'virtual', or 'backbuffer') surface. - ddsd.dwBackBufferCount = 2; - - ddrval = IDirectDraw2_CreateSurface(DDr2,&ddsd, &ScreenReal, NULL); - if (ddrval != DD_OK) - I_Error("CreateSurface Primary Screen FAILED"); - - // Get a pointer to the back buffer - - ddscaps.dwCaps = DDSCAPS_BACKBUFFER; - ddrval = IDirectDrawSurface_GetAttachedSurface(ScreenReal,&ddscaps, &ScreenVirtual); - if (ddrval != DD_OK) - I_Error("GetAttachedSurface FAILED"); - } - else - { - rect.top = 0; - rect.left = 0; - rect.bottom = height; - rect.right = width; - - // Change window attributes - - dwStyle = GetWindowStyle(appWin); - dwStyle &= ~WS_POPUP; - dwStyle |= WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION; - - SetWindowLong(appWin, GWL_STYLE, dwStyle); - - // Resize the window so that the client area is the requested width/height - - AdjustWindowRectEx(&rect, GetWindowStyle(appWin), GetMenu(appWin) != NULL, - GetWindowExStyle(appWin)); - - // Just in case the window was moved off the visible area of the - // screen. - - SetWindowPos(appWin, NULL, 0, 0, rect.right-rect.left, - rect.bottom-rect.top, SWP_NOMOVE | SWP_NOZORDER | - SWP_NOACTIVATE); - - SetWindowPos(appWin, HWND_NOTOPMOST, 0, 0, 0, 0, - SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); - - // Exclusive mode is normal since it's in windowed mode and needs - // to cooperate with GDI - - ddrval = IDirectDraw2_SetCooperativeLevel(DDr2,appWin, DDSCL_NORMAL); - if (ddrval != DD_OK) - I_Error("SetCooperativeLevel FAILED"); - - // Always zero the DDSURFACEDESC structure and set the dwSize member! - - ZeroMemory(&ddsd, sizeof (ddsd)); - ddsd.dwSize = sizeof (ddsd); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - - // Create the primary surface - - ddrval = IDirectDraw2_CreateSurface(DDr2,&ddsd, &ScreenReal, NULL); - if (ddrval != DD_OK) - I_Error("CreateSurface Primary Screen FAILED"); - - // Create a back buffer for offscreen rendering, this will be used to - // blt to the primary - - ScreenVirtual = CreateNewSurface(width, height, DDSCAPS_OFFSCREENPLAIN | - DDSCAPS_SYSTEMMEMORY); - if (ScreenVirtual == NULL) - I_Error("CreateSurface Secondary Screen FAILED"); - - /// \todo get the desktop bit depth, and build a lookup table - /// for quick conversions of 8bit color indexes 0-255 to desktop colors - /// eg: 256 entries of equivalent of palette colors 0-255 in 15,16,24,32 bit format - /// when blit virtual to real, convert pixels through lookup table.. - - // Use a clipper object for clipping when in windowed mode - // (make sure our drawing doesn't affect other windows) - - ddrval = IDirectDraw2_CreateClipper (DDr2, 0, &windclip, 0); - if (ddrval != DD_OK) - I_Error("CreateClipper FAILED"); - - // Associate the clipper with the window. - ddrval = IDirectDrawClipper_SetHWnd (windclip,0, appWin); - if (ddrval != DD_OK) - I_Error("Clipper -> SetHWnd FAILED"); - - // Attach the clipper to the surface. - ddrval = IDirectDrawSurface_SetClipper (ScreenReal,windclip); - if (ddrval != DD_OK) - I_Error("PrimaryScreen -> SetClipperClipper FAILED"); - } - - return TRUE; -} - - -// -// Free all memory -// -VOID CloseDirectDraw (VOID) -{ - ReleaseChtuff(); - if (DDr2) - { - IDirectDraw2_Release(DDr2); - DDr2 = NULL; - } - UnLoadDirectDraw(); -} - - -// -// Release DirectDraw stuff before display mode change -// -VOID ReleaseChtuff (VOID) -{ - if (!DDr2) - return; - if (windclip) - { - IDirectDrawClipper_Release(windclip); - windclip = NULL; - } - if (DDPalette) - { - IDirectDrawPalette_Release(DDPalette); - DDPalette = NULL; - } - // If the app is fullscreen, the back buffer is attached to the - // primary. Releasing the primary buffer will also release any - // attached buffers, so explicitly releasing the back buffer is not - // necessary. - - if (!bAppFullScreen && ScreenVirtual) - { - IDirectDrawSurface_Release(ScreenVirtual); // release hidden surface - ScreenVirtual = NULL; - } - if (ScreenReal) - { - IDirectDrawSurface_Release(ScreenReal); // and attached backbuffers for bAppFullScreen mode - ScreenReal = NULL; - } -} - - -// -// Clear the surface to color -// -VOID ClearSurface(IDirectDrawSurface* surface, int color) -{ - DDBLTFX ddbltfx; - - // Use the blter to do a color fill to clear the back buffer - ddbltfx.dwSize = sizeof (ddbltfx); - ddbltfx. -#ifdef DUMMYUNIONNAMEN - DUMMYUNIONNAMEN(5). -#endif - dwFillColor = color; - IDirectDrawSurface_Blt(surface,NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx); - -} - -// -// Flip the real page with virtual page -// - in bAppFullScreen mode, do page flipping -// - in windowed mode, copy the hidden surface to the visible surface -// -// waitflip : if not 0, wait for page flip to end -BOOL ScreenFlip(int waitflip) -{ - HRESULT hr; - RECT rect; - - if (bAppFullScreen) - { - //hr = IDirectDrawSurface_GetFlipStatus (ScreenReal, DDGFS_); - - // In full-screen exclusive mode, do a hardware flip. - hr = IDirectDrawSurface_Flip(ScreenReal, NULL, DDFLIP_WAIT | (waitflip ? 0 : DDFLIP_NOVSYNC)); //return immediately - - // If the surface was lost, restore it. - if (hr == DDERR_SURFACELOST) - { - IDirectDrawSurface_Restore(ScreenReal); - - // The restore worked, so try the flip again. - hr = IDirectDrawSurface_Flip(ScreenReal, 0, DDFLIP_WAIT | (waitflip ? 0 : DDFLIP_NOVSYNC)); - } - } - else - { - rect.left = windowPosX; - rect.top = windowPosY; - rect.right = windowPosX + ScreenWidth - 1; - rect.bottom = windowPosY + ScreenHeight - 1; - - // Copy the back buffer to front. - hr = IDirectDrawSurface_Blt(ScreenReal, &rect, ScreenVirtual, 0, DDBLT_WAIT, 0); - - if (hr != DD_OK) - { - // If the surfaces were lost, restore them. - if (IDirectDrawSurface_IsLost(ScreenReal) == DDERR_SURFACELOST) - IDirectDrawSurface_Restore(ScreenReal); - - if (IDirectDrawSurface_IsLost(ScreenVirtual) == DDERR_SURFACELOST) - IDirectDrawSurface_Restore(ScreenVirtual); - - // Retry the copy. - hr = IDirectDrawSurface_Blt(ScreenReal,&rect, ScreenVirtual, 0, DDBLT_WAIT, 0); - } - } - - if (hr != DD_OK) - I_Error("ScreenFlip() : couldn't Flip surfaces because %s", DXErrorToString(hr)); - - return FALSE; -} - -// -// Print a text to the surface -// -VOID TextPrint(int x, int y, LPCSTR message) -{ - HRESULT hr; - HDC hdc = NULL; - - // Get the device context handle. - hr = IDirectDrawSurface_GetDC(ScreenVirtual,&hdc); - if (hr != DD_OK) - return; - - // Write the message. - SetBkMode(hdc, TRANSPARENT); - SetTextColor(hdc, RGB(255, 255, 255)); - TextOutA(hdc, x, y, message, (int)strlen(message)); - - // Release the device context. - hr = IDirectDrawSurface_ReleaseDC(ScreenVirtual,hdc); -} - -// -// Lock surface before multiple drawings by hand, for speed -// -boolean LockScreen(VOID) -{ - DDSURFACEDESC ddsd; - HRESULT ddrval; - - ZeroMemory(&ddsd, sizeof (ddsd)); - ddsd.dwSize = sizeof (ddsd); - - // attempt to Lock the surface - ddrval = IDirectDrawSurface_Lock(ScreenVirtual, NULL, &ddsd, DDLOCK_WAIT, NULL); - - // Always, always check for errors with DirectX! - // If the surface was lost, restore it. - if (ddrval == DDERR_SURFACELOST) - { - ddrval = IDirectDrawSurface_Restore(ScreenReal); - - // now retry to get the lock - ddrval = IDirectDrawSurface_Lock(ScreenVirtual, NULL, &ddsd, DDLOCK_WAIT, NULL); - } - - if (ddrval == DD_OK) - { - ScreenLocked = TRUE; - ScreenPtr = (LPBYTE)ddsd.lpSurface; - ScreenPitch = ddsd. -#ifdef DUMMYUNIONNAMEN - DUMMYUNIONNAMEN(1). -#endif - lPitch; - } - else - { - ScreenLocked = FALSE; - ScreenPtr = NULL; - ScreenPitch = 0; - //I_Error("LockScreen() : couldn't restore the surface."); - return false; - } - return true; -} - -// -// Unlock surface -// -VOID UnlockScreen(VOID) -{ - if (DD_OK != IDirectDrawSurface_Unlock(ScreenVirtual,NULL)) - I_Error("Couldn't UnLock the renderer!"); - - ScreenLocked = FALSE; - ScreenPtr = NULL; - ScreenPitch = 0; -} - -// Blit virtual screen to real screen -//faB: note: testing 14/03/1999, see if it is faster than memcopy of virtual to -/* -static LPDIRECTDRAWSURFACE lpDDS = NULL; -VOID BlitScreen(VOID) -{ - HRESULT hr; - - if (!lpDDS) - I_Error("lpDDS NULL"); - - hr = IDirectDrawSurface_BltFast(ScreenVirtual, - 0, 0, // Upper left xy of destination - lpDDS, // Source surface - NULL, // Source rectangle = entire surface - DDBLTFAST_WAIT | DDBLTFAST_NOCOLORKEY); - if (FAILED(hr)) - I_Error("BltFast FAILED"); -} - -VOID MakeScreen(int width, int height, BYTE* lpSurface) -{ - HRESULT hr; - DDSURFACEDESC ddsd; - - // Initialize the surface description. - ZeroMemory (&ddsd, sizeof ddsd); - ZeroMemory (&ddsd.ddpfPixelFormat, sizeof (DDPIXELFORMAT)); - ddsd.dwSize = sizeof ddsd; - ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | //DDSD_LPSURFACE | - DDSD_PITCH | DDSD_PIXELFORMAT | DDSD_CAPS; - ddsd.dwWidth = width; - ddsd.dwHeight= height; - ddsd.lPitch = width; - ddsd.lpSurface = lpSurface; - ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY | DDSCAPS_OFFSCREENPLAIN; - - // Set up the pixel format for 8-bit - ddsd.ddpfPixelFormat.dwSize = sizeof (DDPIXELFORMAT); - ddsd.ddpfPixelFormat.dwFlags= DDPF_RGB | DDPF_PALETTEINDEXED8; - ddsd.ddpfPixelFormat.dwRGBBitCount = 8; - - // - ddsd.ddpfPixelFormat.dwRGBBitCount = (DWORD)DEPTH*8; - ddsd.ddpfPixelFormat.dwRBitMask = 0x00FF0000; - ddsd.ddpfPixelFormat.dwGBitMask = 0x0000FF00; - ddsd.ddpfPixelFormat.dwBBitMask = 0x000000FF; - - // Create the surface - hr = IDirectDraw2_CreateSurface(DDr2, &ddsd, &lpDDS, NULL); - if (FAILED(hr)) - I_Error("MakeScreen FAILED: %s",DDError(hr)); - //ddsd.lpSurface = lpSurface; -} -*/ - -// -// Create a palette object -// -VOID CreateDDPalette (PALETTEENTRY* colorTable) -{ - HRESULT ddrval; - ddrval = IDirectDraw2_CreatePalette(DDr2,DDPCAPS_8BIT|DDPCAPS_ALLOW256, colorTable, &DDPalette, NULL); - if (ddrval != DD_OK) - I_Error("couldn't CreatePalette"); -}; - - -// -// Free the palette object -// -VOID DestroyDDPalette (VOID) -{ - if (DDPalette) - { - IDirectDrawPalette_Release(DDPalette); - DDPalette = NULL; - } -} - -// -// Set a a full palette of 256 PALETTEENTRY entries -// -VOID SetDDPalette(PALETTEENTRY* pal) -{ - // create palette first time - if (DDPalette == NULL) - CreateDDPalette(pal); - else - IDirectDrawPalette_SetEntries(DDPalette, 0, 0, 256, pal); - // setting the same palette to the same surface again does not increase - // the reference count - IDirectDrawSurface_SetPalette(ScreenReal, DDPalette); -} - -// -// Wait for vsync, gross -// -VOID WaitVbl(VOID) -{ - IDirectDraw2_WaitForVerticalBlank(DDr2, DDWAITVB_BLOCKBEGIN, NULL); -} - - -// -// Restore the palette. Useful when we regain focus. -// -VOID RestoreDDPalette(VOID) -{ - if (DDPalette) - IDirectDrawSurface_SetPalette(ScreenReal, DDPalette); -} -#endif diff --git a/src/win32/fabdxlib.h b/src/win32/fabdxlib.h deleted file mode 100644 index 2836b795d..000000000 --- a/src/win32/fabdxlib.h +++ /dev/null @@ -1,82 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 1998-2000 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// 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. -//----------------------------------------------------------------------------- -/// \file -/// \brief faB's DirectX library v1.0 - -#ifndef _H_FABDXLIB_ -#define _H_FABDXLIB_ - -//#define WIN32_LEAN_AND_MEAN -#define RPC_NO_WINDOWS_H -#include -#ifdef __MINGW32__ -//#define NONAMELESSUNION -#endif -#ifdef _MSC_VER -#pragma warning(disable : 4201) -#endif -#include -#if (defined (DIRECTDRAW_VERSION) && (DIRECTDRAW_VERSION >= 0x0700)) -#undef DUMMYUNIONNAMEN -#endif -// format of function in app called with width,height -typedef BOOL (*APPENUMMODESCALLBACK)(int width, int height, int bpp); - - -// globals -extern IDirectDraw2* DDr2; -extern IDirectDrawSurface* ScreenReal; -extern IDirectDrawSurface* ScreenVirtual; -extern IDirectDrawPalette* DDPalette; - -extern BOOL bAppFullScreen; // main code might need this to know the current - // fullscreen or windowed state - -extern int windowPosX; // current position in windowed mode -extern int windowPosY; - -extern int ScreenWidth; -extern int ScreenHeight; -extern BOOL ScreenLocked; // Screen surface is being locked -extern int ScreenPitch; // offset from one line to the next -extern LPBYTE ScreenPtr; // memory of the surface - -extern BOOL bDX0300; - -BOOL EnumDirectDrawDisplayModes (APPENUMMODESCALLBACK appFunc); -BOOL CreateDirectDrawInstance (VOID); - -int InitDirectDrawe (HWND appWin, int width, int height, int bpp, int fullScr); -VOID CloseDirectDraw (VOID); - -VOID ReleaseChtuff (VOID); - -VOID ClearSurface (IDirectDrawSurface* surface, int color); -BOOL ScreenFlip (int wait); -VOID TextPrint (int x, int y, LPCSTR message); - -VOID CreateDDPalette (PALETTEENTRY* colorTable); -VOID DestroyDDPalette (VOID); -VOID SetDDPalette (PALETTEENTRY* pal); -VOID RestoreDDPalette(VOID); - -VOID WaitVbl (VOID); - -boolean LockScreen (VOID); -VOID UnlockScreen (VOID); - - -#endif /* _H_FABDXLIB_ */ diff --git a/src/win32/win_cd.c b/src/win32/win_cd.c deleted file mode 100644 index 324c24928..000000000 --- a/src/win32/win_cd.c +++ /dev/null @@ -1,539 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 1998-2000 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// 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. -//----------------------------------------------------------------------------- -/// \file -/// \brief cd music interface (uses MCI). - -#include "../doomdef.h" -#include "../doomstat.h" -#ifdef _WINDOWS -#include "win_main.h" -#include - -#include "../command.h" -#include "../doomtype.h" -#include "../i_sound.h" -#include "../i_system.h" - -#include "../s_sound.h" - -#define MAX_CD_TRACKS 255 - -typedef struct { - BOOL IsAudio; - DWORD Start, End; - DWORD Length; // minutes -} CDTrack; - -// ------- -// private -// ------- -static CDTrack m_nTracks[MAX_CD_TRACKS]; -static int m_nTracksCount; // up to MAX_CD_TRACKS -static MCI_STATUS_PARMS m_MCIStatus; -static MCI_OPEN_PARMS m_MCIOpen; - -// ------ -// protos -// ------ -static void Command_Cd_f (void); - - -// ------------------- -// MCIErrorMessageBox -// Retrieve error message corresponding to return value from -// mciSendCommand() or mciSenString() -// ------------------- -static VOID MCIErrorMessageBox (MCIERROR iErrorCode) -{ - char szErrorText[128]; - if (!mciGetErrorStringA (iErrorCode, szErrorText, sizeof (szErrorText))) - wsprintfA(szErrorText,"MCI CD Audio Unknown Error #%lu\n", iErrorCode); - I_OutputMsg("%s", szErrorText); - /*MessageBox (GetActiveWindow(), szTemp+1, "LEGACY", - MB_OK | MB_ICONSTOP);*/ -} - - -// -------- -// CD_Reset -// -------- -static VOID CD_Reset (VOID) -{ - // no win32 equivalent - //faB: for DOS, some odd drivers like to be reset sometimes.. useless in MCI I guess -} - - -// ---------------- -// CD_ReadTrackInfo -// Read in number of tracks, and length of each track in minutes/seconds -// returns true if error -// ---------------- -static BOOL CD_ReadTrackInfo(VOID) -{ - UINT nTrackLength; - INT i; - MCIERROR iErr; - - m_nTracksCount = 0; - - m_MCIStatus.dwItem = MCI_STATUS_NUMBER_OF_TRACKS; - iErr = mciSendCommand(m_MCIOpen.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM|MCI_WAIT, (DWORD_PTR)&m_MCIStatus); - if (iErr) - { - MCIErrorMessageBox (iErr); - return FALSE; - } - m_nTracksCount = (int)m_MCIStatus.dwReturn; - if (m_nTracksCount > MAX_CD_TRACKS) - m_nTracksCount = MAX_CD_TRACKS; - - for (i = 0; i < m_nTracksCount; i++) - { - m_MCIStatus.dwTrack = (DWORD)(i+1); - m_MCIStatus.dwItem = MCI_STATUS_LENGTH; - iErr = mciSendCommand(m_MCIOpen.wDeviceID, MCI_STATUS, MCI_TRACK|MCI_STATUS_ITEM|MCI_WAIT, (DWORD_PTR)&m_MCIStatus); - if (iErr) - { - MCIErrorMessageBox (iErr); - return FALSE; - } - nTrackLength = (DWORD)(MCI_MSF_MINUTE(m_MCIStatus.dwReturn)*60 + MCI_MSF_SECOND(m_MCIStatus.dwReturn)); - m_nTracks[i].Length = nTrackLength; - - m_MCIStatus.dwItem = MCI_CDA_STATUS_TYPE_TRACK; - iErr = mciSendCommand(m_MCIOpen.wDeviceID, MCI_STATUS, MCI_TRACK|MCI_STATUS_ITEM|MCI_WAIT, (DWORD_PTR)&m_MCIStatus); - if (iErr) - { - MCIErrorMessageBox (iErr); - return FALSE; - } - m_nTracks[i].IsAudio = (m_MCIStatus.dwReturn == MCI_CDA_TRACK_AUDIO); - } - - return TRUE; -} - - -// ------------ -// CD_TotalTime -// returns total time for all audio tracks in seconds -// ------------ -static UINT CD_TotalTime(VOID) -{ - UINT nTotalLength = 0; - INT nTrack; - for (nTrack = 0; nTrack < m_nTracksCount; nTrack++) - { - if (m_nTracks[nTrack].IsAudio) - nTotalLength += m_nTracks[nTrack].Length; - } - return nTotalLength; -} - - -//====================================================================== -// CD AUDIO MUSIC SUBSYSTEM -//====================================================================== - -UINT8 cdaudio_started = 0; // for system startup/shutdown - -static BOOL cdPlaying = FALSE; -static INT cdPlayTrack; // when cdPlaying is true -static BOOL cdLooping = FALSE; -static BYTE cdRemap[MAX_CD_TRACKS]; -static BOOL cdEnabled = TRUE; // cd info available -static BOOL cdValid; // true when last cd audio info was ok -static BOOL wasPlaying; -//static INT cdVolume = 0; // current cd volume (0-31) - -// 0-31 like Music & Sfx, though CD hardware volume is 0-255. -consvar_t cd_volume = CVAR_INIT ("cd_volume","18",CV_SAVE,soundvolume_cons_t, NULL); - -// allow Update for next/loop track -// some crap cd drivers take up to -// a second for a simple 'busy' check.. -// (on those Update can be disabled) -consvar_t cdUpdate = CVAR_INIT ("cd_update","1",CV_SAVE, NULL, NULL); - -#if (__GNUC__ > 6) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wformat-overflow" -#endif -// hour,minutes,seconds -static LPSTR hms(UINT seconds) -{ - UINT hours, minutes; - static CHAR s[9]; - - minutes = seconds / 60; - seconds %= 60; - hours = minutes / 60; - minutes %= 60; - if (hours > 0) - sprintf (s, "%lu:%02lu:%02lu", (long unsigned int)hours, (long unsigned int)minutes, (long unsigned int)seconds); - else - sprintf (s, "%2lu:%02lu", (long unsigned int)minutes, (long unsigned int)seconds); - return s; -} -#if (__GNUC__ > 6) -#pragma GCC diagnostic pop -#endif - -static void Command_Cd_f(void) -{ - LPCSTR s; - int i,j; - - if (!cdaudio_started) - return; - - if (COM_Argc() < 2) - { - CONS_Printf (M_GetText( - "cd [on] [off] [remap] [reset] [select]\n" - " [open] [info] [play ] [resume]\n" - " [stop] [pause] [loop ]\n")); - return; - } - - s = COM_Argv(1); - - // activate cd music - if (!strncmp(s,"on",2)) - { - cdEnabled = TRUE; - return; - } - - // stop/deactivate cd music - if (!strncmp(s, "off", 3)) - { - if (cdPlaying) - I_StopCD(); - cdEnabled = FALSE; - return; - } - - // remap tracks - if (!strncmp(s, "remap", 5)) - { - i = (int)COM_Argc() - 2; - if (i <= 0) - { - CONS_Printf(M_GetText("CD tracks remapped in that order :\n")); - for (j = 1; j < MAX_CD_TRACKS; j++) - if (cdRemap[j] != j) - CONS_Printf(" %2d -> %2d\n", j, cdRemap[j]); - return; - } - for (j = 1; j <= i; j++) - cdRemap[j] = (UINT8)atoi(COM_Argv(j+1)); - return; - } - - // reset the CD driver, useful on some odd cd's - if (!strncmp(s,"reset",5)) - { - cdEnabled = TRUE; - if (cdPlaying) - I_StopCD (); - for (i = 0; i < MAX_CD_TRACKS; i++) - cdRemap[i] = (UINT8)i; - CD_Reset(); - cdValid = CD_ReadTrackInfo(); - return; - } - - // any other command is not allowed until we could retrieve cd information - if (!cdValid) - { - CONS_Printf(M_GetText("CD is not ready.\n")); - return; - } - - /* faB: not with MCI, didn't find it, useless anyway - if (!strncmp(s,"open",4)) - { - if (cdPlaying) - I_StopCD (); - bcd_open_door(); - cdValid = FALSE; - return; - }*/ - - if (!strncmp(s,"info",4)) - { - if (!CD_ReadTrackInfo()) - { - cdValid = FALSE; - return; - } - - cdValid = TRUE; - - if (m_nTracksCount <= 0) - CONS_Printf(M_GetText("No audio tracks\n")); - else - { - // display list of tracks - // highlight current playing track - for (i = 0; i < m_nTracksCount; i++) - { - CONS_Printf("%s%2d. %s %s\n", - cdPlaying && (cdPlayTrack == i) ? "\x82 " : " ", - i+1, m_nTracks[i].IsAudio ? M_GetText("audio") : M_GetText("data "), - hms(m_nTracks[i].Length)); - } - CONS_Printf(M_GetText("\x82Total time : %s\n"), hms(CD_TotalTime())); - } - if (cdPlaying) - { - CONS_Printf(M_GetText("Currently %s track %u\n"), cdLooping ? M_GetText("looping") : M_GetText("playing"), cdPlayTrack); - } - return; - } - - if (!strncmp(s,"play",4)) - { - I_PlayCD ((UINT8)atoi (COM_Argv (2)), false); - return; - } - - if (!strncmp(s,"stop",4)) - { - I_StopCD (); - return; - } - - if (!strncmp(s,"loop",4)) - { - I_PlayCD((UINT8)atoi (COM_Argv (2)), true); - return; - } - - if (!strncmp(s,"resume",4)) - { - I_ResumeCD (); - return; - } - - CONS_Printf (M_GetText("Invalid CD command \"CD %s\"\n"), s); -} - - -// ------------ -// I_ShutdownCD -// Shutdown CD Audio subsystem, release whatever was allocated -// ------------ -void I_ShutdownCD(void) -{ - MCIERROR iErr; - - if (!cdaudio_started) - return; - - CONS_Printf("I_ShutdownCD: "); - - I_StopCD(); - - // closes MCI CD - iErr = mciSendCommand(m_MCIOpen.wDeviceID, MCI_CLOSE, 0, 0); - if (iErr) - MCIErrorMessageBox (iErr); -} - - -// -------- -// I_InitCD -// Init CD Audio subsystem -// -------- -void I_InitCD(void) -{ - MCI_SET_PARMS mciSet; - MCIERROR iErr; - int i; - - // We don't have an open device yet - m_MCIOpen.wDeviceID = 0; - m_nTracksCount = 0; - - cdaudio_started = false; - - m_MCIOpen.lpstrDeviceType = (LPCTSTR)MCI_DEVTYPE_CD_AUDIO; - iErr = mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID, (DWORD_PTR)&m_MCIOpen); - if (iErr) - { - MCIErrorMessageBox (iErr); - return; - } - - // Set the time format to track/minute/second/frame (TMSF). - mciSet.dwTimeFormat = MCI_FORMAT_TMSF; - iErr = mciSendCommand(m_MCIOpen.wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD_PTR)&mciSet); - if (iErr) - { - MCIErrorMessageBox (iErr); - mciSendCommand(m_MCIOpen.wDeviceID, MCI_CLOSE, 0, 0); - return; - } - - I_AddExitFunc (I_ShutdownCD); - cdaudio_started = true; - - CONS_Printf (M_GetText("CD audio Initialized\n")); - - // last saved in config.cfg - i = cd_volume.value; - //I_SetVolumeCD (0); // initialize to 0 for some odd cd drivers - I_SetVolumeCD (i); // now set the last saved volume - - for (i = 0; i < MAX_CD_TRACKS; i++) - cdRemap[i] = (UINT8)i; - - if (!CD_ReadTrackInfo()) - { - CONS_Printf(M_GetText("No CD in drive\n")); - cdEnabled = FALSE; - cdValid = FALSE; - } - else - { - cdEnabled = TRUE; - cdValid = TRUE; - } - - COM_AddCommand ("cd", Command_Cd_f); -} - - - -// loop/go to next track when track is finished (if cd_update var is true) -// update the volume when it has changed (from console/menu) -void I_UpdateCD(void) -{ - /// \todo check for cd change and restart music ? -} - - -// -void I_PlayCD(UINT8 nTrack, UINT8 bLooping) -{ - MCI_PLAY_PARMS mciPlay; - MCIERROR iErr; - - if (!cdaudio_started || !cdEnabled) - return; - - //faB: try again if it didn't work (just free the user of typing 'cd reset' command) - if (!cdValid) - cdValid = CD_ReadTrackInfo(); - if (!cdValid) - return; - - // tracks start at 0 in the code.. - nTrack--; - if (nTrack >= m_nTracksCount) - nTrack = (UINT8) (nTrack % m_nTracksCount); - - nTrack = cdRemap[nTrack]; - - if (cdPlaying) - { - if (cdPlayTrack == nTrack) - return; - I_StopCD (); - } - - cdPlayTrack = nTrack; - - if (!m_nTracks[nTrack].IsAudio) - { - //I_OutputMsg("\x82""CD Play: not an audio track\n"); // Tails 03-25-2001 - return; - } - - cdLooping = bLooping; - - //faB: stop MIDI music, MIDI music will restart if volume is upped later - cv_digmusicvolume.value = 0; - cv_midimusicvolume.value = 0; - I_StopSong(); - - //faB: I don't use the notify message, I'm trying to minimize the delay - mciPlay.dwCallback = (DWORD)((size_t)hWndMain); - mciPlay.dwFrom = MCI_MAKE_TMSF(nTrack+1, 0, 0, 0); - iErr = mciSendCommand(m_MCIOpen.wDeviceID, MCI_PLAY, MCI_FROM|MCI_NOTIFY, (DWORD_PTR)&mciPlay); - if (iErr) - { - MCIErrorMessageBox (iErr); - cdValid = FALSE; - cdPlaying = FALSE; - return; - } - - cdPlaying = TRUE; -} - - -// pause cd music -void I_StopCD(void) -{ - MCIERROR iErr; - - if (!cdaudio_started || !cdEnabled) - return; - - iErr = mciSendCommand(m_MCIOpen.wDeviceID, MCI_PAUSE, MCI_WAIT, 0); - if (iErr) - MCIErrorMessageBox (iErr); - else - { - wasPlaying = cdPlaying; - cdPlaying = FALSE; - } -} - - -// continue after a pause -void I_ResumeCD(void) -{ - MCIERROR iErr; - - if (!cdaudio_started || !cdEnabled) - return; - - if (!cdValid) - return; - - if (!wasPlaying) - return; - - iErr = mciSendCommand(m_MCIOpen.wDeviceID, MCI_RESUME, MCI_WAIT, 0); - if (iErr) - MCIErrorMessageBox (iErr); - else - cdPlaying = TRUE; -} - - -// volume : logical cd audio volume 0-31 (hardware is 0-255) -boolean I_SetVolumeCD (INT32 volume) -{ - UNREFERENCED_PARAMETER(volume); - return false; -} -#endif diff --git a/src/win32/win_dll.c b/src/win32/win_dll.c deleted file mode 100644 index 4743cec34..000000000 --- a/src/win32/win_dll.c +++ /dev/null @@ -1,238 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 1998-2000 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// 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. -//----------------------------------------------------------------------------- -/// \file -/// \brief load and initialise the 3D driver DLL - -#include "../doomdef.h" -#ifdef HWRENDER -#include "../hardware/hw_drv.h" // get the standard 3D Driver DLL exports prototypes -#endif - -#ifdef HW3SOUND -#include "../hardware/hw3dsdrv.h" // get the 3D sound driver DLL export prototypes -#endif - -#ifdef _WINDOWS - -#include "win_dll.h" -#include "win_main.h" // I_ShowLastError() - -#if defined(HWRENDER) || defined(HW3SOUND) -typedef struct loadfunc_s { - LPCSTR fnName; - LPVOID fnPointer; -} loadfunc_t; - -// -------------------------------------------------------------------------- -// Load a DLL, returns the HMODULE handle or NULL -// -------------------------------------------------------------------------- -static HMODULE LoadDLL (LPCSTR dllName, loadfunc_t *funcTable) -{ - LPVOID funcPtr; - loadfunc_t *loadfunc; - HMODULE hModule; - - if ((hModule = LoadLibraryA(dllName)) != NULL) - { - // get function pointers for all functions we use - for (loadfunc = funcTable; loadfunc->fnName != NULL; loadfunc++) - { - funcPtr = GetProcAddress(hModule, loadfunc->fnName); - if (!funcPtr) { - I_ShowLastError(FALSE); - MessageBoxA(NULL, va("The '%s' haven't the good specification (function %s missing)\n\n" - "You must use dll from the same zip of this exe\n", dllName, loadfunc->fnName), - "Error", MB_OK|MB_ICONINFORMATION); - return FALSE; - } - // store function address - *((LPVOID*)loadfunc->fnPointer) = funcPtr; - } - } - else - { - I_ShowLastError(FALSE); - MessageBoxA(NULL, va("LoadLibrary() FAILED : couldn't load '%s'\r\n", dllName), "Warning", MB_OK|MB_ICONINFORMATION); - } - - return hModule; -} - - -// -------------------------------------------------------------------------- -// Unload the DLL -// -------------------------------------------------------------------------- -static VOID UnloadDLL (HMODULE* pModule) -{ - if (FreeLibrary(*pModule)) - *pModule = NULL; - else - I_ShowLastError(TRUE); -} -#endif - -// ========================================================================== -// STANDARD 3D DRIVER DLL FOR DOOM LEGACY -// ========================================================================== - -// note : the 3D driver loading should be put somewhere else.. - -#ifdef HWRENDER -static HMODULE hwdModule = NULL; - -static loadfunc_t hwdFuncTable[] = { -#ifdef _X86_ - {"Init@4", &hwdriver.pfnInit}, - {"Shutdown@0", &hwdriver.pfnShutdown}, - {"GetModeList@8", &hwdriver.pfnGetModeList}, - {"SetPalette@4", &hwdriver.pfnSetPalette}, - {"FinishUpdate@4", &hwdriver.pfnFinishUpdate}, - {"Draw2DLine@12", &hwdriver.pfnDraw2DLine}, - {"DrawPolygon@16", &hwdriver.pfnDrawPolygon}, - {"RenderSkyDome@4", &hwdriver.pfnRenderSkyDome}, - {"SetBlend@4", &hwdriver.pfnSetBlend}, - {"ClearBuffer@12", &hwdriver.pfnClearBuffer}, - {"SetTexture@4", &hwdriver.pfnSetTexture}, - {"UpdateTexture@4", &hwdriver.pfnUpdateTexture}, - {"DeleteTexture@4", &hwdriver.pfnDeleteTexture}, - {"ReadRect@24", &hwdriver.pfnReadRect}, - {"GClipRect@20", &hwdriver.pfnGClipRect}, - {"ClearMipMapCache@0", &hwdriver.pfnClearMipMapCache}, - {"SetSpecialState@8", &hwdriver.pfnSetSpecialState}, - {"DrawModel@16", &hwdriver.pfnDrawModel}, - {"SetTransform@4", &hwdriver.pfnSetTransform}, - {"GetTextureUsed@0", &hwdriver.pfnGetTextureUsed}, - {"GetRenderVersion@0", &hwdriver.pfnGetRenderVersion}, -#ifdef SHUFFLE - {"PostImgRedraw@4", &hwdriver.pfnPostImgRedraw}, -#endif - {"FlushScreenTextures@0",&hwdriver.pfnFlushScreenTextures}, - {"StartScreenWipe@0", &hwdriver.pfnStartScreenWipe}, - {"EndScreenWipe@0", &hwdriver.pfnEndScreenWipe}, - {"DoScreenWipe@0", &hwdriver.pfnDoScreenWipe}, - {"DrawIntermissionBG@0",&hwdriver.pfnDrawIntermissionBG}, - {"MakeScreenTexture@0", &hwdriver.pfnMakeScreenTexture}, - {"MakeScreenFinalTexture@0", &hwdriver.pfnMakeScreenFinalTexture}, - {"DrawScreenFinalTexture@8", &hwdriver.pfnDrawScreenFinalTexture}, -#else - {"Init", &hwdriver.pfnInit}, - {"Shutdown", &hwdriver.pfnShutdown}, - {"GetModeList", &hwdriver.pfnGetModeList}, - {"SetPalette", &hwdriver.pfnSetPalette}, - {"FinishUpdate", &hwdriver.pfnFinishUpdate}, - {"Draw2DLine", &hwdriver.pfnDraw2DLine}, - {"DrawPolygon", &hwdriver.pfnDrawPolygon}, - {"RenderSkyDome", &hwdriver.pfnRenderSkyDome}, - {"SetBlend", &hwdriver.pfnSetBlend}, - {"ClearBuffer", &hwdriver.pfnClearBuffer}, - {"SetTexture", &hwdriver.pfnSetTexture}, - {"UpdateTexture", &hwdriver.pfnUpdateTexture}, - {"DeleteTexture", &hwdriver.pfnDeleteTexture}, - {"ReadRect", &hwdriver.pfnReadRect}, - {"GClipRect", &hwdriver.pfnGClipRect}, - {"ClearMipMapCache", &hwdriver.pfnClearMipMapCache}, - {"SetSpecialState", &hwdriver.pfnSetSpecialState}, - {"DrawModel", &hwdriver.pfnDrawModel}, - {"SetTransform", &hwdriver.pfnSetTransform}, - {"GetTextureUsed", &hwdriver.pfnGetTextureUsed}, - {"GetRenderVersion", &hwdriver.pfnGetRenderVersion}, -#ifdef SHUFFLE - {"PostImgRedraw", &hwdriver.pfnPostImgRedraw}, -#endif - {"FlushScreenTextures", &hwdriver.pfnFlushScreenTextures}, - {"StartScreenWipe", &hwdriver.pfnStartScreenWipe}, - {"EndScreenWipe", &hwdriver.pfnEndScreenWipe}, - {"DoScreenWipe", &hwdriver.pfnDoScreenWipe}, - {"DrawIntermissionBG", &hwdriver.pfnDrawIntermissionBG}, - {"MakeScreenTexture", &hwdriver.pfnMakeScreenTexture}, - {"MakeScreenFinalTexture", &hwdriver.pfnMakeScreenFinalTexture}, - {"DrawScreenFinalTexture", &hwdriver.pfnDrawScreenFinalTexture}, -#endif - {NULL,NULL} -}; - -BOOL Init3DDriver (LPCSTR dllName) -{ - hwdModule = LoadDLL(dllName, hwdFuncTable); - return (hwdModule != NULL); -} - -VOID Shutdown3DDriver (VOID) -{ - UnloadDLL(&hwdModule); -} -#endif - -#ifdef HW3SOUND -static HMODULE hwsModule = NULL; - -static loadfunc_t hwsFuncTable[] = { -#ifdef _X86_ - {"Startup@8", &hw3ds_driver.pfnStartup}, - {"Shutdown@0", &hw3ds_driver.pfnShutdown}, - {"AddSfx@4", &hw3ds_driver.pfnAddSfx}, - {"AddSource@8", &hw3ds_driver.pfnAddSource}, - {"StartSource@4", &hw3ds_driver.pfnStartSource}, - {"StopSource@4", &hw3ds_driver.pfnStopSource}, - {"GetHW3DSVersion@0", &hw3ds_driver.pfnGetHW3DSVersion}, - {"BeginFrameUpdate@0", &hw3ds_driver.pfnBeginFrameUpdate}, - {"EndFrameUpdate@0", &hw3ds_driver.pfnEndFrameUpdate}, - {"IsPlaying@4", &hw3ds_driver.pfnIsPlaying}, - {"UpdateListener@8", &hw3ds_driver.pfnUpdateListener}, - {"UpdateSourceParms@12", &hw3ds_driver.pfnUpdateSourceParms}, - {"SetCone@8", &hw3ds_driver.pfnSetCone}, - {"SetGlobalSfxVolume@4", &hw3ds_driver.pfnSetGlobalSfxVolume}, - {"Update3DSource@8", &hw3ds_driver.pfnUpdate3DSource}, - {"ReloadSource@8", &hw3ds_driver.pfnReloadSource}, - {"KillSource@4", &hw3ds_driver.pfnKillSource}, - {"KillSfx@4", &hw3ds_driver.pfnKillSfx}, - {"GetHW3DSTitle@8", &hw3ds_driver.pfnGetHW3DSTitle}, -#else - {"Startup", &hw3ds_driver.pfnStartup}, - {"Shutdown", &hw3ds_driver.pfnShutdown}, - {"AddSfx", &hw3ds_driver.pfnAddSfx}, - {"AddSource", &hw3ds_driver.pfnAddSource}, - {"StartSource", &hw3ds_driver.pfnStartSource}, - {"StopSource", &hw3ds_driver.pfnStopSource}, - {"GetHW3DSVersion", &hw3ds_driver.pfnGetHW3DSVersion}, - {"BeginFrameUpdate", &hw3ds_driver.pfnBeginFrameUpdate}, - {"EndFrameUpdate", &hw3ds_driver.pfnEndFrameUpdate}, - {"IsPlaying", &hw3ds_driver.pfnIsPlaying}, - {"UpdateListener", &hw3ds_driver.pfnUpdateListener}, - {"UpdateSourceParms", &hw3ds_driver.pfnUpdateSourceParms}, - {"SetCone", &hw3ds_driver.pfnSetCone}, - {"SetGlobalSfxVolume", &hw3ds_driver.pfnSetGlobalSfxVolume}, - {"Update3DSource", &hw3ds_driver.pfnUpdate3DSource}, - {"ReloadSource", &hw3ds_driver.pfnReloadSource}, - {"KillSource", &hw3ds_driver.pfnKillSource}, - {"KillSfx", &hw3ds_driver.pfnKillSfx}, - {"GetHW3DSTitle", &hw3ds_driver.pfnGetHW3DSTitle}, -#endif - {NULL, NULL} -}; - -BOOL Init3DSDriver(LPCSTR dllName) -{ - hwsModule = LoadDLL(dllName, hwsFuncTable); - return (hwsModule != NULL); -} - -VOID Shutdown3DSDriver (VOID) -{ - UnloadDLL(&hwsModule); -} -#endif -#endif //_WINDOWS diff --git a/src/win32/win_dll.h b/src/win32/win_dll.h deleted file mode 100644 index b4b259587..000000000 --- a/src/win32/win_dll.h +++ /dev/null @@ -1,31 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 1998-2000 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// 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. -//----------------------------------------------------------------------------- -/// \file -/// \brief load/unload a DLL at run-time - -//#define WIN32_LEAN_AND_MEAN -#define RPC_NO_WINDOWS_H -#include - -#ifdef HWRENDER -BOOL Init3DDriver (LPCSTR dllName); -VOID Shutdown3DDriver (VOID); -#endif - -#ifdef HW3SOUND -BOOL Init3DSDriver(LPCSTR dllName); -VOID Shutdown3DSDriver(VOID); -#endif diff --git a/src/win32/win_main.c b/src/win32/win_main.c deleted file mode 100644 index a5ebf3211..000000000 --- a/src/win32/win_main.c +++ /dev/null @@ -1,674 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 1998-2000 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// 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. -//----------------------------------------------------------------------------- -/// \file -/// \brief Win32 WinMain Entry Point -/// -/// Win32 Sonic Robo Blast 2 -/// -/// NOTE: -/// To compile WINDOWS SRB2 version : define a '_WINDOWS' symbol. -/// to do this go to Project/Settings/ menu, click C/C++ tab, in -/// 'Preprocessor definitions:' add '_WINDOWS' - -#include "../doomdef.h" -#include - -#ifdef _WINDOWS - -#include "../doomstat.h" // netgame -#include "resource.h" - -#include "../m_argv.h" -#include "../d_main.h" -#include "../i_system.h" - -#include "../keys.h" //hack quick test - -#include "../console.h" - -#include "fabdxlib.h" -#include "win_main.h" -#include "win_dbg.h" -#include "../s_sound.h" // pause sound with handling -#include "../g_input.h" // KEY_MOUSEWHEELxxx -#include "../screen.h" // for BASEVID* - -// MSWheel support for Win95/NT3.51 -#include - -#ifndef WM_XBUTTONDOWN -#define WM_XBUTTONDOWN 523 -#endif -#ifndef WM_XBUTTONUP -#define WM_XBUTTONUP 524 -#endif -#ifndef MK_XBUTTON1 -#define MK_XBUTTON1 32 -#endif -#ifndef MK_XBUTTON2 -#define MK_XBUTTON2 64 -#endif - -typedef BOOL (WINAPI *p_IsDebuggerPresent)(VOID); - -HWND hWndMain = NULL; -static HCURSOR windowCursor = NULL; // main window cursor - -static LPCSTR wClassName = "SRB2WC"; - -INT appActive = false; // app window is active - -#ifdef LOGMESSAGES -FILE *logstream; -#endif - -BOOL nodinput = FALSE; - -static LRESULT CALLBACK MainWndproc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - event_t ev; //Doom input event - int mouse_keys; - - // judgecutor: - // Response MSH Mouse Wheel event - - if (message == MSHWheelMessage) - { - message = WM_MOUSEWHEEL; - wParam <<= 16; - } - - //I_OutputMsg("MainWndproc: %p,%i,%i,%i",hWnd, message, wParam, (UINT)lParam); - - switch (message) - { - case WM_CREATE: - nodinput = M_CheckParm("-nodinput"); - if (!nodinput && !LoadDirectInput()) - nodinput = true; - break; - - case WM_ACTIVATEAPP: // Handle task switching - appActive = (int)wParam; - - //coming back from alt-tab? reset the palette. - if (appActive) - vid.recalc = true; - - // pause music when alt-tab - if (appActive && !paused) - S_ResumeAudio(); - else if (!paused) - S_PauseAudio(); - { - HANDLE ci = GetStdHandle(STD_INPUT_HANDLE); - DWORD mode; - if (ci != INVALID_HANDLE_VALUE && GetFileType(ci) == FILE_TYPE_CHAR && GetConsoleMode(ci, &mode)) - appActive = true; - } - InvalidateRect (hWnd, NULL, TRUE); - break; - - case WM_PAINT: - if (!appActive && !bAppFullScreen && !netgame) - // app becomes inactive (if windowed) - { - // Paint "Game Paused" in the middle of the screen - PAINTSTRUCT ps; - RECT rect; - HDC hdc = BeginPaint (hWnd, &ps); - GetClientRect (hWnd, &rect); - DrawText (hdc, TEXT("Game Paused"), -1, &rect, - DT_SINGLELINE | DT_CENTER | DT_VCENTER); - EndPaint (hWnd, &ps); - return 0; - } - - break; - - case WM_QUERYNEWPALETTE: - RestoreDDPalette(); - return TRUE; - - case WM_PALETTECHANGED: - if((HWND)wParam != hWnd) - RestoreDDPalette(); - break; - - //case WM_RBUTTONDOWN: - //case WM_LBUTTONDOWN: - - case WM_MOVE: - if (bAppFullScreen) - { - SetWindowPos(hWnd, NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE); - return 0; - } - else - { - windowPosX = (SHORT) LOWORD(lParam); // horizontal position - windowPosY = (SHORT) HIWORD(lParam); // vertical position - break; - } - break; - - // This is where switching windowed/fullscreen is handled. DirectDraw - // objects must be destroyed, recreated, and artwork reloaded. - - case WM_DISPLAYCHANGE: - case WM_SIZE: - break; - - case WM_SETCURSOR: - if (bAppFullScreen) - SetCursor(NULL); - else - SetCursor(windowCursor); - return TRUE; - - case WM_KEYUP: - ev.type = ev_keyup; - goto handleKeyDoom; - break; - - case WM_KEYDOWN: - ev.type = ev_keydown; - - handleKeyDoom: - ev.key = 0; - if (wParam == VK_PAUSE) - // intercept PAUSE key - { - ev.key = KEY_PAUSE; - } - else if (!keyboard_started) - // post some keys during the game startup - // (allow escaping from network synchronization, or pressing enter after - // an error message in the console) - { - switch (wParam) - { - case VK_ESCAPE: ev.key = KEY_ESCAPE; break; - case VK_RETURN: ev.key = KEY_ENTER; break; - case VK_SHIFT: ev.key = KEY_LSHIFT; break; - default: ev.key = MapVirtualKey((DWORD)wParam,2); // convert in to char - } - } - - if (ev.key) - D_PostEvent (&ev); - - return 0; - break; - - // judgecutor: - // Handle mouse events - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - case WM_MBUTTONDOWN: - case WM_MBUTTONUP: - case WM_MOUSEMOVE: - if (nodinput) - { - mouse_keys = 0; - if (wParam & MK_LBUTTON) - mouse_keys |= 1; - if (wParam & MK_RBUTTON) - mouse_keys |= 2; - if (wParam & MK_MBUTTON) - mouse_keys |= 4; - I_GetSysMouseEvents(mouse_keys); - } - break; - - case WM_XBUTTONUP: - if (nodinput) - { - ev.type = ev_keyup; - ev.key = KEY_MOUSE1 + 3 + HIWORD(wParam); - D_PostEvent(&ev); - return TRUE; - } - break; - case WM_XBUTTONDOWN: - if (nodinput) - { - ev.type = ev_keydown; - ev.key = KEY_MOUSE1 + 3 + HIWORD(wParam); - D_PostEvent(&ev); - return TRUE; - } - break; - case WM_MOUSEWHEEL: - //I_OutputMsg("MW_WHEEL dispatched.\n"); - ev.type = ev_keydown; - if ((INT16)HIWORD(wParam) > 0) - ev.key = KEY_MOUSEWHEELUP; - else - ev.key = KEY_MOUSEWHEELDOWN; - D_PostEvent(&ev); - break; - - case WM_SETTEXT: - COM_BufAddText((LPCSTR)lParam); - return TRUE; - break; - - case WM_CLOSE: - PostQuitMessage(0); //to quit while in-game - ev.key = KEY_ESCAPE; //to exit network synchronization - ev.type = ev_keydown; - D_PostEvent (&ev); - return 0; - case WM_DESTROY: - //faB: main app loop will exit the loop and proceed with I_Quit() - PostQuitMessage(0); - break; - - case WM_SYSCOMMAND: - // Don't allow the keyboard to activate the menu. - if(wParam == SC_KEYMENU) - return 0; - - break; - - default: - break; - } - - return DefWindowProc(hWnd, message, wParam, lParam); -} - -static inline VOID OpenTextConsole(VOID) -{ - HANDLE ci, co; - BOOL console; - -#ifdef _DEBUG - console = M_CheckParm("-noconsole") == 0; -#else - console = M_CheckParm("-console") != 0; -#endif - - dedicated = M_CheckParm("-dedicated") != 0; - - if (M_CheckParm("-detachconsole")) - { - if (FreeConsole()) - { - I_OutputMsg("Detatched console.\n"); - console = TRUE; //lets get back a console - } - else - { - I_OutputMsg("No console to detatch.\n"); - I_ShowLastError(FALSE); - } - } - - if (dedicated || console) - { - if (AllocConsole()) //Let get the real console HANDLEs, because Mingw's Bash is bad! - { - SetConsoleTitleA("SRB2 Console"); - CONS_Printf(M_GetText("Hello, it's me, SRB2's Console Window\n")); - } - else - { - I_OutputMsg("We have a console already.\n"); - I_ShowLastError(FALSE); - return; - } - } - else - return; - - ci = CreateFile(TEXT("CONIN$") , GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (ci != INVALID_HANDLE_VALUE) - { - HANDLE sih = GetStdHandle(STD_INPUT_HANDLE); - if (sih != ci) - { - I_OutputMsg("Old STD_INPUT_HANDLE: %p\nNew STD_INPUT_HANDLE: %p\n", sih, ci); - SetStdHandle(STD_INPUT_HANDLE,ci); - } - else - I_OutputMsg("STD_INPUT_HANDLE already set at %p\n", ci); - - if (GetFileType(ci) == FILE_TYPE_CHAR) - { -#if 0 - const DWORD CM = ENABLE_LINE_INPUT|ENABLE_ECHO_INPUT|ENABLE_PROCESSED_INPUT; //default mode but no ENABLE_MOUSE_INPUT - if (SetConsoleMode(ci,CM)) - { - I_OutputMsg("Disabled mouse input on the console\n"); - } - else - { - I_OutputMsg("Could not disable mouse input on the console\n"); - I_ShowLastError(FALSE); - } -#endif - } - else - I_OutputMsg("Handle CONIN$ in not a Console HANDLE\n"); - } - else - { - I_OutputMsg("Could not get a CONIN$ HANDLE\n"); - I_ShowLastError(FALSE); - } - - co = CreateFile(TEXT("CONOUT$"), GENERIC_WRITE|GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (co != INVALID_HANDLE_VALUE) - { - HANDLE soh = GetStdHandle(STD_OUTPUT_HANDLE); - HANDLE seh = GetStdHandle(STD_ERROR_HANDLE); - if (soh != co) - { - I_OutputMsg("Old STD_OUTPUT_HANDLE: %p\nNew STD_OUTPUT_HANDLE: %p\n", soh, co); - SetStdHandle(STD_OUTPUT_HANDLE,co); - } - else - I_OutputMsg("STD_OUTPUT_HANDLE already set at %p\n", co); - if (seh != co) - { - I_OutputMsg("Old STD_ERROR_HANDLE: %p\nNew STD_ERROR_HANDLE: %p\n", seh, co); - SetStdHandle(STD_ERROR_HANDLE,co); - } - else - I_OutputMsg("STD_ERROR_HANDLE already set at %p\n", co); - } - else - I_OutputMsg("Could not get a CONOUT$ HANDLE\n"); -} - - -// -// Do that Windows initialization stuff... -// -static HWND OpenMainWindow (HINSTANCE hInstance, LPSTR wTitle) -{ - const LONG styles = WS_CAPTION|WS_POPUP|WS_SYSMENU, exstyles = 0; - HWND hWnd; - WNDCLASSEXA wc; - RECT bounds; - - // Set up and register window class - ZeroMemory(&wc, sizeof(wc)); - wc.cbSize = sizeof(wc); - wc.style = CS_HREDRAW | CS_VREDRAW /*| CS_DBLCLKS*/; - wc.lpfnWndProc = MainWndproc; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_DLICON1)); - windowCursor = LoadCursor(NULL, IDC_WAIT); //LoadCursor(hInstance, MAKEINTRESOURCE(IDC_DLCURSOR1)); - wc.hCursor = windowCursor; - wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); - wc.lpszClassName = wClassName; - - if (!RegisterClassExA(&wc)) - { - I_OutputMsg("Error doing RegisterClassExA\n"); - I_ShowLastError(TRUE); - return INVALID_HANDLE_VALUE; - } - - // Create a window - // CreateWindowEx - seems to create just the interior, not the borders - - bounds.left = 0; - bounds.right = dedicated ? 0 : specialmodes[0].width; - bounds.top = 0; - bounds.bottom = dedicated ? 0 : specialmodes[0].height; - - AdjustWindowRectEx(&bounds, styles, FALSE, exstyles); - - hWnd = CreateWindowExA( - exstyles, //ExStyle - wClassName, //Classname - wTitle, //Windowname - styles, //dwStyle //WS_VISIBLE|WS_POPUP for bAppFullScreen - 0, - 0, - bounds.right - bounds.left, //GetSystemMetrics(SM_CXSCREEN), - bounds.bottom - bounds.top, //GetSystemMetrics(SM_CYSCREEN), - NULL, //hWnd Parent - NULL, //hMenu Menu - hInstance, - NULL); - - if (hWnd == INVALID_HANDLE_VALUE) - { - I_OutputMsg("Error doing CreateWindowExA\n"); - I_ShowLastError(TRUE); - } - - return hWnd; -} - - -static inline BOOL tlErrorMessage(const TCHAR *err) -{ - /* make the cursor visible */ - SetCursor(LoadCursor(NULL, IDC_ARROW)); - - // - // warn user if there is one - // - printf("Error %s..\n", err); - fflush(stdout); - - MessageBox(hWndMain, err, TEXT("ERROR"), MB_OK); - return FALSE; -} - - -// ------------------ -// Command line stuff -// ------------------ -#define MAXCMDLINEARGS 64 -static char * myWargv[MAXCMDLINEARGS+1]; -static char myCmdline[512]; - -static VOID GetArgcArgv (LPSTR cmdline) -{ - LPSTR tokenstr; - size_t i = 0, len; - char cSep = ' '; - BOOL bCvar = FALSE, prevCvar = FALSE; - - // split arguments of command line into argv - strlcpy (myCmdline, cmdline, sizeof(myCmdline)); // in case window's cmdline is in protected memory..for strtok - len = strlen (myCmdline); - - myargc = 0; - while (myargc < MAXCMDLINEARGS) - { - // get token - while (myCmdline[i] == cSep) - i++; - if (i >= len) - break; - tokenstr = myCmdline + i; - if (myCmdline[i] == '"') - { - cSep = '"'; - i++; - if (!prevCvar) //cvar leave the "" in - tokenstr++; - } - else - cSep = ' '; - - //cvar - if (myCmdline[i] == '+' && cSep == ' ') //a + begins a cvarname, but not after quotes - bCvar = TRUE; - else - bCvar = FALSE; - - while (myCmdline[i] && - myCmdline[i] != cSep) - i++; - - if (myCmdline[i] == '"') - { - cSep = ' '; - if (prevCvar) - i++; // get ending " quote in arg - } - - prevCvar = bCvar; - - if (myCmdline + i > tokenstr) - { - myWargv[myargc++] = tokenstr; - } - - if (!myCmdline[i] || i >= len) - break; - - myCmdline[i++] = '\0'; - } - myWargv[myargc] = NULL; - - // m_argv.c uses myargv[], we used myWargv because we fill the arguments ourselves - // and myargv is just a pointer, so we set it to point myWargv - myargv = myWargv; -} - -static inline VOID MakeCodeWritable(VOID) -{ -#ifdef USEASM // Disable write-protection of code segment - DWORD OldRights; - const DWORD NewRights = PAGE_EXECUTE_READWRITE; - PBYTE pBaseOfImage = (PBYTE)GetModuleHandle(NULL); - PIMAGE_DOS_HEADER dosH =(PIMAGE_DOS_HEADER)pBaseOfImage; - PIMAGE_NT_HEADERS ntH = (PIMAGE_NT_HEADERS)(pBaseOfImage + dosH->e_lfanew); - PIMAGE_OPTIONAL_HEADER oH = (PIMAGE_OPTIONAL_HEADER) - ((PBYTE)ntH + sizeof (IMAGE_NT_SIGNATURE) + sizeof (IMAGE_FILE_HEADER)); - LPVOID pA = pBaseOfImage+oH->BaseOfCode; - SIZE_T pS = oH->SizeOfCode; -#if 1 // try to find the text section - PIMAGE_SECTION_HEADER ntS = IMAGE_FIRST_SECTION (ntH); - WORD s; - for (s = 0; s < ntH->FileHeader.NumberOfSections; s++) - { - if (memcmp (ntS[s].Name, ".text\0\0", 8) == 0) - { - pA = pBaseOfImage+ntS[s].VirtualAddress; - pS = ntS[s].Misc.VirtualSize; - break; - } - } -#endif - - if (!VirtualProtect(pA,pS,NewRights,&OldRights)) - I_Error("Could not make code writable\n"); -#endif -} - -// ----------------------------------------------------------------------------- -// HandledWinMain : called by exception handler -// ----------------------------------------------------------------------------- -static int WINAPI HandledWinMain(HINSTANCE hInstance) -{ - LPSTR args; - -#ifdef LOGMESSAGES - // DEBUG!!! - set logstream to NULL to disable debug log - // Replace WIN32 filehandle with standard C calls, because WIN32 doesn't handle \n properly. - logstream = fopen(va("%s"PATHSEP"%s", srb2home, "log.txt"), "wt"); -#endif - - // fill myargc,myargv for m_argv.c retrieval of cmdline arguments - args = GetCommandLineA(); - CONS_Printf("Command line arguments: '%s'\n", args); - GetArgcArgv(args); - // Create a text console window - OpenTextConsole(); - -#ifdef _DEBUG - { - int i; - CONS_Printf("Myargc: %d\n", myargc); - for (i = 0; i < myargc; i++) - CONS_Printf("myargv[%d] : '%s'\n", i, myargv[i]); - } -#endif - - // open a dummy window, both OpenGL and DirectX need one. - if ((hWndMain = OpenMainWindow(hInstance, va("SRB2 "VERSIONSTRING))) == INVALID_HANDLE_VALUE) - { - tlErrorMessage(TEXT("Couldn't open window")); - return FALSE; - } - - // currently starts DirectInput - CONS_Printf("I_StartupSystem() ...\n"); - I_StartupSystem(); - MakeCodeWritable(); - - // startup SRB2 - CONS_Printf("Setting up SRB2...\n"); - D_SRB2Main(); - CONS_Printf("Entering main game loop...\n"); - // never return - D_SRB2Loop(); - - // back to Windoze - return 0; -} - -// ----------------------------------------------------------------------------- -// Exception handler calls WinMain for catching exceptions -// ----------------------------------------------------------------------------- -int WINAPI WinMain (HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) -{ - int Result = -1; - UNREFERENCED_PARAMETER(hPrevInstance); - UNREFERENCED_PARAMETER(lpCmdLine); - UNREFERENCED_PARAMETER(nCmdShow); - - { -#if 0 - p_IsDebuggerPresent pfnIsDebuggerPresent = (p_IsDebuggerPresent)GetProcAddress(GetModuleHandleA("kernel32.dll"),"IsDebuggerPresent"); - if((!pfnIsDebuggerPresent || !pfnIsDebuggerPresent()) -#ifdef BUGTRAP - && !InitBugTrap() -#endif - ) -#endif - { - LoadLibraryA("exchndl.dll"); - } - } -#ifndef __MINGW32__ - prevExceptionFilter = SetUnhandledExceptionFilter(RecordExceptionInfo); -#endif - Result = HandledWinMain(hInstance); -#ifdef BUGTRAP - // This is safe even if BT didn't start. - ShutdownBugTrap(); -#endif - - return Result; -} -#endif //_WINDOWS diff --git a/src/win32/win_main.h b/src/win32/win_main.h deleted file mode 100644 index 326a813dd..000000000 --- a/src/win32/win_main.h +++ /dev/null @@ -1,45 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 1998-2000 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// 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. -//----------------------------------------------------------------------------- -/// \file -/// \brief Win32 Sharing - -//#define WIN32_LEAN_AND_MEAN -#define RPC_NO_WINDOWS_H -#include -#include - -extern HWND hWndMain; - -extern INT appActive; - -VOID I_GetSysMouseEvents(INT mouse_state); -extern UINT MSHWheelMessage; - -extern BOOL nodinput; -BOOL LoadDirectInput(VOID); - -//faB: midi channel Volume set is delayed by the MIDI stream callback thread, see win_snd.c -#define WM_MSTREAM_UPDATEVOLUME (WM_USER + 101) - -// defined in win_sys.c -VOID I_BeginProfile(VOID); //for timing code -DWORD I_EndProfile(VOID); - -VOID I_ShowLastError(BOOL MB); -VOID I_LoadingScreen (LPCSTR msg); - -VOID I_RestartSysMouse(VOID); -VOID I_DoStartupMouse(VOID); diff --git a/src/win32/win_net.c b/src/win32/win_net.c deleted file mode 100644 index 62c081bbe..000000000 --- a/src/win32/win_net.c +++ /dev/null @@ -1,42 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 1998-2000 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// 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. -//----------------------------------------------------------------------------- -/// \file -/// \brief Win32 network interface - -#include "../doomdef.h" -#include "../m_argv.h" -#include "../i_net.h" - -#ifdef _WINDOWS - -// -// NETWORKING -// - -// -// I_InitNetwork -// -boolean I_InitNetwork(void) -{ - if (M_CheckParm ("-net")) - { - I_Error("The Win32 version of SRB2 doesn't work with external drivers like ipxsetup, sersetup, or doomatic\n" - "Read the documentation about \"-server\" and \"-connect\" parameters or just use the launcher\n"); - } - - return false; -} -#endif diff --git a/src/win32/win_snd.c b/src/win32/win_snd.c deleted file mode 100644 index 13f766728..000000000 --- a/src/win32/win_snd.c +++ /dev/null @@ -1,959 +0,0 @@ -/// \file -/// \brief FMOD Ex interface for sound -#include "../doomdef.h" -#include "../sounds.h" -#include "../i_sound.h" -#include "../s_sound.h" -#include "../w_wad.h" -#include "../z_zone.h" -#include "../byteptr.h" - -#include // FMOD Ex -#define errcode _errcode -#include -#undef errcode - -#ifdef HAVE_LIBGME -#include "gme/gme.h" -#define GME_TREBLE 5.0 -#define GME_BASS 1.0 - -#ifdef HAVE_ZLIB -#ifndef _MSC_VER -#ifndef _LARGEFILE64_SOURCE -#define _LARGEFILE64_SOURCE -#endif -#endif - -#ifndef _LFS64_LARGEFILE -#define _LFS64_LARGEFILE -#endif - -#ifndef _FILE_OFFSET_BITS -#define _FILE_OFFSET_BITS 0 -#endif - -#include "zlib.h" -#endif // HAVE_ZLIB -#endif // HAVE_LIBGME - -static FMOD_SYSTEM *fsys; -static FMOD_SOUND *music_stream; -static FMOD_CHANNEL *music_channel; - -static UINT8 music_volume, midi_volume, sfx_volume; -static INT32 current_track; - -#ifdef HAVE_LIBGME -static Music_Emu *gme; -#endif - -// -// SYSTEM -// - -// spew console messages for general errors. -static void FMR_Debug(FMOD_RESULT e, int line) -{ - if (e != FMOD_OK) - CONS_Alert(CONS_ERROR, "FMOD:%d - %s\n", line, FMOD_ErrorString(e)); -} -#define FMR(x) FMR_Debug(x, __LINE__) - -// for operations on music_channel ONLY. -// returns false if music was released. -// (in other words, if !FMR_MUSIC(op) return immediately, -// because music_stream and music_channel are no longer valid.) -static boolean FMR_Music_Debug(FMOD_RESULT e, int line) -{ - switch(e) - { - case FMOD_ERR_INVALID_HANDLE: // non-looping song ended - case FMOD_ERR_CHANNEL_STOLEN: // song ended and then sfx was played - FMOD_Sound_Release(music_stream); - music_stream = NULL; - return false; - default: - FMR_Debug(e, line); - break; - } - return true; -} -#define FMR_MUSIC(x) FMR_Music_Debug(x, __LINE__) - -void I_StartupSound(void) -{ - I_Assert(!sound_started); - sound_started = true; - - FMR(FMOD_System_Create(&fsys)); - FMR(FMOD_System_SetDSPBufferSize(fsys, 44100 / 30, 2)); - FMR(FMOD_System_Init(fsys, 64, FMOD_INIT_VOL0_BECOMES_VIRTUAL, NULL)); - music_stream = NULL; -#ifdef HAVE_LIBGME - gme = NULL; -#endif - current_track = -1; -} - -void I_ShutdownSound(void) -{ - I_Assert(sound_started); - sound_started = false; - -#ifdef HAVE_LIBGME - if (gme) - gme_delete(gme); -#endif - FMR(FMOD_System_Release(fsys)); -} - -void I_UpdateSound(void) -{ - FMR(FMOD_System_Update(fsys)); -} - -#ifdef HAVE_LIBGME -// Callback hook to read streaming GME data. -static FMOD_RESULT F_CALLBACK GMEReadCallback(FMOD_SOUND *sound, void *data, unsigned int datalen) -{ - Music_Emu *emu; - void *emuvoid = NULL; - // get our emu - FMR(FMOD_Sound_GetUserData(sound, &emuvoid)); - emu = emuvoid; - // no emu? no play. - if (!emu) - return FMOD_ERR_FILE_EOF; - if (gme_track_ended(emu)) - { - // don't delete the primary music stream - if (emu == gme) - return FMOD_ERR_FILE_EOF; - // do delete sfx streams - FMR(FMOD_Sound_SetUserData(sound, NULL)); - gme_delete(emu); - return FMOD_ERR_FILE_EOF; - } - // play beautiful musics theme of ancient land. - if (gme_play(emu, datalen/2, data)) - return FMOD_ERR_FILE_BAD; - // O.K - return FMOD_OK; -} -#endif - -// -// SFX -// - -// convert doom format sound (signed 8bit) -// to an fmod format sound (unsigned 8bit) -// and return the FMOD_SOUND. -static inline FMOD_SOUND *ds2fmod(char *stream) -{ - FMOD_SOUND *sound; - UINT16 ver; - UINT16 freq; - UINT32 samples; - FMOD_CREATESOUNDEXINFO fmt; - UINT32 i; - UINT8 *p; - - // lump header - ver = READUINT16(stream); // sound version format? - if (ver != 3) // It should be 3 if it's a doomsound... - return NULL; // onos! it's not a doomsound! - freq = READUINT16(stream); - samples = READUINT32(stream); - //CONS_Printf("FMT: v%d f%d, s%d, b%d\n", ver, freq, samples, bps); - - memset(&fmt, 0, sizeof(FMOD_CREATESOUNDEXINFO)); - fmt.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); - - // convert to unsigned - fmt.format = FMOD_SOUND_FORMAT_PCM8; // 8bit - fmt.length = samples*1; // 1 bps - fmt.numchannels = 1; // mono - fmt.defaultfrequency = freq; - - // Make a duplicate of the stream to change format. - p = Z_Malloc(fmt.length, PU_SOUND, NULL); - for (i = 0; i < fmt.length; i++) - p[i] = (UINT8)(stream[i]+0x80); // convert from signed to unsigned - stream = (char *)p; - - // Create FMOD_SOUND. - FMR(FMOD_System_CreateSound(fsys, stream, FMOD_CREATESAMPLE|FMOD_OPENMEMORY|FMOD_OPENRAW|FMOD_SOFTWARE|FMOD_LOWMEM, &fmt, &sound)); - - Z_Free(stream); // FMOD made its own copy, so we don't need this anymore. - return sound; -} - -void *I_GetSfx(sfxinfo_t *sfx) -{ - FMOD_SOUND *sound; - char *lump; - FMOD_CREATESOUNDEXINFO fmt; -#ifdef HAVE_LIBGME - Music_Emu *emu; - gme_info_t *info; -#endif - - if (sfx->lumpnum == LUMPERROR) - sfx->lumpnum = S_GetSfxLumpNum(sfx); - sfx->length = W_LumpLength(sfx->lumpnum); - - lump = W_CacheLumpNum(sfx->lumpnum, PU_SOUND); - sound = ds2fmod(lump); - if (sound) - { - Z_Free(lump); - return sound; - } - - // It's not a doom sound. - // Try to read it as an FMOD sound? - - memset(&fmt, 0, sizeof(FMOD_CREATESOUNDEXINFO)); - fmt.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); - fmt.length = sfx->length; - -#ifdef HAVE_LIBGME - // VGZ format - if ((UINT8)lump[0] == 0x1F - && (UINT8)lump[1] == 0x8B) - { -#ifdef HAVE_ZLIB - UINT8 *inflatedData; - size_t inflatedLen; - z_stream stream; - int zErr; // Somewhere to handle any error messages zlib tosses out - - memset(&stream, 0x00, sizeof (z_stream)); // Init zlib stream - // Begin the inflation process - inflatedLen = *(UINT32 *)(lump + (sfx->length-4)); // Last 4 bytes are the decompressed size, typically - inflatedData = (UINT8 *)Z_Malloc(inflatedLen, PU_SOUND, NULL); // Make room for the decompressed data - stream.total_in = stream.avail_in = sfx->length; - stream.total_out = stream.avail_out = inflatedLen; - stream.next_in = (UINT8 *)lump; - stream.next_out = inflatedData; - - zErr = inflateInit2(&stream, 32 + MAX_WBITS); - if (zErr == Z_OK) // We're good to go - { - zErr = inflate(&stream, Z_FINISH); - if (zErr == Z_STREAM_END) { - // Run GME on new data - if (!gme_open_data(inflatedData, inflatedLen, &emu, 44100)) - { - Z_Free(inflatedData); // GME supposedly makes a copy for itself, so we don't need this lying around - Z_Free(lump); // We're done with the uninflated lump now, too. - - gme_start_track(emu, 0); - gme_track_info(emu, &info, 0); - - fmt.format = FMOD_SOUND_FORMAT_PCM16; - fmt.defaultfrequency = 44100; - fmt.numchannels = 2; - fmt.length = ((UINT32)info->play_length * 441 / 10) * 4; - fmt.decodebuffersize = (44100 * 2) / 35; - fmt.pcmreadcallback = GMEReadCallback; - fmt.userdata = emu; - - FMR(FMOD_System_CreateSound(fsys, NULL, FMOD_CREATESAMPLE|FMOD_OPENUSER|FMOD_SOFTWARE|FMOD_LOWMEM, &fmt, &sound)); - return sound; - } - } - else - { - const char *errorType; - switch (zErr) - { - case Z_ERRNO: - errorType = "Z_ERRNO"; break; - case Z_STREAM_ERROR: - errorType = "Z_STREAM_ERROR"; break; - case Z_DATA_ERROR: - errorType = "Z_DATA_ERROR"; break; - case Z_MEM_ERROR: - errorType = "Z_MEM_ERROR"; break; - case Z_BUF_ERROR: - errorType = "Z_BUF_ERROR"; break; - case Z_VERSION_ERROR: - errorType = "Z_VERSION_ERROR"; break; - default: - errorType = "unknown error"; - } - CONS_Alert(CONS_ERROR,"Encountered %s when running inflate: %s\n", errorType, stream.msg); - } - (void)inflateEnd(&stream); - } - else // Hold up, zlib's got a problem - { - const char *errorType; - switch (zErr) - { - case Z_ERRNO: - errorType = "Z_ERRNO"; break; - case Z_STREAM_ERROR: - errorType = "Z_STREAM_ERROR"; break; - case Z_DATA_ERROR: - errorType = "Z_DATA_ERROR"; break; - case Z_MEM_ERROR: - errorType = "Z_MEM_ERROR"; break; - case Z_BUF_ERROR: - errorType = "Z_BUF_ERROR"; break; - case Z_VERSION_ERROR: - errorType = "Z_VERSION_ERROR"; break; - default: - errorType = "unknown error"; - } - CONS_Alert(CONS_ERROR,"Encountered %s when running inflateInit: %s\n", errorType, stream.msg); - } - Z_Free(inflatedData); // GME didn't open jack, but don't let that stop us from freeing this up -#else - //CONS_Alert(CONS_ERROR,"Cannot decompress VGZ; no zlib support\n"); -#endif - } - // Try to read it as a GME sound - else if (!gme_open_data(lump, sfx->length, &emu, 44100)) - { - Z_Free(lump); - - gme_start_track(emu, 0); - gme_track_info(emu, &info, 0); - - fmt.format = FMOD_SOUND_FORMAT_PCM16; - fmt.defaultfrequency = 44100; - fmt.numchannels = 2; - fmt.length = ((UINT32)info->play_length * 441 / 10) * 4; - fmt.decodebuffersize = (44100 * 2) / 35; - fmt.pcmreadcallback = GMEReadCallback; - fmt.userdata = emu; - - gme_free_info(info); - - FMR(FMOD_System_CreateSound(fsys, NULL, FMOD_CREATESAMPLE|FMOD_OPENUSER|FMOD_SOFTWARE|FMOD_LOWMEM, &fmt, &sound)); - return sound; - } -#endif - - // Ogg, Mod, Midi, etc. - FMR(FMOD_System_CreateSound(fsys, lump, FMOD_CREATESAMPLE|FMOD_OPENMEMORY|FMOD_SOFTWARE|FMOD_LOWMEM, &fmt, &sound)); - Z_Free(lump); // We're done with the lump now, at least. - return sound; -} - -void I_FreeSfx(sfxinfo_t *sfx) -{ - if (sfx->data) - FMOD_Sound_Release(sfx->data); - sfx->data = NULL; -} - -INT32 I_StartSound(sfxenum_t id, UINT8 vol, UINT8 sep, UINT8 pitch, UINT8 priority, INT32 channel) -{ - FMOD_SOUND *sound; - FMOD_CHANNEL *chan; - INT32 i; - float frequency; - (void)channel; - - sound = (FMOD_SOUND *)S_sfx[id].data; - I_Assert(sound != NULL); - - FMR(FMOD_System_PlaySound(fsys, FMOD_CHANNEL_FREE, sound, true, &chan)); - - if (sep == 0) - sep = 1; - - FMR(FMOD_Channel_SetVolume(chan, (vol / 255.0) * (sfx_volume / 31.0))); - FMR(FMOD_Channel_SetPan(chan, (sep - 128) / 127.0)); - - FMR(FMOD_Sound_GetDefaults(sound, &frequency, NULL, NULL, NULL)); - FMR(FMOD_Channel_SetFrequency(chan, (pitch / 128.0) * frequency)); - - FMR(FMOD_Channel_SetPriority(chan, priority)); - //UNREFERENCED_PARAMETER(priority); - //FMR(FMOD_Channel_SetPriority(chan, 1 + ((0xff-vol)>>1))); // automatic priority 1 - 128 based on volume (priority 0 is music) - - FMR(FMOD_Channel_GetIndex(chan, &i)); - FMR(FMOD_Channel_SetPaused(chan, false)); - return i; -} - -void I_StopSound(INT32 handle) -{ - FMOD_CHANNEL *chan; - FMR(FMOD_System_GetChannel(fsys, handle, &chan)); - if (music_stream && chan == music_channel) - return; - FMR(FMOD_Channel_Stop(chan)); -} - -boolean I_SoundIsPlaying(INT32 handle) -{ - FMOD_CHANNEL *chan; - FMOD_BOOL playing; - FMOD_RESULT e; - FMR(FMOD_System_GetChannel(fsys, handle, &chan)); - if (music_stream && chan == music_channel) - return false; - e = FMOD_Channel_IsPlaying(chan, &playing); - switch(e) - { - case FMOD_ERR_INVALID_HANDLE: // Sound effect finished. - case FMOD_ERR_CHANNEL_STOLEN: // Sound effect interrupted. -- technically impossible due to GetChannel by handle. :( - return false; // therefore, it's not playing anymore. - default: - FMR(e); - break; - } - return (boolean)playing; -} - -// seems to never be called on an invalid channel (calls I_SoundIsPlaying first?) -// so I'm not gonna worry about it. -void I_UpdateSoundParams(INT32 handle, UINT8 vol, UINT8 sep, UINT8 pitch) -{ - FMOD_CHANNEL *chan; - FMOD_SOUND *sound; - float frequency; - - FMR(FMOD_System_GetChannel(fsys, handle, &chan)); - FMR(FMOD_Channel_SetVolume(chan, (vol / 255.0) * (sfx_volume / 31.0))); - FMR(FMOD_Channel_SetPan(chan, (sep - 128) / 127.0)); - - FMR(FMOD_Channel_GetCurrentSound(chan, &sound)); - FMR(FMOD_Sound_GetDefaults(sound, &frequency, NULL, NULL, NULL)); - FMR(FMOD_Channel_SetFrequency(chan, (pitch / 128.0) * frequency)); - - //FMR(FMOD_Channel_SetPriority(chan, 1 + ((0xff-vol)>>1))); // automatic priority 1 - 128 based on volume (priority 0 is music) -} - -void I_SetSfxVolume(UINT8 volume) -{ - // volume is 0 to 31. - sfx_volume = volume; -} - -/// ------------------------ -// MUSIC SYSTEM -/// ------------------------ - -void I_InitMusic(void) -{ -} - -void I_ShutdownMusic(void) -{ - I_StopSong(); -} - -/// ------------------------ -// MUSIC PROPERTIES -/// ------------------------ - -musictype_t I_SongType(void) -{ - FMOD_SOUND_TYPE type; - -#ifdef HAVE_LIBGME - if (gme) - return MU_GME; -#endif - - if (!music_stream) - return MU_NONE; - - if (FMOD_Sound_GetFormat(music_stream, &type, NULL, NULL, NULL) == FMOD_OK) - { - switch(type) - { - case FMOD_SOUND_TYPE_WAV: - return MU_WAV; - case FMOD_SOUND_TYPE_MOD: - return MU_MOD; - case FMOD_SOUND_TYPE_MIDI: - return MU_MID; - case FMOD_SOUND_TYPE_OGGVORBIS: - return MU_OGG; - case FMOD_SOUND_TYPE_MPEG: - return MU_MP3; - case FMOD_SOUND_TYPE_FLAC: - return MU_FLAC; - default: - return MU_NONE; - } - } - else - return MU_NONE; -} - -boolean I_SongPlaying(void) -{ - return (music_stream != NULL); -} - -boolean I_SongPaused(void) -{ - FMOD_BOOL fmpaused = false; - if (music_stream) - FMOD_Channel_GetPaused(music_channel, &fmpaused); - return (boolean)fmpaused; -} - -/// ------------------------ -// MUSIC EFFECTS -/// ------------------------ - -boolean I_SetSongSpeed(float speed) -{ - FMOD_RESULT e; - float frequency; - if (!music_stream) - return false; - if (speed > 250.0f) - speed = 250.0f; //limit speed up to 250x - -#ifdef HAVE_LIBGME - // Try to set GME speed - if (gme) - { - gme_set_tempo(gme, speed); - return true; - } -#endif - - // Try to set Mod/Midi speed - e = FMOD_Sound_SetMusicSpeed(music_stream, speed); - - if (e == FMOD_ERR_FORMAT) - { - // Just change pitch instead for Ogg/etc. - FMR(FMOD_Sound_GetDefaults(music_stream, &frequency, NULL, NULL, NULL)); - FMR_MUSIC(FMOD_Channel_SetFrequency(music_channel, speed*frequency)); - } - else - FMR_MUSIC(e); - - return true; -} - -/// ------------------------ -// MUSIC PLAYBACK -/// ------------------------ - -boolean I_LoadSong(char *data, size_t len) -{ - FMOD_CREATESOUNDEXINFO fmt; - FMOD_RESULT e; - FMOD_TAG tag; - unsigned int loopstart, loopend; - - if ( -#ifdef HAVE_LIBGME - gme || -#endif - music_stream - ) - I_UnloadSong(); - - memset(&fmt, 0, sizeof(FMOD_CREATESOUNDEXINFO)); - fmt.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); - -#ifdef HAVE_LIBGME - if ((UINT8)data[0] == 0x1F - && (UINT8)data[1] == 0x8B) - { -#ifdef HAVE_ZLIB - UINT8 *inflatedData; - size_t inflatedLen; - z_stream stream; - int zErr; // Somewhere to handle any error messages zlib tosses out - - memset(&stream, 0x00, sizeof (z_stream)); // Init zlib stream - // Begin the inflation process - inflatedLen = *(UINT32 *)(data + (len-4)); // Last 4 bytes are the decompressed size, typically - inflatedData = (UINT8 *)Z_Calloc(inflatedLen, PU_MUSIC, NULL); // Make room for the decompressed data - stream.total_in = stream.avail_in = len; - stream.total_out = stream.avail_out = inflatedLen; - stream.next_in = (UINT8 *)data; - stream.next_out = inflatedData; - - zErr = inflateInit2(&stream, 32 + MAX_WBITS); - if (zErr == Z_OK) // We're good to go - { - zErr = inflate(&stream, Z_FINISH); - if (zErr == Z_STREAM_END) { - // Run GME on new data - if (!gme_open_data(inflatedData, inflatedLen, &gme, 44100)) - { - gme_equalizer_t gmeq = {GME_TREBLE, GME_BASS, 0,0,0,0,0,0,0,0}; - Z_Free(inflatedData); // GME supposedly makes a copy for itself, so we don't need this lying around - Z_Free(data); // We don't need this, either. - gme_set_equalizer(gme,&gmeq); - fmt.format = FMOD_SOUND_FORMAT_PCM16; - fmt.defaultfrequency = 44100; - fmt.numchannels = 2; - fmt.length = -1; - fmt.decodebuffersize = (44100 * 2) / 35; - fmt.pcmreadcallback = GMEReadCallback; - fmt.userdata = gme; - FMR(FMOD_System_CreateStream(fsys, NULL, FMOD_OPENUSER, &fmt, &music_stream)); - return true; - } - } - else - { - const char *errorType; - switch (zErr) - { - case Z_ERRNO: - errorType = "Z_ERRNO"; break; - case Z_STREAM_ERROR: - errorType = "Z_STREAM_ERROR"; break; - case Z_DATA_ERROR: - errorType = "Z_DATA_ERROR"; break; - case Z_MEM_ERROR: - errorType = "Z_MEM_ERROR"; break; - case Z_BUF_ERROR: - errorType = "Z_BUF_ERROR"; break; - case Z_VERSION_ERROR: - errorType = "Z_VERSION_ERROR"; break; - default: - errorType = "unknown error"; - } - CONS_Alert(CONS_ERROR,"Encountered %s when running inflate: %s\n", errorType, stream.msg); - } - (void)inflateEnd(&stream); - } - else // Hold up, zlib's got a problem - { - const char *errorType; - switch (zErr) - { - case Z_ERRNO: - errorType = "Z_ERRNO"; break; - case Z_STREAM_ERROR: - errorType = "Z_STREAM_ERROR"; break; - case Z_DATA_ERROR: - errorType = "Z_DATA_ERROR"; break; - case Z_MEM_ERROR: - errorType = "Z_MEM_ERROR"; break; - case Z_BUF_ERROR: - errorType = "Z_BUF_ERROR"; break; - case Z_VERSION_ERROR: - errorType = "Z_VERSION_ERROR"; break; - default: - errorType = "unknown error"; - } - CONS_Alert(CONS_ERROR,"Encountered %s when running inflateInit: %s\n", errorType, stream.msg); - } - Z_Free(inflatedData); // GME didn't open jack, but don't let that stop us from freeing this up -#else - //CONS_Alert(CONS_ERROR,"Cannot decompress VGZ; no zlib support\n"); -#endif - } - else if (!gme_open_data(data, len, &gme, 44100)) - { - gme_equalizer_t gmeq = {GME_TREBLE, GME_BASS, 0,0,0,0,0,0,0,0}; - Z_Free(data); // We don't need this anymore. - gme_set_equalizer(gme,&gmeq); - fmt.format = FMOD_SOUND_FORMAT_PCM16; - fmt.defaultfrequency = 44100; - fmt.numchannels = 2; - fmt.length = -1; - fmt.decodebuffersize = (44100 * 2) / 35; - fmt.pcmreadcallback = GMEReadCallback; - fmt.userdata = gme; - FMR(FMOD_System_CreateStream(fsys, NULL, FMOD_OPENUSER, &fmt, &music_stream)); - return true; - } -#endif - - fmt.length = len; - - e = FMOD_System_CreateStream(fsys, data, FMOD_OPENMEMORY_POINT, &fmt, &music_stream); - if (e != FMOD_OK) - { - if (e == FMOD_ERR_FORMAT) - CONS_Alert(CONS_WARNING, "Failed to play music lump due to invalid format.\n"); - else - FMR(e); - return false; - } - - // Try to find a loop point in streaming music formats (ogg, mp3) - - // A proper LOOPPOINT is its own tag, stupid. - e = FMOD_Sound_GetTag(music_stream, "LOOPPOINT", 0, &tag); - if (e != FMOD_ERR_TAGNOTFOUND) - { - FMR(e); - loopstart = atoi((char *)tag.data); // assumed to be a string data tag. - FMR(FMOD_Sound_GetLoopPoints(music_stream, NULL, FMOD_TIMEUNIT_PCM, &loopend, FMOD_TIMEUNIT_PCM)); - if (loopstart > 0) - FMR(FMOD_Sound_SetLoopPoints(music_stream, loopstart, FMOD_TIMEUNIT_PCM, loopend, FMOD_TIMEUNIT_PCM)); - return true; - } - - // Use LOOPMS for time in miliseconds. - e = FMOD_Sound_GetTag(music_stream, "LOOPMS", 0, &tag); - if (e != FMOD_ERR_TAGNOTFOUND) - { - FMR(e); - loopstart = atoi((char *)tag.data); // assumed to be a string data tag. - FMR(FMOD_Sound_GetLoopPoints(music_stream, NULL, FMOD_TIMEUNIT_MS, &loopend, FMOD_TIMEUNIT_PCM)); - if (loopstart > 0) - FMR(FMOD_Sound_SetLoopPoints(music_stream, loopstart, FMOD_TIMEUNIT_MS, loopend, FMOD_TIMEUNIT_PCM)); - return true; - } - - // Try to fetch it from the COMMENT tag, like A.J. Freda - e = FMOD_Sound_GetTag(music_stream, "COMMENT", 0, &tag); - if (e != FMOD_ERR_TAGNOTFOUND) - { - char *loopText; - // Handle any errors that arose, first - FMR(e); - // Figure out where the number starts - loopText = strstr((char *)tag.data,"LOOPPOINT="); - if (loopText != NULL) - { - // Skip the "LOOPPOINT=" part. - loopText += 10; - // Convert it to our looppoint - // FMOD seems to ensure the tag is properly NULL-terminated. - // atoi will stop when it reaches anything that's not a number. - loopstart = atoi(loopText); - // Now do the rest like above - FMR(FMOD_Sound_GetLoopPoints(music_stream, NULL, FMOD_TIMEUNIT_PCM, &loopend, FMOD_TIMEUNIT_PCM)); - if (loopstart > 0) - FMR(FMOD_Sound_SetLoopPoints(music_stream, loopstart, FMOD_TIMEUNIT_PCM, loopend, FMOD_TIMEUNIT_PCM)); - } - return true; - } - - // No special loop point - return true; -} - -void I_UnloadSong(void) -{ - I_StopSong(); -#ifdef HAVE_LIBGME - if (gme) - { - gme_delete(gme); - gme = NULL; - } -#endif - if (music_stream) - { - FMR(FMOD_Sound_Release(music_stream)); - music_stream = NULL; - } -} - -boolean I_PlaySong(boolean looping) -{ -#ifdef HAVE_LIBGME - if (gme) - { - gme_start_track(gme, 0); - current_track = 0; - FMR(FMOD_System_PlaySound(fsys, FMOD_CHANNEL_FREE, music_stream, false, &music_channel)); - FMR(FMOD_Channel_SetVolume(music_channel, music_volume / 31.0)); - FMR(FMOD_Channel_SetPriority(music_channel, 0)); - return true; - } -#endif - - FMR(FMOD_Sound_SetMode(music_stream, (looping ? FMOD_LOOP_NORMAL : FMOD_LOOP_OFF))); - FMR(FMOD_System_PlaySound(fsys, FMOD_CHANNEL_FREE, music_stream, false, &music_channel)); - if (I_SongType() != MU_MID) - FMR(FMOD_Channel_SetVolume(music_channel, midi_volume / 31.0)); - else - FMR(FMOD_Channel_SetVolume(music_channel, music_volume / 31.0)); - FMR(FMOD_Channel_SetPriority(music_channel, 0)); - current_track = 0; - - return true; -} - -void I_StopSong(void) -{ - if (music_channel) - FMR_MUSIC(FMOD_Channel_Stop(music_channel)); -} - -void I_PauseSong(void) -{ - if (music_channel) - FMR_MUSIC(FMOD_Channel_SetPaused(music_channel, true)); -} - -void I_ResumeSong(void) -{ - if (music_channel) - FMR_MUSIC(FMOD_Channel_SetPaused(music_channel, false)); -} - -void I_SetMusicVolume(UINT8 volume) -{ - if (!music_channel) - return; - - // volume is 0 to 31. - if (I_SongType() == MU_MID) - music_volume = 31; // windows bug hack - else - music_volume = volume; - - FMR_MUSIC(FMOD_Channel_SetVolume(music_channel, music_volume / 31.0)); -} - -UINT32 I_GetSongLength(void) -{ - UINT32 length; - if (I_SongType() == MU_MID) - return 0; - FMR_MUSIC(FMOD_Sound_GetLength(music_stream, &length, FMOD_TIMEUNIT_MS)); - return length; -} - -boolean I_SetSongLoopPoint(UINT32 looppoint) -{ - (void)looppoint; - return false; -} - -UINT32 I_GetSongLoopPoint(void) -{ - return 0; -} - -boolean I_SetSongPosition(UINT32 position) -{ - FMOD_RESULT e; - if(I_SongType() == MU_MID) - // Dummy out; this works for some MIDI, but not others. - // SDL does not support this for any MIDI. - return false; - - e = FMOD_Channel_SetPosition(music_channel, position, FMOD_TIMEUNIT_MS); - if (e == FMOD_OK) - return true; - else if (e == FMOD_ERR_UNSUPPORTED // Only music modules, numbnuts! - || e == FMOD_ERR_INVALID_POSITION) // Out-of-bounds! - return false; - else // Congrats, you horribly broke it somehow - { - FMR_MUSIC(e); - return false; - } -} - -UINT32 I_GetSongPosition(void) -{ - FMOD_RESULT e; - unsigned int fmposition = 0; - if(I_SongType() == MU_MID) - // Dummy out because unsupported, even though FMOD does this correctly. - return 0; - e = FMOD_Channel_GetPosition(music_channel, &fmposition, FMOD_TIMEUNIT_MS); - if (e == FMOD_OK) - return (UINT32)fmposition; - else - return 0; -} - -boolean I_SetSongTrack(INT32 track) -{ - if (track != current_track) // If the track's already playing, then why bother? - { - FMOD_RESULT e; - - #ifdef HAVE_LIBGME - // If the specified track is within the number of tracks playing, then change it - if (gme) - { - if (track >= 0 - && track < gme_track_count(gme)) - { - gme_err_t gme_e = gme_start_track(gme,track); - if (gme_e == NULL) - { - current_track = track; - return true; - } - else - CONS_Alert(CONS_ERROR, "Encountered GME error: %s\n", gme_e); - } - return false; - } - #endif // HAVE_LIBGME - - // Try to set it via FMOD - e = FMOD_Channel_SetPosition(music_channel, (UINT32)track, FMOD_TIMEUNIT_MODORDER); - if (e == FMOD_OK) // We good - { - current_track = track; - return true; - } - else if (e == FMOD_ERR_UNSUPPORTED // Only music modules, numbnuts! - || e == FMOD_ERR_INVALID_POSITION) // Out-of-bounds! - return false; - else // Congrats, you horribly broke it somehow - { - FMR_MUSIC(e); - return false; - } - } - return false; -} - -/// ------------------------ -/// MUSIC FADING -/// ------------------------ - -void I_SetInternalMusicVolume(UINT8 volume) -{ - (void)volume; -} - -void I_StopFadingSong(void) -{ -} - -boolean I_FadeSongFromVolume(UINT8 target_volume, UINT8 source_volume, UINT32 ms, void (*callback)(void)) -{ - (void)target_volume; - (void)source_volume; - (void)ms; - (void)callback; - return false; -} - -boolean I_FadeSong(UINT8 target_volume, UINT32 ms, void (*callback)(void)) -{ - (void)target_volume; - (void)ms; - (void)callback; - return false; -} - -boolean I_FadeOutStopSong(UINT32 ms) -{ - (void)ms; - return false; -} - -boolean I_FadeInPlaySong(UINT32 ms, boolean looping) -{ - (void)ms; - (void)looping; - return false; -} diff --git a/src/win32/win_sys.c b/src/win32/win_sys.c deleted file mode 100644 index ff443935f..000000000 --- a/src/win32/win_sys.c +++ /dev/null @@ -1,3707 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 1998-2000 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// 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. -//----------------------------------------------------------------------------- -/// \file -/// \brief win32 system i/o -/// -/// Startup & Shutdown routines for music,sound,timer,keyboard,... -/// Signal handler to trap errors and exit cleanly. - -#include "../doomdef.h" - -#ifdef _WINDOWS - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "../m_misc.h" -#include "../i_video.h" -#include "../i_sound.h" -#include "../i_system.h" - -#include "../d_net.h" -#include "../g_game.h" - -#include "../d_main.h" - -#include "../m_argv.h" - -#include "../w_wad.h" -#include "../z_zone.h" -#include "../g_input.h" - -#include "../keys.h" - -#include "../screen.h" - -#include "../m_menu.h" - -// Wheel support for Win95/WinNT3.51 -#include - -// Taken from Win98/NT4.0 -#ifndef SM_MOUSEWHEELPRESENT -#define SM_MOUSEWHEELPRESENT 75 -#endif - -#ifndef MSH_MOUSEWHEEL -#ifdef UNICODE -#define MSH_MOUSEWHEEL L"MSWHEEL_ROLLMSG" -#else -#define MSH_MOUSEWHEEL "MSWHEEL_ROLLMSG" -#endif -#endif - -#include "win_main.h" -#include "win_dbg.h" -#include "../i_joy.h" - -#ifndef NOMUMBLE -// Mumble context string -#include "../d_clisrv.h" -#include "../byteptr.h" -#endif - -#define DIRECTINPUT_VERSION 0x0500 -// Force dinput.h to generate old DX3 headers. -#define DXVERSION_NTCOMPATIBLE 0x0300 -#include -#ifndef IDirectInputEffect_Stop -#define IDirectInputEffect_Stop(p) (p)->lpVtbl->Stop(p) -#endif -#ifndef IDirectInputEffect_SetParameters -#define IDirectInputEffect_SetParameters(p,a,b) (p)->lpVtbl->SetParameters(p,a,b) -#endif -#ifndef IDirectInputEffect_Release -#define IDirectInputEffect_Release(p) (p)->lpVtbl->Release(p) -#endif - -#include "fabdxlib.h" - -/// \brief max number of joystick buttons -#define JOYBUTTONS_MAX 32 // rgbButtons[32] -/// \brief max number of joystick button events -#define JOYBUTTONS_MIN min((JOYBUTTONS),(JOYBUTTONS_MAX)) - -/// \brief max number of joysick axies -#define JOYAXISSET_MAX 4 // (lX, lY), (lZ,lRx), (lRy, lRz), rglSlider[2] is very diff -/// \brief max number ofjoystick axis events -#define JOYAXISSET_MIN min((JOYAXISSET),(JOYAXISSET_MAX)) - -/// \brief max number of joystick hats -#define JOYHATS_MAX 4 // rgdwPOV[4]; -/// \brief max number of joystick hat events -#define JOYHATS_MIN min((JOYHATS),(JOYHATS_MAX)) - -/// \brief max number of mouse buttons -#define MOUSEBUTTONS_MAX 8 // 8 bit of BYTE and DIMOFS_BUTTON7 -/// \brief max number of muse button events -#define MOUSEBUTTONS_MIN min((MOUSEBUTTONS),(MOUSEBUTTONS_MAX)) - -// ================== -// DIRECT INPUT STUFF -// ================== -BOOL bDX0300; // if true, we created a DirectInput 0x0300 version -static LPDIRECTINPUTA lpDI = NULL; -static LPDIRECTINPUTDEVICEA lpDIK = NULL; // Keyboard -static LPDIRECTINPUTDEVICEA lpDIM = NULL; // mice -static LPDIRECTINPUTDEVICEA lpDIJ = NULL; // joystick 1P -static LPDIRECTINPUTEFFECT lpDIE[NumberofForces]; // joystick 1Es -static LPDIRECTINPUTDEVICE2A lpDIJA = NULL; // joystick 1I -static LPDIRECTINPUTDEVICEA lpDIJ2 = NULL; // joystick 2P -static LPDIRECTINPUTEFFECT lpDIE2[NumberofForces]; // joystick 1Es -static LPDIRECTINPUTDEVICE2A lpDIJ2A = NULL;// joystick 2I - -// Do not execute cleanup code more than once. See Shutdown_xxx() routines. -UINT8 graphics_started = 0; -UINT8 keyboard_started = 0; -UINT8 sound_started = 0; -static boolean mouse_enabled = false; -static boolean joystick_detected = false; -static boolean joystick2_detected = false; - -static VOID I_ShutdownKeyboard(VOID); -static VOID I_GetKeyboardEvents(VOID); -static VOID I_ShutdownJoystick(VOID); -static VOID I_ShutdownJoystick2(VOID); - -static boolean entering_con_command = false; - -// -// Why would this be system specific?? hmmmm.... -// -// it is for virtual reality system, next incoming feature :) -static ticcmd_t emptycmd; -ticcmd_t *I_BaseTiccmd(void) -{ - return &emptycmd; -} - -static ticcmd_t emptycmd2; -ticcmd_t *I_BaseTiccmd2(void) -{ - return &emptycmd2; -} - -// Allocates the base zone memory, -// this function returns a valid pointer and size, -// else it should interrupt the program immediately. -// -// now checks if mem could be allocated, this is still -// prehistoric... there's a lot to do here: memory locking, detection -// of win95 etc... -// - -// return free and total memory in the system -UINT32 I_GetFreeMem(UINT32* total) -{ - MEMORYSTATUS info; - - info.dwLength = sizeof (MEMORYSTATUS); - GlobalMemoryStatus(&info); - if (total) - *total = (UINT32)info.dwTotalPhys; - return (UINT32)info.dwAvailPhys; -} - -// --------- -// I_Profile -// Two little functions to profile our code using the high resolution timer -// --------- -static LARGE_INTEGER ProfileCount; -VOID I_BeginProfile(VOID) -{ - if (!QueryPerformanceCounter(&ProfileCount)) - I_Error("I_BeginProfile failed"); // can't profile without the high res timer -} - -// we're supposed to use this to measure very small amounts of time, -// that's why we return a DWORD and not a 64bit value -DWORD I_EndProfile(VOID) -{ - LARGE_INTEGER CurrTime; - DWORD ret; - if (!QueryPerformanceCounter (&CurrTime)) - I_Error("I_EndProfile failed"); - if (CurrTime.QuadPart - ProfileCount.QuadPart > (LONGLONG)0xFFFFFFFFUL) - I_Error("I_EndProfile overflow"); - ret = (DWORD)(CurrTime.QuadPart - ProfileCount.QuadPart); - // we can call I_EndProfile() several time, I_BeginProfile() need be called just once - ProfileCount = CurrTime; - - return ret; -} - -// --------- -// I_GetTime -// Use the High Resolution Timer if available, -// else use the multimedia timer which has 1 millisecond precision on Windowz 95, -// but lower precision on Windows NT -// --------- -static long hacktics = 0; // used locally for keyboard repeat keys -static DWORD starttickcount = 0; // hack for win2k time bug - -tic_t I_GetTime(void) -{ - tic_t newtics = 0; - - if (!starttickcount) // high precision timer - { - LARGE_INTEGER currtime; // use only LowPart if high resolution counter is not available - static LARGE_INTEGER basetime = {{0, 0}}; - - // use this if High Resolution timer is found - static LARGE_INTEGER frequency; - - if (!basetime.LowPart) - { - if (!QueryPerformanceFrequency(&frequency)) - frequency.QuadPart = 0; - else - QueryPerformanceCounter(&basetime); - } - - if (frequency.LowPart && QueryPerformanceCounter(&currtime)) - { - newtics = (int)((currtime.QuadPart - basetime.QuadPart) * NEWTICRATE - / frequency.QuadPart); - } - else - { - currtime.LowPart = timeGetTime(); - if (!basetime.LowPart) - basetime.LowPart = currtime.LowPart; - newtics = ((currtime.LowPart - basetime.LowPart)/(1000/NEWTICRATE)); - } - } - else - newtics = (GetTickCount() - starttickcount)/(1000/NEWTICRATE); - - hacktics = newtics; // a local counter for keyboard repeat key - return newtics; -} - -void I_Sleep(void) -{ - if (cv_sleep.value != -1) - Sleep(cv_sleep.value); -} - -// should move to i_video -void I_WaitVBL(INT32 count) -{ - UNREFERENCED_PARAMETER(count); -} - -// this is probably to activate the 'loading' disc icon -// it should set a flag, that I_FinishUpdate uses to know -// whether it draws a small 'loading' disc icon on the screen or not -// -// also it should explicitly draw the disc because the screen is -// possibly not refreshed while loading -// -void I_BeginRead(void) {} - -// see above, end the 'loading' disc icon, set the flag false -// -void I_EndRead(void) {} - -// =========================================================================================== -// EVENTS -// =========================================================================================== -static BOOL I_ReadyConsole(HANDLE ci) -{ - DWORD gotinput; - if (ci == INVALID_HANDLE_VALUE) return FALSE; - if (WaitForSingleObject(ci,0) != WAIT_OBJECT_0) return FALSE; - if (GetFileType(ci) != FILE_TYPE_CHAR) return FALSE; - if (!GetConsoleMode(ci, &gotinput)) return FALSE; - return (GetNumberOfConsoleInputEvents(ci, &gotinput) && gotinput); -} - -static inline VOID I_GetConsoleEvents(VOID) -{ - event_t ev = {0,0,0,0}; - HANDLE ci = GetStdHandle(STD_INPUT_HANDLE); - HANDLE co = GetStdHandle(STD_OUTPUT_HANDLE); - CONSOLE_SCREEN_BUFFER_INFO CSBI; - INPUT_RECORD input; - DWORD t; - - while (I_ReadyConsole(ci) && ReadConsoleInput(ci, &input, 1, &t) && t) - { - ZeroMemory(&ev, sizeof(ev)); - switch (input.EventType) - { - case KEY_EVENT: - if (input.Event.KeyEvent.bKeyDown) - { - ev.type = ev_console; - entering_con_command = true; - switch (input.Event.KeyEvent.wVirtualKeyCode) - { - case VK_ESCAPE: - case VK_TAB: - ev.key = KEY_NULL; - break; - case VK_SHIFT: - ev.key = KEY_LSHIFT; - break; - case VK_RETURN: - entering_con_command = false; - /* FALLTHRU */ - default: - ev.key = MapVirtualKey(input.Event.KeyEvent.wVirtualKeyCode,2); // convert in to char - } - if (co != INVALID_HANDLE_VALUE && GetFileType(co) == FILE_TYPE_CHAR && GetConsoleMode(co, &t)) - { - if (ev.key && ev.key != KEY_LSHIFT && ev.key != KEY_RSHIFT) - { -#ifdef UNICODE - WriteConsole(co, &input.Event.KeyEvent.uChar.UnicodeChar, 1, &t, NULL); -#else - WriteConsole(co, &input.Event.KeyEvent.uChar.AsciiChar, 1, &t, NULL); -#endif - } - if (input.Event.KeyEvent.wVirtualKeyCode == VK_BACK - && GetConsoleScreenBufferInfo(co,&CSBI)) - { - WriteConsoleOutputCharacterA(co, " ",1, CSBI.dwCursorPosition, &t); - } - } - } - else - { - ev.type = ev_keyup; - switch (input.Event.KeyEvent.wVirtualKeyCode) - { - case VK_SHIFT: - ev.key = KEY_LSHIFT; - break; - default: - break; - } - } - if (ev.key) D_PostEvent(&ev); - break; - case MOUSE_EVENT: - case WINDOW_BUFFER_SIZE_EVENT: - case MENU_EVENT: - case FOCUS_EVENT: - break; - } - } -} - -// ---------- -// I_GetEvent -// Post new events for all sorts of user-input -// ---------- -void I_GetEvent(void) -{ - I_GetConsoleEvents(); - I_GetKeyboardEvents(); - I_GetMouseEvents(); - I_GetJoystickEvents(); - I_GetJoystick2Events(); -} - -// ---------- -// I_OsPolling -// ---------- -void I_OsPolling(void) -{ - MSG msg; - HANDLE ci = GetStdHandle(STD_INPUT_HANDLE); - - // we need to dispatch messages to the window - // so the window procedure can respond to messages and PostEvent() for keys - // during D_SRB2Main startup. - // this one replaces the main loop of windows since I_OsPolling is called in the main loop - do - { - while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) - { - if (GetMessage(&msg, NULL, 0, 0)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - else // winspec : this is quit message - I_Quit(); - } - if (!appActive && !netgame && !I_ReadyConsole(ci)) - WaitMessage(); - } while (!appActive && !netgame && !I_ReadyConsole(ci)); - - // this is called by the network synchronization, - // check keys and allow escaping - I_GetEvent(); - - // reset "emulated keys" - gamekeydown[KEY_MOUSEWHEELUP] = 0; - gamekeydown[KEY_MOUSEWHEELDOWN] = 0; -} - -// =========================================================================================== -// TIMER -// =========================================================================================== - -static VOID I_ShutdownTimer(VOID) -{ - timeEndPeriod(1); -} - -// -// Installs the timer interrupt handler with timer speed as TICRATE. -// -#define TIMER_ID 1 -#define TIMER_RATE (1000/TICRATE) -void I_StartupTimer(void) -{ - // for win2k time bug - if (M_CheckParm("-gettickcount")) - { - starttickcount = GetTickCount(); - CONS_Printf("Using GetTickCount()\n"); - } - timeBeginPeriod(1); - I_AddExitFunc(I_ShutdownTimer); -} - -// =========================================================================================== -// EXIT CODE, ERROR HANDLING -// =========================================================================================== - -static int errorcount = 0; // phuck recursive errors -static int shutdowning = false; - -// -// Used to trap various signals, to make sure things get shut down cleanly. -// -#ifdef NDEBUG -static void signal_handler(int num) -{ - //static char msg[] = "oh no! back to reality!\r\n"; - const char *sigmsg; - char sigdef[64]; - - D_QuitNetGame(); // Fix server freezes - CL_AbortDownloadResume(); - I_ShutdownSystem(); - - switch (num) - { - case SIGINT: - sigmsg = "interrupt"; - break; - case SIGILL: - sigmsg = "illegal instruction - invalid function image"; - break; - case SIGFPE: - sigmsg = "floating point exception"; - break; - case SIGSEGV: - sigmsg = "segment violation"; - break; - case SIGTERM: - sigmsg = "software termination signal from kill"; - break; - case SIGBREAK: - sigmsg = "Ctrl-Break sequence"; - break; - case SIGABRT: - sigmsg = "abnormal termination triggered by abort call"; - break; - default: - sprintf(sigdef, "signal number %d", num); - sigmsg = sigdef; - } - -#ifdef LOGMESSAGES - if (logstream) - { - I_OutputMsg("signal_handler() error: %s\r\n", sigmsg); - fclose(logstream); - logstream = NULL; - } -#endif - - MessageBoxA(hWndMain, va("signal_handler(): %s", sigmsg), "SRB2 error", MB_OK|MB_ICONERROR); - - signal(num, SIG_DFL); // default signal action - raise(num); -} -#endif - -// -// put an error message (with format) on stderr -// -void I_OutputMsg(const char *fmt, ...) -{ - HANDLE co = GetStdHandle(STD_OUTPUT_HANDLE); - DWORD bytesWritten; - va_list argptr; - char txt[8192]; - - va_start(argptr,fmt); - vsprintf(txt, fmt, argptr); - va_end(argptr); - -#ifdef _MSC_VER - OutputDebugStringA(txt); -#endif - -#ifdef LOGMESSAGES - if (logstream) - { - fwrite(txt, strlen(txt), 1, logstream); - fflush(logstream); - } -#endif - - if (co == INVALID_HANDLE_VALUE) - return; - - if (GetFileType(co) == FILE_TYPE_CHAR && GetConsoleMode(co, &bytesWritten)) - { - static COORD coordNextWrite = {0,0}; - LPVOID oldLines = NULL; - INT oldLength; - CONSOLE_SCREEN_BUFFER_INFO csbi; - - // Save the lines that we're going to obliterate. - GetConsoleScreenBufferInfo(co, &csbi); - oldLength = csbi.dwSize.X * (csbi.dwCursorPosition.Y - coordNextWrite.Y) + csbi.dwCursorPosition.X - coordNextWrite.X; - - if (oldLength > 0) - { - LPVOID blank = malloc(oldLength); - if (!blank) return; - memset(blank, ' ', oldLength); // Blank out. - oldLines = malloc(oldLength*sizeof(TCHAR)); - if (!oldLines) - { - free(blank); - return; - } - - ReadConsoleOutputCharacter(co, oldLines, oldLength, coordNextWrite, &bytesWritten); - - // Move to where we what to print - which is where we would've been, - // had console input not been in the way, - SetConsoleCursorPosition(co, coordNextWrite); - - WriteConsoleA(co, blank, oldLength, &bytesWritten, NULL); - free(blank); - - // And back to where we want to print again. - SetConsoleCursorPosition(co, coordNextWrite); - } - - // Actually write the string now! - WriteConsoleA(co, txt, (DWORD)strlen(txt), &bytesWritten, NULL); - - // Next time, output where we left off. - GetConsoleScreenBufferInfo(co, &csbi); - coordNextWrite = csbi.dwCursorPosition; - - // Restore what was overwritten. - if (oldLines && entering_con_command) - WriteConsole(co, oldLines, oldLength, &bytesWritten, NULL); - if (oldLines) free(oldLines); - } - else // Redirected to a file. - WriteFile(co, txt, (DWORD)strlen(txt), &bytesWritten, NULL); -} - -// display error messy after shutdowngfx -// -void I_Error(const char *error, ...) -{ - va_list argptr; - char txt[8192]; - - // added 11-2-98 recursive error detecting - if (shutdowning) - { - errorcount++; - // try to shutdown each subsystem separately - if (errorcount == 5) - I_ShutdownGraphics(); - if (errorcount == 6) - I_ShutdownSystem(); - if (errorcount == 7) - { - M_SaveConfig(NULL); - G_SaveGameData(); - } - if (errorcount > 20) - { - // Don't print garbage - va_start(argptr,error); - vsprintf(txt, error, argptr); - va_end(argptr); - - OutputDebugStringA(txt); - MessageBoxA(hWndMain, txt, "SRB2 Recursive Error", MB_OK|MB_ICONERROR); - W_Shutdown(); - exit(-1); // recursive errors detected - } - } - shutdowning = true; - - // put message to stderr - va_start(argptr, error); - wvsprintfA(txt, error, argptr); - va_end(argptr); - - CONS_Printf("I_Error(): %s\n", txt); //don't change from CONS_Printf. - - // saving one time is enough! - if (!errorcount) - { - M_SaveConfig(NULL); // save game config, cvars.. - G_SaveGameData(); - } - - // save demo, could be useful for debug - // NOTE: demos are normally not saved here. - if (demorecording) - G_CheckDemoStatus(); - if (metalrecording) - G_StopMetalRecording(false); - - D_QuitNetGame(); - CL_AbortDownloadResume(); - M_FreePlayerSetupColors(); - - // shutdown everything that was started - I_ShutdownSystem(); - -#ifdef LOGMESSAGES - if (logstream) - { - fclose(logstream); - logstream = NULL; - } -#endif - - MessageBoxA(hWndMain, txt, "SRB2 Error", MB_OK|MB_ICONERROR); - - W_Shutdown(); - exit(-1); -} - -static inline VOID ShowEndTxt(HANDLE co) -{ - int i; - UINT16 j, att = 0; - int nlflag = 1; - CONSOLE_SCREEN_BUFFER_INFO backupcon; - COORD resizewin = {80,-1}; - DWORD bytesWritten; - CHAR let = 0; - UINT16 *ptext; - LPVOID data; - lumpnum_t endoomnum = W_GetNumForName("ENDOOM"); - //HANDLE ci = GetStdHandle(STD_INPUT_HANDLE); - - /* get the lump with the text */ - data = ptext = W_CacheLumpNum(endoomnum, PU_CACHE); - - backupcon.wAttributes = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE; // Just in case - GetConsoleScreenBufferInfo(co, &backupcon); //Store old state - resizewin.Y = backupcon.dwSize.Y; - if (backupcon.dwSize.X < resizewin.X) - SetConsoleScreenBufferSize(co, resizewin); - - for (i = 1; i <= 80*25; i++) // print 80x25 text and deal with the attributes too - { - j = (UINT16)(*ptext >> 8); // attribute first - let = (char)(*ptext & 0xff); // text senond - if (j != att) // attribute changed? - { - att = j; // save current attribute - SetConsoleTextAttribute(co, j); //set fg and bg color for buffer - } - - WriteConsoleA(co, &let, 1, &bytesWritten, NULL); // now the text - - if (nlflag && !(i % 80) && backupcon.dwSize.X > resizewin.X) // do we need a nl? - { - att = backupcon.wAttributes; - SetConsoleTextAttribute(co, att); // all attributes off - WriteConsoleA(co, "\n", 1, &bytesWritten, NULL); // newline to console - } - ptext++; - } - SetConsoleTextAttribute(co, backupcon.wAttributes); // all attributes off - //if (nlflag) - // WriteConsoleA(co, "\n", 1, &bytesWritten, NULL); - - getchar(); //pause! - - Z_Free(data); -} - - -// -// I_Quit: shutdown everything cleanly, in reverse order of Startup. -// -void I_Quit(void) -{ - HANDLE co = GetStdHandle(STD_OUTPUT_HANDLE); - DWORD mode; - // when recording a demo, should exit using 'q', - // but sometimes we forget and use Alt+F4, so save here too. - if (demorecording) - G_CheckDemoStatus(); - if (metalrecording) - G_StopMetalRecording(false); - - M_SaveConfig(NULL); // save game config, cvars.. -#ifndef NONET - D_SaveBan(); // save the ban list -#endif - G_SaveGameData(); - - // maybe it needs that the ticcount continues, - // or something else that will be finished by I_ShutdownSystem(), - // so do it before. - D_QuitNetGame(); - CL_AbortDownloadResume(); - - M_FreePlayerSetupColors(); - - // shutdown everything that was started - I_ShutdownSystem(); - - if (shutdowning || errorcount) - I_Error("Error detected (%d)", errorcount); - -#ifdef LOGMESSAGES - if (logstream) - { - I_OutputMsg("I_Quit(): end of logstream.\n"); - fclose(logstream); - logstream = NULL; - } -#endif - if (!M_CheckParm("-noendtxt") && W_CheckNumForName("ENDOOM")!=LUMPERROR - && co != INVALID_HANDLE_VALUE && GetFileType(co) == FILE_TYPE_CHAR - && GetConsoleMode(co, &mode)) - { - printf("\r"); - ShowEndTxt(co); - } - fflush(stderr); - if (myargmalloc) - free(myargv); // Deallocate allocated memory - W_Shutdown(); - exit(0); -} - -// -------------------------------------------------------------------------- -// I_ShowLastError -// Print a GetLastError() error message, and if MB is TRUE, also display it in a MessageBox -// -------------------------------------------------------------------------- -VOID I_ShowLastError(BOOL MB) -{ - LPSTR lpMsgBuf = NULL; - const DWORD LE = GetLastError(); - - if (LE == 0xdeadbeef) return; // Not a real error - - FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, LE, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPVOID)&lpMsgBuf, 0, NULL); - - if (!lpMsgBuf) - { - I_OutputMsg("GetLastError: Unknown\n"); - return; - } - - // Display the string - if (MB && LE) MessageBoxA(NULL, lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION); - - // put it in text console and log if any - I_OutputMsg("GetLastError: %s", lpMsgBuf); - - // Free the buffer. - LocalFree(lpMsgBuf); -} - -// =========================================================================================== -// CLEAN STARTUP & SHUTDOWN HANDLING, JUST CLOSE EVERYTHING YOU OPENED. -// =========================================================================================== -// -// -static quitfuncptr quit_funcs[MAX_QUIT_FUNCS] = -{ - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL -}; - -// Adds a function to the list that need to be called by I_SystemShutdown(). -// -void I_AddExitFunc(void (*func)()) -{ - int c; - - for (c = 0; c < MAX_QUIT_FUNCS; c++) - { - if (!quit_funcs[c]) - { - quit_funcs[c] = func; - break; - } - } -} - -// Removes a function from the list that need to be called by I_SystemShutdown(). -// -void I_RemoveExitFunc(void (*func)()) -{ - int c; - - for (c = 0; c < MAX_QUIT_FUNCS; c++) - { - if (quit_funcs[c] == func) - { - while (c < MAX_QUIT_FUNCS - 1) - { - quit_funcs[c] = quit_funcs[c+1]; - c++; - } - quit_funcs[MAX_QUIT_FUNCS-1] = NULL; - break; - } - } -} - -// =========================================================================================== -// DIRECT INPUT HELPER CODE -// =========================================================================================== - -// Create a DirectInputDevice interface, -// create a DirectInputDevice2 interface if possible -static VOID CreateDevice2A(LPDIRECTINPUTA di, REFGUID pguid, LPDIRECTINPUTDEVICEA* lpDEV, - LPDIRECTINPUTDEVICE2A* lpDEV2) -{ - HRESULT hr, hr2; - LPDIRECTINPUTDEVICEA lpdid1; - LPDIRECTINPUTDEVICE2A lpdid2 = NULL; - - hr = IDirectInput_CreateDevice(di, pguid, &lpdid1, NULL); - - if (SUCCEEDED(hr)) - { - // get Device2 but only if we are not in DirectInput version 3 - if (!bDX0300 && lpDEV2) - { - LPDIRECTINPUTDEVICE2A *rp = &lpdid2; - LPVOID *tp = (LPVOID *)rp; - hr2 = IDirectInputDevice_QueryInterface(lpdid1, &IID_IDirectInputDevice2, tp); - if (FAILED(hr2)) - { - CONS_Alert(CONS_ERROR, M_GetText("Could not create IDirectInput device 2")); - lpdid2 = NULL; - } - } - } - else - I_Error("Could not create IDirectInput device"); - - *lpDEV = lpdid1; - if (lpDEV2) // only if we requested it - *lpDEV2 = lpdid2; -} - -// =========================================================================================== -// DIRECT INPUT MOUSE -// =========================================================================================== - -#define DI_MOUSE_BUFFERSIZE 16 // number of data elements in mouse buffer - -// -// Initialise the mouse. -// -static void I_ShutdownMouse(VOID); - -void I_StartupMouse(VOID) -{ - // this gets called when cv_usemouse is initted - // for the win32 version, we want to startup the mouse later - if (menuactive) - { - if (cv_usemouse.value) - I_DoStartupMouse(); - else - I_ShutdownMouse(); - } -} - -static HANDLE mouse2filehandle = INVALID_HANDLE_VALUE; - -static void I_ShutdownMouse2(VOID) -{ - if (mouse2filehandle != INVALID_HANDLE_VALUE) - { - event_t event; - UINT i; - - SetCommMask(mouse2filehandle, 0); - - EscapeCommFunction(mouse2filehandle, CLRDTR); - EscapeCommFunction(mouse2filehandle, CLRRTS); - - PurgeComm(mouse2filehandle, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); - - CloseHandle(mouse2filehandle); - - // emulate the up of all mouse buttons - for (i = 0; i < MOUSEBUTTONS; i++) - { - event.type = ev_keyup; - event.key = KEY_2MOUSE1 + i; - D_PostEvent(&event); - } - - mouse2filehandle = INVALID_HANDLE_VALUE; - } -} - -#define MOUSECOMBUFFERSIZE 256 -static int handlermouse2x, handlermouse2y, handlermouse2buttons; - -static VOID I_PoolMouse2(VOID) -{ - BYTE buffer[MOUSECOMBUFFERSIZE]; - COMSTAT ComStat; - DWORD dwErrorFlags, dwLength, i; - CHAR dx, dy; - static BYTE bytenum, combytes[4]; - - ClearCommError(mouse2filehandle, &dwErrorFlags, &ComStat); - dwLength = min(MOUSECOMBUFFERSIZE, ComStat.cbInQue); - - if (dwLength > 0) - { - if (!ReadFile(mouse2filehandle, buffer, dwLength, &dwLength, NULL)) - { - CONS_Alert(CONS_ERROR, M_GetText("Read Error on secondary mouse port\n")); - return; - } - - // parse the mouse packets - for (i = 0; i < dwLength; i++) - { - if ((buffer[i] & 64) == 64) - bytenum = 0; - - if (bytenum < 4) - combytes[bytenum] = buffer[i]; - bytenum++; - - if (bytenum == 1) - { - handlermouse2buttons &= ~3; - handlermouse2buttons |= ((combytes[0] & (32+16)) >>4); - } - else if (bytenum == 3) - { - dx = (CHAR)((combytes[0] & 3) << 6); - dy = (CHAR)((combytes[0] & 12) << 4); - dx = (CHAR)(dx + combytes[1]); - dy = (CHAR)(dy + combytes[2]); - handlermouse2x += dx; - handlermouse2y += dy; - } - else if (bytenum == 4) // fourth byte (logitech mouses) - { - if (buffer[i] & 32) - handlermouse2buttons |= 4; - else - handlermouse2buttons &= ~4; - } - } - } -} - -// secondary mouse doesn't use DirectX, therefore forget all about grabbing, acquire, etc. -void I_StartupMouse2(void) -{ - DCB dcb; - - if (mouse2filehandle != INVALID_HANDLE_VALUE) - I_ShutdownMouse2(); - - if (!cv_usemouse2.value) - return; - - if (mouse2filehandle != INVALID_HANDLE_VALUE) - { - // COM file handle - mouse2filehandle = CreateFileA(cv_mouse2port.string, GENERIC_READ|GENERIC_WRITE, - 0, // exclusive access - NULL, // no security attrs - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (mouse2filehandle == INVALID_HANDLE_VALUE) - { - int e = GetLastError(); - if (e == 5) - CONS_Alert(CONS_ERROR, M_GetText("Error opening %s!\n"), cv_mouse2port.string); - else - CONS_Alert(CONS_ERROR, M_GetText("Can't open %s: error %d\n"), cv_mouse2port.string, e); - return; - } - } - - // buffers - SetupComm(mouse2filehandle, MOUSECOMBUFFERSIZE, MOUSECOMBUFFERSIZE); - - // purge buffers - PurgeComm(mouse2filehandle, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); - - // setup port to 1200 7N1 - dcb.DCBlength = sizeof (DCB); - - GetCommState(mouse2filehandle, &dcb); - - dcb.BaudRate = CBR_1200; - dcb.ByteSize = 7; - dcb.Parity = NOPARITY; - dcb.StopBits = ONESTOPBIT; - - dcb.fDtrControl = DTR_CONTROL_ENABLE; - dcb.fRtsControl = RTS_CONTROL_ENABLE; - - dcb.fBinary = dcb.fParity = TRUE; - - SetCommState(mouse2filehandle, &dcb); - - I_AddExitFunc(I_ShutdownMouse2); -} - -#define MAX_MOUSE_BTNS 5 -static int center_x, center_y; -static INT old_mparms[3], new_mparms[3] = {0, 0, 1}; -static BOOL restore_mouse = FALSE; -static INT old_mouse_state = 0; -UINT MSHWheelMessage = 0; - -static VOID I_DoStartupSysMouse(VOID) -{ - boolean valid; - RECT w_rect; - - valid = SystemParametersInfo(SPI_GETMOUSE, 0, old_mparms, 0); - if (valid) - { - new_mparms[2] = old_mparms[2]; - restore_mouse = SystemParametersInfo(SPI_SETMOUSE, 0, new_mparms, 0); - } - - if (bAppFullScreen) - { - w_rect.top = 0; - w_rect.left = 0; - } - else - { - w_rect.top = windowPosY; - w_rect.left = windowPosX; - } - - w_rect.bottom = w_rect.top + VIDHEIGHT; - w_rect.right = w_rect.left + VIDWIDTH; - center_x = w_rect.left + (VIDWIDTH >> 1); - center_y = w_rect.top + (VIDHEIGHT >> 1); - SetCursor(NULL); - SetCursorPos(center_x, center_y); - SetCapture(hWndMain); - ClipCursor(&w_rect); -} - -static VOID I_ShutdownSysMouse(VOID) -{ - if (restore_mouse) - SystemParametersInfo(SPI_SETMOUSE, 0, old_mparms, 0); - ClipCursor(NULL); - ReleaseCapture(); -} - -VOID I_RestartSysMouse(VOID) -{ - if (nodinput) - { - I_ShutdownSysMouse(); - I_DoStartupSysMouse(); - } -} - -VOID I_GetSysMouseEvents(INT mouse_state) -{ - UINT i; - event_t event; - int xmickeys = 0, ymickeys = 0; - POINT c_pos; - - for (i = 0; i < MAX_MOUSE_BTNS; i++) - { - // check if button pressed - if ((mouse_state & (1 << i)) && !(old_mouse_state & (1 << i))) - { - event.type = ev_keydown; - event.key = KEY_MOUSE1 + i; - D_PostEvent(&event); - } - // check if button released - if (!(mouse_state & (1 << i)) && (old_mouse_state & (1 << i))) - { - event.type = ev_keyup; - event.key = KEY_MOUSE1 + i; - D_PostEvent(&event); - } - } - old_mouse_state = mouse_state; - - // proceed mouse movements - GetCursorPos(&c_pos); - xmickeys = c_pos.x - center_x; - ymickeys = c_pos.y - center_y; - - if (xmickeys || ymickeys) - { - event.type = ev_mouse; - event.key = 0; - event.x = xmickeys; - event.y = -ymickeys; - D_PostEvent(&event); - SetCursorPos(center_x, center_y); - } -} - -// This is called just before entering the main game loop, -// when we are going fullscreen and the loading screen has finished. -VOID I_DoStartupMouse(VOID) -{ - DIPROPDWORD dip; - - // mouse detection may be skipped by setting usemouse false - if (!cv_usemouse.value || M_CheckParm("-nomouse")) - { - mouse_enabled = false; - return; - } - - if (nodinput) - { - CONS_Printf(M_GetText("\tMouse will not use DirectInput.\n")); - // System mouse input will be initiated by VID_SetMode - I_AddExitFunc(I_ShutdownMouse); - - MSHWheelMessage = RegisterWindowMessage(MSH_MOUSEWHEEL); - } - else if (!lpDIM) // acquire the mouse only once - { - CreateDevice2A(lpDI, &GUID_SysMouse, &lpDIM, NULL); - - if (lpDIM) - { - if (FAILED(IDirectInputDevice_SetDataFormat(lpDIM, &c_dfDIMouse))) - I_Error("Couldn't set mouse data format"); - - // create buffer for buffered data - dip.diph.dwSize = sizeof (dip); - dip.diph.dwHeaderSize = sizeof (dip.diph); - dip.diph.dwObj = 0; - dip.diph.dwHow = DIPH_DEVICE; - dip.dwData = DI_MOUSE_BUFFERSIZE; - if (FAILED(IDirectInputDevice_SetProperty(lpDIM, DIPROP_BUFFERSIZE, &dip.diph))) - I_Error("Couldn't set mouse buffer size"); - - if (FAILED(IDirectInputDevice_SetCooperativeLevel(lpDIM, hWndMain, - DISCL_EXCLUSIVE|DISCL_FOREGROUND))) - { - I_Error("Couldn't set mouse coop level"); - } - I_AddExitFunc(I_ShutdownMouse); - } - else - I_Error("Couldn't create mouse input"); - } - - // if re-enabled while running, just set mouse_enabled true again, - // do not acquire the mouse more than once - mouse_enabled = true; -} - -// -// Shutdown Mouse DirectInput device -// -static void I_ShutdownMouse(void) -{ - int i; - event_t event; - - CONS_Printf("I_ShutdownMouse()\n"); - - if (lpDIM) - { - IDirectInputDevice_Unacquire(lpDIM); - IDirectInputDevice_Release(lpDIM); - lpDIM = NULL; - } - - // emulate the up of all mouse buttons - for (i = 0; i < MOUSEBUTTONS; i++) - { - event.type = ev_keyup; - event.key = KEY_MOUSE1 + i; - D_PostEvent(&event); - } - if (nodinput) - I_ShutdownSysMouse(); - - mouse_enabled = false; -} - -// -// Get buffered data from the mouse -// -void I_GetMouseEvents(void) -{ - DIDEVICEOBJECTDATA rgdod[DI_MOUSE_BUFFERSIZE]; - DWORD dwItems, d; - HRESULT hr; - - event_t event; - int xmickeys, ymickeys; - - if (mouse2filehandle != INVALID_HANDLE_VALUE) - { - //mouse movement - static UINT8 lastbuttons2 = 0; - - I_PoolMouse2(); - // post key event for buttons - if (handlermouse2buttons != lastbuttons2) - { - int i, j = 1, k; - k = handlermouse2buttons ^ lastbuttons2; // only changed bit to 1 - lastbuttons2 = (UINT8)handlermouse2buttons; - - for (i = 0; i < MOUSEBUTTONS; i++, j <<= 1) - if (k & j) - { - if (handlermouse2buttons & j) - event.type = ev_keydown; - else - event.type = ev_keyup; - event.key = KEY_2MOUSE1 + i; - D_PostEvent(&event); - } - } - - if (handlermouse2x || handlermouse2y) - { - event.type = ev_mouse2; - event.key = 0; - event.x = handlermouse2x<<1; - event.y = -handlermouse2y<<1; - handlermouse2x = 0; - handlermouse2y = 0; - - D_PostEvent(&event); - } - } - - if (!mouse_enabled || nodinput) - return; - -getBufferedData: - dwItems = DI_MOUSE_BUFFERSIZE; - hr = IDirectInputDevice_GetDeviceData(lpDIM, sizeof (DIDEVICEOBJECTDATA), rgdod, &dwItems, 0); - - // If data stream was interrupted, reacquire the device and try again. - if (hr == DIERR_INPUTLOST || hr == DIERR_NOTACQUIRED) - { - hr = IDirectInputDevice_Acquire(lpDIM); - if (SUCCEEDED(hr)) - goto getBufferedData; - } - - // We got buffered input, act on it - if (SUCCEEDED(hr)) - { - xmickeys = ymickeys = 0; - - // dwItems contains number of elements read (could be 0) - for (d = 0; d < dwItems; d++) - { - if (rgdod[d].dwOfs >= DIMOFS_BUTTON0 && - rgdod[d].dwOfs < DIMOFS_BUTTON0 + MOUSEBUTTONS) - { - if (rgdod[d].dwData & 0x80) // Button down - event.type = ev_keydown; - else - event.type = ev_keyup; // Button up - - event.key = rgdod[d].dwOfs - DIMOFS_BUTTON0 + KEY_MOUSE1; - D_PostEvent(&event); - } - else if (rgdod[d].dwOfs == DIMOFS_X) - xmickeys += rgdod[d].dwData; - else if (rgdod[d].dwOfs == DIMOFS_Y) - ymickeys += rgdod[d].dwData; - - else if (rgdod[d].dwOfs == DIMOFS_Z) - { - // z-axes the wheel - if ((int)rgdod[d].dwData > 0) - event.key = KEY_MOUSEWHEELUP; - else - event.key = KEY_MOUSEWHEELDOWN; - event.type = ev_keydown; - D_PostEvent(&event); - } - - } - - if (xmickeys || ymickeys) - { - event.type = ev_mouse; - event.key = 0; - event.x = xmickeys; - event.y = -ymickeys; - D_PostEvent(&event); - } - } -} - -void I_UpdateMouseGrab(void) {} - -// =========================================================================================== -// DIRECT INPUT JOYSTICK -// =========================================================================================== - -struct DIJoyInfo_s -{ - BYTE X,Y,Z,Rx,Ry,Rz,U,V; - LONG ForceAxises; -}; -typedef struct DIJoyInfo_s DIJoyInfo_t; - -// private info - static BYTE iJoyNum; // used by enumeration - static DIJoyInfo_t JoyInfo; - static BYTE iJoy2Num; - static DIJoyInfo_t JoyInfo2; - -//----------------------------------------------------------------------------- -// Name: EnumAxesCallback() -// Desc: Callback function for enumerating the axes on a joystick and counting -// each force feedback enabled axis -//----------------------------------------------------------------------------- -static BOOL CALLBACK EnumAxesCallback(const DIDEVICEOBJECTINSTANCEA* pdidoi, - VOID* pContext) -{ - DWORD* pdwNumForceFeedbackAxis = (DWORD*) pContext; - - if ((pdidoi->dwFlags & DIDOI_FFACTUATOR) != 0) - (*pdwNumForceFeedbackAxis)++; - - return DIENUM_CONTINUE; -} - - -static HRESULT SetupForceTacile(LPDIRECTINPUTDEVICE2A DJI, LPDIRECTINPUTEFFECT *DJE, DWORD FFAXIS, FFType EffectType,REFGUID EffectGUID) -{ - HRESULT hr; - DIEFFECT eff; - DWORD rgdwAxes[2] = { DIJOFS_X, DIJOFS_Y }; - LONG rglDirection[2] = { 0, 0 }; - DICONSTANTFORCE cf = { 0 }; // LONG lMagnitude - DIRAMPFORCE rf = {0,0}; // LONG lStart, lEnd; - DIPERIODIC pf = {0,0,0,0}; - ZeroMemory(&eff, sizeof (eff)); - if (FFAXIS > 2) - FFAXIS = 2; //up to 2 FFAXIS - eff.dwSize = sizeof (DIEFFECT); - eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS; // Cartesian and data format offsets - eff.dwDuration = INFINITE; - eff.dwSamplePeriod = 0; - eff.dwGain = DI_FFNOMINALMAX; - eff.dwTriggerButton = DIEB_NOTRIGGER; - eff.dwTriggerRepeatInterval = 0; - eff.cAxes = FFAXIS; - eff.rgdwAxes = rgdwAxes; - eff.rglDirection = rglDirection; - eff.lpEnvelope = NULL; - eff.lpvTypeSpecificParams = NULL; - if (EffectType == ConstantForce) - { - eff.cbTypeSpecificParams = sizeof (cf); - eff.lpvTypeSpecificParams = &cf; - } - else if (EffectType == RampForce) - { - eff.cbTypeSpecificParams = sizeof (rf); - eff.lpvTypeSpecificParams = &rf; - } - else if (EffectType >= SquareForce && SawtoothDownForce >= EffectType) - { - eff.cbTypeSpecificParams = sizeof (pf); - eff.lpvTypeSpecificParams = &pf; - } - - // Create the prepared effect - if (FAILED(hr = IDirectInputDevice2_CreateEffect(DJI, EffectGUID, - &eff, DJE, NULL))) - { - return hr; - } - - if (NULL == *DJE) - return E_FAIL; - - return hr; -} - -static BOOL CALLBACK DIEnumEffectsCallback1(LPCDIEFFECTINFOA pdei, LPVOID pvRef) -{ - LPDIRECTINPUTEFFECT *DJE = pvRef; - if (DIEFT_GETTYPE(pdei->dwEffType) == DIEFT_CONSTANTFORCE) - { - if (SUCCEEDED(SetupForceTacile(lpDIJA,DJE, JoyInfo.ForceAxises, ConstantForce, &pdei->guid))) - return DIENUM_STOP; - } - if (DIEFT_GETTYPE(pdei->dwEffType) == DIEFT_RAMPFORCE) - { - if (SUCCEEDED(SetupForceTacile(lpDIJA,DJE, JoyInfo.ForceAxises, RampForce, &pdei->guid))) - return DIENUM_STOP; - } - return DIENUM_CONTINUE; -} - -static BOOL CALLBACK DIEnumEffectsCallback2(LPCDIEFFECTINFOA pdei, LPVOID pvRef) -{ - LPDIRECTINPUTEFFECT *DJE = pvRef; - if (DIEFT_GETTYPE(pdei->dwEffType) == DIEFT_CONSTANTFORCE) - { - if (SUCCEEDED(SetupForceTacile(lpDIJ2A,DJE, JoyInfo2.ForceAxises, ConstantForce, &pdei->guid))) - return DIENUM_STOP; - } - if (DIEFT_GETTYPE(pdei->dwEffType) == DIEFT_RAMPFORCE) - { - if (SUCCEEDED(SetupForceTacile(lpDIJ2A,DJE, JoyInfo2.ForceAxises, RampForce, &pdei->guid))) - return DIENUM_STOP; - } - return DIENUM_CONTINUE; -} - -static REFGUID DIETable[] = -{ - &GUID_ConstantForce, //ConstantForce - &GUID_RampForce, //RampForce - &GUID_Square, //SquareForce - &GUID_Sine, //SineForce - &GUID_Triangle, //TriangleForce - &GUID_SawtoothUp, //SawtoothUpForce - &GUID_SawtoothDown, //SawtoothDownForce - (REFGUID)-1, //NumberofForces -}; - -static HRESULT SetupAllForces(LPDIRECTINPUTDEVICE2A DJI, LPDIRECTINPUTEFFECT DJE[], DWORD FFAXIS) -{ - FFType ForceType = EvilForce; - if (DJI == lpDIJA) - { - IDirectInputDevice2_EnumEffects(DJI,DIEnumEffectsCallback1,&DJE[ConstantForce],DIEFT_CONSTANTFORCE); - IDirectInputDevice2_EnumEffects(DJI,DIEnumEffectsCallback1,&DJE[RampForce],DIEFT_RAMPFORCE); - } - else if (DJI == lpDIJA) - { - IDirectInputDevice2_EnumEffects(DJI,DIEnumEffectsCallback2,&DJE[ConstantForce],DIEFT_CONSTANTFORCE); - IDirectInputDevice2_EnumEffects(DJI,DIEnumEffectsCallback2,&DJE[RampForce],DIEFT_RAMPFORCE); - } - for (ForceType = SquareForce; ForceType > NumberofForces && DIETable[ForceType] != (REFGUID)-1; ForceType++) - if (DIETable[ForceType]) - SetupForceTacile(DJI,&DJE[ForceType], FFAXIS, ForceType, DIETable[ForceType]); - return S_OK; -} - -static inline VOID LimitEffect(LPDIEFFECT eff, FFType EffectType) -{ - LPDICONSTANTFORCE pCF = eff->lpvTypeSpecificParams; - LPDIPERIODIC pDP= eff->lpvTypeSpecificParams; - if (eff->rglDirection) - { - } -/* if (eff->dwDuration != INFINITE && eff->dwDuration < 0) - { - eff->dwDuration = 0; - }*/ - if (eff->dwGain != 0) - { - if (eff->dwGain > DI_FFNOMINALMAX) - eff->dwGain = DI_FFNOMINALMAX; - //else if (eff->dwGain < -DI_FFNOMINALMAX) - // eff->dwGain = DI_FFNOMINALMAX; - } - if (EffectType == ConstantForce && pCF->lMagnitude) - { - } - else if (EffectType >= SquareForce && SawtoothDownForce >= EffectType && pDP) - { - } - -} - -static HRESULT SetForceTacile(LPDIRECTINPUTEFFECT SDIE, const JoyFF_t *FF,DWORD FFAXIS, FFType EffectType) -{ - DIEFFECT eff; - HRESULT hr; - LONG Magnitude; - LONG rglDirection[2] = { 0, 0 }; - DICONSTANTFORCE cf = { 0 }; // LONG lMagnitude - DIRAMPFORCE rf = {0,0}; // LONG lStart, lEnd; - DIPERIODIC pf = {0,0,0,0}; - if (!FF) - IDirectInputEffect_Stop(SDIE); - Magnitude = FF->Magnitude; - ZeroMemory(&eff, sizeof (eff)); - eff.dwSize = sizeof (eff); - //DIEP_START - eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS; // Cartesian and data format offsets - //DIEP_DURATION - eff.dwDuration = FF->Duration; - //DIEP_GAIN - eff.dwGain = FF->Gain; - //DIEP_DIRECTION - eff.rglDirection = rglDirection; - //DIEP_TYPESPECIFICPARAMS - if (FFAXIS > 1) - { - double dMagnitude; - dMagnitude = (double)Magnitude; - dMagnitude = hypot(dMagnitude, dMagnitude); - Magnitude = (DWORD)dMagnitude; - rglDirection[0] = FF->ForceX; - rglDirection[1] = FF->ForceY; - } - if (EffectType == ConstantForce) - { - cf.lMagnitude = Magnitude; - eff.cbTypeSpecificParams = sizeof (cf); - eff.lpvTypeSpecificParams = &cf; - } - else if (EffectType == RampForce) - { - rf.lStart = FF->Start; - rf.lEnd = FF->End; - eff.cbTypeSpecificParams = sizeof (rf); - eff.lpvTypeSpecificParams = &rf; - } - else if (EffectType >= SquareForce && SawtoothDownForce >= EffectType) - { - pf.dwMagnitude = Magnitude; - pf.lOffset = FF->Offset; - pf.dwPhase = FF->Phase; - pf.dwPeriod = FF->Period; - eff.cbTypeSpecificParams = sizeof (pf); - eff.lpvTypeSpecificParams = &pf; - } - - LimitEffect(&eff, EffectType); - - hr = IDirectInputEffect_SetParameters(SDIE, &eff, - DIEP_START|DIEP_DURATION|DIEP_GAIN|DIEP_DIRECTION|DIEP_TYPESPECIFICPARAMS); - return hr; -} - -void I_Tactile(FFType Type, const JoyFF_t *Effect) -{ - if (!lpDIJA) return; - if (FAILED(IDirectInputDevice2_Acquire(lpDIJA))) - return; - if (Type == EvilForce) - IDirectInputDevice2_SendForceFeedbackCommand(lpDIJA,DISFFC_STOPALL); - if (Type <= EvilForce || Type > NumberofForces || !lpDIE[Type]) - return; - SetForceTacile(lpDIE[Type], Effect, JoyInfo.ForceAxises, Type); -} - -void I_Tactile2(FFType Type, const JoyFF_t *Effect) -{ - if (!lpDIJ2A) return; - if (FAILED(IDirectInputDevice2_Acquire(lpDIJ2A))) - return; - if (Type == EvilForce) - IDirectInputDevice2_SendForceFeedbackCommand(lpDIJ2A,DISFFC_STOPALL); - if (Type <= EvilForce || Type > NumberofForces || !lpDIE2[Type]) - return; - SetForceTacile(lpDIE2[Type],Effect, JoyInfo2.ForceAxises, Type); -} - -// ------------------ -// SetDIDwordProperty (HELPER) -// Set a DWORD property on a DirectInputDevice. -// ------------------ -static HRESULT SetDIDwordProperty(LPDIRECTINPUTDEVICEA pdev, - REFGUID guidProperty, - DWORD dwObject, - DWORD dwHow, - DWORD dwValue) -{ - DIPROPDWORD dipdw; - - dipdw.diph.dwSize = sizeof (dipdw); - dipdw.diph.dwHeaderSize = sizeof (dipdw.diph); - dipdw.diph.dwObj = dwObject; - dipdw.diph.dwHow = dwHow; - dipdw.dwData = dwValue; - - return IDirectInputDevice_SetProperty(pdev, guidProperty, &dipdw.diph); -} - -#define DIDEADZONE 0000 //2500 - -// --------------- -// DIEnumJoysticks -// There is no such thing as a 'system' joystick, contrary to mouse, -// we must enumerate and choose one joystick device to use -// --------------- -static BOOL CALLBACK DIEnumJoysticks (LPCDIDEVICEINSTANCEA lpddi, - LPVOID pvRef) //cv_usejoystick -{ - LPDIRECTINPUTDEVICEA pdev; - DIPROPRANGE diprg; - DIDEVCAPS caps; - BOOL bUseThisOne = FALSE; - - iJoyNum++; - - //faB: if cv holds a string description of joystick, the value from atoi() is 0 - // else, the value was probably set by user at console to one of the previously - // enumerated joysticks - if (((consvar_t *)pvRef)->value == iJoyNum || !strcmp(((consvar_t *)pvRef)->string, lpddi->tszProductName)) - bUseThisOne = TRUE; - - //I_OutputMsg(" cv joy is %s\n", ((consvar_t *)pvRef)->string); - - // print out device name - CONS_Printf("%c%d: %s\n", - (bUseThisOne) ? '\2' : ' ', // show name in white if this is the one we will use - iJoyNum, - //(GET_DIDEVICE_SUBTYPE(lpddi->dwDevType) == DIDEVTYPEJOYSTICK_GAMEPAD) ? "Gamepad " : "Joystick", - lpddi->tszProductName); //, lpddi->tszInstanceName); - - // use specified joystick (cv_usejoystick.value in pvRef) - if (!bUseThisOne) - return DIENUM_CONTINUE; - - ((consvar_t *)pvRef)->value = iJoyNum; - if (IDirectInput_CreateDevice(lpDI, &lpddi->guidInstance, - &pdev, NULL) != DI_OK) - { - // if it failed, then we can't use this joystick for some - // bizarre reason. (Maybe the user unplugged it while we - // were in the middle of enumerating it.) So continue enumerating - I_OutputMsg("DIEnumJoysticks(): CreateDevice FAILED\n"); - return DIENUM_CONTINUE; - } - - // get the Device capabilities - // - caps.dwSize = sizeof (DIDEVCAPS_DX3); - if (FAILED(IDirectInputDevice_GetCapabilities (pdev, &caps))) - { - I_OutputMsg("DIEnumJoysticks(): GetCapabilities FAILED\n"); - IDirectInputDevice_Release (pdev); - return DIENUM_CONTINUE; - } - if (!(caps.dwFlags & DIDC_ATTACHED)) // should be, since we enumerate only attached devices - return DIENUM_CONTINUE; - - Joystick.bJoyNeedPoll = ((caps.dwFlags & DIDC_POLLEDDATAFORMAT) != 0); - - if (caps.dwFlags & DIDC_FORCEFEEDBACK) - JoyInfo.ForceAxises = 0; - else - JoyInfo.ForceAxises = -1; - - Joystick.bGamepadStyle = (GET_DIDEVICE_SUBTYPE(caps.dwDevType) == DIDEVTYPEJOYSTICK_GAMEPAD); - //I_OutputMsg("Gamepad: %d\n", Joystick.bGamepadStyle); - - - CONS_Printf(M_GetText("Capabilities: %lu axes, %lu buttons, %lu POVs, poll %u, Gamepad %d\n"), caps.dwAxes, caps.dwButtons, caps.dwPOVs, Joystick.bJoyNeedPoll, Joystick.bGamepadStyle); - - // Set the data format to "simple joystick" - a predefined data format - // - // A data format specifies which controls on a device we - // are interested in, and how they should be reported. - // - // This tells DirectInput that we will be passing a - // DIJOYSTATE structure to IDirectInputDevice::GetDeviceState. - if (IDirectInputDevice_SetDataFormat (pdev, &c_dfDIJoystick) != DI_OK) - { - I_OutputMsg("DIEnumJoysticks(): SetDataFormat FAILED\n"); - IDirectInputDevice_Release (pdev); - return DIENUM_CONTINUE; - } - - // Set the cooperativity level to let DirectInput know how - // this device should interact with the system and with other - // DirectInput applications. - if (IDirectInputDevice_SetCooperativeLevel (pdev, hWndMain, - DISCL_EXCLUSIVE | DISCL_FOREGROUND) != DI_OK) - { - I_OutputMsg("DIEnumJoysticks(): SetCooperativeLevel FAILED\n"); - IDirectInputDevice_Release (pdev); - return DIENUM_CONTINUE; - } - - // set the range of the joystick axis - diprg.diph.dwSize = sizeof (DIPROPRANGE); - diprg.diph.dwHeaderSize = sizeof (DIPROPHEADER); - diprg.diph.dwHow = DIPH_BYOFFSET; - diprg.lMin = -JOYAXISRANGE; // value for extreme left - diprg.lMax = +JOYAXISRANGE; // value for extreme right - - diprg.diph.dwObj = DIJOFS_X; // set the x-axis range - if (FAILED(IDirectInputDevice_SetProperty(pdev, DIPROP_RANGE, &diprg.diph))) - { - //goto SetPropFail; - JoyInfo.X = FALSE; - } - else JoyInfo.X = TRUE; - - diprg.diph.dwObj = DIJOFS_Y; // set the y-axis range - if (FAILED(IDirectInputDevice_SetProperty(pdev, DIPROP_RANGE, &diprg.diph))) - { -//SetPropFail: -// I_OutputMsg("DIEnumJoysticks(): SetProperty FAILED\n"); -// IDirectInputDevice_Release (pdev); -// return DIENUM_CONTINUE; - JoyInfo.Y = FALSE; - } - else JoyInfo.Y = TRUE; - - diprg.diph.dwObj = DIJOFS_Z; // set the z-axis range - if (FAILED(IDirectInputDevice_SetProperty(pdev, DIPROP_RANGE, &diprg.diph))) - { - //I_OutputMsg("DIJOFS_Z not found\n"); - JoyInfo.Z = FALSE; - } - else JoyInfo.Z = TRUE; - - diprg.diph.dwObj = DIJOFS_RX; // set the x-rudder range - if (FAILED(IDirectInputDevice_SetProperty(pdev, DIPROP_RANGE, &diprg.diph))) - { - //I_OutputMsg("DIJOFS_RX (x-rudder) not found\n"); - JoyInfo.Rx = FALSE; - } - else JoyInfo.Rx = TRUE; - - diprg.diph.dwObj = DIJOFS_RY; // set the y-rudder range - if (FAILED(IDirectInputDevice_SetProperty(pdev, DIPROP_RANGE, &diprg.diph))) - { - //I_OutputMsg("DIJOFS_RY (y-rudder) not found\n"); - JoyInfo.Ry = FALSE; - } - else JoyInfo.Ry = TRUE; - - diprg.diph.dwObj = DIJOFS_RZ; // set the z-rudder range - if (FAILED(IDirectInputDevice_SetProperty(pdev, DIPROP_RANGE, &diprg.diph))) - { - //I_OutputMsg("DIJOFS_RZ (z-rudder) not found\n"); - JoyInfo.Rz = FALSE; - } - else JoyInfo.Rz = TRUE; - diprg.diph.dwObj = DIJOFS_SLIDER(0); // set the x-misc range - if (FAILED(IDirectInputDevice_SetProperty(pdev, DIPROP_RANGE, &diprg.diph))) - { - //I_OutputMsg("DIJOFS_RZ (x-misc) not found\n"); - JoyInfo.U = FALSE; - } - else JoyInfo.U = TRUE; - - diprg.diph.dwObj = DIJOFS_SLIDER(1); // set the y-misc range - if (FAILED(IDirectInputDevice_SetProperty(pdev, DIPROP_RANGE, &diprg.diph))) - { - //I_OutputMsg("DIJOFS_RZ (y-misc) not found\n"); - JoyInfo.V = FALSE; - } - else JoyInfo.V = TRUE; - - // set X axis dead zone to 25% (to avoid accidental turning) - if (!Joystick.bGamepadStyle) - { - if (JoyInfo.X) - if (FAILED(SetDIDwordProperty(pdev, DIPROP_DEADZONE, DIJOFS_X, - DIPH_BYOFFSET, DIDEADZONE))) - { - I_OutputMsg("DIEnumJoysticks(): couldn't SetProperty for X DEAD ZONE\n"); - //IDirectInputDevice_Release (pdev); - //return DIENUM_CONTINUE; - } - if (JoyInfo.Y) - if (FAILED(SetDIDwordProperty(pdev, DIPROP_DEADZONE, DIJOFS_Y, - DIPH_BYOFFSET, DIDEADZONE))) - { - I_OutputMsg("DIEnumJoysticks(): couldn't SetProperty for Y DEAD ZONE\n"); - //IDirectInputDevice_Release (pdev); - //return DIENUM_CONTINUE; - } - if (JoyInfo.Z) - if (FAILED(SetDIDwordProperty(pdev, DIPROP_DEADZONE, DIJOFS_Z, - DIPH_BYOFFSET, DIDEADZONE))) - { - I_OutputMsg("DIEnumJoysticks(): couldn't SetProperty for Z DEAD ZONE\n"); - //IDirectInputDevice_Release (pdev); - //return DIENUM_CONTINUE; - } - if (JoyInfo.Rx) - if (FAILED(SetDIDwordProperty(pdev, DIPROP_DEADZONE, DIJOFS_RX, - DIPH_BYOFFSET, DIDEADZONE))) - { - I_OutputMsg("DIEnumJoysticks(): couldn't SetProperty for RX DEAD ZONE\n"); - //IDirectInputDevice_Release (pdev); - //return DIENUM_CONTINUE; - } - if (JoyInfo.Ry) - if (FAILED(SetDIDwordProperty(pdev, DIPROP_DEADZONE, DIJOFS_RY, - DIPH_BYOFFSET, DIDEADZONE))) - { - I_OutputMsg("DIEnumJoysticks(): couldn't SetProperty for RY DEAD ZONE\n"); - //IDirectInputDevice_Release (pdev); - //return DIENUM_CONTINUE; - } - if (JoyInfo.Rz) - if (FAILED(SetDIDwordProperty(pdev, DIPROP_DEADZONE, DIJOFS_RZ, - DIPH_BYOFFSET, DIDEADZONE))) - { - I_OutputMsg("DIEnumJoysticks(): couldn't SetProperty for RZ DEAD ZONE\n"); - //IDirectInputDevice_Release (pdev); - //return DIENUM_CONTINUE; - } - if (JoyInfo.U) - if (FAILED(SetDIDwordProperty(pdev, DIPROP_DEADZONE, DIJOFS_SLIDER(0), - DIPH_BYOFFSET, DIDEADZONE))) - { - I_OutputMsg("DIEnumJoysticks(): couldn't SetProperty for U DEAD ZONE\n"); - //IDirectInputDevice_Release (pdev); - //return DIENUM_CONTINUE; - } - if (JoyInfo.V) - if (FAILED(SetDIDwordProperty(pdev, DIPROP_DEADZONE, DIJOFS_SLIDER(1), - DIPH_BYOFFSET, DIDEADZONE))) - { - I_OutputMsg("DIEnumJoysticks(): couldn't SetProperty for V DEAD ZONE\n"); - //IDirectInputDevice_Release (pdev); - //return DIENUM_CONTINUE; - } - } - - // query for IDirectInputDevice2 - we need this to poll the joystick - if (bDX0300) - { - FFType i = EvilForce; - // we won't use the poll - lpDIJA = NULL; - for (i = 0; i > NumberofForces; i++) - lpDIE[i] = NULL; - } - else - { - LPDIRECTINPUTDEVICE2A *rp = &lpDIJA; - LPVOID *tp = (LPVOID *)rp; - if (FAILED(IDirectInputDevice_QueryInterface(pdev, &IID_IDirectInputDevice2, tp))) - { - I_OutputMsg("DIEnumJoysticks(): QueryInterface FAILED\n"); - IDirectInputDevice_Release (pdev); - return DIENUM_CONTINUE; - } - - if (lpDIJA && JoyInfo.ForceAxises != -1) - { - // Since we will be playing force feedback effects, we should disable the - // auto-centering spring. - if (FAILED(SetDIDwordProperty(pdev, DIPROP_AUTOCENTER, 0, DIPH_DEVICE, FALSE))) - { - //NOP - } - - // Enumerate and count the axes of the joystick - if (FAILED(IDirectInputDevice_EnumObjects(pdev, EnumAxesCallback, - (LPVOID)&JoyInfo.ForceAxises, DIDFT_AXIS))) - { - JoyInfo.ForceAxises = -1; - } - else - { - SetupAllForces(lpDIJA,lpDIE,JoyInfo.ForceAxises); - } - } - } - - // we successfully created an IDirectInputDevice. So stop looking - // for another one. - lpDIJ = pdev; - return DIENUM_STOP; -} - -// -------------- -// I_InitJoystick -// This is called everytime the 'use_joystick' variable changes -// It is normally called at least once at startup when the config is loaded -// -------------- -void I_InitJoystick(void) -{ - HRESULT hr; - - // cleanup - I_ShutdownJoystick(); - - //joystick detection can be skipped by setting use_joystick to 0 - if (!lpDI || M_CheckParm("-nojoy")) - { - CONS_Printf(M_GetText("Joystick disabled\n")); - return; - } - else - // don't do anything at the registration of the joystick cvar, - // until config is loaded - if (!strcmp(cv_usejoystick.string, "0")) - return; - - // acquire the joystick only once - if (!lpDIJ) - { - joystick_detected = false; - - CONS_Printf(M_GetText("Looking for joystick devices:\n")); - iJoyNum = 0; - hr = IDirectInput_EnumDevices(lpDI, DIDEVTYPE_JOYSTICK, DIEnumJoysticks, - (void *)&cv_usejoystick, // our user parameter is joystick number - DIEDFL_ATTACHEDONLY); - if (FAILED(hr)) - { - CONS_Alert(CONS_WARNING, M_GetText("Joystick initialize failed.\n")); - cv_usejoystick.value = 0; - return; - } - - if (!lpDIJ) - { - if (!iJoyNum) - CONS_Printf(M_GetText("none found\n")); - else - { - CONS_Printf(M_GetText("none used\n")); - if (cv_usejoystick.value > 0 && cv_usejoystick.value > iJoyNum) - { - CONS_Alert(CONS_WARNING, M_GetText("Set the use_joystick variable to one of the enumerated joystick numbers\n")); - } - } - cv_usejoystick.value = 0; - return; - } - - I_AddExitFunc(I_ShutdownJoystick); - - // set coop level - if (FAILED(IDirectInputDevice_SetCooperativeLevel(lpDIJ, hWndMain, - DISCL_NONEXCLUSIVE|DISCL_FOREGROUND))) - { - I_Error("I_InitJoystick: SetCooperativeLevel FAILED"); - } - } - else - CONS_Printf(M_GetText("Joystick already initialized\n")); - - // we don't unacquire joystick, so let's just pretend we re-acquired it - joystick_detected = true; -} -//Joystick 2 - -// --------------- -// DIEnumJoysticks2 -// There is no such thing as a 'system' joystick, contrary to mouse, -// we must enumerate and choose one joystick device to use -// --------------- -static BOOL CALLBACK DIEnumJoysticks2 (LPCDIDEVICEINSTANCEA lpddi, - LPVOID pvRef) //cv_usejoystick -{ - LPDIRECTINPUTDEVICEA pdev; - DIPROPRANGE diprg; - DIDEVCAPS caps; - BOOL bUseThisOne = FALSE; - - iJoy2Num++; - - //faB: if cv holds a string description of joystick, the value from atoi() is 0 - // else, the value was probably set by user at console to one of the previsouly - // enumerated joysticks - if (((consvar_t *)pvRef)->value == iJoy2Num || !strcmp(((consvar_t *)pvRef)->string, lpddi->tszProductName)) - bUseThisOne = TRUE; - - //I_OutputMsg(" cv joy2 is %s\n", ((consvar_t *)pvRef)->string); - - // print out device name - CONS_Printf("%c%d: %s\n", - (bUseThisOne) ? '\2' : ' ', // show name in white if this is the one we will use - iJoy2Num, - //(GET_DIDEVICE_SUBTYPE(lpddi->dwDevType) == DIDEVTYPEJOYSTICK_GAMEPAD) ? "Gamepad " : "Joystick", - lpddi->tszProductName); //, lpddi->tszInstanceName); - - // use specified joystick (cv_usejoystick.value in pvRef) - if (!bUseThisOne) - return DIENUM_CONTINUE; - - ((consvar_t *)pvRef)->value = iJoy2Num; - if (IDirectInput_CreateDevice (lpDI, &lpddi->guidInstance, - &pdev, NULL) != DI_OK) - { - // if it failed, then we can't use this joystick for some - // bizarre reason. (Maybe the user unplugged it while we - // were in the middle of enumerating it.) So continue enumerating - I_OutputMsg("DIEnumJoysticks2(): CreateDevice FAILED\n"); - return DIENUM_CONTINUE; - } - - - // get the Device capabilities - // - caps.dwSize = sizeof (DIDEVCAPS_DX3); - if (FAILED(IDirectInputDevice_GetCapabilities (pdev, &caps))) - { - I_OutputMsg("DIEnumJoysticks2(): GetCapabilities FAILED\n"); - IDirectInputDevice_Release (pdev); - return DIENUM_CONTINUE; - } - if (!(caps.dwFlags & DIDC_ATTACHED)) // should be, since we enumerate only attached devices - return DIENUM_CONTINUE; - - Joystick2.bJoyNeedPoll = ((caps.dwFlags & DIDC_POLLEDDATAFORMAT) != 0); - - if (caps.dwFlags & DIDC_FORCEFEEDBACK) - JoyInfo2.ForceAxises = 0; - else - JoyInfo2.ForceAxises = -1; - - Joystick2.bGamepadStyle = (GET_DIDEVICE_SUBTYPE(caps.dwDevType) == DIDEVTYPEJOYSTICK_GAMEPAD); - //I_OutputMsg("Gamepad: %d\n", Joystick2.bGamepadStyle); - - CONS_Printf(M_GetText("Capabilities: %lu axes, %lu buttons, %lu POVs, poll %u, Gamepad %d\n"), caps.dwAxes, caps.dwButtons, caps.dwPOVs, Joystick2.bJoyNeedPoll, Joystick2.bGamepadStyle); - - // Set the data format to "simple joystick" - a predefined data format - // - // A data format specifies which controls on a device we - // are interested in, and how they should be reported. - // - // This tells DirectInput that we will be passing a - // DIJOYSTATE structure to IDirectInputDevice::GetDeviceState. - if (IDirectInputDevice_SetDataFormat (pdev, &c_dfDIJoystick) != DI_OK) - { - I_OutputMsg("DIEnumJoysticks2(): SetDataFormat FAILED\n"); - IDirectInputDevice_Release (pdev); - return DIENUM_CONTINUE; - } - - // Set the cooperativity level to let DirectInput know how - // this device should interact with the system and with other - // DirectInput applications. - if (IDirectInputDevice_SetCooperativeLevel (pdev, hWndMain, - DISCL_EXCLUSIVE | DISCL_FOREGROUND) != DI_OK) - { - I_OutputMsg("DIEnumJoysticks2(): SetCooperativeLevel FAILED\n"); - IDirectInputDevice_Release (pdev); - return DIENUM_CONTINUE; - } - - // set the range of the joystick axis - diprg.diph.dwSize = sizeof (DIPROPRANGE); - diprg.diph.dwHeaderSize = sizeof (DIPROPHEADER); - diprg.diph.dwHow = DIPH_BYOFFSET; - diprg.lMin = -JOYAXISRANGE; // value for extreme left - diprg.lMax = +JOYAXISRANGE; // value for extreme right - - diprg.diph.dwObj = DIJOFS_X; // set the x-axis range - if (FAILED(IDirectInputDevice_SetProperty(pdev, DIPROP_RANGE, &diprg.diph))) - { - //goto SetPropFail; - JoyInfo2.X = FALSE; - } - else JoyInfo2.X = TRUE; - - diprg.diph.dwObj = DIJOFS_Y; // set the y-axis range - if (FAILED(IDirectInputDevice_SetProperty(pdev, DIPROP_RANGE, &diprg.diph))) - { -//SetPropFail: -// I_OutputMsg("DIEnumJoysticks(): SetProperty FAILED\n"); -// IDirectInputDevice_Release (pdev); -// return DIENUM_CONTINUE; - JoyInfo2.Y = FALSE; - } - else JoyInfo2.Y = TRUE; - - diprg.diph.dwObj = DIJOFS_Z; // set the z-axis range - if (FAILED(IDirectInputDevice_SetProperty(pdev, DIPROP_RANGE, &diprg.diph))) - { - //I_OutputMsg("DIJOFS_Z not found\n"); - JoyInfo2.Z = FALSE; - } - else JoyInfo2.Z = TRUE; - - diprg.diph.dwObj = DIJOFS_RX; // set the x-rudder range - if (FAILED(IDirectInputDevice_SetProperty(pdev, DIPROP_RANGE, &diprg.diph))) - { - //I_OutputMsg("DIJOFS_RX (x-rudder) not found\n"); - JoyInfo2.Rx = FALSE; - } - else JoyInfo2.Rx = TRUE; - - diprg.diph.dwObj = DIJOFS_RY; // set the y-rudder range - if (FAILED(IDirectInputDevice_SetProperty(pdev, DIPROP_RANGE, &diprg.diph))) - { - //I_OutputMsg("DIJOFS_RY (y-rudder) not found\n"); - JoyInfo2.Ry = FALSE; - } - else JoyInfo2.Ry = TRUE; - - diprg.diph.dwObj = DIJOFS_RZ; // set the z-rudder range - if (FAILED(IDirectInputDevice_SetProperty(pdev, DIPROP_RANGE, &diprg.diph))) - { - //I_OutputMsg("DIJOFS_RZ (z-rudder) not found\n"); - JoyInfo2.Rz = FALSE; - } - else JoyInfo2.Rz = TRUE; - diprg.diph.dwObj = DIJOFS_SLIDER(0); // set the x-misc range - if (FAILED(IDirectInputDevice_SetProperty(pdev, DIPROP_RANGE, &diprg.diph))) - { - //I_OutputMsg("DIJOFS_RZ (x-misc) not found\n"); - JoyInfo2.U = FALSE; - } - else JoyInfo2.U = TRUE; - - diprg.diph.dwObj = DIJOFS_SLIDER(1); // set the y-misc range - if (FAILED(IDirectInputDevice_SetProperty(pdev, DIPROP_RANGE, &diprg.diph))) - { - //I_OutputMsg("DIJOFS_RZ (y-misc) not found\n"); - JoyInfo2.V = FALSE; - } - else JoyInfo2.V = TRUE; - - // set X axis dead zone to 25% (to avoid accidental turning) - if (!Joystick2.bGamepadStyle) - { - if (JoyInfo2.X) - if (FAILED(SetDIDwordProperty(pdev, DIPROP_DEADZONE, DIJOFS_X, - DIPH_BYOFFSET, DIDEADZONE))) - { - I_OutputMsg("DIEnumJoysticks2(): couldn't SetProperty for X DEAD ZONE"); - //IDirectInputDevice_Release (pdev); - //return DIENUM_CONTINUE; - } - if (JoyInfo2.Y) - if (FAILED(SetDIDwordProperty(pdev, DIPROP_DEADZONE, DIJOFS_Y, - DIPH_BYOFFSET, DIDEADZONE))) - { - I_OutputMsg("DIEnumJoysticks2(): couldn't SetProperty for Y DEAD ZONE\n"); - //IDirectInputDevice_Release (pdev); - //return DIENUM_CONTINUE; - } - if (JoyInfo2.Z) - if (FAILED(SetDIDwordProperty(pdev, DIPROP_DEADZONE, DIJOFS_Z, - DIPH_BYOFFSET, DIDEADZONE))) - { - I_OutputMsg("DIEnumJoysticks2(): couldn't SetProperty for Z DEAD ZONE\n"); - //IDirectInputDevice_Release (pdev); - //return DIENUM_CONTINUE; - } - if (JoyInfo2.Rx) - if (FAILED(SetDIDwordProperty(pdev, DIPROP_DEADZONE, DIJOFS_RX, - DIPH_BYOFFSET, DIDEADZONE))) - { - I_OutputMsg("DIEnumJoysticks2(): couldn't SetProperty for RX DEAD ZONE\n"); - //IDirectInputDevice_Release (pdev); - //return DIENUM_CONTINUE; - } - if (JoyInfo2.Ry) - if (FAILED(SetDIDwordProperty(pdev, DIPROP_DEADZONE, DIJOFS_RY, - DIPH_BYOFFSET, DIDEADZONE))) - { - I_OutputMsg("DIEnumJoysticks2(): couldn't SetProperty for RY DEAD ZONE\n"); - //IDirectInputDevice_Release (pdev); - //return DIENUM_CONTINUE; - } - if (JoyInfo2.Rz) - if (FAILED(SetDIDwordProperty(pdev, DIPROP_DEADZONE, DIJOFS_RZ, - DIPH_BYOFFSET, DIDEADZONE))) - { - I_OutputMsg("DIEnumJoysticks2(): couldn't SetProperty for RZ DEAD ZONE\n"); - //IDirectInputDevice_Release (pdev); - //return DIENUM_CONTINUE; - } - if (JoyInfo2.U) - if (FAILED(SetDIDwordProperty(pdev, DIPROP_DEADZONE, DIJOFS_SLIDER(0), - DIPH_BYOFFSET, DIDEADZONE))) - { - I_OutputMsg("DIEnumJoysticks2(): couldn't SetProperty for U DEAD ZONE\n"); - //IDirectInputDevice_Release (pdev); - //return DIENUM_CONTINUE; - } - if (JoyInfo2.V) - if (FAILED(SetDIDwordProperty(pdev, DIPROP_DEADZONE, DIJOFS_SLIDER(1), - DIPH_BYOFFSET, DIDEADZONE))) - { - I_OutputMsg("DIEnumJoysticks2(): couldn't SetProperty for V DEAD ZONE\n"); - //IDirectInputDevice_Release (pdev); - //return DIENUM_CONTINUE; - } - } - - // query for IDirectInputDevice2 - we need this to poll the joystick - if (bDX0300) - { - FFType i = EvilForce; - // we won't use the poll - lpDIJA = NULL; - for (i = 0; i > NumberofForces; i++) - lpDIE[i] = NULL; - } - else - { - LPDIRECTINPUTDEVICE2A *rp = &lpDIJ2A; - LPVOID *tp = (LPVOID *)rp; - if (FAILED(IDirectInputDevice_QueryInterface(pdev, &IID_IDirectInputDevice2, tp))) - { - I_OutputMsg("DIEnumJoysticks2(): QueryInterface FAILED\n"); - IDirectInputDevice_Release (pdev); - return DIENUM_CONTINUE; - } - - if (lpDIJ2A && JoyInfo2.ForceAxises != -1) - { - // Since we will be playing force feedback effects, we should disable the - // auto-centering spring. - if (FAILED(SetDIDwordProperty(pdev, DIPROP_AUTOCENTER, 0, DIPH_DEVICE, FALSE))) - { - //NOP - } - - // Enumerate and count the axes of the joystick - if (FAILED(IDirectInputDevice_EnumObjects(pdev, EnumAxesCallback, - (LPVOID)&JoyInfo2.ForceAxises, DIDFT_AXIS))) - { - JoyInfo2.ForceAxises = -1; - } - else - { - SetupAllForces(lpDIJ2A,lpDIE2,JoyInfo2.ForceAxises); - } - } - } - - // we successfully created an IDirectInputDevice. So stop looking - // for another one. - lpDIJ2 = pdev; - return DIENUM_STOP; -} - - -// -------------- -// I_InitJoystick2 -// This is called everytime the 'use_joystick2' variable changes -// It is normally called at least once at startup when the config is loaded -// -------------- -void I_InitJoystick2 (void) -{ - HRESULT hr; - - // cleanup - I_ShutdownJoystick2 (); - - joystick2_detected = false; - - // joystick detection can be skipped by setting use_joystick to 0 - if (!lpDI || M_CheckParm("-nojoy")) - { - CONS_Printf(M_GetText("Joystick2 disabled\n")); - return; - } - else - // don't do anything at the registration of the joystick cvar, - // until config is loaded - if (!strcmp(cv_usejoystick2.string, "0")) - return; - - // acquire the joystick only once - if (!lpDIJ2) - { - joystick2_detected = false; - - CONS_Printf(M_GetText("Looking for joystick devices:\n")); - iJoy2Num = 0; - hr = IDirectInput_EnumDevices(lpDI, DIDEVTYPE_JOYSTICK, - DIEnumJoysticks2, - (LPVOID)&cv_usejoystick2, // our user parameter is joystick number - DIEDFL_ATTACHEDONLY); - if (FAILED(hr)) - { - CONS_Alert(CONS_WARNING, M_GetText("Joystick initialize failed.\n")); - cv_usejoystick2.value = 0; - return; - } - - if (!lpDIJ2) - { - if (iJoy2Num == 0) - CONS_Printf(M_GetText("none found\n")); - else - { - CONS_Printf(M_GetText("none used\n")); - if (cv_usejoystick2.value > 0 && - cv_usejoystick2.value > iJoy2Num) - { - CONS_Alert(CONS_WARNING, M_GetText("Set the use_joystick2 variable to one of the enumerated joysticks number\n")); - } - } - cv_usejoystick2.value = 0; - return; - } - - I_AddExitFunc (I_ShutdownJoystick2); - - // set coop level - if (FAILED(IDirectInputDevice_SetCooperativeLevel (lpDIJ2, hWndMain, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND))) - I_Error("I_InitJoystick2: SetCooperativeLevel FAILED"); - - // later - //if (FAILED(IDirectInputDevice_Acquire (lpDIJ2))) - // I_Error("Couldn't acquire Joystick2"); - - joystick2_detected = true; - } - else - CONS_Printf(M_GetText("Joystick already initialized\n")); - - //faB: we don't unacquire joystick, so let's just pretend we re-acquired it - joystick2_detected = true; -} - -/** \brief Joystick 1 buttons states -*/ -static UINT64 lastjoybuttons = 0; - -/** \brief Joystick 1 hats state -*/ -static UINT64 lastjoyhats = 0; - -static VOID I_ShutdownJoystick(VOID) -{ - int i; - event_t event; - - lastjoybuttons = lastjoyhats = 0; - - event.type = ev_keyup; - - // emulate the up of all joystick buttons - for (i = 0;i < JOYBUTTONS;i++) - { - event.key = KEY_JOY1+i; - D_PostEvent(&event); - } - - // emulate the up of all joystick hats - for (i = 0;i < JOYHATS*4;i++) - { - event.key = KEY_HAT1+i; - D_PostEvent(&event); - } - - // reset joystick position - event.type = ev_joystick; - for (i = 0;i < JOYAXISSET; i++) - { - event.key = i; - D_PostEvent(&event); - } - - if (joystick_detected) - CONS_Printf("I_ShutdownJoystick()\n"); - - for (i = 0; i > NumberofForces; i++) - { - if (lpDIE[i]) - { - IDirectInputEffect_Release(lpDIE[i]); - lpDIE[i] = NULL; - - } - } - if (lpDIJ) - { - IDirectInputDevice_Unacquire(lpDIJ); - IDirectInputDevice_Release(lpDIJ); - lpDIJ = NULL; - } - if (lpDIJA) - { - IDirectInputDevice2_Release(lpDIJA); - lpDIJA = NULL; - } - joystick_detected = false; -} - -/** \brief Joystick 2 buttons states -*/ -static UINT64 lastjoy2buttons = 0; - -/** \brief Joystick 2 hats state -*/ -static UINT64 lastjoy2hats = 0; - -static VOID I_ShutdownJoystick2(VOID) -{ - int i; - event_t event; - - lastjoy2buttons = lastjoy2hats = 0; - - event.type = ev_keyup; - - // emulate the up of all joystick buttons - for (i = 0;i < JOYBUTTONS;i++) - { - event.key = KEY_2JOY1+i; - D_PostEvent(&event); - } - - // emulate the up of all joystick hats - for (i = 0;i < JOYHATS*4;i++) - { - event.key = KEY_2HAT1+i; - D_PostEvent(&event); - } - - // reset joystick position - event.type = ev_joystick2; - for (i = 0;i < JOYAXISSET; i++) - { - event.key = i; - D_PostEvent(&event); - } - - if (joystick2_detected) - CONS_Printf("I_ShutdownJoystick2()\n"); - - for (i = 0; i > NumberofForces; i++) - { - if (lpDIE2[i]) - { - IDirectInputEffect_Release(lpDIE2[i]); - lpDIE2[i] = NULL; - } - } - if (lpDIJ2) - { - IDirectInputDevice_Unacquire(lpDIJ2); - IDirectInputDevice_Release(lpDIJ2); - lpDIJ2 = NULL; - } - if (lpDIJ2A) - { - IDirectInputDevice2_Release(lpDIJ2A); - lpDIJ2A = NULL; - } - joystick2_detected = false; -} - -// ------------------- -// I_GetJoystickEvents -// Get current joystick axis and button states -// ------------------- -void I_GetJoystickEvents(void) -{ - HRESULT hr; - DIJOYSTATE js; // DirectInput joystick state - int i; - UINT64 joybuttons = 0; - UINT64 joyhats = 0; - event_t event; - - if (!lpDIJ) - return; - - // if input is lost then acquire and keep trying - for (;;) - { - // poll the joystick to read the current state - // if the device doesn't require polling, this function returns almost instantly - if (lpDIJA) - { - hr = IDirectInputDevice2_Poll(lpDIJA); - if (hr == DIERR_INPUTLOST || hr == DIERR_NOTACQUIRED) - goto acquire; - else if (FAILED(hr)) - { - I_OutputMsg("I_GetJoystickEvents(): Poll FAILED\n"); - return; - } - } - - // get the input's device state, and put the state in dims - hr = IDirectInputDevice_GetDeviceState(lpDIJ, sizeof (DIJOYSTATE), &js); - - if (hr == DIERR_INPUTLOST || hr == DIERR_NOTACQUIRED) - { - // DirectInput is telling us that the input stream has - // been interrupted. We aren't tracking any state - // between polls, so we don't have any special reset - // that needs to be done. We just re-acquire and - // try again. - goto acquire; - } - else if (FAILED(hr)) - { - I_OutputMsg("I_GetJoystickEvents(): GetDeviceState FAILED\n"); - return; - } - - break; -acquire: - if (FAILED(IDirectInputDevice_Acquire(lpDIJ))) - return; - } - - // look for as many buttons as g_input code supports, we don't use the others - for (i = JOYBUTTONS_MIN - 1; i >= 0; i--) - { - joybuttons <<= 1; - if (js.rgbButtons[i]) - joybuttons |= 1; - } - - for (i = JOYHATS_MIN -1; i >=0; i--) - { - if (js.rgdwPOV[i] != 0xffff && js.rgdwPOV[i] != 0xffffffff) - { - if (js.rgdwPOV[i] > 270 * DI_DEGREES || js.rgdwPOV[i] < 90 * DI_DEGREES) - joyhats |= (UINT64)1<<(0 + 4*(UINT64)i); // UP - else if (js.rgdwPOV[i] > 90 * DI_DEGREES && js.rgdwPOV[i] < 270 * DI_DEGREES) - joyhats |= (UINT64)1<<(1 + 4*(UINT64)i); // DOWN - if (js.rgdwPOV[i] > 0 * DI_DEGREES && js.rgdwPOV[i] < 180 * DI_DEGREES) - joyhats |= (UINT64)1<<(3 + 4*(UINT64)i); // LEFT - else if (js.rgdwPOV[i] > 180 * DI_DEGREES && js.rgdwPOV[i] < 360 * DI_DEGREES) - joyhats |= (UINT64)1<<(2 + 4*(UINT64)i); // RIGHT - } - } - - if (joybuttons != lastjoybuttons) - { - UINT64 j = 1; // keep only bits that changed since last time - UINT64 newbuttons = joybuttons ^ lastjoybuttons; - lastjoybuttons = joybuttons; - - for (i = 0; i < JOYBUTTONS_MIN; i++, j <<= 1) - { - if (newbuttons & j) // button changed state? - { - if (joybuttons & j) - event.type = ev_keydown; - else - event.type = ev_keyup; - event.key = KEY_JOY1 + i; - D_PostEvent(&event); - } - } - } - - if (joyhats != lastjoyhats) - { - UINT64 j = 1; // keep only bits that changed since last time - UINT64 newhats = joyhats ^ lastjoyhats; - lastjoyhats = joyhats; - - for (i = 0; i < JOYHATS_MIN*4; i++, j <<= 1) - { - if (newhats & j) // button changed state? - { - if (joyhats & j) - event.type = ev_keydown; - else - event.type = ev_keyup; - event.key = KEY_HAT1 + i; - D_PostEvent(&event); - } - } - - } - - // send joystick axis positions - event.type = ev_joystick; - event.key = event.x = event.y = 0; - - if (Joystick.bGamepadStyle) - { - // gamepad control type, on or off, live or die - if (JoyInfo.X) - { - if (js.lX < -(JOYAXISRANGE/2)) - event.x = -1; - else if (js.lX > JOYAXISRANGE/2) - event.x = 1; - } - if (JoyInfo.Y) - { - if (js.lY < -(JOYAXISRANGE/2)) - event.y = -1; - else if (js.lY > JOYAXISRANGE/2) - event.y = 1; - } - } - else - { - // analog control style, just send the raw data - if (JoyInfo.X) event.x = js.lX; // x axis - if (JoyInfo.Y) event.y = js.lY; // y axis - } - - D_PostEvent(&event); -#if JOYAXISSET > 1 - event.key = 1; - event.x = event.y = 0; - - if (Joystick.bGamepadStyle) - { - // gamepad control type, on or off, live or die - if (JoyInfo.Z) - { - if (js.lZ < -(JOYAXISRANGE/2)) - event.x = -1; - else if (js.lZ > JOYAXISRANGE/2) - event.x = 1; - } - if (JoyInfo.Rx) - { - if (js.lRx < -(JOYAXISRANGE/2)) - event.y = -1; - else if (js.lRx > JOYAXISRANGE/2) - event.y = 1; - } - } - else - { - // analog control style, just send the raw data - if (JoyInfo.Z) event.x = js.lZ; // z axis - if (JoyInfo.Rx) event.y = js.lRx; // rx axis - } - - D_PostEvent(&event); -#endif -#if JOYAXISSET > 2 - event.key = 2; - event.x = event.y = 0; - - if (Joystick.bGamepadStyle) - { - // gamepad control type, on or off, live or die - if (JoyInfo.Rx) - { - if (js.lRy < -(JOYAXISRANGE/2)) - event.x = -1; - else if (js.lRy > JOYAXISRANGE/2) - event.x = 1; - } - if (JoyInfo.Rz) - { - if (js.lRz < -(JOYAXISRANGE/2)) - event.y = -1; - else if (js.lRz > JOYAXISRANGE/2) - event.y = 1; - } - } - else - { - // analog control style, just send the raw data - if (JoyInfo.Ry) event.x = js.lRy; // ry axis - if (JoyInfo.Rz) event.y = js.lRz; // rz axis - } - - D_PostEvent(&event); -#endif -#if JOYAXISSET > 3 - event.key = 3; - event.x = event.y = 0; - if (Joystick.bGamepadStyle) - { - // gamepad control type, on or off, live or die - if (JoyInfo.U) - { - if (js.rglSlider[0] < -(JOYAXISRANGE/2)) - event.x = -1; - else if (js.rglSlider[0] > JOYAXISRANGE/2) - event.x = 1; - } - if (JoyInfo.V) - { - if (js.rglSlider[1] < -(JOYAXISRANGE/2)) - event.y = -1; - else if (js.rglSlider[1] > JOYAXISRANGE/2) - event.y = 1; - } - } - else - { - // analog control style, just send the raw data - if (JoyInfo.U) event.x = js.rglSlider[0]; // U axis - if (JoyInfo.V) event.y = js.rglSlider[1]; // V axis - } - D_PostEvent(&event); -#endif -} - -// ------------------- -// I_GetJoystickEvents -// Get current joystick axis and button states -// ------------------- -void I_GetJoystick2Events(void) -{ - HRESULT hr; - DIJOYSTATE js; // DirectInput joystick state - int i; - UINT64 joybuttons = 0; - UINT64 joyhats = 0; - event_t event; - - if (!lpDIJ2) - return; - - // if input is lost then acquire and keep trying - for (;;) - { - // poll the joystick to read the current state - // if the device doesn't require polling, this function returns almost instantly - if (lpDIJ2A) - { - hr = IDirectInputDevice2_Poll(lpDIJ2A); - if (hr == DIERR_INPUTLOST || hr == DIERR_NOTACQUIRED) - goto acquire; - else if (FAILED(hr)) - { - I_OutputMsg("I_GetJoystick2Events(): Poll FAILED\n"); - return; - } - } - - // get the input's device state, and put the state in dims - hr = IDirectInputDevice_GetDeviceState(lpDIJ2, sizeof (DIJOYSTATE), &js); - - if (hr == DIERR_INPUTLOST || hr == DIERR_NOTACQUIRED) - { - // DirectInput is telling us that the input stream has - // been interrupted. We aren't tracking any state - // between polls, so we don't have any special reset - // that needs to be done. We just re-acquire and - // try again. - goto acquire; - } - else if (FAILED(hr)) - { - I_OutputMsg("I_GetJoystickEvents2(): GetDeviceState FAILED\n"); - return; - } - - break; -acquire: - if (FAILED(IDirectInputDevice_Acquire(lpDIJ2))) - return; - } - - // look for as many buttons as g_input code supports, we don't use the others - for (i = JOYBUTTONS_MIN - 1; i >= 0; i--) - { - joybuttons <<= 1; - if (js.rgbButtons[i]) - joybuttons |= 1; - } - - for (i = JOYHATS_MIN -1; i >=0; i--) - { - if (js.rgdwPOV[i] != 0xffff && js.rgdwPOV[i] != 0xffffffff) - { - if (js.rgdwPOV[i] > 270 * DI_DEGREES || js.rgdwPOV[i] < 90 * DI_DEGREES) - joyhats |= (UINT64)1<<(0 + 4*(UINT64)i); // UP - else if (js.rgdwPOV[i] > 90 * DI_DEGREES && js.rgdwPOV[i] < 270 * DI_DEGREES) - joyhats |= (UINT64)1<<(1 + 4*(UINT64)i); // DOWN - if (js.rgdwPOV[i] > 0 * DI_DEGREES && js.rgdwPOV[i] < 180 * DI_DEGREES) - joyhats |= (UINT64)1<<(3 + 4*(UINT64)i); // LEFT - else if (js.rgdwPOV[i] > 180 * DI_DEGREES && js.rgdwPOV[i] < 360 * DI_DEGREES) - joyhats |= (UINT64)1<<(2 + 4*(UINT64)i); // RIGHT - } - } - - if (joybuttons != lastjoy2buttons) - { - UINT64 j = 1; // keep only bits that changed since last time - UINT64 newbuttons = joybuttons ^ lastjoy2buttons; - lastjoy2buttons = joybuttons; - - for (i = 0; i < JOYBUTTONS_MIN; i++, j <<= 1) - { - if (newbuttons & j) // button changed state? - { - if (joybuttons & j) - event.type = ev_keydown; - else - event.type = ev_keyup; - event.key = KEY_2JOY1 + i; - D_PostEvent(&event); - } - } - } - - if (joyhats != lastjoy2hats) - { - UINT64 j = 1; // keep only bits that changed since last time - UINT64 newhats = joyhats ^ lastjoy2hats; - lastjoy2hats = joyhats; - - for (i = 0; i < JOYHATS_MIN*4; i++, j <<= 1) - { - if (newhats & j) // button changed state? - { - if (joyhats & j) - event.type = ev_keydown; - else - event.type = ev_keyup; - event.key = KEY_2HAT1 + i; - D_PostEvent(&event); - } - } - - } - - // send joystick axis positions - event.type = ev_joystick2; - event.key = event.x = event.y = 0; - - if (Joystick2.bGamepadStyle) - { - // gamepad control type, on or off, live or die - if (JoyInfo2.X) - { - if (js.lX < -(JOYAXISRANGE/2)) - event.x = -1; - else if (js.lX > JOYAXISRANGE/2) - event.x = 1; - } - if (JoyInfo2.Y) - { - if (js.lY < -(JOYAXISRANGE/2)) - event.y = -1; - else if (js.lY > JOYAXISRANGE/2) - event.y = 1; - } - } - else - { - // analog control style, just send the raw data - if (JoyInfo2.X) event.x = js.lX; // x axis - if (JoyInfo2.Y) event.y = js.lY; // y axis - } - - D_PostEvent(&event); -#if JOYAXISSET > 1 - event.key = 1; - event.x = event.y = 0; - - if (Joystick2.bGamepadStyle) - { - // gamepad control type, on or off, live or die - if (JoyInfo2.Z) - { - if (js.lZ < -(JOYAXISRANGE/2)) - event.x = -1; - else if (js.lZ > JOYAXISRANGE/2) - event.x = 1; - } - if (JoyInfo2.Rx) - { - if (js.lRx < -(JOYAXISRANGE/2)) - event.y = -1; - else if (js.lRx > JOYAXISRANGE/2) - event.y = 1; - } - } - else - { - // analog control style, just send the raw data - if (JoyInfo2.Z) event.x = js.lZ; // z axis - if (JoyInfo2.Rx) event.y = js.lRx; // rx axis - } - - D_PostEvent(&event); -#endif -#if JOYAXISSET > 2 - event.key = 2; - event.x = event.y = 0; - - if (Joystick2.bGamepadStyle) - { - // gamepad control type, on or off, live or die - if (JoyInfo2.Rx) - { - if (js.lRy < -(JOYAXISRANGE/2)) - event.x = -1; - else if (js.lRy > JOYAXISRANGE/2) - event.x = 1; - } - if (JoyInfo2.Rz) - { - if (js.lRz < -(JOYAXISRANGE/2)) - event.y = -1; - else if (js.lRz > JOYAXISRANGE/2) - event.y = 1; - } - } - else - { - // analog control style, just send the raw data - if (JoyInfo2.Ry) event.x = js.lRy; // ry axis - if (JoyInfo2.Rz) event.y = js.lRz; // rz axis - } - - D_PostEvent(&event); -#endif -#if JOYAXISSET > 3 - event.key = 3; - event.x = event.y = 0; - if (Joystick2.bGamepadStyle) - { - // gamepad control type, on or off, live or die - if (JoyInfo2.U) - { - if (js.rglSlider[0] < -(JOYAXISRANGE/2)) - event.x = -1; - else if (js.rglSlider[0] > JOYAXISRANGE/2) - event.x = 1; - } - if (JoyInfo2.V) - { - if (js.rglSlider[1] < -(JOYAXISRANGE/2)) - event.y = -1; - else if (js.rglSlider[1] > JOYAXISRANGE/2) - event.y = 1; - } - } - else - { - // analog control style, just send the raw data - if (JoyInfo2.U) event.x = js.rglSlider[0]; // U axis - if (JoyInfo2.V) event.y = js.rglSlider[1]; // V axis - } - D_PostEvent(&event); -#endif -} - -static int numofjoy = 0; -static char joyname[MAX_PATH]; -static int needjoy = -1; - -static BOOL CALLBACK DIEnumJoysticksCount (LPCDIDEVICEINSTANCEA lpddi, - LPVOID pvRef) //joyname -{ - numofjoy++; - if (needjoy == numofjoy && pvRef && pvRef == (void *)joyname && lpddi - && lpddi->tszProductName) - { - sprintf(joyname,"%s",lpddi->tszProductName); - return DIENUM_STOP; - } - //else I_OutputMsg("DIEnumJoysticksCount need help!\n"); - return DIENUM_CONTINUE; -} - -INT32 I_NumJoys(void) -{ - HRESULT hr; - needjoy = -1; - numofjoy = 0; - hr = IDirectInput_EnumDevices(lpDI, DIDEVTYPE_JOYSTICK, - DIEnumJoysticksCount, (LPVOID)&numofjoy, DIEDFL_ATTACHEDONLY); - if (FAILED(hr)) - { - I_OutputMsg("\nI_NumJoys(): EnumDevices FAILED\n"); - } - return numofjoy; - -} - -const char *I_GetJoyName(INT32 joyindex) -{ - HRESULT hr; - needjoy = joyindex; - numofjoy = 0; - ZeroMemory(joyname,sizeof (joyname)); - hr = IDirectInput_EnumDevices(lpDI, DIDEVTYPE_JOYSTICK, - DIEnumJoysticksCount, (LPVOID)joyname, DIEDFL_ATTACHEDONLY); - if (FAILED(hr)) - { - I_OutputMsg("\nI_GetJoyName(): EnumDevices FAILED\n"); - } - if (joyname[0] == 0) return NULL; - return joyname; -} - -#ifndef NOMUMBLE -// Best Mumble positional audio settings: -// Minimum distance 3.0 m -// Bloom 175% -// Maximum distance 80.0 m -// Minimum volume 50% -#define DEG2RAD (0.017453292519943295769236907684883l) // TAU/360 or PI/180 -#define MUMBLEUNIT (64.0f) // FRACUNITS in a Meter - -static struct { - UINT32 uiVersion; - DWORD uiTick; - float fAvatarPosition[3]; - float fAvatarFront[3]; - float fAvatarTop[3]; // defaults to Y-is-up (only used for leaning) - wchar_t name[256]; // game name - float fCameraPosition[3]; - float fCameraFront[3]; - float fCameraTop[3]; // defaults to Y-is-up (only used for leaning) - wchar_t identity[256]; // player id - UINT32 context_len; - unsigned char context[256]; // server/team - wchar_t description[2048]; // game description -} *mumble = NULL; - -static inline void I_SetupMumble(void) -{ - HANDLE hMap = OpenFileMappingW(FILE_MAP_ALL_ACCESS, FALSE, L"MumbleLink"); - if (!hMap) - return; - - mumble = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(*mumble)); - if (!mumble) - CloseHandle(hMap); -} - -void I_UpdateMumble(const mobj_t *mobj, const listener_t listener) -{ - double angle; - fixed_t anglef; - - if (!mumble) - return; - - if(mumble->uiVersion != 2) { - wcsncpy(mumble->name, L"SRB2 "VERSIONSTRINGW, 256); - wcsncpy(mumble->description, L"Sonic Robo Blast 2 with integrated Mumble Link support.", 2048); - mumble->uiVersion = 2; - } - mumble->uiTick++; - - if (!netgame || gamestate != GS_LEVEL) { // Zero out, but never delink. - mumble->fAvatarPosition[0] = mumble->fAvatarPosition[1] = mumble->fAvatarPosition[2] = 0.0f; - mumble->fAvatarFront[0] = 1.0f; - mumble->fAvatarFront[1] = mumble->fAvatarFront[2] = 0.0f; - mumble->fCameraPosition[0] = mumble->fCameraPosition[1] = mumble->fCameraPosition[2] = 0.0f; - mumble->fCameraFront[0] = 1.0f; - mumble->fCameraFront[1] = mumble->fCameraFront[2] = 0.0f; - return; - } - - { - UINT8 *p = mumble->context; - WRITEMEM(p, server_context, 8); - WRITEINT16(p, gamemap); - mumble->context_len = p - mumble->context; - } - - if (mobj) { - mumble->fAvatarPosition[0] = FIXED_TO_FLOAT(mobj->x) / MUMBLEUNIT; - mumble->fAvatarPosition[1] = FIXED_TO_FLOAT(mobj->z) / MUMBLEUNIT; - mumble->fAvatarPosition[2] = FIXED_TO_FLOAT(mobj->y) / MUMBLEUNIT; - - anglef = AngleFixed(mobj->angle); - angle = FIXED_TO_FLOAT(anglef)*DEG2RAD; - mumble->fAvatarFront[0] = (float)cos(angle); - mumble->fAvatarFront[1] = 0.0f; - mumble->fAvatarFront[2] = (float)sin(angle); - } else { - mumble->fAvatarPosition[0] = mumble->fAvatarPosition[1] = mumble->fAvatarPosition[2] = 0.0f; - mumble->fAvatarFront[0] = 1.0f; - mumble->fAvatarFront[1] = mumble->fAvatarFront[2] = 0.0f; - } - - mumble->fCameraPosition[0] = FIXED_TO_FLOAT(listener.x) / MUMBLEUNIT; - mumble->fCameraPosition[1] = FIXED_TO_FLOAT(listener.z) / MUMBLEUNIT; - mumble->fCameraPosition[2] = FIXED_TO_FLOAT(listener.y) / MUMBLEUNIT; - - anglef = AngleFixed(listener.angle); - angle = FIXED_TO_FLOAT(anglef)*DEG2RAD; - mumble->fCameraFront[0] = (float)cos(angle); - mumble->fCameraFront[1] = 0.0f; - mumble->fCameraFront[2] = (float)sin(angle); -} -#endif - -// =========================================================================================== -// DIRECT INPUT KEYBOARD -// =========================================================================================== - -static UINT8 ASCIINames[256] = -{ - // 0 1 2 3 4 5 6 7 - // 8 9 A B C D E F - 0, 27, '1', '2', '3', '4', '5', '6', - '7', '8', '9', '0', KEY_MINUS,KEY_EQUALS,KEY_BACKSPACE, KEY_TAB, - 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', - 'o', 'p', '[', ']',KEY_ENTER,KEY_LCTRL,'a', 's', - 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', - '\'', '`', KEY_LSHIFT,'\\', 'z', 'x', 'c', 'v', - 'b', 'n', 'm', ',', '.', '/', KEY_RSHIFT,'*', - KEY_LALT,KEY_SPACE,KEY_CAPSLOCK,KEY_F1,KEY_F2,KEY_F3,KEY_F4,KEY_F5, - KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10,KEY_NUMLOCK,KEY_SCROLLLOCK,KEY_KEYPAD7, - KEY_KEYPAD8,KEY_KEYPAD9,KEY_MINUSPAD,KEY_KEYPAD4,KEY_KEYPAD5,KEY_KEYPAD6,KEY_PLUSPAD,KEY_KEYPAD1, - KEY_KEYPAD2,KEY_KEYPAD3,KEY_KEYPAD0,KEY_KPADDEL,0,0,0, KEY_F11, - KEY_F12,0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - // 0 1 2 3 4 5 6 7 - // 8 9 A B C D E F - - 0, 0, 0, 0, 0, 0, 0, 0, // 0x80 - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, KEY_ENTER,KEY_RCTRL,0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, // 0xa0 - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, KEY_KPADDEL, 0,KEY_KPADSLASH,0, 0, - KEY_RALT, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, KEY_HOME, // 0xc0 - KEY_UPARROW,KEY_PGUP,0,KEY_LEFTARROW,0,KEY_RIGHTARROW,0,KEY_END, - KEY_DOWNARROW,KEY_PGDN, KEY_INS,KEY_DEL,0,0,0,0, - 0, 0, 0,KEY_LEFTWIN,KEY_RIGHTWIN,KEY_MENU, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, // 0xe0 - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 -}; - -// Return a key that has been pushed, or 0 (replace getchar() at game startup) -// -INT32 I_GetKey(void) -{ - event_t *ev; - - if (eventtail != eventhead) - { - ev = &events[eventtail]; - eventtail = (eventtail+1) & (MAXEVENTS-1); - if (ev->type == ev_keydown || ev->type == ev_console) - return ev->key; - else - return 0; - } - return 0; -} - -// ----------------- -// I_StartupKeyboard -// Installs DirectInput keyboard -// ----------------- -#define DI_KEYBOARD_BUFFERSIZE 32 // number of data elements in keyboard buffer - -static void I_StartupKeyboard(void) -{ - DIPROPDWORD dip; - - if (dedicated || !lpDI) - return; - - // make sure the app window has the focus or DirectInput acquire keyboard won't work - if (hWndMain) - { - SetFocus(hWndMain); - ShowWindow(hWndMain, SW_SHOW); - UpdateWindow(hWndMain); - } - - // detect error - if (lpDIK) - { - I_OutputMsg("I_StartupKeyboard(): called twice\n"); - return; - } - - CreateDevice2A(lpDI, &GUID_SysKeyboard, &lpDIK, NULL); - - if (lpDIK) - { - if (FAILED(IDirectInputDevice_SetDataFormat(lpDIK, &c_dfDIKeyboard))) - I_Error("Couldn't set keyboard data format"); - - // create buffer for buffered data - dip.diph.dwSize = sizeof (dip); - dip.diph.dwHeaderSize = sizeof (dip.diph); - dip.diph.dwObj = 0; - dip.diph.dwHow = DIPH_DEVICE; - dip.dwData = DI_KEYBOARD_BUFFERSIZE; - if (FAILED(IDirectInputDevice_SetProperty(lpDIK, DIPROP_BUFFERSIZE, &dip.diph))) - I_Error("Couldn't set keyboard buffer size"); - - if (FAILED(IDirectInputDevice_SetCooperativeLevel(lpDIK, hWndMain, - DISCL_NONEXCLUSIVE|DISCL_FOREGROUND))) - { - I_Error("Couldn't set keyboard coop level"); - } - } - else - I_Error("Couldn't create keyboard input"); - - I_AddExitFunc(I_ShutdownKeyboard); - hacktics = 0; // see definition - keyboard_started = true; -} - -// ------------------ -// I_ShutdownKeyboard -// Release DirectInput keyboard. -// ------------------ -static VOID I_ShutdownKeyboard(VOID) -{ - if (!keyboard_started) - return; - - CONS_Printf("I_ShutdownKeyboard()\n"); - - if (lpDIK) - { - IDirectInputDevice_Unacquire(lpDIK); - IDirectInputDevice_Release(lpDIK); - lpDIK = NULL; - } - - keyboard_started = false; -} - -// ------------------- -// I_GetKeyboardEvents -// Get buffered data from the keyboard -// ------------------- -static VOID I_GetKeyboardEvents(VOID) -{ - static BOOL KeyboardLost = false; - - // simply repeat the last pushed key every xx tics, - // make more user friendly input for Console and game Menus -#define KEY_REPEAT_DELAY (NEWTICRATE/17) // TICRATE tics, repeat every 1/3 second - static LONG RepeatKeyTics = 0; - static int RepeatKeyCode = 0; - - DIDEVICEOBJECTDATA rgdod[DI_KEYBOARD_BUFFERSIZE]; - DWORD dwItems, d; - HRESULT hr; - int ch; - - event_t event; - ZeroMemory(&event,sizeof (event)); - - if (!keyboard_started) - return; - - if (!appActive && RepeatKeyCode) // Stop when lost focus - { - event.type = ev_keyup; - event.key = RepeatKeyCode; - D_PostEvent(&event); - RepeatKeyCode = 0; - } -getBufferedData: - dwItems = DI_KEYBOARD_BUFFERSIZE; - hr = IDirectInputDevice_GetDeviceData(lpDIK, sizeof (DIDEVICEOBJECTDATA), rgdod, &dwItems, 0); - - // If data stream was interrupted, reacquire the device and try again. - if (hr == DIERR_INPUTLOST || hr == DIERR_NOTACQUIRED) - { - // why it succeeds to acquire just after I don't understand.. so I set the flag BEFORE - KeyboardLost = true; - - hr = IDirectInputDevice_Acquire(lpDIK); - if (SUCCEEDED(hr)) - goto getBufferedData; - return; - } - - // we lost data, get device actual state to recover lost information - if (hr == DI_BUFFEROVERFLOW) - { - /// \note either uncomment or delete block - //I_Error("DI buffer overflow (keyboard)"); - //I_RecoverKeyboardState (); - - //hr = IDirectInputDevice_GetDeviceState (lpDIM, sizeof (keys), &diMouseState); - } - - // We got buffered input, act on it - if (SUCCEEDED(hr)) - { - // if we previously lost keyboard data, recover its current state - if (KeyboardLost) - { - /// \bug hack simply clears the keys so we don't have the last pressed keys - /// still active.. to have to re-trigger it is not much trouble for the user. - ZeroMemory(gamekeydown, NUMKEYS); - KeyboardLost = false; - } - - // dwItems contains number of elements read (could be 0) - for (d = 0; d < dwItems; d++) - { - // dwOfs member is DIK_* value - // dwData member 0x80 bit set press down, clear is release - - if (rgdod[d].dwData & 0x80) - event.type = ev_keydown; - else - event.type = ev_keyup; - - ch = rgdod[d].dwOfs & 0xFF; - if (ASCIINames[ch]) - event.key = ASCIINames[ch]; - else - event.key = 0x80; - - D_PostEvent(&event); - } - - // Key Repeat - if (dwItems) - { - // new key events, so stop repeating key - RepeatKeyCode = 0; - // delay is tripled for first repeating key - RepeatKeyTics = hacktics + (KEY_REPEAT_DELAY*3); - if (event.type == ev_keydown) // use the last event! - RepeatKeyCode = event.key; - } - else - { - // no new keys, repeat last pushed key after some time - if (RepeatKeyCode && hacktics - RepeatKeyTics > KEY_REPEAT_DELAY) - { - event.type = ev_keydown; - event.key = RepeatKeyCode; - D_PostEvent(&event); - - RepeatKeyTics = hacktics; - } - } - } -} - -static HINSTANCE DInputDLL = NULL; -typedef HRESULT (WINAPI *DICreateA)(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTA *ppDI, LPUNKNOWN punkOuter); -static DICreateA pfnDirectInputCreateA = NULL; - -BOOL LoadDirectInput(VOID) -{ - // load dinput.dll - DInputDLL = LoadLibraryA("DINPUT.DLL"); - if (DInputDLL == NULL) - return false; - pfnDirectInputCreateA = (DICreateA)(LPVOID)GetProcAddress(DInputDLL, "DirectInputCreateA"); - if (pfnDirectInputCreateA == NULL) - return false; - return true; -} - -static inline VOID UnLoadDirectInput(VOID) -{ - if (!DInputDLL) - return; - FreeLibrary(DInputDLL); - pfnDirectInputCreateA = NULL; - DInputDLL = NULL; -} - - -// -// Closes DirectInput -// -static VOID I_ShutdownDirectInput(VOID) -{ - if (lpDI) - IDirectInput_Release(lpDI); - lpDI = NULL; - UnLoadDirectInput(); -} - -// This stuff should get rid of the exception and page faults when -// SRB2 bugs out with an error. Now it should exit cleanly. -// -INT32 I_StartupSystem(void) -{ - HRESULT hr; - HINSTANCE myInstance = GetModuleHandle(NULL); - - // some 'more global than globals' things to initialize here ? - graphics_started = keyboard_started = sound_started = cdaudio_started = false; - - I_StartupKeyboard(); - -#ifdef NDEBUG - -#ifdef BUGTRAP - if(!IsBugTrapLoaded()) - { -#endif - signal(SIGABRT, signal_handler); - signal(SIGFPE, signal_handler); - signal(SIGILL, signal_handler); - signal(SIGSEGV, signal_handler); - signal(SIGTERM, signal_handler); - signal(SIGINT, signal_handler); -#ifdef BUGTRAP - } -#endif - -#endif - -#ifndef NOMUMBLE - I_SetupMumble(); -#endif - - if (!pfnDirectInputCreateA) - return 1; - // create DirectInput - so that I_StartupKeyboard/Mouse can be called later on - // from D_SRB2Main just like DOS version - hr = pfnDirectInputCreateA(myInstance, DIRECTINPUT_VERSION, &lpDI, NULL); - - if (SUCCEEDED(hr)) - bDX0300 = FALSE; - else - { - // try opening DirectX3 interface for NT compatibility - hr = pfnDirectInputCreateA(myInstance, DXVERSION_NTCOMPATIBLE, &lpDI, NULL); - - if (FAILED(hr)) - { - const char *sErr; - switch (hr) - { - case DIERR_BETADIRECTINPUTVERSION: - sErr = "DIERR_BETADIRECTINPUTVERSION"; - break; - case DIERR_INVALIDPARAM: - sErr = "DIERR_INVALIDPARAM"; - break; - case DIERR_OLDDIRECTINPUTVERSION : - sErr = "DIERR_OLDDIRECTINPUTVERSION"; - break; - case DIERR_OUTOFMEMORY: - sErr = "DIERR_OUTOFMEMORY"; - break; - default: - sErr = "UNKNOWN"; - break; - } - I_Error("Couldn't create DirectInput (reason: %s)", sErr); - } - else - CONS_Printf("\x82%s", M_GetText("Using DirectX3 interface\n")); - - // only use DirectInput3 compatible structures and calls - bDX0300 = TRUE; - } - I_AddExitFunc(I_ShutdownDirectInput); - return 0; -} - -// Closes down everything. This includes restoring the initial -// palette and video mode, and removing whatever mouse, keyboard, and -// timer routines have been installed. -// -/// \bug doesn't restore wave/midi device volume -// -// Shutdown user funcs are effectively called in reverse order. -// -void I_ShutdownSystem(void) -{ - int c; - - for (c = MAX_QUIT_FUNCS - 1; c >= 0; c--) - if (quit_funcs[c]) - (*quit_funcs[c])(); -} - -// my god how win32 suck -typedef BOOL (WINAPI *p_GetDiskFreeSpaceExA)(LPCSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER); - -void I_GetDiskFreeSpace(INT64* freespace) -{ - static p_GetDiskFreeSpaceExA pfnGetDiskFreeSpaceEx = NULL; - static boolean testwin95 = false; - ULARGE_INTEGER usedbytes, lfreespace; - - if (!testwin95) - { - pfnGetDiskFreeSpaceEx = (p_GetDiskFreeSpaceExA)(LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "GetDiskFreeSpaceExA"); - testwin95 = true; - } - if (pfnGetDiskFreeSpaceEx) - { - if (pfnGetDiskFreeSpaceEx(NULL, &lfreespace, &usedbytes, NULL)) - *freespace = lfreespace.QuadPart; - else - *freespace = INT32_MAX; - } - else - { - DWORD SectorsPerCluster, BytesPerSector, NumberOfFreeClusters, TotalNumberOfClusters; - GetDiskFreeSpace(NULL, &SectorsPerCluster, &BytesPerSector, - &NumberOfFreeClusters, &TotalNumberOfClusters); - *freespace = BytesPerSector * SectorsPerCluster * NumberOfFreeClusters; - } -} - -char *I_GetUserName(void) -{ - static char username[MAXPLAYERNAME+1]; - char *p; - DWORD i = MAXPLAYERNAME; - - if (!GetUserNameA(username, &i)) - { - p = getenv("USER"); - if (!p) - { - p = getenv("user"); - if (!p) - { - p = getenv("USERNAME"); - if (!p) - { - p = getenv("username"); - if (!p) - { - return NULL; - } - } - } - } - strlcpy(username, p, sizeof (username)); - } - - if (!strlen(username)) - return NULL; - return username; -} - -INT32 I_mkdir(const char *dirname, INT32 unixright) -{ - UNREFERENCED_PARAMETER(unixright); /// \todo should implement ntright under nt... - return CreateDirectoryA(dirname, NULL); -} - -char * I_GetEnv(const char *name) -{ - return getenv(name); -} - -INT32 I_PutEnv(char *variable) -{ - return putenv(variable); -} - -INT32 I_ClipboardCopy(const char *data, size_t size) -{ - (void)data; - (void)size; - return -1; -} - -const char *I_ClipboardPaste(void) -{ - return NULL; -} - -typedef BOOL (WINAPI *p_IsProcessorFeaturePresent) (DWORD); - -const CPUInfoFlags *I_CPUInfo(void) -{ - static CPUInfoFlags WIN_CPUInfo; - SYSTEM_INFO SI; - p_IsProcessorFeaturePresent pfnCPUID = (p_IsProcessorFeaturePresent)(LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "IsProcessorFeaturePresent"); - - ZeroMemory(&WIN_CPUInfo,sizeof (WIN_CPUInfo)); - if (pfnCPUID) - { - WIN_CPUInfo.FPPE = pfnCPUID( 0); //PF_FLOATING_POINT_PRECISION_ERRATA - WIN_CPUInfo.FPE = pfnCPUID( 1); //PF_FLOATING_POINT_EMULATED - WIN_CPUInfo.cmpxchg = pfnCPUID( 2); //PF_COMPARE_EXCHANGE_DOUBLE - WIN_CPUInfo.MMX = pfnCPUID( 3); //PF_MMX_INSTRUCTIONS_AVAILABLE - WIN_CPUInfo.PPCMM64 = pfnCPUID( 4); //PF_PPC_MOVEMEM_64BIT_OK - WIN_CPUInfo.ALPHAbyte = pfnCPUID( 5); //PF_ALPHA_BYTE_INSTRUCTIONS - WIN_CPUInfo.SSE = pfnCPUID( 6); //PF_XMMI_INSTRUCTIONS_AVAILABLE - WIN_CPUInfo.AMD3DNow = pfnCPUID( 7); //PF_3DNOW_INSTRUCTIONS_AVAILABLE - WIN_CPUInfo.RDTSC = pfnCPUID( 8); //PF_RDTSC_INSTRUCTION_AVAILABLE - WIN_CPUInfo.PAE = pfnCPUID( 9); //PF_PAE_ENABLED - WIN_CPUInfo.SSE2 = pfnCPUID(10); //PF_XMMI64_INSTRUCTIONS_AVAILABLE - //WIN_CPUInfo.blank = pfnCPUID(11); //PF_SSE_DAZ_MODE_AVAILABLE - WIN_CPUInfo.DEP = pfnCPUID(12); //PF_NX_ENABLED - WIN_CPUInfo.SSE3 = pfnCPUID(13); //PF_SSE3_INSTRUCTIONS_AVAILABLE - WIN_CPUInfo.cmpxchg16b = pfnCPUID(14); //PF_COMPARE_EXCHANGE128 - WIN_CPUInfo.cmp8xchg16 = pfnCPUID(15); //PF_COMPARE64_EXCHANGE128 - WIN_CPUInfo.PFC = pfnCPUID(16); //PF_CHANNELS_ENABLED - } - GetSystemInfo(&SI); - WIN_CPUInfo.CPUs = SI.dwNumberOfProcessors; - WIN_CPUInfo.IA64 = (SI.dwProcessorType == 2200); // PROCESSOR_INTEL_IA64 - WIN_CPUInfo.AMD64 = (SI.dwProcessorType == 8664); // PROCESSOR_AMD_X8664 - return &WIN_CPUInfo; -} - -static void CPUAffinity_OnChange(void); -static consvar_t cv_cpuaffinity = CVAR_INIT ("cpuaffinity", "-1", CV_CALL, NULL, CPUAffinity_OnChange); - -typedef HANDLE (WINAPI *p_GetCurrentProcess) (VOID); -static p_GetCurrentProcess pfnGetCurrentProcess = NULL; -typedef BOOL (WINAPI *p_GetProcessAffinityMask) (HANDLE, PDWORD_PTR, PDWORD_PTR); -static p_GetProcessAffinityMask pfnGetProcessAffinityMask = NULL; -typedef BOOL (WINAPI *p_SetProcessAffinityMask) (HANDLE, DWORD_PTR); -static p_SetProcessAffinityMask pfnSetProcessAffinityMask = NULL; - -static inline VOID GetAffinityFuncs(VOID) -{ - HMODULE h = GetModuleHandleA("kernel32.dll"); - pfnGetCurrentProcess = (p_GetCurrentProcess)(LPVOID)GetProcAddress(h, "GetCurrentProcess"); - pfnGetProcessAffinityMask = (p_GetProcessAffinityMask)(LPVOID)GetProcAddress(h, "GetProcessAffinityMask"); - pfnSetProcessAffinityMask = (p_SetProcessAffinityMask)(LPVOID)GetProcAddress(h, "SetProcessAffinityMask"); -} - -static void CPUAffinity_OnChange(void) -{ - DWORD_PTR dwProcMask, dwSysMask; - HANDLE selfpid; - - if (!pfnGetCurrentProcess || !pfnGetProcessAffinityMask || !pfnSetProcessAffinityMask) - return; - else - selfpid = pfnGetCurrentProcess(); - - pfnGetProcessAffinityMask(selfpid, &dwProcMask, &dwSysMask); - - /* If resulting mask is zero, don't change anything and fall back to - * actual mask. - */ - if(dwSysMask & cv_cpuaffinity.value) - { - pfnSetProcessAffinityMask(selfpid, dwSysMask & cv_cpuaffinity.value); - CV_StealthSetValue(&cv_cpuaffinity, (int)(dwSysMask & cv_cpuaffinity.value)); - } - else - CV_StealthSetValue(&cv_cpuaffinity, (int)dwProcMask); -} - -void I_RegisterSysCommands(void) -{ - GetAffinityFuncs(); - CV_RegisterVar(&cv_cpuaffinity); -} -#endif diff --git a/src/win32/win_vid.c b/src/win32/win_vid.c deleted file mode 100644 index 7a33e1931..000000000 --- a/src/win32/win_vid.c +++ /dev/null @@ -1,1113 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 1998-2000 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// 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. -//----------------------------------------------------------------------------- -/// \file -/// \brief win32 video driver for Doom Legacy - -#include "../doomdef.h" - -#ifdef _WINDOWS - -#include -#include - -#include "../d_clisrv.h" -#include "../i_system.h" -#include "../m_argv.h" -#include "../v_video.h" -#include "../st_stuff.h" -#include "../i_video.h" -#include "../z_zone.h" -#include "fabdxlib.h" -#include "../doomstat.h" -#include "win_main.h" -#include "../command.h" -#include "../screen.h" - -#ifdef HWRENDER -#include "win_dll.h" // loading the render DLL -#include "../hardware/hw_drv.h" // calling driver init & shutdown -#include "../hardware/hw_main.h" // calling HWR module init & shutdown -#endif - -// ------- -// Globals -// ------- - -// this is the CURRENT rendermode!! very important: used by w_wad, and much other code -rendermode_t rendermode = render_soft; -rendermode_t chosenrendermode = render_none; // set by command line arguments -static void OnTop_OnChange(void); -// synchronize page flipping with screen refresh -static CV_PossibleValue_t CV_NeverOnOff[] = {{-1, "Never"}, {0, "Off"}, {1, "On"}, {0, NULL}}; -consvar_t cv_vidwait = CVAR_INIT ("vid_wait", "On", CV_SAVE, CV_OnOff, OnTop_OnChange); -static consvar_t cv_stretch = CVAR_INIT ("stretch", "On", CV_SAVE|CV_NOSHOWHELP, CV_OnOff, NULL); -static consvar_t cv_ontop = CVAR_INIT ("ontop", "Never", 0, CV_NeverOnOff, NULL); - -boolean highcolor; - -static BOOL bDIBMode; // means we are using DIB instead of DirectDraw surfaces -static LPBITMAPINFO bmiMain = NULL; -static HDC hDCMain = NULL; - -// ----------------- -// Video modes stuff -// ----------------- - -#define MAX_EXTRA_MODES 36 -static vmode_t extra_modes[MAX_EXTRA_MODES] = {{NULL, NULL, 0, 0, 0, 0, 0, 0, NULL, NULL, 0}}; -static char names[MAX_EXTRA_MODES][10]; - -static INT32 numvidmodes; // total number of DirectDraw display modes -static vmode_t *pvidmodes; // start of videomodes list. -static vmode_t *pcurrentmode; // the current active videomode. -static BOOL bWinParm; -static INT32 WINAPI VID_SetWindowedDisplayMode(viddef_t *lvid, vmode_t *currentmode); - -// this holds description of the startup video mode, -// the resolution is 320x200, windowed on the desktop -static char winmodenames[NUMSPECIALMODES][11] = { - // W to make sure it's the windowed mode - "320x200W", - "640x400W", - "960x600W", - "1280x800W" -}; -vmode_t specialmodes[NUMSPECIALMODES] = -{ - { - NULL, - winmodenames[0], // hehe - 320, 200, //(200.0/320.0)*(320.0/240.0), - 320, 1, // rowbytes, bytes per pixel - 1, 2, // windowed (TRUE), numpages - NULL, - VID_SetWindowedDisplayMode, 0 - }, - { - NULL, - winmodenames[1], // haha - 640, 400, - 640, 1, // rowbytes, bytes per pixel - 1, 2, // windowed (TRUE), numpages - NULL, - VID_SetWindowedDisplayMode, 0 - }, - { - NULL, - winmodenames[2], // hihi? - 960, 600, - 960, 1, // rowbytes, bytes per pixel - 1, 2, // windowed (TRUE), numpages - NULL, - VID_SetWindowedDisplayMode, 0 - }, - { - NULL, - winmodenames[3], // hoho! - 1280, 800, - 1280, 1, // rowbytes, bytes per pixel - 1, 2, // windowed (TRUE), numpages - NULL, - VID_SetWindowedDisplayMode, 0 - } -}; - -// ------ -// Protos -// ------ -static void VID_Command_NumModes_f(void); -static void VID_Command_ModeInfo_f(void); -static void VID_Command_ModeList_f(void); -static void VID_Command_Mode_f(void); -static INT32 WINAPI VID_SetDirectDrawMode(viddef_t *lvid, vmode_t *currentmode); -static vmode_t *VID_GetModePtr(int modenum); -static VOID VID_Init(VOID); -static BOOL VID_FreeAndAllocVidbuffer(viddef_t *lvid); - -#if 0 - // Disable Composition in Vista DWM (Desktop Window Manager) ---------------- -static HMODULE DMdll = NULL; -typedef HRESULT (CALLBACK *P_DwmIsCompositionEnabled) (BOOL *pfEnabled); -static P_DwmIsCompositionEnabled pfnDwmIsCompositionEnabled = NULL; -typedef HRESULT (CALLBACK *P_DwmEnableComposition) (BOOL fEnable); -static P_DwmEnableComposition pfnDwmEnableComposition = NULL; -static BOOL AeroWasEnabled = FALSE; - -static inline VOID UnloadDM(VOID) -{ - pfnDwmEnableComposition = NULL; - pfnDwmIsCompositionEnabled = NULL; - if (DMdll) FreeLibrary(DMdll); - DMdll = NULL; -} - -static inline BOOL LoadDM(VOID) -{ - if (DMdll) - return TRUE; - - DMdll = LoadLibraryA("dwmapi.dll"); - if (DMdll) - I_OutputMsg("dmwapi.dll loaded, Vista's Desktop Window Manager API\n"); - else - return FALSE; - - pfnDwmIsCompositionEnabled = (P_DwmIsCompositionEnabled)GetProcAddress(DMdll, "DwmIsCompositionEnabled"); - if (pfnDwmIsCompositionEnabled) - I_OutputMsg("Composition Aero API found, DwmIsCompositionEnabled\n"); - - pfnDwmEnableComposition = (P_DwmEnableComposition)GetProcAddress(DMdll, "DwmEnableComposition"); - if (pfnDwmEnableComposition) - I_OutputMsg("Composition Aero API found, DwmEnableComposition\n"); - - return TRUE; -} - -static inline VOID DisableAero(VOID) -{ - BOOL pfnDwmEnableCompositiond = FALSE; - AeroWasEnabled = FALSE; - - if (!LoadDM()) - return; - - if (pfnDwmIsCompositionEnabled && SUCCEEDED(pfnDwmIsCompositionEnabled(&pfnDwmEnableCompositiond))) - I_OutputMsg("Got the result of DwmIsCompositionEnabled, %i\n", pfnDwmEnableCompositiond); - else - return; - - if ((AeroWasEnabled = pfnDwmEnableCompositiond)) - I_OutputMsg("Disable the Aero rendering\n"); - else - return; - - if (pfnDwmEnableComposition && SUCCEEDED(pfnDwmEnableComposition(FALSE))) - I_OutputMsg("Aero rendering disabled\n"); - else - I_OutputMsg("We failed to disable the Aero rendering\n"); -} - -static inline VOID ResetAero(VOID) -{ - if (pfnDwmEnableComposition && AeroWasEnabled) - { - if (SUCCEEDED(pfnDwmEnableComposition(AeroWasEnabled))) - I_OutputMsg("Aero rendering setting restored\n"); - else - I_OutputMsg("We failed to restore Aero rendering\n"); - } - UnloadDM(); -} -#endif - -// ----------------- -// I_StartupGraphics -// Initialize video mode, setup dynamic screen size variables, -// and allocate screens. -// ----------------- -void I_StartupGraphics(void) -{ - if (graphics_started) - return; - -#ifdef HWRENDER - else if (M_CheckParm("-opengl")) - rendermode = render_opengl; - else -#endif - rendermode = render_soft; - - if (dedicated) - rendermode = render_none; - else - VID_Init(); - - // register exit code for graphics - I_AddExitFunc(I_ShutdownGraphics); - if (!dedicated) graphics_started = true; -} - -void VID_StartupOpenGL(void){} - -// ------------------ -// I_ShutdownGraphics -// Close the screen, restore previous video mode. -// ------------------ -void I_ShutdownGraphics(void) -{ -#ifdef HWRENDER - const rendermode_t oldrendermode = rendermode; -#endif - -// This is BAD because it makes the I_Error box screw up! -// rendermode = render_none; - - if (!graphics_started) - return; - - CONS_Printf("I_ShutdownGraphics: "); - - //FreeConsole(); - - //ResetAero(); - - // release windowed startup stuff - if (hDCMain) - { - ReleaseDC(hWndMain, hDCMain); - hDCMain = NULL; - } - if (bmiMain) - { - GlobalFree(bmiMain); - bmiMain = NULL; - } - -#ifdef HWRENDER - if (oldrendermode != render_soft) - { - HWR_Shutdown(); // free stuff from the hardware renderer - HWD.pfnShutdown(); // close 3d card display - Shutdown3DDriver(); // free the driver DLL - } -#endif - - // free the last video mode screen buffers - if (vid.buffer) - { - GlobalFree(vid.buffer); - vid.buffer = NULL; - } - -#ifdef HWRENDER - if (rendermode == render_soft) -#endif - CloseDirectDraw(); - - graphics_started = false; -} - -// -------------- -// I_UpdateNoBlit -// -------------- -void I_UpdateNoBlit(void) -{ - // what is this? -} - -// I_SkipFrame -// -// Returns true if it thinks we can afford to skip this frame -// from PrBoom's src/SDL/i_video.c -static inline boolean I_SkipFrame(void) -{ - static boolean skip = false; - - if (render_soft != rendermode) - return false; - - skip = !skip; - switch (gamestate) - { - case GS_LEVEL: - if (!paused) - return false; - //case GS_TIMEATTACK: -- sorry optimisation but now we have a cool level platter and that being laggardly looks terrible -#ifndef NONET - /* FALLTHRU */ - case GS_WAITINGPLAYERS: -#endif - return skip; // Skip odd frames - default: - return false; - } -} - -static void OnTop_OnChange(void) -{ - const UINT uFlags = SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER; - RECT bounds; - int x = 0, y = 0, w = 0, h = 0; - - if (!hWndMain || bAppFullScreen || cv_ontop.value == -1) - return; - - GetWindowRect(hWndMain, &bounds); - AdjustWindowRectEx(&bounds, GetWindowLong(hWndMain, GWL_STYLE), 0, 0); - w = bounds.right - (x = bounds.left); h = bounds.bottom - (y = bounds.top); - - if (cv_ontop.value && !paused) - SetWindowPos(hWndMain, HWND_TOP , x, y, w, h, uFlags); - else - SetWindowPos(hWndMain, HWND_NOTOPMOST, x, y, w, h, uFlags); -} - -// -------------- -// I_FinishUpdate -// -------------- -void I_FinishUpdate(void) -{ - if (rendermode == render_none) - return; - - if (I_SkipFrame()) - return; - - if (marathonmode) - SCR_DisplayMarathonInfo(); - - // draw captions if enabled - if (cv_closedcaptioning.value) - SCR_ClosedCaptions(); - - // display a graph of ticrate - if (cv_ticrate.value) - SCR_DisplayTicRate(); - - if (cv_showping.value && netgame && consoleplayer != serverplayer) - SCR_DisplayLocalPing(); - - // - if (bDIBMode) - { - // paranoia - if (!hDCMain || !bmiMain || !vid.buffer) - return; - // main game loop, still in a window (-win parm) - SetDIBitsToDevice(hDCMain, 0, 0, vid.width, vid.height, 0, 0, 0, vid.height, vid.buffer, bmiMain, - DIB_RGB_COLORS); - } - else -#ifdef HWRENDER - if (rendermode != render_soft) - HWD.pfnFinishUpdate(cv_vidwait.value); - else -#endif - { - // DIRECT DRAW - // copy virtual screen to real screen - // can fail when not active (alt-tab) - if (LockScreen()) - { - /// \todo use directX blit here!!? a blit might use hardware with access - /// to main memory on recent hardware, and software blit of directX may be - /// optimized for p2 or mmx?? - if (ScreenHeight > vid.height) - { - UINT8 *ptr = (UINT8 *)ScreenPtr; - size_t half_excess = ScreenPitch*(ScreenHeight-vid.height)/2; - memset(ptr, 0x1F, half_excess); - ptr += half_excess; - VID_BlitLinearScreen(screens[0], ptr, vid.width*vid.bpp, vid.height, - vid.width*vid.bpp, ScreenPitch); - ptr += vid.height*ScreenPitch; - memset(ptr, 0x1F, half_excess); - } - else - VID_BlitLinearScreen(screens[0], (UINT8 *)ScreenPtr, vid.width*vid.bpp, vid.height, - vid.width*vid.bpp, ScreenPitch); - - UnlockScreen(); - - // swap screens - ScreenFlip(cv_vidwait.value); - } - } -} - -// --------------- -// I_UpdateNoVsync -// --------------- -void I_UpdateNoVsync(void) -{ - int real_vidwait = cv_vidwait.value; - cv_vidwait.value = 0; - I_FinishUpdate(); - cv_vidwait.value = real_vidwait; -} - -// -// This is meant to be called only by CONS_Printf() while game startup -// -void I_LoadingScreen(LPCSTR msg) -{ - RECT rect; - - // paranoia - if (!hDCMain || !bmiMain || !vid.buffer) - return; - - GetClientRect(vid.WndParent, &rect); - - SetDIBitsToDevice(hDCMain, 0, 0, vid.width, vid.height, 0, 0, 0, vid.height, vid.buffer, bmiMain, DIB_RGB_COLORS); - - if (msg) - { - if (rect.bottom - rect.top > 32) - rect.top = rect.bottom - 32; // put msg on bottom of window - SetBkMode(hDCMain, TRANSPARENT); - SetTextColor(hDCMain, RGB(0x00, 0x00, 0x00)); - DrawTextA(hDCMain, msg, -1, &rect, DT_WORDBREAK|DT_CENTER); - } -} - -// ------------ -// I_ReadScreen -// ------------ -void I_ReadScreen(UINT8 *scr) -{ - // DEBUGGING - if (rendermode != render_soft) - I_Error("I_ReadScreen: called while in non-software mode"); - VID_BlitLinearScreen(screens[0], scr, vid.width*vid.bpp, vid.height, vid.width*vid.bpp, - vid.rowbytes); -} - -// ------------ -// I_SetPalette -// ------------ -void I_SetPalette(RGBA_t *palette) -{ - int i; - - if (bDIBMode) - { - // set palette in RGBQUAD format, NOT THE SAME ORDER as PALETTEENTRY, grmpf! - RGBQUAD *pColors; - pColors = (RGBQUAD *)((LPBYTE)bmiMain + bmiMain->bmiHeader.biSize); - ZeroMemory(pColors, sizeof (RGBQUAD)*256); - for (i = 0; i < 256; i++, pColors++, palette++) - { - pColors->rgbRed = palette->s.red; - pColors->rgbGreen = palette->s.green; - pColors->rgbBlue = palette->s.blue; - } - } - else -#ifdef HWRENDER - if (rendermode == render_soft) -#endif - { - PALETTEENTRY mainpal[256]; - - // this clears the 'flag' for each color in palette - ZeroMemory(mainpal, sizeof mainpal); - - // set palette in PALETTEENTRY format - for (i = 0; i < 256; i++, palette++) - { - mainpal[i].peRed = palette->s.red; - mainpal[i].peGreen = palette->s.green; - mainpal[i].peBlue = palette->s.blue; - } - SetDDPalette(mainpal); // set DirectDraw palette - } -} - -// -// return number of video modes in pvidmodes list -// MODES ARE ZERO INDEXED. DO NOT USE (n > nummodes). USE >= INSTEAD. -// -INT32 VID_NumModes(void) -{ - return numvidmodes; -} - -// return a video mode number from the dimensions -// returns any available video mode if the mode was not found -INT32 VID_GetModeForSize(INT32 w, INT32 h) -{ - vmode_t *pv = pvidmodes; - int modenum = 0; - - // Fullscreen resolutions exist - if (numvidmodes > NUMSPECIALMODES) - { - // skip the special modes so that it finds only fullscreen modes - for (; pv && modenum < NUMSPECIALMODES; pv = pv->pnext, ++modenum); - for (; pv; pv = pv->pnext, ++modenum) - if (pv->width == (unsigned)w && pv->height == (unsigned)h) - return modenum; - - // Try default video mode first - if (w != cv_scr_width.value || h != cv_scr_height.value) - return VID_GetModeForSize(cv_scr_width.value, cv_scr_height.value); - - // didn't find, return first fullscreen mode - return NUMSPECIALMODES; - } - - // rely only on special (windowed) modes - for (; pv && modenum < NUMSPECIALMODES; pv = pv->pnext, ++modenum) - if (pv->width == (unsigned)w && pv->height == (unsigned)h) - return modenum; - - // Try default video mode first - if (w != cv_scr_width.value || h != cv_scr_height.value) - return VID_GetModeForSize(cv_scr_width.value, cv_scr_height.value); - - // didn't find, return first windowed mode - return 0; -} - -// -// Enumerate DirectDraw modes available -// -static int nummodes = 0; -static BOOL GetExtraModesCallback(int width, int height, int bpp) -{ -#ifdef _DEBUG - CONS_Printf("mode %d x %d x %d bpp\n", width, height, bpp); -#endif - - // skip all unwanted modes - if (highcolor && bpp != 15) - goto skip; - if (!highcolor && bpp != 8) - goto skip; - - if (bpp > 16 || width > MAXVIDWIDTH || height > MAXVIDHEIGHT) - goto skip; - - // check if we have space for this mode - if (nummodes >= MAX_EXTRA_MODES) - { -#ifdef _DEBUG - CONS_Printf("mode skipped (too many)\n"); -#endif - return FALSE; - } - - // store mode info - extra_modes[nummodes].pnext = &extra_modes[nummodes+1]; - memset(names[nummodes], 0, 10); - snprintf(names[nummodes], 9, "%dx%d", width, height); - - extra_modes[nummodes].name = names[nummodes]; - extra_modes[nummodes].width = width; - extra_modes[nummodes].height = height; - - // exactly, the current FinishUdpate() gets the rowbytes itself after locking the video buffer - // so for now we put anything here - extra_modes[nummodes].rowbytes = width; - extra_modes[nummodes].windowed = false; - extra_modes[nummodes].misc = 0; // unused - extra_modes[nummodes].pextradata = NULL; - extra_modes[nummodes].setmode = VID_SetDirectDrawMode; - - extra_modes[nummodes].numpages = 3; // triple-buffer (but this value is unused) - - extra_modes[nummodes].bytesperpixel = (bpp+1)>>3; - - nummodes++; -skip: - return TRUE; -} - -// -// Collect info about DirectDraw display modes we use -// -static inline VOID VID_GetExtraModes(VOID) -{ - nummodes = 0; - EnumDirectDrawDisplayModes(GetExtraModesCallback); - - // add the extra modes (not 320x200) at the start of the mode list (if there are any) - if (nummodes) - { - extra_modes[nummodes-1].pnext = NULL; - pvidmodes = &extra_modes[0]; - numvidmodes += nummodes; - } -} - -// --------------- -// WindowMode_Init -// Add windowed modes to the start of the list, -// mode 0 is used for windowed console startup (works on all computers with no DirectX) -// --------------- -static VOID WindowMode_Init(VOID) -{ - int modenum; - - for (modenum = 0; modenum < NUMSPECIALMODES - 1; modenum++) - specialmodes[modenum].pnext = &specialmodes[modenum + 1]; - specialmodes[NUMSPECIALMODES-1].pnext = pvidmodes; - - pvidmodes = specialmodes; - numvidmodes += NUMSPECIALMODES; -} - -// ************************************************************************************* -// VID_Init -// Initialize Video modes subsystem -// ************************************************************************************* -static VOID VID_Init(VOID) -{ -#ifdef _DEBUG - vmode_t *pv; - int iMode; -#endif - - // if '-win' is specified on the command line, do not add DirectDraw modes - bWinParm = M_CheckParm("-win"); - - COM_AddCommand("vid_nummodes", VID_Command_NumModes_f); - COM_AddCommand("vid_modeinfo", VID_Command_ModeInfo_f); - COM_AddCommand("vid_modelist", VID_Command_ModeList_f); - COM_AddCommand("vid_mode", VID_Command_Mode_f); - - CV_RegisterVar(&cv_vidwait); - CV_RegisterVar(&cv_stretch); - CV_RegisterVar(&cv_ontop); - - // setup the videmodes list, - // note that mode 0 must always be VGA mode 0x13 - pvidmodes = pcurrentmode = NULL; - numvidmodes = 0; - - //DisableAero(); - - // store the main window handle in viddef struct - SetWindowPos(hWndMain, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOSENDCHANGING|SWP_NOSIZE|SWP_NOMOVE); - vid.WndParent = hWndMain; - vid.buffer = NULL; - - // we startup in windowed mode using DIB bitmap - // we will use DirectDraw when switching fullScreen and entering main game loop - bDIBMode = TRUE; - bAppFullScreen = FALSE; - -#ifdef HWRENDER - // initialize the appropriate display device - if (rendermode != render_soft) - { - const char *drvname = NULL; - - switch (rendermode) - { - case render_opengl: - drvname = "r_opengl.dll"; - break; - default: - I_Error("Unknown hardware render mode"); - } - - // load the DLL - if (drvname && Init3DDriver(drvname)) - { - int hwdversion = HWD.pfnGetRenderVersion(); - if (hwdversion != VERSION) - CONS_Alert(CONS_WARNING, M_GetText("This r_opengl version is not supported, use it at your own risk!\n")); - - // perform initialisations - HWD.pfnInit(I_Error); - // get available display modes for the device - HWD.pfnGetModeList(&pvidmodes, &numvidmodes); - } - else - { - switch (rendermode) - { - case render_opengl: - I_Error("Error initializing OpenGL"); - default: - break; - } - rendermode = render_soft; - } - } - - if (rendermode == render_soft) -#endif - if (!bWinParm) - { - if (!CreateDirectDrawInstance()) - bWinParm = TRUE; - else // get available display modes for the device - VID_GetExtraModes(); - } - - // the game boots in 320x200 standard VGA, but - // we need a highcolor mode to run the game in highcolor - if (highcolor && !numvidmodes) - I_Error("Cannot run in highcolor - No 15bit highcolor DirectX video mode found."); - - // add windowed mode at the start of the list, very important! - WindowMode_Init(); - - if (!numvidmodes) - I_Error("No display modes available."); - -#ifdef _DEBUG // DEBUG - for (iMode = 0, pv = pvidmodes; pv; pv = pv->pnext, iMode++) - I_OutputMsg("#%02d: %dx%dx%dbpp (desc: '%s')\n", iMode, pv->width, pv->height, pv->bytesperpixel, pv->name); -#endif - - // set the startup screen in a window - VID_SetMode(0); -} - -// -------------------------- -// VID_SetWindowedDisplayMode -// Display the startup 320x200 console screen into a window on the desktop, -// switching to fullscreen display only when we will enter the main game loop. -// - we can display error message boxes for startup errors -// - we can set the last used resolution only once, when entering the main game loop -// -------------------------- -static INT32 WINAPI VID_SetWindowedDisplayMode(viddef_t *lvid, vmode_t *currentmode) -{ - RECT bounds; - int x = 0, y = 0, w = 0, h = 0; - - UNREFERENCED_PARAMETER(currentmode); - - I_OutputMsg("VID_SetWindowedDisplayMode()\n"); - - - lvid->u.numpages = 1; // not used - lvid->direct = NULL; // DOS remains - lvid->buffer = NULL; - - // allocate screens - if (!VID_FreeAndAllocVidbuffer(lvid)) - return -1; - - // lvid->buffer should be NULL here! - - bmiMain = GlobalAlloc(GPTR, sizeof (BITMAPINFO) + (sizeof (RGBQUAD)*256)); - if (!bmiMain) - I_Error("VID_SWDM(): No mem"); - - // setup a BITMAPINFO to allow copying our video buffer to the desktop, - // with color conversion as needed - bmiMain->bmiHeader.biSize = sizeof (BITMAPINFOHEADER); - bmiMain->bmiHeader.biWidth = lvid->width; - bmiMain->bmiHeader.biHeight= -(lvid->height); - bmiMain->bmiHeader.biPlanes = 1; - bmiMain->bmiHeader.biBitCount = 8; - bmiMain->bmiHeader.biCompression = BI_RGB; - - // center window on the desktop - bounds.left = 0; - bounds.right = lvid->width; - bounds.top = 0; - bounds.bottom = lvid->height; - AdjustWindowRectEx(&bounds, GetWindowLong(hWndMain, GWL_STYLE), FALSE, GetWindowLong(hWndMain, GWL_EXSTYLE)); - - w = bounds.right-bounds.left; - h = bounds.bottom-bounds.top; - x = (GetSystemMetrics(SM_CXSCREEN)-w)/2; - y = (GetSystemMetrics(SM_CYSCREEN)-h)/2; - - if (devparm) - MoveWindow(hWndMain, x<<1, y<<1, w, h, TRUE); - else - MoveWindow(hWndMain, x, y, w, h, TRUE); - - SetFocus(hWndMain); - ShowWindow(hWndMain, SW_SHOW); - - hDCMain = GetDC(hWndMain); - if (!hDCMain) - I_Error("VID_SWDM(): GetDC FAILED"); - - return 1; -} - -// ======================================================================== -// Returns a vmode_t from the video modes list, given a video mode number. -// ======================================================================== -vmode_t *VID_GetModePtr(int modenum) -{ - vmode_t *pv; - - pv = pvidmodes; - if (!pv) - I_Error("VID_error: No video mode found\n"); - - while (modenum--) - { - pv = pv->pnext; - if (!pv) - I_Error("VID_error: Mode not available\n"); - } - return pv; -} - -// -// return the name of a video mode -// -const char *VID_GetModeName(INT32 modenum) -{ - return (VID_GetModePtr(modenum))->name; -} - -// ======================================================================== -// Sets a video mode -// ======================================================================== -INT32 VID_SetMode(INT32 modenum) -{ - int vstat; - vmode_t *pnewmode; - - if (dedicated) - return 0; - - I_OutputMsg("VID_SetMode(%d)\n", modenum); - - // if mode 0 (windowed) we must not be fullscreen already, - // if other mode, check it is not mode 0 and existing - if (modenum >= numvidmodes) - { - if (!pcurrentmode) - modenum = 0; // revert to the default base vid mode - else - I_Error("Unknown video mode: %d\n", modenum); - } - else if (bAppFullScreen && modenum < NUMSPECIALMODES) - I_Error("Tried to switch from fullscreen back to windowed mode %d\n", modenum); - - pnewmode = VID_GetModePtr(modenum); - - // dont switch to the same display mode - if (pnewmode == pcurrentmode) - return 1; - - // initialize the new mode - pcurrentmode = pnewmode; - - // initialize vidbuffer size for setmode - vid.width = pcurrentmode->width; - vid.height = pcurrentmode->height; - vid.rowbytes = pcurrentmode->rowbytes; - vid.bpp = pcurrentmode->bytesperpixel; - if (modenum) // if not 320x200 windowed mode, it's actually a hack - { - if (rendermode == render_opengl) - { - // don't accept depth < 16 for OpenGL mode (too much ugly) - if (cv_scr_depth.value < 16) - CV_SetValue(&cv_scr_depth, 16); - vid.bpp = cv_scr_depth.value/8; - vid.u.windowed = (bWinParm || !cv_fullscreen.value); - pcurrentmode->bytesperpixel = vid.bpp; - pcurrentmode->windowed = vid.u.windowed; - } - } - - vstat = (*pcurrentmode->setmode)(&vid, pcurrentmode); - - if (vstat == -1) - I_Error("Not enough mem for VID_SetMode\n"); - else if (vstat == -2) - I_Error("Couldn't set video mode because it failed the test\n"); - else if (vstat == -3) - I_Error("Couldn't set video mode because it failed the change?\n"); - else if (!vstat) - I_Error("Couldn't set video mode %d (%dx%d %d bits)\n", modenum, vid.width, vid.height, (vid.bpp*8));// hardware could not setup mode - else - CONS_Printf(M_GetText("Mode changed to %d (%s)\n"), modenum, pcurrentmode->name); - - vid.modenum = modenum; - - // tell game engine to recalc all tables and realloc buffers based on new values - vid.recalc = 1; - - if (modenum < NUMSPECIALMODES) - { - // we are in startup windowed mode - bAppFullScreen = FALSE; - bDIBMode = TRUE; - } - else - { - // we switch to fullscreen - bAppFullScreen = TRUE; - bDIBMode = FALSE; -#ifdef HWRENDER - if (rendermode != render_soft) - { - // purge all patch graphics stored in software format - //Z_FreeTags (PU_PURGELEVEL, PU_PURGELEVEL+100); - HWR_Startup(); - } -#endif - } - - I_RestartSysMouse(); - return 1; -} - -boolean VID_CheckRenderer(void) -{ - return false; -} - -void VID_CheckGLLoaded(rendermode_t oldrender) -{ - (void)oldrender; -} - -// ======================================================================== -// Free the video buffer of the last video mode, -// allocate a new buffer for the video mode to set. -// ======================================================================== -static BOOL VID_FreeAndAllocVidbuffer(viddef_t *lvid) -{ - const DWORD vidbuffersize = (lvid->width * lvid->height * lvid->bpp * NUMSCREENS); - - // free allocated buffer for previous video mode - if (lvid->buffer) - GlobalFree(lvid->buffer); - - // allocate & clear the new screen buffer - lvid->buffer = GlobalAlloc(GPTR, vidbuffersize); - if (!lvid->buffer) - return FALSE; - - ZeroMemory(lvid->buffer, vidbuffersize); - I_OutputMsg("VID_FreeAndAllocVidbuffer done, vidbuffersize: %x\n",(UINT32)vidbuffersize); - - return TRUE; -} - -// ======================================================================== -// Set video mode routine for DirectDraw display modes -// Out: 1 ok, -// 0 hardware could not set mode, -// -1 no mem -// ======================================================================== -static INT32 WINAPI VID_SetDirectDrawMode(viddef_t *lvid, vmode_t *currentmode) -{ - UNREFERENCED_PARAMETER(currentmode); - - I_OutputMsg("VID_SetDirectDrawMode...\n"); - - - // DD modes do double-buffer page flipping, but the game engine doesn't need this.. - lvid->u.numpages = 2; - - // release ddraw surfaces etc.. - ReleaseChtuff(); - - // clean up any old vid buffer lying around, alloc new if needed - if (!VID_FreeAndAllocVidbuffer(lvid)) - return -1; // no mem - - // should clear video mem here - - // note use lvid->bpp instead of 8...will this be needed? will we support other than 256color - // in software ? - if (!InitDirectDrawe(hWndMain, lvid->width, lvid->height, 8, TRUE)) // TRUE currently always full screen - return 0; // could not set mode - - // this is NOT used with DirectDraw modes, game engine should never use this directly - // but rather render to memory bitmap buffer - lvid->direct = NULL; - - if (!cv_stretch.value && fabsf((float)vid.width/vid.height - ((float)BASEVIDWIDTH/BASEVIDHEIGHT)) > 1.0E-36f) - vid.height = (int)(vid.width * ((float)BASEVIDHEIGHT/BASEVIDWIDTH));// Adjust the height to match - - return 1; -} - -// ======================================================================== -// VIDEO MODE CONSOLE COMMANDS -// ======================================================================== - -// vid_nummodes -// -static void VID_Command_NumModes_f(void) -{ - CONS_Printf(M_GetText("%d video mode(s) available(s)\n"), VID_NumModes()); -} - -// vid_modeinfo -// -static void VID_Command_ModeInfo_f(void) -{ - vmode_t *pv; - int modenum; - - if (COM_Argc() != 2) - modenum = vid.modenum; // describe the current mode - else - modenum = atoi(COM_Argv(1)); // the given mode number - - if (modenum >= VID_NumModes() - || (!bWinParm && modenum < NUMSPECIALMODES)) // don't accept the windowed modes - { - CONS_Printf(M_GetText("Video mode not present\n")); - return; - } - - pv = VID_GetModePtr(modenum); - - CONS_Printf("\x82" "%s\n", VID_GetModeName(modenum)); - CONS_Printf(M_GetText("width: %d\nheight: %d\n"), - pv->width, pv->height); - if (rendermode == render_soft) - CONS_Printf(M_GetText("bytes per scanline: %d\nbytes per pixel: %d\nnumpages: %d\n"), - pv->rowbytes, pv->bytesperpixel, pv->numpages); -} - -// vid_modelist -// -static void VID_Command_ModeList_f(void) -{ - int i, numodes; - const char *pinfo; - vmode_t *pv; - - numodes = VID_NumModes(); - - // hide windowed modes unless using them - i = (!bWinParm) ? NUMSPECIALMODES : 0; - - for (; i < numodes; i++) - { - pv = VID_GetModePtr(i); - pinfo = VID_GetModeName(i); - - if (pv->bytesperpixel == 1) - CONS_Printf("%d: %s\n", i, pinfo); - else - CONS_Printf("%d: %s (hicolor)\n", i, pinfo); - } -} - -// vid_mode -// -static void VID_Command_Mode_f(void) -{ - int modenum; - - if (COM_Argc() != 2) - { - CONS_Printf(M_GetText("vid_mode : set video mode, current video mode %i\n"), vid.modenum); - return; - } - - modenum = atoi(COM_Argv(1)); - - if (modenum >= VID_NumModes() - || (!bWinParm && modenum < NUMSPECIALMODES)) // don't accept the windowed modes - CONS_Printf(M_GetText("Video mode not present\n")); - else - setmodeneeded = modenum + 1; // request vid mode change -} -#endif From 2ff303574681ecf9aa2b385e2773b474fb24aec8 Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sun, 17 Jul 2022 19:37:46 -0500 Subject: [PATCH 368/377] Remove SRB2 Music Player This thing is ancient history and also depends on FMOD. --- tools/SRB2MP/Makefile | 44 ---- tools/SRB2MP/SRB2MP.c | 464 -------------------------------------- tools/SRB2MP/SRB2MP.dsp | 148 ------------ tools/SRB2MP/SRB2MP.dsw | 29 --- tools/SRB2MP/Script1.aps | Bin 35604 -> 0 bytes tools/SRB2MP/Script1.rc | 118 ---------- tools/SRB2MP/StdAfx.c | 8 - tools/SRB2MP/StdAfx.h | 35 --- tools/SRB2MP/icon1.ico | Bin 2998 -> 0 bytes tools/SRB2MP/lump.c | 471 --------------------------------------- tools/SRB2MP/lump.h | 61 ----- tools/SRB2MP/resource.h | 26 --- 12 files changed, 1404 deletions(-) delete mode 100644 tools/SRB2MP/Makefile delete mode 100644 tools/SRB2MP/SRB2MP.c delete mode 100644 tools/SRB2MP/SRB2MP.dsp delete mode 100644 tools/SRB2MP/SRB2MP.dsw delete mode 100644 tools/SRB2MP/Script1.aps delete mode 100644 tools/SRB2MP/Script1.rc delete mode 100644 tools/SRB2MP/StdAfx.c delete mode 100644 tools/SRB2MP/StdAfx.h delete mode 100644 tools/SRB2MP/icon1.ico delete mode 100644 tools/SRB2MP/lump.c delete mode 100644 tools/SRB2MP/lump.h delete mode 100644 tools/SRB2MP/resource.h diff --git a/tools/SRB2MP/Makefile b/tools/SRB2MP/Makefile deleted file mode 100644 index 92e112d7a..000000000 --- a/tools/SRB2MP/Makefile +++ /dev/null @@ -1,44 +0,0 @@ -# Makfile of SRB2MP - -CFLAGS +=-Wall -mms-bitfields -fno-exceptions -LDFLAGS +=-mwindows -lfmod -WINDRESFLAGS= - -SRC=lump.c SRB2MP.c - -ifdef DEBUGMODE -CFLAGS +=-g -D_DEBUG -LDFLAGS +=-g -else -CFLAGS :=-Os -s $(CFLAGS) -LDFLAGS :=-s $(LDFLAGS) -endif - -OBJ=$(SRC:.c=.o) # replaces the .c from SRC with .o -EXTRAOBJ=Script1.res -EXE=SRB2MP.exe - -ifdef PREFIX -CC=$(PREFIX)-gcc -WINDRES ?=$(PREFIX)-windres -endif - -WINDRES ?=windres - -RM=rm - -%.o: %.c StdAfx.h lump.h resource.h - $(CC) $(CFLAGS) -o $@ -c $< - -%.res: %.rc resource.h - $(WINDRES) -i $< -O rc $(WINDRESFLAGS) -o $@ -O coff - -.PHONY : all # .PHONY ignores files named all -all: $(EXE) # all is dependent on $(EXE) to be complete - -$(EXE): $(OBJ) $(EXTRAOBJ) # $(EXE) is dependent on all of the files in $(OBJ) to exist - $(CC) $(OBJ) $(EXTRAOBJ) $(LDFLAGS) -o $@ - -.PHONY : clean # .PHONY ignores files named clean -clean: - -$(RM) $(OBJ) $(EXTRAOBJ) diff --git a/tools/SRB2MP/SRB2MP.c b/tools/SRB2MP/SRB2MP.c deleted file mode 100644 index 69cc21040..000000000 --- a/tools/SRB2MP/SRB2MP.c +++ /dev/null @@ -1,464 +0,0 @@ -// SRB2MP.cpp : Defines the entry point for the application. -// - -#include "StdAfx.h" -#include "lump.h" - -#define APPTITLE "SRB2 Music Player" -#define APPVERSION "v0.1" -#define APPAUTHOR "SSNTails" -#define APPCOMPANY "Sonic Team Junior" - -static FSOUND_STREAM *fmus = NULL; -static int fsoundchannel = -1; -static FMUSIC_MODULE *mod = NULL; -static struct wadfile* wfptr = NULL; - -static inline VOID M_SetVolume(int volume) -{ - if (mod && FMUSIC_GetType(mod) != FMUSIC_TYPE_NONE) - FMUSIC_SetMasterVolume(mod, volume); - if (fsoundchannel != -1) - FSOUND_SetVolume(fsoundchannel, volume); -} - -static inline BOOL M_InitMusic(VOID) -{ - if (FSOUND_GetVersion() < FMOD_VERSION) - { - printf("Error : You are using the wrong DLL version!\nYou should be using FMOD %.02f\n", FMOD_VERSION); - return FALSE; - } - -#ifdef _DEBUG - FSOUND_SetOutput(FSOUND_OUTPUT_WINMM); -#endif - - if (!FSOUND_Init(44100, 1, FSOUND_INIT_GLOBALFOCUS)) - { - printf("%s\n", FMOD_ErrorString(FSOUND_GetError())); - return FALSE; - } - return TRUE; -} - -static inline VOID M_FreeMusic(VOID) -{ - if (mod) - { - FMUSIC_StopSong(mod); - FMUSIC_FreeSong(mod); - mod = NULL; - } - if (fmus) - { - FSOUND_Stream_Stop(fmus); - FSOUND_Stream_Close(fmus); - fmus = NULL; - fsoundchannel = -1; - } -} - -static inline VOID M_ShutdownMusic(VOID) -{ - M_FreeMusic(); - FSOUND_Close(); - //remove(musicfile); // Delete the temp file -} - -static inline VOID M_PauseMusic(VOID) -{ - if (mod && !FMUSIC_GetPaused(mod)) - FMUSIC_SetPaused(mod, TRUE); - if (fsoundchannel != -1 && FSOUND_IsPlaying(fsoundchannel)) - FSOUND_SetPaused(fsoundchannel, TRUE); -} - -static inline VOID M_ResumeMusic(VOID) -{ - if (mod && FMUSIC_GetPaused(mod)) - FMUSIC_SetPaused(mod, FALSE); - if (fsoundchannel != -1 && FSOUND_GetPaused(fsoundchannel)) - FSOUND_SetPaused(fsoundchannel, FALSE); -} - -static inline VOID M_StopMusic(VOID) -{ - if (mod) - FMUSIC_StopSong(mod); - if (fsoundchannel != -1 && fmus && FSOUND_IsPlaying(fsoundchannel)) - FSOUND_Stream_Stop(fmus); -} - -static inline VOID M_StartFMODSong(LPVOID data, int len, int looping, HWND hDlg) -{ - const int loops = FSOUND_LOOP_NORMAL|FSOUND_LOADMEMORY; - const int nloop = FSOUND_LOADMEMORY; - M_FreeMusic(); - - if (looping) - mod = FMUSIC_LoadSongEx(data, 0, len, loops, NULL, 0); - else - mod = FMUSIC_LoadSongEx(data, 0, len, nloop, NULL, 0); - - if (mod) - { - FMUSIC_SetLooping(mod, (signed char)looping); - FMUSIC_SetPanSeperation(mod, 0.0f); - } - else - { - if (looping) - fmus = FSOUND_Stream_Open(data, loops, 0, len); - else - fmus = FSOUND_Stream_Open(data, nloop, 0, len); - } - - if (!fmus && !mod) - { - MessageBoxA(hDlg, FMOD_ErrorString(FSOUND_GetError()), "Error", MB_OK|MB_APPLMODAL); - return; - } - - // Scan the OGG for the COMMENT= field for a custom loop point - if (looping && fmus) - { - const BYTE *origpos, *dataum = data; - size_t scan, size = len; - - CHAR buffer[512]; - BOOL titlefound = FALSE, artistfound = FALSE; - - unsigned int loopstart = 0; - - origpos = dataum; - - for(scan = 0; scan < size; scan++) - { - if (!titlefound) - { - if (*dataum++ == 'T') - if (*dataum++ == 'I') - if (*dataum++ == 'T') - if (*dataum++ == 'L') - if (*dataum++ == 'E') - if (*dataum++ == '=') - { - size_t titlecount = 0; - CHAR title[256]; - BYTE length = *(dataum-10) - 6; - - while(titlecount < length) - title[titlecount++] = *dataum++; - - title[titlecount] = '\0'; - - sprintf(buffer, "Title: %s", title); - - SendMessage(GetDlgItem(hDlg, IDC_TITLE), WM_SETTEXT, 0, (LPARAM)(LPCSTR)buffer); - - titlefound = TRUE; - } - } - } - - dataum = origpos; - - for(scan = 0; scan < size; scan++) - { - if (!artistfound) - { - if (*dataum++ == 'A') - if (*dataum++ == 'R') - if (*dataum++ == 'T') - if (*dataum++ == 'I') - if (*dataum++ == 'S') - if (*dataum++ == 'T') - if (*dataum++ == '=') - { - size_t artistcount = 0; - CHAR artist[256]; - BYTE length = *(dataum-11) - 7; - - while(artistcount < length) - artist[artistcount++] = *dataum++; - - artist[artistcount] = '\0'; - - sprintf(buffer, "By: %s", artist); - - SendMessage(GetDlgItem(hDlg, IDC_ARTIST), WM_SETTEXT, 0, (LPARAM)(LPCSTR)buffer); - - artistfound = TRUE; - } - } - } - - dataum = origpos; - - for(scan = 0; scan < size; scan++) - { - if (*dataum++ == 'C'){ - if (*dataum++ == 'O'){ - if (*dataum++ == 'M'){ - if (*dataum++ == 'M'){ - if (*dataum++ == 'E'){ - if (*dataum++ == 'N'){ - if (*dataum++ == 'T'){ - if (*dataum++ == '='){ - if (*dataum++ == 'L'){ - if (*dataum++ == 'O'){ - if (*dataum++ == 'O'){ - if (*dataum++ == 'P'){ - if (*dataum++ == 'P'){ - if (*dataum++ == 'O'){ - if (*dataum++ == 'I'){ - if (*dataum++ == 'N'){ - if (*dataum++ == 'T'){ - if (*dataum++ == '=') - { - size_t newcount = 0; - CHAR looplength[64]; - while (*dataum != 1 && newcount < 63) - { - looplength[newcount++] = *dataum++; - } - - looplength[newcount] = '\n'; - - loopstart = atoi(looplength); - } - else - dataum--;} - else - dataum--;} - else - dataum--;} - else - dataum--;} - else - dataum--;} - else - dataum--;} - else - dataum--;} - else - dataum--;} - else - dataum--;} - else - dataum--;} - else - dataum--;} - else - dataum--;} - else - dataum--;} - else - dataum--;} - else - dataum--;} - else - dataum--;} - else - dataum--;} - } - - if (loopstart > 0) - { - const int length = FSOUND_Stream_GetLengthMs(fmus); - const int freq = 44100; - const unsigned int loopend = (unsigned int)((freq/1000.0f)*length-(freq/1000.0f)); - if (!FSOUND_Stream_SetLoopPoints(fmus, loopstart, loopend)) - { - printf("FMOD(Start,FSOUND_Stream_SetLoopPoints): %s\n", - FMOD_ErrorString(FSOUND_GetError())); - } - } - } - - if (mod) - FMUSIC_PlaySong(mod); - if (fmus) - fsoundchannel = FSOUND_Stream_PlayEx(FSOUND_FREE, fmus, NULL, FALSE); - - M_SetVolume(128); -} - -static inline VOID FreeWADLumps(VOID) -{ - M_FreeMusic(); - if (wfptr) free_wadfile(wfptr); - wfptr = NULL; -} - -static inline VOID ReadWADLumps(LPCSTR WADfilename, HWND hDlg) -{ - HWND listbox = GetDlgItem(hDlg, IDC_PLAYLIST); - FILE* f; - struct lumplist *curlump; - - SendMessage(listbox, LB_RESETCONTENT, 0, 0); - FreeWADLumps(); - f = fopen(WADfilename, "rb"); - wfptr = read_wadfile(f); - fclose(f); - - /* start of C_LIST */ - /* Loop through the lump list, printing lump info */ - for(curlump = wfptr->head->next; curlump; curlump = curlump->next) - { - LPCSTR lumpname = get_lump_name(curlump->cl); - if (!strncmp(lumpname, "O_", 2) || !strncmp(lumpname, "D_", 2)) - SendMessage(listbox, LB_ADDSTRING, 0, (LPARAM)(LPCSTR)get_lump_name(curlump->cl)); - } - /* end of C_LIST */ -} - -// -// OpenWadfile -// -// Provides a common dialog box -// for selecting the desired wad file. -// -static inline VOID OpenWadfile(HWND hDlg) -{ - OPENFILENAMEA ofn; - CHAR FileBuffer[256] = ""; - - ZeroMemory(&ofn, sizeof(ofn)); - ofn.hwndOwner = hDlg; - ofn.lpstrFilter = "WAD Files\0*.wad\0All Files\0*.*\0\0"; - ofn.lpstrInitialDir = NULL; - ofn.lpstrFile = FileBuffer; - ofn.lStructSize = sizeof(ofn); - ofn.nMaxFile = sizeof(FileBuffer); - ofn.nFilterIndex = 1; - ofn.lpstrFileTitle = NULL; - ofn.nMaxFileTitle = 0; - ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; - - if (GetOpenFileNameA(&ofn)) - ReadWADLumps(FileBuffer, hDlg); -} - -static inline VOID PlayLump(HWND hDlg) -{ - HWND listbox = GetDlgItem(hDlg, IDC_PLAYLIST); - LRESULT cursel = SendMessage(listbox, LB_GETCURSEL, 0, 0); - - /* Start of C_EXTRACT */ - CHAR argv[9]; - - SendMessage(listbox, LB_GETTEXT, cursel, (LPARAM)(LPCSTR)argv); - - /* Extract LUMPNAME FILENAME pairs */ - if (wfptr) - { - struct lumplist *extracted; - - printf("Extracting lump %s...\n", argv); - /* Find the lump to extract */ - extracted = find_previous_lump(wfptr->head, NULL, argv); - if (extracted == NULL || (extracted = extracted->next) == NULL) - return; - - /* Extract lump */ - M_StartFMODSong(extracted->cl->data, extracted->cl->len, FALSE, hDlg); - - /* end of extracting LUMPNAME FILENAME pairs */ - - } /* end of C_EXTRACT */ - return; -} - -static LRESULT CALLBACK MainWndproc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - return DefWindowProc(hWnd, message, wParam, lParam); -} - -static INT_PTR CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch(message) - { - case WM_INITDIALOG: - M_InitMusic(); - break; - - case WM_CLOSE: - EndDialog(hDlg, message); - break; - - case WM_DESTROY: - FreeWADLumps(); - M_ShutdownMusic(); - break; - - case WM_COMMAND: - { - switch(LOWORD(wParam)) - { - case 2: - EndDialog(hDlg, message); - return TRUE; - case IDC_ABOUT: // The About button. - { - char TempString[256]; - sprintf(TempString, "%s %s by %s - %s", APPTITLE, APPVERSION, APPAUTHOR, APPCOMPANY); - MessageBoxA(hDlg, TempString, "About", MB_OK|MB_APPLMODAL); - } - return TRUE; - case IDC_OPEN: - OpenWadfile(hDlg); - return TRUE; - case IDC_PLAY: - PlayLump(hDlg); - return TRUE; - default: - break; - } - break; - } - } - - return FALSE; -} - -static inline VOID RegisterDialogClass(LPCSTR name, WNDPROC callback, HINSTANCE hInst) -{ - WNDCLASSA wnd; - - wnd.style = CS_HREDRAW | CS_VREDRAW; - wnd.cbWndExtra = DLGWINDOWEXTRA; - wnd.cbClsExtra = 0; - wnd.hCursor = LoadCursorA(NULL,(LPCSTR)MAKEINTRESOURCE(IDC_ARROW)); - wnd.hIcon = LoadIcon(NULL,MAKEINTRESOURCE(IDI_ICON1)); - wnd.hInstance = hInst; - wnd.lpfnWndProc = callback; - wnd.lpszClassName = name; - wnd.lpszMenuName = NULL; - wnd.hbrBackground = (HBRUSH)(COLOR_WINDOW); - - if (!RegisterClassA(&wnd)) - { - return; - } -} - -int APIENTRY WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) -{ - // Prevent multiples instances of this app. - CreateMutexA(NULL, TRUE, APPTITLE); - - if (GetLastError() == ERROR_ALREADY_EXISTS) - return 0; - - RegisterDialogClass("SRB2MP", MainWndproc, hInstance); - - DialogBoxA(hInstance, (LPCSTR)IDD_MAIN, NULL, DialogProc); - - return 0; -} diff --git a/tools/SRB2MP/SRB2MP.dsp b/tools/SRB2MP/SRB2MP.dsp deleted file mode 100644 index f2e700fb5..000000000 --- a/tools/SRB2MP/SRB2MP.dsp +++ /dev/null @@ -1,148 +0,0 @@ -# Microsoft Developer Studio Project File - Name="SRB2MP" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Application" 0x0101 - -CFG=SRB2MP - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "SRB2MP.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "SRB2MP.mak" CFG="SRB2MP - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "SRB2MP - Win32 Release" (based on "Win32 (x86) Application") -!MESSAGE "SRB2MP - Win32 Debug" (based on "Win32 (x86) Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "SRB2MP - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /c -# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib fmodvc.lib /nologo /subsystem:windows /machine:I386 - -!ELSEIF "$(CFG)" == "SRB2MP - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib fmodvc.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "SRB2MP - Win32 Release" -# Name "SRB2MP - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\lump.c -# End Source File -# Begin Source File - -SOURCE=.\SRB2MP.c -# End Source File -# Begin Source File - -SOURCE=.\StdAfx.c -# ADD CPP /Yc"stdafx.h" -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\lump.h -# End Source File -# Begin Source File - -SOURCE=.\resource.h -# End Source File -# Begin Source File - -SOURCE=.\StdAfx.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# Begin Source File - -SOURCE=.\icon1.ico -# End Source File -# Begin Source File - -SOURCE=.\icon2.ico -# End Source File -# Begin Source File - -SOURCE=.\icon3.ico -# End Source File -# Begin Source File - -SOURCE=.\Script1.rc -# End Source File -# End Group -# Begin Source File - -SOURCE=.\ReadMe.txt -# End Source File -# End Target -# End Project diff --git a/tools/SRB2MP/SRB2MP.dsw b/tools/SRB2MP/SRB2MP.dsw deleted file mode 100644 index b73bd1ac7..000000000 --- a/tools/SRB2MP/SRB2MP.dsw +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "SRB2MP"=.\SRB2MP.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/tools/SRB2MP/Script1.aps b/tools/SRB2MP/Script1.aps deleted file mode 100644 index 994653cb127842a0407c238f8d1ffd05f5a54f30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35604 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 diff --git a/tools/SRB2MP/Script1.rc b/tools/SRB2MP/Script1.rc deleted file mode 100644 index 3fa7bd572..000000000 --- a/tools/SRB2MP/Script1.rc +++ /dev/null @@ -1,118 +0,0 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 262, 170 -STYLE DS_3DLOOK | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "SRB2 Music Player" -FONT 8, "MS Sans Serif" -BEGIN - PUSHBUTTON "E&xit",IDCANCEL,205,145,50,19 - PUSHBUTTON "&About",IDC_ABOUT,230,15,23,10 - LISTBOX IDC_WADLIST,5,30,112,110,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - LISTBOX IDC_PLAYLIST,140,30,114,110,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "&Play",IDC_PLAY,140,145,60,20 - PUSHBUTTON "->",IDC_ADD,120,35,15,15 - PUSHBUTTON "<-",IDC_REMOVE,120,55,15,15 - PUSHBUTTON "&Open WAD...",IDC_OPEN,5,10,50,15 - ICON IDI_ICON1,IDC_STATIC,205,5,20,20 - LTEXT "Title:",IDC_TITLE,5,140,125,10 - LTEXT "By:",IDC_ARTIST,5,150,125,15 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 255 - TOPMARGIN, 7 - BOTTOMMARGIN, 163 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_ICON1 ICON DISCARDABLE "icon1.ico" -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/tools/SRB2MP/StdAfx.c b/tools/SRB2MP/StdAfx.c deleted file mode 100644 index 4f305cd1a..000000000 --- a/tools/SRB2MP/StdAfx.c +++ /dev/null @@ -1,8 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// SRB2MP.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "StdAfx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file diff --git a/tools/SRB2MP/StdAfx.h b/tools/SRB2MP/StdAfx.h deleted file mode 100644 index 84ac428b8..000000000 --- a/tools/SRB2MP/StdAfx.h +++ /dev/null @@ -1,35 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) -#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_ - -//#define UNICODE - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers - -#include -#include -#include -#include - -// TODO: reference additional headers your program requires here -#ifdef __MINGW32__ -#include -#include -#else -#include -#include -#endif -#include "resource.h" - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) diff --git a/tools/SRB2MP/icon1.ico b/tools/SRB2MP/icon1.ico deleted file mode 100644 index 7548e7cafb5f491c26e6bc600d8ee8b19c1cc96a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2998 zcmd6py=!Af5Wq*4h=mckxG^aVr??1lz0J8f2ls|+T)W$U!A&^55O5s`7#31ok%Xj3 zAZVQsBF|6&SG;MLjXHl&Y$j&7l4#s|3S0FoS-XS#nI1&8MseefO`d5cpRe>PfHn zvFgPX*0fqoWfFZ!(=r9Br0t^9$07Fo8a0EDlaqt@fl~Y8< z2up+|!s17UC6YXnC=xWn;$^@XSwvVOEM68kA{-Hp2uFm&O9e-SA;J)0u+l|1A`B6R z?7vvKE+Kj953-lnssk0d6MkN5awnJ)NfQYYOo`kHVjSZU0un|&5aEC;kh2EeDmxX-{XSn+IPSv;<;pTO;lO?D{VaA z7Hk}kMq@ssvGrwkVoh9h>N>xFWMSN(^L7hg$G^+5%s!32w&r`^+5d(esyhBG|D4^4 zW<{7;?!CG@%e{9ja{PCqEQmG^48jaep~jx!hiXH F%Ae-dH{SpN diff --git a/tools/SRB2MP/lump.c b/tools/SRB2MP/lump.c deleted file mode 100644 index 4cf355401..000000000 --- a/tools/SRB2MP/lump.c +++ /dev/null @@ -1,471 +0,0 @@ -/* - LumpMod v0.21, a command-line utility for working with lumps in wad files. - Copyright (C) 2003 Thunder Palace Entertainment. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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., 675 Mass Ave, Cambridge, MA 02139, USA. - - lump.c: Provides functions for dealing with lumps -*/ - -#include "StdAfx.h" -#include -#include -#include "lump.h" - -/* Read contents of a wad file and store them in memory. - * fpoint is the file to read, opened with "rb" mode. - * A pointer to a new wadfile struct will be returned, or NULL on error. - */ -struct wadfile *read_wadfile(FILE *fpoint) { - struct wadfile *wfptr; - struct lumplist *curlump; - unsigned long diroffset, filelen; - unsigned long count; - - /* Allocate memory for wadfile struct */ - wfptr = (struct wadfile*)malloc(sizeof(struct wadfile)); - if(wfptr == NULL) return NULL; - - /* Read first four characters (PWAD or IWAD) */ - if(fread(wfptr->id, 4, 1, fpoint) < 1) { - free(wfptr); - return NULL; - } - - /* Read number of lumps */ - if(fread(&(wfptr->numlumps), 4, 1, fpoint) < 1) { - free(wfptr); - return NULL; - } - - /* If number of lumps is zero, nothing more needs to be done */ - if(wfptr->numlumps == 0) { - wfptr->head = NULL; - return wfptr; - } - - /* Read offset of directory */ - if(fread(&diroffset, 4, 1, fpoint) < 1) { - free(wfptr); - return NULL; - } - - /* Verify that the directory as long as it needs to be */ - fseek(fpoint, 0, SEEK_END); - filelen = ftell(fpoint); - if((filelen - diroffset) / DIRENTRYLEN < wfptr->numlumps) { - free(wfptr); - return NULL; - } - - /* Allocate memory for head lumplist item and set head pointer */ - curlump = (struct lumplist*)malloc(sizeof(struct lumplist)); - if(curlump == NULL) { - free(wfptr); - return NULL; - } - wfptr->head = curlump; - curlump->cl = NULL; - - /* Read directory entries and lumps */ - for(count = 0; count < wfptr->numlumps; count++) { - long lumpdataoffset; - - /* Advance to a new list item */ - curlump->next = (struct lumplist*)malloc(sizeof(struct lumplist)); - if(curlump->next == NULL) { - free_wadfile(wfptr); - return NULL; - } - curlump = curlump->next; - curlump->next = NULL; - - /* Allocate memory for the lump info */ - curlump->cl = (struct lump*)malloc(sizeof(struct lump)); - if(curlump->cl == NULL) { - free_wadfile(wfptr); - return NULL; - } - - /* Seek to the proper position in the file */ - if(fseek(fpoint, diroffset + (count * DIRENTRYLEN), SEEK_SET) != 0) { - free_wadfile(wfptr); - return NULL; - } - - /* Read offset of lump data */ - if(fread(&lumpdataoffset, 4, 1, fpoint) < 1) { - free_wadfile(wfptr); - return NULL; - } - - /* Read size of lump in bytes */ - if(fread(&(curlump->cl->len), 4, 1, fpoint) < 1) { - free_wadfile(wfptr); - return NULL; - } - - /* Read lump name */ - if(fread(curlump->cl->name, 8, 1, fpoint) < 1) { - free_wadfile(wfptr); - return NULL; - } - - /* Read actual lump data, unless lump size is 0 */ - if(curlump->cl->len > 0) { - if(fseek(fpoint, lumpdataoffset, SEEK_SET) != 0) { - free_wadfile(wfptr); - return NULL; - } - - /* Allocate memory for data */ - curlump->cl->data = (unsigned char*)malloc(curlump->cl->len); - if(curlump->cl->data == NULL) { - free_wadfile(wfptr); - return NULL; - } - - /* Fill the data buffer */ - if(fread(curlump->cl->data, curlump->cl->len, 1, fpoint) < 1) { - free_wadfile(wfptr); - return NULL; - } - } else curlump->cl->data = NULL; - } /* End of directory reading loop */ - - return wfptr; -} - -/* Free a wadfile from memory as well as all related structures. - */ -void free_wadfile(struct wadfile *wfptr) { - struct lumplist *curlump, *nextlump; - - if(wfptr == NULL) return; - curlump = wfptr->head; - - /* Free items in the lump list */ - while(curlump != NULL) { - - /* Free the actual lump and its data, if necessary */ - if(curlump->cl != NULL) { - if(curlump->cl->data != NULL) free(curlump->cl->data); - free(curlump->cl); - } - - /* Advance to next lump and free this one */ - nextlump = curlump->next; - free(curlump); - curlump = nextlump; - } - - free(wfptr); -} - -/* Write complete wadfile to a file stream, opened with "wb" mode. - * fpoint is the stream to write to. - * wfptr is a pointer to the wadfile structure to use. - * Return zero on success, nonzero on failure. - */ -int write_wadfile(FILE *fpoint, struct wadfile *wfptr) { - struct lumplist *curlump; - long lumpdataoffset, diroffset; - - if(wfptr == NULL) return 1; - - /* Write four-character ID ("PWAD" or "IWAD") */ - if(fwrite(wfptr->id, 4, 1, fpoint) < 1) return 2; - - /* Write number of lumps */ - if(fwrite(&(wfptr->numlumps), 4, 1, fpoint) < 1) return 3; - - /* Offset of directory is not known yet. For now, write number of lumps - * again, just to fill the space. - */ - if(fwrite(&(wfptr->numlumps), 4, 1, fpoint) < 1) return 4; - - /* Loop through lump list, writing lump data */ - for(curlump = wfptr->head; curlump != NULL; curlump = curlump->next) { - - /* Don't write anything for the head of the lump list or for lumps of - zero length */ - if(curlump->cl == NULL || curlump->cl->data == NULL) continue; - - /* Write the data */ - if(fwrite(curlump->cl->data, curlump->cl->len, 1, fpoint) < 1) - return 5; - } - - /* Current position is where directory will start */ - diroffset = ftell(fpoint); - - /* Offset for the first lump's data is always 12 */ - lumpdataoffset = 12; - - /* Loop through lump list again, this time writing directory entries */ - for(curlump = wfptr->head; curlump != NULL; curlump = curlump->next) { - - /* Don't write anything for the head of the lump list */ - if(curlump->cl == NULL) continue; - - /* Write offset for lump data */ - if(fwrite(&lumpdataoffset, 4, 1, fpoint) < 1) return 6; - - /* Write size of lump data */ - if(fwrite(&(curlump->cl->len), 4, 1, fpoint) < 1) return 7; - - /* Write lump name */ - if(fwrite(curlump->cl->name, 8, 1, fpoint) < 1) return 8; - - /* Increment lumpdataoffset variable as appropriate */ - lumpdataoffset += curlump->cl->len; - } - - /* Go back to header and write the proper directory offset */ - fseek(fpoint, 8, SEEK_SET); - if(fwrite(&diroffset, 4, 1, fpoint) < 1) return 9; - - return 0; -} - -/* Get the name of a lump, as a null-terminated string. - * item is a pointer to the lump (not lumplist) whose name will be obtained. - * Return NULL on error. - */ -char *get_lump_name(struct lump *item) { - char convname[9], *retname; - - if(item == NULL) return NULL; - memcpy(convname, item->name, 8); - convname[8] = '\0'; - - retname = (char*)malloc(strlen(convname) + 1); - if(retname != NULL) strcpy(retname, convname); - return retname; -} - -/* Find the lump after start and before end having a certain name. - * Return a pointer to the list item for that lump, or return NULL if no lump - * by that name is found or lumpname is too long. - * lumpname is a null-terminated string. - * If end parameter is NULL, search to the end of the entire list. - */ -struct lumplist *find_previous_lump(struct lumplist *start, struct lumplist - *end, char *lumpname) { - struct lumplist *curlump, *lastlump; - char *curname; - int found = 0; - - /* Verify that parameters are valid */ - if(start==NULL || start==end || lumpname==NULL || strlen(lumpname) > 8) - return NULL; - - /* Loop through the list from start parameter */ - lastlump = start; - for(curlump = start->next; curlump != end && curlump != NULL; - curlump = curlump->next) { - - /* Skip header lump */ - if(curlump->cl == NULL) continue; - - /* Find name of this lump */ - curname = get_lump_name(curlump->cl); - if(curname == NULL) continue; - - /* Compare names to see if this is the lump we want */ - if(strcmp(curname, lumpname) == 0) { - found = 1; - break; - } - - /* Free memory allocated to curname */ - free(curname); - - lastlump = curlump; - } - - if(found) return lastlump; - return NULL; -} - -/* Remove a lump from the list, free it, and free its data. - * before is the lump immediately preceding the lump to be removed. - * wfptr is a pointer to the wadfile structure to which the removed lump - * belongs, so that numlumps can be decreased. - */ -void remove_next_lump(struct wadfile *wfptr, struct lumplist *before) { - struct lumplist *removed; - - /* Verify that parameters are valid */ - if(before == NULL || before->next == NULL || wfptr == NULL) return; - - /* Update linked list to omit removed lump */ - removed = before->next; - before->next = removed->next; - - /* Free lump info and data if necessary */ - if(removed->cl != NULL) { - if(removed->cl->data != NULL) free(removed->cl->data); - free(removed->cl); - } - - free(removed); - - /* Decrement numlumps */ - wfptr->numlumps--; -} - -/* Add a lump. - * The lump will follow prev in the list and be named name, with a data size - * of len. - * A copy will be made of the data. - * Return zero on success or nonzero on failure. - */ -int add_lump(struct wadfile *wfptr, struct lumplist *prev, char *name, long - len, unsigned char *data) { - struct lump *newlump; - struct lumplist *newlumplist; - unsigned char *copydata; - - /* Verify that parameters are valid */ - if(wfptr == NULL || prev == NULL || name == NULL || strlen(name) > 8) - return 1; - - /* Allocate space for newlump and newlumplist */ - newlump = (struct lump*)malloc(sizeof(struct lump)); - newlumplist = (struct lumplist*)malloc(sizeof(struct lumplist)); - if(newlump == NULL || newlumplist == NULL) return 2; - - /* Copy lump data and set up newlump */ - if(len == 0 || data == NULL) { - newlump->len = 0; - newlump->data = NULL; - } else { - newlump->len = len; - copydata = (unsigned char*)malloc(len); - if(copydata == NULL) return 3; - memcpy(copydata, data, len); - newlump->data = copydata; - } - - /* Set name of newlump */ - memset(newlump->name, '\0', 8); - if(strlen(name) == 8) memcpy(newlump->name, name, 8); - else strcpy(newlump->name, name); - - /* Set up newlumplist and alter prev appropriately */ - newlumplist->cl = newlump; - newlumplist->next = prev->next; - prev->next = newlumplist; - - /* Increment numlumps */ - wfptr->numlumps++; - - return 0; -} - -/* Rename a lump. - * renamed is a pointer to the lump (not lumplist) that needs renaming. - * newname is a null-terminated string with the new name. - * Return zero on success or nonzero on failure. - */ -int rename_lump(struct lump *renamed, char *newname) { - - /* Verify that parameters are valid. */ - if(newname == NULL || renamed == NULL || strlen(newname) > 8) return 1; - - /* Do the renaming. */ - memset(renamed->name, '\0', 8); - if(strlen(newname) == 8) memcpy(renamed->name, newname, 8); - else strcpy(renamed->name, newname); - - return 0; -} - -/* Find the last lump in a wadfile structure. - * Return this lump or NULL on failure. - */ -struct lumplist *find_last_lump(struct wadfile *wfptr) { - struct lumplist *curlump; - - if(wfptr == NULL || wfptr->head == NULL) return NULL; - curlump = wfptr->head; - - while(curlump->next != NULL) curlump = curlump->next; - return curlump; -} - -/* Find the last lump between start and end. - * Return this lump or NULL on failure. - */ -struct lumplist *find_last_lump_between(struct lumplist *start, struct - lumplist *end) { - struct lumplist *curlump; - - if(start == NULL) return NULL; - curlump = start; - - while(curlump->next != end) { - curlump = curlump->next; - if(curlump == NULL) break; - } - - return curlump; -} - -/* Find the next section lump. A section lump is MAPxx (0 <= x <= 9), ExMy - * (0 <= x <= 9, 0 <= y <= 9), or any lump whose name ends in _START or _END. - * Return NULL if there are no section lumps after start. - */ -struct lumplist *find_next_section_lump(struct lumplist *start) { - struct lumplist *curlump, *found = NULL; - char *curname; - - /* Verify that parameter is valid */ - if(start == NULL || start->next == NULL) return NULL; - - /* Loop through the list from start parameter */ - for(curlump = start->next; curlump != NULL && found == NULL; - curlump = curlump->next) { - - /* Skip header lump */ - if(curlump->cl == NULL) continue; - - /* Find name of this lump */ - curname = get_lump_name(curlump->cl); - if(curname == NULL) continue; - - /* Check to see if this is a section lump */ - if(strlen(curname) == 5 && strncmp("MAP", curname, 3) == 0 && - isdigit(curname[3]) && isdigit(curname[4])) - found = curlump; - else if(strlen(curname) == 4 && curname[0] == 'E' && curname[2] == - 'M' && isdigit(curname[1]) && isdigit(curname[3])) - found = curlump; - else if(strlen(curname) == 7 && strcmp("_START", &curname[1]) == 0) - found = curlump; - else if(strlen(curname) == 8 && strcmp("_START", &curname[2]) == 0) - found = curlump; - else if(strlen(curname) == 5 && strcmp("_END", &curname[1]) == 0) - found = curlump; - else if(strlen(curname) == 6 && strcmp("_END", &curname[2]) == 0) - found = curlump; - - /* Free memory allocated to curname */ - free(curname); - } - - return found; -} diff --git a/tools/SRB2MP/lump.h b/tools/SRB2MP/lump.h deleted file mode 100644 index b36b84441..000000000 --- a/tools/SRB2MP/lump.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - LumpMod v0.21, a command-line utility for working with lumps in wad files. - Copyright (C) 2003 Thunder Palace Entertainment. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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., 675 Mass Ave, Cambridge, MA 02139, USA. - - lump.h: Defines constants, structures, and functions used in lump.c -*/ - -#ifndef __LUMP_H -#define __LUMP_H - -/* Entries in the wadfile directory are 16 bytes */ -#define DIRENTRYLEN 16 - -/* Lumps and associated info */ -struct lump { - long len; - unsigned char *data; - char name[8]; -}; - -/* Linked list of lumps */ -struct lumplist { - struct lump *cl; /* actual content of the lump */ - struct lumplist *next; -}; - -/* Structure to contain all wadfile data */ -struct wadfile { - char id[4]; /* IWAD or PWAD */ - unsigned long numlumps; /* 32-bit integer */ - struct lumplist *head; /* points to first entry */ -}; - -/* Function declarations */ -struct wadfile *read_wadfile(FILE *); -void free_wadfile(struct wadfile *); -int write_wadfile(FILE *, struct wadfile *); -char *get_lump_name(struct lump *); -struct lumplist *find_previous_lump(struct lumplist *, struct lumplist *, char *); -void remove_next_lump(struct wadfile *, struct lumplist *); -int add_lump(struct wadfile *, struct lumplist *, char *, long, unsigned char *); -int rename_lump(struct lump *, char *); -struct lumplist *find_last_lump(struct wadfile *); -struct lumplist *find_last_lump_between(struct lumplist *, struct lumplist *); -struct lumplist *find_next_section_lump(struct lumplist *); - -#endif diff --git a/tools/SRB2MP/resource.h b/tools/SRB2MP/resource.h deleted file mode 100644 index 56924e34a..000000000 --- a/tools/SRB2MP/resource.h +++ /dev/null @@ -1,26 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by Script1.rc -// -#define IDD_MAIN 101 -#define IDI_ICON1 102 -#define IDC_ABOUT 1000 -#define IDC_WADLIST 1001 -#define IDC_PLAYLIST 1002 -#define IDC_PLAY 1003 -#define IDC_ADD 1004 -#define IDC_REMOVE 1005 -#define IDC_OPEN 1006 -#define IDC_TITLE 1007 -#define IDC_ARTIST 1008 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 105 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1009 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif From 0ab8576ddbe1e75ab593e77c6dd3e58eddda4fdf Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sun, 17 Jul 2022 19:40:53 -0500 Subject: [PATCH 369/377] Remove legacy SRB2Updater tool Also unsupported and nonfunctional --- tools/SRB2Updater/Bunny.cs | 53 -- tools/SRB2Updater/Debug.Designer.cs | 266 ------ tools/SRB2Updater/Debug.cs | 66 -- tools/SRB2Updater/Debug.resx | 120 --- tools/SRB2Updater/Launcher.Designer.cs | 766 ------------------ tools/SRB2Updater/Launcher.cs | 658 --------------- tools/SRB2Updater/Launcher.resx | 190 ----- tools/SRB2Updater/MSClient.cs | 121 --- tools/SRB2Updater/Options.Designer.cs | 628 -------------- tools/SRB2Updater/Options.cs | 134 --- tools/SRB2Updater/Options.resx | 166 ---- tools/SRB2Updater/Program.cs | 20 - tools/SRB2Updater/Properties/AssemblyInfo.cs | 35 - .../Properties/Resources.Designer.cs | 132 --- tools/SRB2Updater/Properties/Resources.resx | 151 ---- .../Properties/Settings.Designer.cs | 26 - .../SRB2Updater/Properties/Settings.settings | 7 - tools/SRB2Updater/Resources/Banner.png | Bin 48784 -> 0 bytes tools/SRB2Updater/Resources/Banner.psd | Bin 833250 -> 0 bytes tools/SRB2Updater/Resources/Banner2.png | Bin 46935 -> 0 bytes tools/SRB2Updater/Resources/Banner3.png | Bin 53400 -> 0 bytes tools/SRB2Updater/Resources/Banner4.png | Bin 61190 -> 0 bytes tools/SRB2Updater/Resources/CONSBACK.bmp | Bin 65080 -> 0 bytes tools/SRB2Updater/Resources/Kotaku.wav | Bin 243476 -> 0 bytes tools/SRB2Updater/Resources/Sonic.png | Bin 14237 -> 0 bytes tools/SRB2Updater/Resources/Srb2win.ico | Bin 2238 -> 0 bytes tools/SRB2Updater/Resources/sonic_bottom.png | Bin 10226 -> 0 bytes tools/SRB2Updater/Resources/sonic_top.png | Bin 7000 -> 0 bytes tools/SRB2Updater/Resources/updaterbanner.png | Bin 15321 -> 0 bytes tools/SRB2Updater/SRB2Updater.csproj | 173 ---- tools/SRB2Updater/SRB2Updater.sln | 20 - tools/SRB2Updater/ServerQuerier.cs | 362 --------- tools/SRB2Updater/Settings.cs | 219 ----- tools/SRB2Updater/app.config | 3 - 34 files changed, 4316 deletions(-) delete mode 100644 tools/SRB2Updater/Bunny.cs delete mode 100644 tools/SRB2Updater/Debug.Designer.cs delete mode 100644 tools/SRB2Updater/Debug.cs delete mode 100644 tools/SRB2Updater/Debug.resx delete mode 100644 tools/SRB2Updater/Launcher.Designer.cs delete mode 100644 tools/SRB2Updater/Launcher.cs delete mode 100644 tools/SRB2Updater/Launcher.resx delete mode 100644 tools/SRB2Updater/MSClient.cs delete mode 100644 tools/SRB2Updater/Options.Designer.cs delete mode 100644 tools/SRB2Updater/Options.cs delete mode 100644 tools/SRB2Updater/Options.resx delete mode 100644 tools/SRB2Updater/Program.cs delete mode 100644 tools/SRB2Updater/Properties/AssemblyInfo.cs delete mode 100644 tools/SRB2Updater/Properties/Resources.Designer.cs delete mode 100644 tools/SRB2Updater/Properties/Resources.resx delete mode 100644 tools/SRB2Updater/Properties/Settings.Designer.cs delete mode 100644 tools/SRB2Updater/Properties/Settings.settings delete mode 100644 tools/SRB2Updater/Resources/Banner.png delete mode 100644 tools/SRB2Updater/Resources/Banner.psd delete mode 100644 tools/SRB2Updater/Resources/Banner2.png delete mode 100644 tools/SRB2Updater/Resources/Banner3.png delete mode 100644 tools/SRB2Updater/Resources/Banner4.png delete mode 100644 tools/SRB2Updater/Resources/CONSBACK.bmp delete mode 100644 tools/SRB2Updater/Resources/Kotaku.wav delete mode 100644 tools/SRB2Updater/Resources/Sonic.png delete mode 100644 tools/SRB2Updater/Resources/Srb2win.ico delete mode 100644 tools/SRB2Updater/Resources/sonic_bottom.png delete mode 100644 tools/SRB2Updater/Resources/sonic_top.png delete mode 100644 tools/SRB2Updater/Resources/updaterbanner.png delete mode 100644 tools/SRB2Updater/SRB2Updater.csproj delete mode 100644 tools/SRB2Updater/SRB2Updater.sln delete mode 100644 tools/SRB2Updater/ServerQuerier.cs delete mode 100644 tools/SRB2Updater/Settings.cs delete mode 100644 tools/SRB2Updater/app.config diff --git a/tools/SRB2Updater/Bunny.cs b/tools/SRB2Updater/Bunny.cs deleted file mode 100644 index 71934ee31..000000000 --- a/tools/SRB2Updater/Bunny.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Windows.Forms; - -namespace SRB2Updater -{ - public class Bunny - { - List Keys = new List{System.Windows.Forms.Keys.Up, System.Windows.Forms.Keys.Up, - System.Windows.Forms.Keys.Down, System.Windows.Forms.Keys.Down, - System.Windows.Forms.Keys.Left, System.Windows.Forms.Keys.Right, - System.Windows.Forms.Keys.Left, System.Windows.Forms.Keys.Right, - System.Windows.Forms.Keys.B, System.Windows.Forms.Keys.A}; - private int mPosition = -1; - - public int Position - { - get { return mPosition; } - private set { mPosition = value; } - } - - public bool IsCompletedBy(Keys key) - { - - if (Keys[Position + 1] == key) - { - // move to next - Position++; - } - else if (Position == 1 && key == System.Windows.Forms.Keys.Up) - { - // stay where we are - } - else if (Keys[0] == key) - { - // restart at 1st - Position = 0; - } - else - { - // no match in sequence - Position = -1; - } - - if (Position == Keys.Count - 1) - { - Position = -1; - return true; - } - return false; - } - } -} diff --git a/tools/SRB2Updater/Debug.Designer.cs b/tools/SRB2Updater/Debug.Designer.cs deleted file mode 100644 index 6ec72f904..000000000 --- a/tools/SRB2Updater/Debug.Designer.cs +++ /dev/null @@ -1,266 +0,0 @@ -namespace SRB2Updater -{ - partial class Debug - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.lblOverallPercentage = new System.Windows.Forms.Label(); - this.lblPercent = new System.Windows.Forms.Label(); - this.lblOverall = new System.Windows.Forms.Label(); - this.lblCurrent = new System.Windows.Forms.Label(); - this.lblTotal = new System.Windows.Forms.Label(); - this.lblRead = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); - this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); - this.label6 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.label7 = new System.Windows.Forms.Label(); - this.lblKonami = new System.Windows.Forms.Label(); - this.lblRandom = new System.Windows.Forms.Label(); - this.label9 = new System.Windows.Forms.Label(); - this.tableLayoutPanel1.SuspendLayout(); - this.SuspendLayout(); - // - // lblOverallPercentage - // - this.lblOverallPercentage.AutoSize = true; - this.lblOverallPercentage.Location = new System.Drawing.Point(176, 150); - this.lblOverallPercentage.Name = "lblOverallPercentage"; - this.lblOverallPercentage.Size = new System.Drawing.Size(21, 13); - this.lblOverallPercentage.TabIndex = 26; - this.lblOverallPercentage.Text = "0%"; - // - // lblPercent - // - this.lblPercent.AutoSize = true; - this.lblPercent.Location = new System.Drawing.Point(176, 90); - this.lblPercent.Name = "lblPercent"; - this.lblPercent.Size = new System.Drawing.Size(21, 13); - this.lblPercent.TabIndex = 25; - this.lblPercent.Text = "0%"; - // - // lblOverall - // - this.lblOverall.AutoSize = true; - this.lblOverall.Location = new System.Drawing.Point(176, 120); - this.lblOverall.Name = "lblOverall"; - this.lblOverall.Size = new System.Drawing.Size(41, 13); - this.lblOverall.TabIndex = 24; - this.lblOverall.Text = "0 bytes"; - // - // lblCurrent - // - this.lblCurrent.AutoSize = true; - this.lblCurrent.Location = new System.Drawing.Point(176, 60); - this.lblCurrent.Name = "lblCurrent"; - this.lblCurrent.Size = new System.Drawing.Size(41, 13); - this.lblCurrent.TabIndex = 23; - this.lblCurrent.Text = "0 bytes"; - // - // lblTotal - // - this.lblTotal.AutoSize = true; - this.lblTotal.Location = new System.Drawing.Point(176, 0); - this.lblTotal.Name = "lblTotal"; - this.lblTotal.Size = new System.Drawing.Size(41, 13); - this.lblTotal.TabIndex = 21; - this.lblTotal.Text = "0 bytes"; - // - // lblRead - // - this.lblRead.AutoSize = true; - this.lblRead.Location = new System.Drawing.Point(176, 30); - this.lblRead.Name = "lblRead"; - this.lblRead.Size = new System.Drawing.Size(41, 13); - this.lblRead.TabIndex = 22; - this.lblRead.Text = "0 bytes"; - this.lblRead.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(3, 0); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(105, 13); - this.label1.TabIndex = 27; - this.label1.Text = "Total Download Size"; - // - // tableLayoutPanel1 - // - this.tableLayoutPanel1.ColumnCount = 2; - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 66.66666F)); - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33333F)); - this.tableLayoutPanel1.Controls.Add(this.label6, 0, 5); - this.tableLayoutPanel1.Controls.Add(this.label5, 0, 4); - this.tableLayoutPanel1.Controls.Add(this.label4, 0, 3); - this.tableLayoutPanel1.Controls.Add(this.label3, 0, 2); - this.tableLayoutPanel1.Controls.Add(this.label2, 0, 1); - this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0); - this.tableLayoutPanel1.Controls.Add(this.lblOverallPercentage, 1, 5); - this.tableLayoutPanel1.Controls.Add(this.lblTotal, 1, 0); - this.tableLayoutPanel1.Controls.Add(this.lblOverall, 1, 4); - this.tableLayoutPanel1.Controls.Add(this.lblPercent, 1, 3); - this.tableLayoutPanel1.Controls.Add(this.lblRead, 1, 1); - this.tableLayoutPanel1.Controls.Add(this.lblCurrent, 1, 2); - this.tableLayoutPanel1.Controls.Add(this.label7, 0, 6); - this.tableLayoutPanel1.Controls.Add(this.lblKonami, 1, 6); - this.tableLayoutPanel1.Controls.Add(this.lblRandom, 1, 7); - this.tableLayoutPanel1.Controls.Add(this.label9, 0, 7); - this.tableLayoutPanel1.Location = new System.Drawing.Point(12, 12); - this.tableLayoutPanel1.Name = "tableLayoutPanel1"; - this.tableLayoutPanel1.RowCount = 9; - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); - this.tableLayoutPanel1.Size = new System.Drawing.Size(260, 355); - this.tableLayoutPanel1.TabIndex = 28; - // - // label6 - // - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(3, 150); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(98, 13); - this.label6.TabIndex = 32; - this.label6.Text = "Overall Percentage"; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(3, 120); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(132, 13); - this.label5.TabIndex = 31; - this.label5.Text = "Bytes Downloaded Overall"; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(3, 90); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(118, 13); - this.label4.TabIndex = 30; - this.label4.Text = "Current File Percentage"; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(3, 60); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(146, 13); - this.label3.TabIndex = 29; - this.label3.Text = "Downloaded from Current File"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(3, 30); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(62, 13); - this.label2.TabIndex = 28; - this.label2.Text = "Bytes Read"; - // - // label7 - // - this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(3, 180); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(42, 13); - this.label7.TabIndex = 33; - this.label7.Text = "Konami"; - // - // lblKonami - // - this.lblKonami.AutoSize = true; - this.lblKonami.Location = new System.Drawing.Point(176, 180); - this.lblKonami.Name = "lblKonami"; - this.lblKonami.Size = new System.Drawing.Size(16, 13); - this.lblKonami.TabIndex = 34; - this.lblKonami.Text = "-1"; - // - // lblRandom - // - this.lblRandom.AutoSize = true; - this.lblRandom.Location = new System.Drawing.Point(176, 210); - this.lblRandom.Name = "lblRandom"; - this.lblRandom.Size = new System.Drawing.Size(13, 13); - this.lblRandom.TabIndex = 37; - this.lblRandom.Text = "0"; - // - // label9 - // - this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(3, 210); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(47, 13); - this.label9.TabIndex = 38; - this.label9.Text = "Random"; - // - // Debug - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(284, 379); - this.Controls.Add(this.tableLayoutPanel1); - this.Name = "Debug"; - this.Text = "Debug"; - this.tableLayoutPanel1.ResumeLayout(false); - this.tableLayoutPanel1.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Label lblOverallPercentage; - private System.Windows.Forms.Label lblPercent; - private System.Windows.Forms.Label lblOverall; - private System.Windows.Forms.Label lblCurrent; - private System.Windows.Forms.Label lblTotal; - private System.Windows.Forms.Label lblRead; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; - private System.Windows.Forms.Label label6; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label7; - private System.Windows.Forms.Label lblKonami; - private System.Windows.Forms.Label lblRandom; - private System.Windows.Forms.Label label9; - } -} \ No newline at end of file diff --git a/tools/SRB2Updater/Debug.cs b/tools/SRB2Updater/Debug.cs deleted file mode 100644 index 5cb54dd37..000000000 --- a/tools/SRB2Updater/Debug.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; - -namespace SRB2Updater -{ - public partial class Debug : Form - { - public Debug() - { - InitializeComponent(); - } - - public String strOverall - { - get { return this.lblOverall.Text; } - set { this.lblOverall.Text = value; } - } - - public String strKonami - { - get { return this.lblKonami.Text; } - set { this.lblKonami.Text = value; } - } - - public String strRandom - { - get { return this.lblRandom.Text; } - set { this.lblRandom.Text = value; } - } - - public String strOverallPercentage - { - get { return this.lblOverallPercentage.Text; } - set { this.lblOverallPercentage.Text = value; } - } - - public String strCurrent - { - get { return this.lblCurrent.Text; } - set { this.lblCurrent.Text = value; } - } - - public String strPercent - { - get { return this.lblPercent.Text; } - set { this.lblPercent.Text = value; } - } - - public String strRead - { - get { return this.lblRead.Text; } - set { this.lblRead.Text = value; } - } - - public String strTotal - { - get { return this.lblTotal.Text; } - set { this.lblTotal.Text = value; } - } - } -} diff --git a/tools/SRB2Updater/Debug.resx b/tools/SRB2Updater/Debug.resx deleted file mode 100644 index ff31a6db5..000000000 --- a/tools/SRB2Updater/Debug.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/tools/SRB2Updater/Launcher.Designer.cs b/tools/SRB2Updater/Launcher.Designer.cs deleted file mode 100644 index 9126eba54..000000000 --- a/tools/SRB2Updater/Launcher.Designer.cs +++ /dev/null @@ -1,766 +0,0 @@ -namespace SRB2Updater -{ - partial class Launcher - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Launcher)); - this.panel1 = new System.Windows.Forms.Panel(); - this.panel3 = new System.Windows.Forms.Panel(); - this.btnOptions = new System.Windows.Forms.Button(); - this.btnCheckFiles = new System.Windows.Forms.Button(); - this.btnStartSRB2 = new System.Windows.Forms.Button(); - this.panel2 = new System.Windows.Forms.Panel(); - this.lblProgress = new System.Windows.Forms.Label(); - this.update_optional = new System.Windows.Forms.CheckBox(); - this.progress_overall = new System.Windows.Forms.ProgressBar(); - this.progress_currentFile = new System.Windows.Forms.ProgressBar(); - this.tab_web = new System.Windows.Forms.TabControl(); - this.tabPage1 = new System.Windows.Forms.TabPage(); - this.panel10 = new System.Windows.Forms.Panel(); - this.webBrowser3 = new System.Windows.Forms.WebBrowser(); - this.tabPage2 = new System.Windows.Forms.TabPage(); - this.panel9 = new System.Windows.Forms.Panel(); - this.webBrowser1 = new System.Windows.Forms.WebBrowser(); - this.tabPage3 = new System.Windows.Forms.TabPage(); - this.panel8 = new System.Windows.Forms.Panel(); - this.fileList = new System.Windows.Forms.DataGridView(); - this.name = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.filename = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.status = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.localmd5 = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.md5 = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.optional = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.calculated = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.serverTab = new System.Windows.Forms.TabPage(); - this.panel6 = new System.Windows.Forms.Panel(); - this.listViewServers = new System.Windows.Forms.ListView(); - this.colhdrName = new System.Windows.Forms.ColumnHeader("(none)"); - this.colhdrGametype = new System.Windows.Forms.ColumnHeader(); - this.colhdrPing = new System.Windows.Forms.ColumnHeader(); - this.colhdrPlayers = new System.Windows.Forms.ColumnHeader(); - this.colhdrVersion = new System.Windows.Forms.ColumnHeader(); - this.panel4 = new System.Windows.Forms.Panel(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.label4 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); - this.button1 = new System.Windows.Forms.Button(); - this.button3 = new System.Windows.Forms.Button(); - this.btnConnect = new System.Windows.Forms.Button(); - this.panel5 = new System.Windows.Forms.Panel(); - this.bannerRandom = new System.Windows.Forms.Panel(); - this.backgroundWorkerQueryServers = new System.ComponentModel.BackgroundWorker(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.webBrowser2 = new System.Windows.Forms.WebBrowser(); - this.panel1.SuspendLayout(); - this.panel3.SuspendLayout(); - this.panel2.SuspendLayout(); - this.tab_web.SuspendLayout(); - this.tabPage1.SuspendLayout(); - this.panel10.SuspendLayout(); - this.tabPage2.SuspendLayout(); - this.panel9.SuspendLayout(); - this.tabPage3.SuspendLayout(); - this.panel8.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.fileList)).BeginInit(); - this.serverTab.SuspendLayout(); - this.panel6.SuspendLayout(); - this.panel4.SuspendLayout(); - this.groupBox1.SuspendLayout(); - this.panel5.SuspendLayout(); - this.SuspendLayout(); - // - // panel1 - // - this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(212)))), ((int)(((byte)(204)))), ((int)(((byte)(187))))); - this.panel1.Controls.Add(this.panel3); - this.panel1.Controls.Add(this.panel2); - this.panel1.Location = new System.Drawing.Point(12, 415); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(772, 125); - this.panel1.TabIndex = 0; - // - // panel3 - // - this.panel3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.panel3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(230)))), ((int)(((byte)(217))))); - this.panel3.Controls.Add(this.btnOptions); - this.panel3.Controls.Add(this.btnCheckFiles); - this.panel3.Controls.Add(this.btnStartSRB2); - this.panel3.Location = new System.Drawing.Point(557, 10); - this.panel3.Name = "panel3"; - this.panel3.Size = new System.Drawing.Size(204, 104); - this.panel3.TabIndex = 1; - // - // btnOptions - // - this.btnOptions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.btnOptions.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.btnOptions.Location = new System.Drawing.Point(105, 72); - this.btnOptions.Name = "btnOptions"; - this.btnOptions.Size = new System.Drawing.Size(96, 29); - this.btnOptions.TabIndex = 2; - this.btnOptions.Text = "Options"; - this.btnOptions.UseVisualStyleBackColor = true; - this.btnOptions.Click += new System.EventHandler(this.btnOptions_Click); - // - // btnCheckFiles - // - this.btnCheckFiles.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.btnCheckFiles.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.btnCheckFiles.Location = new System.Drawing.Point(4, 72); - this.btnCheckFiles.Name = "btnCheckFiles"; - this.btnCheckFiles.Size = new System.Drawing.Size(96, 29); - this.btnCheckFiles.TabIndex = 1; - this.btnCheckFiles.Text = "Check Files"; - this.btnCheckFiles.UseVisualStyleBackColor = true; - this.btnCheckFiles.Click += new System.EventHandler(this.update_Load); - // - // btnStartSRB2 - // - this.btnStartSRB2.BackColor = System.Drawing.Color.Transparent; - this.btnStartSRB2.Font = new System.Drawing.Font("Arial Rounded MT Bold", 20.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.btnStartSRB2.Location = new System.Drawing.Point(4, 4); - this.btnStartSRB2.Name = "btnStartSRB2"; - this.btnStartSRB2.Size = new System.Drawing.Size(197, 62); - this.btnStartSRB2.TabIndex = 0; - this.btnStartSRB2.Text = "Start"; - this.btnStartSRB2.UseVisualStyleBackColor = false; - this.btnStartSRB2.Click += new System.EventHandler(this.btnStartSRB2_Click); - // - // panel2 - // - this.panel2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.panel2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(230)))), ((int)(((byte)(217))))); - this.panel2.Controls.Add(this.lblProgress); - this.panel2.Controls.Add(this.update_optional); - this.panel2.Controls.Add(this.progress_overall); - this.panel2.Controls.Add(this.progress_currentFile); - this.panel2.Location = new System.Drawing.Point(10, 10); - this.panel2.Name = "panel2"; - this.panel2.Size = new System.Drawing.Size(541, 105); - this.panel2.TabIndex = 0; - // - // lblProgress - // - this.lblProgress.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.lblProgress.AutoSize = true; - this.lblProgress.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblProgress.ForeColor = System.Drawing.Color.Black; - this.lblProgress.Location = new System.Drawing.Point(6, 68); - this.lblProgress.Name = "lblProgress"; - this.lblProgress.Size = new System.Drawing.Size(299, 14); - this.lblProgress.TabIndex = 14; - this.lblProgress.Text = "Click \'Check Files\' to check for and apply updates."; - // - // update_optional - // - this.update_optional.AutoSize = true; - this.update_optional.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.update_optional.Location = new System.Drawing.Point(372, 68); - this.update_optional.Name = "update_optional"; - this.update_optional.Size = new System.Drawing.Size(160, 18); - this.update_optional.TabIndex = 13; - this.update_optional.Text = "Download Optional Updates"; - this.update_optional.UseVisualStyleBackColor = true; - // - // progress_overall - // - this.progress_overall.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.progress_overall.Location = new System.Drawing.Point(9, 36); - this.progress_overall.Name = "progress_overall"; - this.progress_overall.Size = new System.Drawing.Size(522, 26); - this.progress_overall.TabIndex = 1; - // - // progress_currentFile - // - this.progress_currentFile.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.progress_currentFile.Location = new System.Drawing.Point(9, 4); - this.progress_currentFile.Name = "progress_currentFile"; - this.progress_currentFile.Size = new System.Drawing.Size(522, 26); - this.progress_currentFile.TabIndex = 0; - // - // tab_web - // - this.tab_web.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tab_web.Controls.Add(this.tabPage1); - this.tab_web.Controls.Add(this.tabPage2); - this.tab_web.Controls.Add(this.tabPage3); - this.tab_web.Controls.Add(this.serverTab); - this.tab_web.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9F); - this.tab_web.Location = new System.Drawing.Point(0, 138); - this.tab_web.Name = "tab_web"; - this.tab_web.SelectedIndex = 0; - this.tab_web.Size = new System.Drawing.Size(770, 256); - this.tab_web.TabIndex = 1; - // - // tabPage1 - // - this.tabPage1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(212)))), ((int)(((byte)(204)))), ((int)(((byte)(187))))); - this.tabPage1.Controls.Add(this.panel10); - this.tabPage1.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.tabPage1.Location = new System.Drawing.Point(4, 23); - this.tabPage1.Name = "tabPage1"; - this.tabPage1.Padding = new System.Windows.Forms.Padding(3); - this.tabPage1.Size = new System.Drawing.Size(762, 229); - this.tabPage1.TabIndex = 0; - this.tabPage1.Text = "News & Updates"; - // - // panel10 - // - this.panel10.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(230)))), ((int)(((byte)(217))))); - this.panel10.Controls.Add(this.webBrowser3); - this.panel10.Location = new System.Drawing.Point(4, 6); - this.panel10.Name = "panel10"; - this.panel10.Padding = new System.Windows.Forms.Padding(5); - this.panel10.Size = new System.Drawing.Size(748, 217); - this.panel10.TabIndex = 14; - // - // webBrowser3 - // - this.webBrowser3.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.webBrowser3.Location = new System.Drawing.Point(8, 8); - this.webBrowser3.MinimumSize = new System.Drawing.Size(20, 20); - this.webBrowser3.Name = "webBrowser3"; - this.webBrowser3.Size = new System.Drawing.Size(732, 201); - this.webBrowser3.TabIndex = 0; - this.webBrowser3.Url = new System.Uri("http://update.srb2.org/files_beta/files_beta.xml", System.UriKind.Absolute); - // - // tabPage2 - // - this.tabPage2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(212)))), ((int)(((byte)(204)))), ((int)(((byte)(187))))); - this.tabPage2.Controls.Add(this.panel9); - this.tabPage2.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9F); - this.tabPage2.Location = new System.Drawing.Point(4, 23); - this.tabPage2.Name = "tabPage2"; - this.tabPage2.Padding = new System.Windows.Forms.Padding(3); - this.tabPage2.Size = new System.Drawing.Size(762, 229); - this.tabPage2.TabIndex = 1; - this.tabPage2.Text = "Change Log"; - // - // panel9 - // - this.panel9.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(230)))), ((int)(((byte)(217))))); - this.panel9.Controls.Add(this.webBrowser1); - this.panel9.Location = new System.Drawing.Point(4, 6); - this.panel9.Name = "panel9"; - this.panel9.Padding = new System.Windows.Forms.Padding(5); - this.panel9.Size = new System.Drawing.Size(748, 217); - this.panel9.TabIndex = 13; - // - // webBrowser1 - // - this.webBrowser1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.webBrowser1.Location = new System.Drawing.Point(8, 8); - this.webBrowser1.MinimumSize = new System.Drawing.Size(20, 20); - this.webBrowser1.Name = "webBrowser1"; - this.webBrowser1.Size = new System.Drawing.Size(732, 201); - this.webBrowser1.TabIndex = 0; - this.webBrowser1.Url = new System.Uri("http://update.srb2.org/files_beta/changelog.html", System.UriKind.Absolute); - // - // tabPage3 - // - this.tabPage3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(212)))), ((int)(((byte)(204)))), ((int)(((byte)(187))))); - this.tabPage3.Controls.Add(this.panel8); - this.tabPage3.Location = new System.Drawing.Point(4, 23); - this.tabPage3.Name = "tabPage3"; - this.tabPage3.Padding = new System.Windows.Forms.Padding(3); - this.tabPage3.Size = new System.Drawing.Size(762, 229); - this.tabPage3.TabIndex = 2; - this.tabPage3.Text = "Download List"; - // - // panel8 - // - this.panel8.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(230)))), ((int)(((byte)(217))))); - this.panel8.Controls.Add(this.fileList); - this.panel8.Location = new System.Drawing.Point(4, 6); - this.panel8.Name = "panel8"; - this.panel8.Padding = new System.Windows.Forms.Padding(5); - this.panel8.Size = new System.Drawing.Size(748, 217); - this.panel8.TabIndex = 12; - // - // fileList - // - this.fileList.AllowUserToAddRows = false; - this.fileList.AllowUserToDeleteRows = false; - this.fileList.AllowUserToResizeRows = false; - dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(212)))), ((int)(((byte)(204)))), ((int)(((byte)(187))))); - dataGridViewCellStyle1.Font = new System.Drawing.Font("Arial Rounded MT Bold", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle1.ForeColor = System.Drawing.Color.Black; - dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(212)))), ((int)(((byte)(204)))), ((int)(((byte)(187))))); - dataGridViewCellStyle1.SelectionForeColor = System.Drawing.Color.Black; - this.fileList.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1; - this.fileList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.fileList.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; - this.fileList.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(224)))), ((int)(((byte)(206))))); - this.fileList.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; - dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(212)))), ((int)(((byte)(204)))), ((int)(((byte)(187))))); - dataGridViewCellStyle2.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9F); - dataGridViewCellStyle2.ForeColor = System.Drawing.Color.Black; - dataGridViewCellStyle2.Padding = new System.Windows.Forms.Padding(2); - dataGridViewCellStyle2.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(212)))), ((int)(((byte)(204)))), ((int)(((byte)(187))))); - dataGridViewCellStyle2.SelectionForeColor = System.Drawing.Color.Black; - dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this.fileList.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle2; - this.fileList.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.fileList.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { - this.name, - this.filename, - this.status, - this.localmd5, - this.md5, - this.optional, - this.calculated}); - dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(224)))), ((int)(((byte)(206))))); - dataGridViewCellStyle4.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9F); - dataGridViewCellStyle4.ForeColor = System.Drawing.SystemColors.ControlText; - dataGridViewCellStyle4.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(224)))), ((int)(((byte)(206))))); - dataGridViewCellStyle4.SelectionForeColor = System.Drawing.Color.Black; - dataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.False; - this.fileList.DefaultCellStyle = dataGridViewCellStyle4; - this.fileList.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(212)))), ((int)(((byte)(204)))), ((int)(((byte)(187))))); - this.fileList.Location = new System.Drawing.Point(8, 8); - this.fileList.MultiSelect = false; - this.fileList.Name = "fileList"; - this.fileList.ReadOnly = true; - dataGridViewCellStyle5.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(224)))), ((int)(((byte)(206))))); - dataGridViewCellStyle5.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9F); - dataGridViewCellStyle5.ForeColor = System.Drawing.SystemColors.WindowText; - dataGridViewCellStyle5.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(224)))), ((int)(((byte)(206))))); - dataGridViewCellStyle5.SelectionForeColor = System.Drawing.Color.Black; - dataGridViewCellStyle5.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this.fileList.RowHeadersDefaultCellStyle = dataGridViewCellStyle5; - this.fileList.RowHeadersVisible = false; - dataGridViewCellStyle6.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(224)))), ((int)(((byte)(206))))); - dataGridViewCellStyle6.ForeColor = System.Drawing.Color.Black; - dataGridViewCellStyle6.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(224)))), ((int)(((byte)(206))))); - dataGridViewCellStyle6.SelectionForeColor = System.Drawing.Color.Black; - this.fileList.RowsDefaultCellStyle = dataGridViewCellStyle6; - this.fileList.RowTemplate.DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(224)))), ((int)(((byte)(206))))); - this.fileList.RowTemplate.DefaultCellStyle.Font = new System.Drawing.Font("Arial", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.fileList.RowTemplate.DefaultCellStyle.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(224)))), ((int)(((byte)(206))))); - this.fileList.RowTemplate.DefaultCellStyle.SelectionForeColor = System.Drawing.Color.Black; - this.fileList.RowTemplate.ReadOnly = true; - this.fileList.Size = new System.Drawing.Size(732, 201); - this.fileList.TabIndex = 11; - // - // name - // - this.name.DataPropertyName = "name"; - dataGridViewCellStyle3.BackColor = System.Drawing.Color.White; - this.name.DefaultCellStyle = dataGridViewCellStyle3; - this.name.FillWeight = 128.7982F; - this.name.HeaderText = "Name"; - this.name.Name = "name"; - this.name.ReadOnly = true; - // - // filename - // - this.filename.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None; - this.filename.DataPropertyName = "filename"; - this.filename.HeaderText = "File"; - this.filename.Name = "filename"; - this.filename.ReadOnly = true; - this.filename.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; - this.filename.Width = 150; - // - // status - // - this.status.DataPropertyName = "status"; - this.status.FillWeight = 128.7982F; - this.status.HeaderText = "Status"; - this.status.Name = "status"; - this.status.ReadOnly = true; - // - // localmd5 - // - this.localmd5.DataPropertyName = "localmd5"; - this.localmd5.FillWeight = 13.60544F; - this.localmd5.HeaderText = "localmd5"; - this.localmd5.Name = "localmd5"; - this.localmd5.ReadOnly = true; - this.localmd5.Visible = false; - // - // md5 - // - this.md5.DataPropertyName = "md5"; - this.md5.FillWeight = 128.7982F; - this.md5.HeaderText = "md5"; - this.md5.Name = "md5"; - this.md5.ReadOnly = true; - this.md5.Visible = false; - // - // optional - // - this.optional.DataPropertyName = "optional"; - this.optional.HeaderText = "optional"; - this.optional.Name = "optional"; - this.optional.ReadOnly = true; - this.optional.Visible = false; - // - // calculated - // - this.calculated.DataPropertyName = "calculated"; - this.calculated.HeaderText = "calculated"; - this.calculated.Name = "calculated"; - this.calculated.ReadOnly = true; - this.calculated.Visible = false; - // - // serverTab - // - this.serverTab.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(212)))), ((int)(((byte)(204)))), ((int)(((byte)(187))))); - this.serverTab.Controls.Add(this.panel6); - this.serverTab.Controls.Add(this.panel4); - this.serverTab.Location = new System.Drawing.Point(4, 23); - this.serverTab.Name = "serverTab"; - this.serverTab.Padding = new System.Windows.Forms.Padding(3); - this.serverTab.Size = new System.Drawing.Size(762, 229); - this.serverTab.TabIndex = 3; - this.serverTab.Text = "Master Server"; - // - // panel6 - // - this.panel6.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(230)))), ((int)(((byte)(217))))); - this.panel6.Controls.Add(this.listViewServers); - this.panel6.Location = new System.Drawing.Point(4, 6); - this.panel6.Name = "panel6"; - this.panel6.Padding = new System.Windows.Forms.Padding(5); - this.panel6.Size = new System.Drawing.Size(603, 217); - this.panel6.TabIndex = 6; - // - // listViewServers - // - this.listViewServers.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewServers.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(224)))), ((int)(((byte)(206))))); - this.listViewServers.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.listViewServers.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.colhdrName, - this.colhdrGametype, - this.colhdrPing, - this.colhdrPlayers, - this.colhdrVersion}); - this.listViewServers.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.listViewServers.FullRowSelect = true; - this.listViewServers.HideSelection = false; - this.listViewServers.Location = new System.Drawing.Point(9, 8); - this.listViewServers.Name = "listViewServers"; - this.listViewServers.ShowItemToolTips = true; - this.listViewServers.Size = new System.Drawing.Size(586, 201); - this.listViewServers.TabIndex = 1; - this.listViewServers.UseCompatibleStateImageBehavior = false; - this.listViewServers.View = System.Windows.Forms.View.Details; - this.listViewServers.ItemActivate += new System.EventHandler(this.listViewServers_ItemActivate); - this.listViewServers.SelectedIndexChanged += new System.EventHandler(this.listViewServers_SelectedIndexChanged); - this.listViewServers.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listViewServers_ColumnClick); - // - // colhdrName - // - this.colhdrName.Tag = ""; - this.colhdrName.Text = "Server Name"; - this.colhdrName.Width = 231; - // - // colhdrGametype - // - this.colhdrGametype.Text = "Gametype"; - this.colhdrGametype.Width = 92; - // - // colhdrPing - // - this.colhdrPing.Text = "Ping (ms)"; - this.colhdrPing.Width = 87; - // - // colhdrPlayers - // - this.colhdrPlayers.Text = "Players"; - this.colhdrPlayers.Width = 88; - // - // colhdrVersion - // - this.colhdrVersion.Text = "Version"; - this.colhdrVersion.Width = 87; - // - // panel4 - // - this.panel4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(230)))), ((int)(((byte)(217))))); - this.panel4.Controls.Add(this.groupBox1); - this.panel4.Controls.Add(this.button1); - this.panel4.Controls.Add(this.button3); - this.panel4.Controls.Add(this.btnConnect); - this.panel4.Location = new System.Drawing.Point(613, 6); - this.panel4.Name = "panel4"; - this.panel4.Padding = new System.Windows.Forms.Padding(5); - this.panel4.Size = new System.Drawing.Size(139, 217); - this.panel4.TabIndex = 5; - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.label4); - this.groupBox1.Controls.Add(this.label3); - this.groupBox1.Controls.Add(this.label2); - this.groupBox1.Controls.Add(this.label1); - this.groupBox1.Location = new System.Drawing.Point(9, 114); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(122, 95); - this.groupBox1.TabIndex = 5; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Key"; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label4.ForeColor = System.Drawing.Color.Black; - this.label4.Location = new System.Drawing.Point(6, 77); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(87, 14); - this.label4.TabIndex = 3; - this.label4.Text = "Normal Game"; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label3.ForeColor = System.Drawing.Color.DimGray; - this.label3.Location = new System.Drawing.Point(6, 57); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(78, 14); - this.label3.TabIndex = 2; - this.label3.Text = "Game is Full"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label2.ForeColor = System.Drawing.Color.Green; - this.label2.Location = new System.Drawing.Point(6, 37); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(99, 14); - this.label2.TabIndex = 1; - this.label2.Text = "Cheats Enabled"; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label1.ForeColor = System.Drawing.Color.Red; - this.label1.Location = new System.Drawing.Point(6, 17); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(57, 14); - this.label1.TabIndex = 0; - this.label1.Text = "Modified"; - // - // button1 - // - this.button1.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9.75F); - this.button1.Location = new System.Drawing.Point(8, 8); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(123, 29); - this.button1.TabIndex = 2; - this.button1.Text = "Refresh List"; - this.button1.UseVisualStyleBackColor = true; - this.button1.Click += new System.EventHandler(this.btnRefresh_Click); - // - // button3 - // - this.button3.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9.75F); - this.button3.Location = new System.Drawing.Point(8, 78); - this.button3.Name = "button3"; - this.button3.Size = new System.Drawing.Size(123, 29); - this.button3.TabIndex = 4; - this.button3.Text = "Join Game (IP)"; - this.button3.UseVisualStyleBackColor = true; - // - // btnConnect - // - this.btnConnect.Enabled = false; - this.btnConnect.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9.75F); - this.btnConnect.Location = new System.Drawing.Point(8, 43); - this.btnConnect.Name = "btnConnect"; - this.btnConnect.Size = new System.Drawing.Size(123, 29); - this.btnConnect.TabIndex = 3; - this.btnConnect.Text = "Join Game (List)"; - this.btnConnect.UseVisualStyleBackColor = true; - this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click); - // - // panel5 - // - this.panel5.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.panel5.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; - this.panel5.Controls.Add(this.tab_web); - this.panel5.Controls.Add(this.bannerRandom); - this.panel5.Location = new System.Drawing.Point(12, 13); - this.panel5.Name = "panel5"; - this.panel5.Size = new System.Drawing.Size(772, 396); - this.panel5.TabIndex = 1; - // - // bannerRandom - // - this.bannerRandom.BackgroundImage = global::SRB2Updater.Properties.Resources.Banner4; - this.bannerRandom.Location = new System.Drawing.Point(0, -2); - this.bannerRandom.Name = "bannerRandom"; - this.bannerRandom.Size = new System.Drawing.Size(768, 123); - this.bannerRandom.TabIndex = 3; - // - // backgroundWorkerQueryServers - // - this.backgroundWorkerQueryServers.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorkerQueryServers_DoWork); - // - // openFileDialog1 - // - this.openFileDialog1.DefaultExt = "exe"; - this.openFileDialog1.Filter = "Executables files|*.exe|All files|*.*"; - // - // webBrowser2 - // - this.webBrowser2.Location = new System.Drawing.Point(8, 8); - this.webBrowser2.MinimumSize = new System.Drawing.Size(20, 20); - this.webBrowser2.Name = "webBrowser2"; - this.webBrowser2.Size = new System.Drawing.Size(567, 201); - this.webBrowser2.TabIndex = 0; - this.webBrowser2.Url = new System.Uri("http://update.srb2.org/files_beta/changelog.html", System.UriKind.Absolute); - // - // Launcher - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(230)))), ((int)(((byte)(217))))); - this.ClientSize = new System.Drawing.Size(796, 552); - this.Controls.Add(this.panel5); - this.Controls.Add(this.panel1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.KeyPreview = true; - this.Name = "Launcher"; - this.Text = "Launcher"; - this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Launcher_FormClosed); - this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Launcher_KeyUp); - this.panel1.ResumeLayout(false); - this.panel3.ResumeLayout(false); - this.panel2.ResumeLayout(false); - this.panel2.PerformLayout(); - this.tab_web.ResumeLayout(false); - this.tabPage1.ResumeLayout(false); - this.panel10.ResumeLayout(false); - this.tabPage2.ResumeLayout(false); - this.panel9.ResumeLayout(false); - this.tabPage3.ResumeLayout(false); - this.panel8.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.fileList)).EndInit(); - this.serverTab.ResumeLayout(false); - this.panel6.ResumeLayout(false); - this.panel4.ResumeLayout(false); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.panel5.ResumeLayout(false); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.Panel panel3; - private System.Windows.Forms.Button btnOptions; - private System.Windows.Forms.Button btnCheckFiles; - private System.Windows.Forms.Button btnStartSRB2; - private System.Windows.Forms.TabControl tab_web; - private System.Windows.Forms.TabPage tabPage1; - private System.Windows.Forms.TabPage tabPage2; - private System.Windows.Forms.Panel panel5; - private System.Windows.Forms.WebBrowser webBrowser1; - private System.Windows.Forms.Panel bannerRandom; - private System.Windows.Forms.ProgressBar progress_overall; - private System.Windows.Forms.ProgressBar progress_currentFile; - private System.Windows.Forms.TabPage tabPage3; - private System.Windows.Forms.DataGridView fileList; - private System.Windows.Forms.CheckBox update_optional; - private System.Windows.Forms.Label lblProgress; - private System.Windows.Forms.DataGridViewTextBoxColumn name; - private System.Windows.Forms.DataGridViewTextBoxColumn filename; - private System.Windows.Forms.DataGridViewTextBoxColumn status; - private System.Windows.Forms.DataGridViewTextBoxColumn localmd5; - private System.Windows.Forms.DataGridViewTextBoxColumn md5; - private System.Windows.Forms.DataGridViewTextBoxColumn optional; - private System.Windows.Forms.DataGridViewTextBoxColumn calculated; - private System.Windows.Forms.TabPage serverTab; - private System.Windows.Forms.ListView listViewServers; - private System.Windows.Forms.ColumnHeader colhdrName; - private System.Windows.Forms.ColumnHeader colhdrGametype; - private System.Windows.Forms.ColumnHeader colhdrPing; - private System.Windows.Forms.ColumnHeader colhdrPlayers; - private System.Windows.Forms.ColumnHeader colhdrVersion; - private System.ComponentModel.BackgroundWorker backgroundWorkerQueryServers; - private System.Windows.Forms.Panel panel4; - private System.Windows.Forms.Button button1; - private System.Windows.Forms.Button button3; - private System.Windows.Forms.Button btnConnect; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.Panel panel6; - private System.Windows.Forms.Panel panel8; - private System.Windows.Forms.Panel panel9; - private System.Windows.Forms.Panel panel10; - private System.Windows.Forms.WebBrowser webBrowser3; - private System.Windows.Forms.WebBrowser webBrowser2; - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label4; - } -} \ No newline at end of file diff --git a/tools/SRB2Updater/Launcher.cs b/tools/SRB2Updater/Launcher.cs deleted file mode 100644 index df2fdf712..000000000 --- a/tools/SRB2Updater/Launcher.cs +++ /dev/null @@ -1,658 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -//using System.Data.OleDb; -using System.Xml; -//using System.Drawing; -using System.Text; -using System.Windows.Forms; -using System.Net; -using System.IO; -using System.Threading; -using System.Security.Cryptography; -//using System.Runtime.InteropServices; -using System.Diagnostics; -using System.Drawing; -using System.Media; - -namespace SRB2Updater -{ - public partial class Launcher : Form - { - private Settings settings = new Settings(); - private Debug debug = new Debug(); - // The thread inside which the download happens - private Thread thrDownload; - private Thread thrTotal; - // The stream of data retrieved from the web server - private Stream strResponse; - // The stream of data that we write to the harddrive - private Stream strLocal; - // The request to the web server for file information - private HttpWebRequest webRequest; - // The response from the web server containing information about the file - private HttpWebResponse webResponse; - // The progress of the download in percentage - private static int PercentProgress; - private static int OverallPercentProgress; - // Overall progress as a percentage - private static Int64 OverallProgress; - // Progress stored, for calculating overall - private static Int64 CurrentProgress; - // Total File Size of entire update - private static Int64 TotalSize; - // The delegate which we will call from the thread to update the form - private delegate void UpdateProgessCallback(Int64 BytesRead, Int64 TotalBytes); - private delegate void OverallProgessCallback(Int64 BytesRead); - // When to pause - bool goPause = false; - // Download Details - string downFile; - // Updating - bool filesGot = false; - bool downloadStatus = false; - bool doneCalculate = false; - string formTitle = "Sonic Robo Blast 2 Launcher"; - bool loadedBat = false; - ProcessStartInfo startinfo = new ProcessStartInfo(); - private ServerQuerier sq; - private string MSFail; - - public Launcher(string[] args) - { - InitializeComponent(); - settings.GetSettings(); - sq = new ServerQuerier(); - ServerInfoListViewAdder silva = new ServerInfoListViewAdder(sq, this); - try - { - sq.SetMasterServer(settings.msAddress, Convert.ToUInt16(settings.msPort)); - } - catch (Exception exception) - { - MSFail = exception.Message; - } - sq.StartListening(silva); - backgroundWorkerQueryServers.RunWorkerAsync(); - foreach (string arg in args) - { - if (arg == "-debug") - { - debug.Show(); - break; - } - } - RandomBanner(); - } - - public string getMD5(string filename) - { - StringBuilder sb = new StringBuilder(); - FileInfo f = new FileInfo(filename); - FileStream fs = f.OpenRead(); - MD5 md5 = new MD5CryptoServiceProvider(); - byte[] hash = md5.ComputeHash(fs); - fs.Close(); - foreach (byte hex in hash) - sb.Append(hex.ToString("x2")); - string md5sum = sb.ToString(); - return md5sum; - } - - public void PlayIt() - { - SoundPlayer player = new SoundPlayer(Properties.Resources.Kotaku); - player.Play(); - } - - public void RandomBanner() - { - Random random = new Random(); - int rand = random.Next(0, 4); - //this.bannerRandom.BackgroundImage = global::SRB2Updater.Properties.Resources.Banner; - switch (rand) - { - case 0: - bannerRandom.BackgroundImage = global::SRB2Updater.Properties.Resources.Banner; - break; - case 1: - bannerRandom.BackgroundImage = global::SRB2Updater.Properties.Resources.Banner2; - break; - case 2: - bannerRandom.BackgroundImage = global::SRB2Updater.Properties.Resources.Banner3; - break; - case 3: - bannerRandom.BackgroundImage = global::SRB2Updater.Properties.Resources.Banner4; - break; - default: - bannerRandom.BackgroundImage = global::SRB2Updater.Properties.Resources.Banner; - break; - } - - debug.strRandom = Convert.ToString(rand); - } - - private void updateList(bool doCalculate) - { - if (filesGot == false) - { - - XmlDataDocument xmlDatadoc = new XmlDataDocument(); - xmlDatadoc.DataSet.ReadXml("http://update.srb2.org/files_beta/files_beta.xml"); - DataSet ds = new DataSet("Files DataSet"); - ds = xmlDatadoc.DataSet; - fileList.DataSource = ds.DefaultViewManager; - fileList.DataMember = "File"; - filesGot = true; - } - if (downloadStatus == false) - { - foreach (DataGridViewRow fileRow in fileList.Rows) - { - if (!File.Exists(fileRow.Cells["filename"].Value.ToString()) && fileRow.Cells["filename"].Value.ToString() != "srb2update.update") - { -// fileRow.DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(192))))); - fileRow.Cells["localmd5"].Value = "not_found"; - } else { - if (fileRow.Cells["filename"].Value.ToString() == "srb2update.update") - fileRow.Cells["localmd5"].Value = getMD5("srb2update.exe"); - else - fileRow.Cells["localmd5"].Value = getMD5(fileRow.Cells["filename"].Value.ToString()); - } - if (fileRow.Cells["localmd5"].Value.ToString() != fileRow.Cells["md5"].Value.ToString()) - { -// if (fileRow.Cells["localmd5"].Value.ToString() != "not_found") -// fileRow.DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(224)))), ((int)(((byte)(206))))); - fileRow.Cells["status"].Value = "Queued"; - - } - else - { - fileRow.Cells["status"].Value = "Up to date"; - } - } - if (doCalculate) - { - thrTotal = new Thread(new ParameterizedThreadStart(CalculateTotalSize)); - thrTotal.Start(0); - } - if (doneCalculate) - { - foreach (DataGridViewRow fileRow in fileList.Rows) - { - if (fileRow.Cells["localmd5"].Value.ToString() != fileRow.Cells["md5"].Value.ToString()) - { - if (fileRow.Cells["optional"].Value.ToString() == "1" && !update_optional.Checked) - fileRow.Cells["Status"].Value = "Skipped (Optional)"; - else - { - downFile = fileRow.Cells["filename"].Value.ToString(); - thrDownload = new Thread(new ParameterizedThreadStart(Download)); - thrDownload.Start(0); - fileRow.Cells["Status"].Value = "Downloading..."; - downloadStatus = true; - break; - } - } - else - { - fileRow.Cells["Status"].Value = "Up to date"; - } - CurrentProgress = 0; - } - } - } - } - - private void UpdateProgress(Int64 BytesRead, Int64 TotalBytes) - { - // Calculate the download progress in percentages - PercentProgress = Convert.ToInt32((BytesRead * 100) / TotalBytes); - // Make progress on the progress bar - progress_currentFile.Value = PercentProgress; - // Display the current progress on the form - lblProgress.Text = downFile + " - " + (BytesRead / 1024) + "KB of " + (TotalBytes / 1024) + "KB (" + PercentProgress + "%)"; - this.Text = formTitle + " :: Downloading " + downFile + " (" + PercentProgress + "%)"; - debug.strPercent = PercentProgress.ToString() + "%"; - if (BytesRead >= TotalBytes - 1) - updateList(false); - } - - private void UpdateOverallProgress(Int64 BytesRead) - { - // Calculate progress change and add to OverallProgress... - OverallProgress += BytesRead - CurrentProgress; - // Calculate the download progress in percentages - if (TotalSize < 1) - TotalSize = 1; - OverallPercentProgress = Convert.ToInt32((OverallProgress * 100) / TotalSize); - // Make progress on the progress bar - if (OverallPercentProgress > 100) - OverallPercentProgress = 100; - progress_overall.Value = OverallPercentProgress; - if (OverallProgress >= TotalSize) - { - lblProgress.Text = "Done"; - btnCheckFiles.Enabled = true; - } - CurrentProgress = BytesRead; - debug.strCurrent = Convert.ToString(CurrentProgress) + " bytes"; - debug.strOverall = Convert.ToString(OverallProgress) + " bytes"; - debug.strOverallPercentage = Convert.ToString(OverallPercentProgress) + "%"; - debug.strRead = Convert.ToString(BytesRead) + " bytes"; - debug.strTotal = Convert.ToString(TotalSize) + " bytes"; - } - - private void CalculateTotalSize(object startpoint) - { - foreach (DataGridViewRow fileRow in fileList.Rows) - { - if ((fileRow.Cells["optional"].Value.ToString() == "0" || update_optional.Checked) && fileRow.Cells["localmd5"].Value.ToString() != fileRow.Cells["md5"].Value.ToString()) - { - try - { - // Create a request to the file we are downloading - webRequest = (HttpWebRequest)WebRequest.Create("http://update.srb2.org/files_beta/" + fileRow.Cells["filename"].Value.ToString()); - // Set the starting point of the request - webRequest.AddRange(0); - - // Set default authentication for retrieving the file - webRequest.Credentials = CredentialCache.DefaultCredentials; - // Retrieve the response from the server - webResponse = (HttpWebResponse)webRequest.GetResponse(); - // Ask the server for the file size and store it - Int64 fileSize = webResponse.ContentLength; - TotalSize = TotalSize + fileSize; - } - finally - { - // When the above code has ended, close the streams - webResponse.Close(); - } - } - } - doneCalculate = true; - updateList(false); - } - - private void Download(object startpoint) - { - try - { - string filename = Convert.ToString(startpoint); - // Create a request to the file we are downloading - webRequest = (HttpWebRequest)WebRequest.Create("http://update.srb2.org/files_beta/" + downFile); - // Set the starting point of the request - webRequest.AddRange(0); - - // Set default authentication for retrieving the file - webRequest.Credentials = CredentialCache.DefaultCredentials; - // Retrieve the response from the server - webResponse = (HttpWebResponse)webRequest.GetResponse(); - // Ask the server for the file size and store it - Int64 fileSize = webResponse.ContentLength; - - // Open the URL for download - strResponse = webResponse.GetResponseStream(); - - // Create a new file stream where we will be saving the data (local drive) - strLocal = new FileStream(downFile, FileMode.Create, FileAccess.Write, FileShare.None); - // It will store the current number of bytes we retrieved from the server - int bytesSize = 0; - // A buffer for storing and writing the data retrieved from the server - byte[] downBuffer = new byte[2048]; - - // Loop through the buffer until the buffer is empty - while ((bytesSize = strResponse.Read(downBuffer, 0, downBuffer.Length)) > 0) - { - // Write the data from the buffer to the local hard drive - strLocal.Write(downBuffer, 0, bytesSize); - // Invoke the method that updates the form's label and progress bar - this.Invoke(new UpdateProgessCallback(this.UpdateProgress), new object[] { strLocal.Length, fileSize }); - this.Invoke(new OverallProgessCallback(this.UpdateOverallProgress), new object[] { strLocal.Length }); - - if (goPause == true) - { - break; - } - } - } - finally - { - // When the above code has ended, close the streams - strResponse.Close(); - strLocal.Close(); - // And update the row! - downloadStatus = false; - if (downFile == "srb2update.update" && loadedBat != true) - { - MessageBox.Show("The updater will now restart to apply a patch.", "Self Update", MessageBoxButtons.OK); - CreateUpdaterBat(); - startinfo.WindowStyle = ProcessWindowStyle.Hidden; - startinfo.FileName = "srb2update.bat"; - System.Diagnostics.Process.Start(startinfo); - downloadStatus = false; - Environment.Exit(0); - } else - updateList(false); - } - } - - private void CreateUpdaterBat() - { - File.WriteAllText("srb2update.bat", "ping 127.0.0.1\ncopy srb2update.update srb2update.exe\ndel srb2update.update\nsrb2update.exe\nexit"); - } - - - private void update_Load(object sender, EventArgs e) - { - lblProgress.Text = "Getting File List..."; - if (File.Exists("srb2update.bat")) - File.Delete("srb2update.bat"); - TotalSize = 0; - CurrentProgress = 0; - OverallPercentProgress = 0; - OverallProgress = 0; - btnCheckFiles.Enabled = false; - updateList(true); - } - - private void btnOptions_Click(object sender, EventArgs e) - { - new Options(settings).ShowDialog(); - } - - private class ServerInfoListViewAdder : ServerQuerier.ServerInfoReceiveHandler - { - private delegate ListViewItem AddToListCallback(ListViewItem lvi); - private Launcher form1; - private Dictionary dicGametypes = new Dictionary(); - private static Dictionary> dicDefaultFiles = - new Dictionary>(); - - static ServerInfoListViewAdder() - { - dicDefaultFiles.Add( - ServerQuerier.ServerInfoVer.SIV_PREME, - new List( - new string[] { - "srb2.srb", "sonic.plr", "tails.plr", "knux.plr", - "auto.wpn", "bomb.wpn", "home.wpn", "rail.wpn", "infn.wpn", - "drill.dta", "soar.dta", "music.dta" - }) - ); - - dicDefaultFiles.Add( - ServerQuerier.ServerInfoVer.SIV_ME, - new List( - new string[] { - "srb2.wad", "sonic.plr", "tails.plr", "knux.plr", - "rings.wpn", "drill.dta", "soar.dta", "music.dta" - }) - ); - } - - - public ServerInfoListViewAdder(ServerQuerier sq, Launcher form1) - : base(sq) - { - this.form1 = form1; - - // Gametypes. - dicGametypes.Add(0, "Co-op"); - dicGametypes.Add(1, "Match"); - dicGametypes.Add(2, "Race"); - dicGametypes.Add(3, "Tag"); - dicGametypes.Add(4, "CTF"); - dicGametypes.Add(5, "Chaos"); - - // Don't think these are actually used. - dicGametypes.Add(42, "Team Match"); - dicGametypes.Add(43, "Time-Only Race"); - } - - public override void ProcessServerInfo(ServerQuerier.SRB2ServerInfo srb2si) - { - ListView lv = form1.listViewServers; - - // Build a list item. - ListViewItem lvi = new ListViewItem(srb2si.strName); - - // So we can get address and whatever else we might need. - lvi.Tag = srb2si; - - // Gametype string, or number if not recognised. - if (dicGametypes.ContainsKey(srb2si.byGametype)) - lvi.SubItems.Add(dicGametypes[srb2si.byGametype]); - else - lvi.SubItems.Add(Convert.ToString(srb2si.byGametype)); - - lvi.SubItems.Add(Convert.ToString(srb2si.uiTime)); - lvi.SubItems.Add(srb2si.byPlayers + "/" + srb2si.byMaxplayers); - lvi.SubItems.Add(srb2si.strVersion); - - // Make the tooltip. - BuildTooltip(lvi, form1.settings.ShowDefaultWads); - - // Is the game full? - if (srb2si.byPlayers >= srb2si.byMaxplayers) - lvi.ForeColor = Color.DimGray; - // Modified? - else if (srb2si.bModified) - lvi.ForeColor = Color.Red; - - // Thread-safe goodness. - if (lv.InvokeRequired) - { - // Call ourselves in the context of the form's thread. - AddToListCallback addtolistcallback = new AddToListCallback(lv.Items.Add); - lv.Invoke(addtolistcallback, new object[] { lvi }); - } - else - { - // Add it! - lv.Items.Add(lvi); - } - - } - - public override void HandleException(Exception e) - { - - } - - public static void BuildTooltip(ListViewItem lvi, bool bShowDefaultWads) - { - string strWads = String.Empty; - ServerQuerier.SRB2ServerInfo srb2si = (ServerQuerier.SRB2ServerInfo)lvi.Tag; - - foreach (ServerQuerier.AddedWad aw in srb2si.listFiles) - { - List listDefaultFiles = dicDefaultFiles[srb2si.siv]; - - if (bShowDefaultWads || !listDefaultFiles.Contains(aw.strFilename)) - { - strWads += String.Format("\n{0} ({1:f1} KB)", aw.strFilename, Convert.ToSingle(aw.uiSize) / 1024); - if (aw.bImportant) - { - if (aw.downloadtype == ServerQuerier.DownloadTypes.DT_TOOBIG) - strWads += " (too big to download)"; - else if (aw.downloadtype == ServerQuerier.DownloadTypes.DT_DISABLED) - strWads += " (downloading disabled)"; - } - else strWads += " (unimportant)"; - } - } - - lvi.ToolTipText = "Current map: " + srb2si.strMapName + "\n"; - if (strWads != String.Empty) - lvi.ToolTipText += "Wads added:" + strWads; - else lvi.ToolTipText += "No wads added"; - } - } - - private void backgroundWorkerQueryServers_DoWork(object sender, DoWorkEventArgs e) - { - MSClient msclient = new MSClient(); - - try - { - List listServers = msclient.GetServerList(settings.msAddress, Convert.ToUInt16(settings.msPort)); - - - // Query each of the individual servers asynchronously. - foreach (MSServerEntry msse in listServers) - { - sq.Query(msse.strAddress, msse.unPort); - } - } - catch (System.Net.Sockets.SocketException sockexception) - { - MSFail = sockexception.Message; - } - catch (Exception exception) - { - MSFail = exception.Message; - } - } - - private void btnRefresh_Click(object sender, EventArgs e) - { - if (!backgroundWorkerQueryServers.IsBusy) - { - // Clear the server list. - listViewServers.Items.Clear(); - - // Disable the Connect button. - btnConnect.Enabled = false; - - // Query the MS and the individual servers in another thread. - backgroundWorkerQueryServers.RunWorkerAsync(); - } - } - - private void btnConnect_Click(object sender, EventArgs e) - { - if (listViewServers.SelectedItems.Count > 0) - { - ConnectToServerFromListItem(listViewServers.SelectedItems[0]); - } - } - - private void ConnectToServerFromListItem(ListViewItem lvi) - { - ServerQuerier.SRB2ServerInfo srb2si = (ServerQuerier.SRB2ServerInfo)lvi.Tag; - - // Prompt to get a binary if we need one. - if (!settings.HasBinaryForVersion(srb2si.strVersion) && - MessageBox.Show("To join this game, you must register an executable file for version " + srb2si.strVersion + ". Would you like to do so?", Text, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes && - openFileDialog1.ShowDialog() == DialogResult.OK) - { - settings.SetBinary(srb2si.strVersion, openFileDialog1.FileName); - settings.SaveSettings(); - } - - // Go! - ConnectToServer(srb2si.strAddress, srb2si.unPort, srb2si.strVersion); - } - - private void ConnectToServer(string strAddress, ushort unPort, string strVersion) - { - // Make sure we now have a binary. - if (settings.HasBinaryForVersion(strVersion)) - { - try - { - string strBinary = settings.GetBinary(strVersion); - string strDirectory = System.IO.Path.GetDirectoryName(strBinary); - if (strDirectory != String.Empty) - System.IO.Directory.SetCurrentDirectory(strDirectory); - System.Diagnostics.Process.Start(strBinary, System.String.Format("-connect {0}:{1} {2}", strAddress, unPort, settings.Params)).Close(); - if (settings.CloseOnStart) - Environment.Exit(0); - } - catch (Exception exception) - { - MessageBox.Show("Unable to start SRB2: " + exception.Message + ".", "SRB2 MS Launcher", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - } - - private class ListViewSorter : System.Collections.IComparer - { - private int iColumn; - public int Column { get { return iColumn; } } - public SortOrder so; - - public ListViewSorter(int iColumn) - { - this.iColumn = iColumn; - so = SortOrder.Ascending; - } - - public int Compare(object x, object y) - { - ListViewItem lviX = (ListViewItem)x; - ListViewItem lviY = (ListViewItem)y; - - return ((so == SortOrder.Ascending) ? 1 : -1) * String.Compare(lviX.SubItems[iColumn].Text, lviY.SubItems[iColumn].Text); - } - - public void ToggleSortOrder() - { - if (so != SortOrder.Ascending) - so = SortOrder.Ascending; - else - so = SortOrder.Descending; - } - } - - private void listViewServers_ColumnClick(object sender, ColumnClickEventArgs e) - { - if (listViewServers.ListViewItemSorter != null && - ((ListViewSorter)listViewServers.ListViewItemSorter).Column == e.Column) - { - ((ListViewSorter)listViewServers.ListViewItemSorter).ToggleSortOrder(); - listViewServers.Sort(); - } - else - { - listViewServers.ListViewItemSorter = new ListViewSorter(e.Column); - } - } - - private void listViewServers_SelectedIndexChanged(object sender, EventArgs e) - { - btnConnect.Enabled = (listViewServers.SelectedItems.Count > 0); - } - - private void listViewServers_ItemActivate(object sender, EventArgs e) - { - ConnectToServerFromListItem(listViewServers.SelectedItems[0]); - } - - private void Launcher_FormClosed(object sender, FormClosedEventArgs e) - { - Environment.Exit(0); - } - - private Bunny sequence = new Bunny(); - - private void Launcher_KeyUp(object sender, KeyEventArgs e) - { - if (sequence.IsCompletedBy(e.KeyCode)) - { - PlayIt(); - } - debug.strKonami = Convert.ToString(sequence.Position); - } - - private void btnStartSRB2_Click(object sender, EventArgs e) - { - System.Diagnostics.Process.Start("srb2win.exe", System.String.Format("{0}", settings.Params)).Close(); - if(settings.CloseOnStart) - Environment.Exit(0); - } - } -} diff --git a/tools/SRB2Updater/Launcher.resx b/tools/SRB2Updater/Launcher.resx deleted file mode 100644 index 464d72c21..000000000 --- a/tools/SRB2Updater/Launcher.resx +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - 17, 17 - - - 585, 17 - - - - - AAABAAEAICAAAAEACACoCAAAFgAAACgAAAAgAAAAQAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAADg4OAIAAAABQABkAlgAAALkAAABQGQAAcwAlAJYAMQBzJQAAuQA9AJYxAACWAGIAMjIyALk9 - AAD/JSUAPj4+AFZWVgD/SEgAYmJiAABilgBubm4Aenp6AP9rawCAgIAAhoaGAJKSkgD/jo4Anp6eAKSg - oAD/jqsAqqqqAGuP/wC2trYAwMDAAI6r/wDCwsIAa8b/AM7OzgCO1P8A2traAObm5gDy8vIA////AAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQ8PHQAAAAAAAAAAAAAAACMgJSUlJSUZ - AAAAABMNBgoPDw8AAAAAAAAAAAAAACInJycnJycnJyclFgYGBggPDw8PDwAAAAAAAAAAAAAjJycnJycn - JycnGScnFQkGCA8PDw8AAAAAAAAAAAAAISMnJycjIyMjJycnJycVDwYGDw8PDwAAAAAAAAAAAAAQAAEj - HygqKSkkHyMnJwoPDwYJDw8PAAAAAAAAAAAAACkTHxwrKysrKysrGhkMDw8PCwYJDw8AAAAAAAAAACkp - JA0pACkrKysrKyspDw8PDw8PAwYIAAAAAAAAAAAAACsiARwAISsrKysrKysSDw8PDw8PAwYAAAAAAAAA - AAAAKyIAEAAfKysrKysrKxcPDw8PDw8PDwgIABYAABcSCAArKAMPACIrKysrKysrGw8PDw8PDw8PDw8P - Dw8PDw8RACsoBA8EISsrKysrKyseDw8PDw8PDw8PDw8PDw8PDwAAKx8PDw8VKSsrKysrKxcPDw8PDw8P - Dw8PDw8PDw8AACooFQ8PDw8aKCsrKysmDw8PDw8PDw8PDw8PDw8PFQAAAAAKDw8PDw8VIigoIgoPDw8P - Dw8PDw8PDw8PDxEAAAAAAAoPDw8PDw8XFxcXEhIPDwUPDw8PDw8PDw8YAAAAAAAACA8PDw8SFxcXFxcX - FxcPFQ8PDw8PDw8KAAAAAAAAAAAACg8PEhcXFxcXFxcXFxkjBRISEhISGAAAAAAAAAAAIRcXCA8XFxcX - FxcXFxcaJyMFDwoLEQAAAAAAAAAAAAAAFxcSDxIXFxcXFxcSEyAlIwILCwsIAAAAAAAAAAAAABcXEg8A - EhIXFxcXEgoPDBUUBwsLCwsLAAAAAAAAAAAAFxcAAAAAFxIXFxcXFxIKDw8ICwsLDg4LAAAAAAAAAAAA - AAAAAAAAABISFxcXFw8PDw8PDw8PDwAAAAAAAAAAAAAAAAAAAAAAAAASEhcSDw8PDw8PDxIAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAFwoSDw8SFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///////////////////3////w//APAf/AAAH/gAAD/wAAA/8AAAP/AAAD/AAAB/4AA - Af+AAABYgAAAAIAAAAGAAAADAAAAA8AAAAfAAAAPwAAAP+AAAH+AAAH/wAAB/4QAAP+eAAB//4AA///g - Af//+A////////////////// - - - \ No newline at end of file diff --git a/tools/SRB2Updater/MSClient.cs b/tools/SRB2Updater/MSClient.cs deleted file mode 100644 index 40cb0d984..000000000 --- a/tools/SRB2Updater/MSClient.cs +++ /dev/null @@ -1,121 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Net.Sockets; -using System.Net; -using System.IO; - -namespace SRB2Updater -{ - class MSClient - { - private Socket socket; - - /// - /// Constructs an MS client object. - /// - public MSClient() - { - socket = new Socket( - AddressFamily.InterNetwork, - SocketType.Stream, - ProtocolType.IP); - } - - /// - /// Gets list of servers reported by the MS. - /// - /// Hostname or IP address of MS. - /// Port of MS. - /// List of running servers. - public List GetServerList(string strAddress, ushort unPort) - { - // Resolve the address if necessary. - IPHostEntry iphe = Dns.GetHostEntry(strAddress); - - int iIPIndex = 0; - while (iIPIndex < iphe.AddressList.Length && - iphe.AddressList[iIPIndex].AddressFamily != socket.AddressFamily) - { - iIPIndex++; - } - - // No addresses from our family? - if (iIPIndex >= iphe.AddressList.Length) - throw new SocketException((int)SocketError.HostNotFound); - - socket.Connect(iphe.AddressList[iIPIndex], unPort); - - // Send a request for the short server list. - byte[] byPacket = new byte[12]; - BinaryWriter bw = new BinaryWriter(new MemoryStream(byPacket)); - bw.Write((uint)0); // Unused - bw.Write((uint)IPAddress.HostToNetworkOrder(205)); // GET_SHORT_SERVER_MSG - bw.Write((uint)0); // Length of tail. - socket.Send(byPacket); - - List listServers = new List(); - - // Don't sit and wait for ever. - socket.ReceiveTimeout = 10000; - - // Keep reading packets. We break if we receive the sentinel end-packet. - byte[] byServer = new byte[12 + 80]; - while (true) - { - int iLen = socket.Receive(byServer); - BinaryReader br = new BinaryReader(new MemoryStream(byServer)); - - // Ignore the first eight bytes. - br.ReadInt64(); - - // Is that the list finished? - int iTailLen = IPAddress.NetworkToHostOrder(br.ReadInt32()); - if (iTailLen == 0) - break; - else if (iTailLen != iLen - 12) - { - // MS is in a bad mood. - //throw new Exception("Bad packet."); - break; - } - - // Otherwise, add the server to the list. - MSServerEntry msse = new MSServerEntry(); - - br.ReadBytes(16); // Skip. - msse.strAddress = Encoding.ASCII.GetString(br.ReadBytes(16)); - - string str = Encoding.ASCII.GetString(br.ReadBytes(8)); - int iPos = str.IndexOf("\0"); - if (iPos >= 0) - str = str.Remove(iPos); - msse.unPort = Convert.ToUInt16(str); - - msse.strName = Encoding.ASCII.GetString(br.ReadBytes(32)); - iPos = msse.strName.IndexOf("\0"); - if (iPos >= 0) - msse.strName = msse.strName.Remove(iPos); - - msse.strVersion = Encoding.ASCII.GetString(br.ReadBytes(8)); - iPos = msse.strVersion.IndexOf("\0"); - if (iPos >= 0) - msse.strVersion = msse.strVersion.Remove(iPos); - - listServers.Add(msse); - } - - return listServers; - } - } - - public struct MSServerEntry - { - public string strAddress; - public ushort unPort; - public string strName; - public string strVersion; - public bool bPermanent; - } - -} diff --git a/tools/SRB2Updater/Options.Designer.cs b/tools/SRB2Updater/Options.Designer.cs deleted file mode 100644 index 01234549d..000000000 --- a/tools/SRB2Updater/Options.Designer.cs +++ /dev/null @@ -1,628 +0,0 @@ -namespace SRB2Updater -{ - partial class Options - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Options)); - this.groupDisplay = new System.Windows.Forms.GroupBox(); - this.label2 = new System.Windows.Forms.Label(); - this.txtHeight = new System.Windows.Forms.TextBox(); - this.label1 = new System.Windows.Forms.Label(); - this.txtWidth = new System.Windows.Forms.TextBox(); - this.chkCustomResolution = new System.Windows.Forms.CheckBox(); - this.chkDisplayWindowed = new System.Windows.Forms.CheckBox(); - this.panel1 = new System.Windows.Forms.Panel(); - this.btnCancel = new System.Windows.Forms.Button(); - this.btnSave = new System.Windows.Forms.Button(); - this.panel2 = new System.Windows.Forms.Panel(); - this.groupMS = new System.Windows.Forms.GroupBox(); - this.label4 = new System.Windows.Forms.Label(); - this.txtMSPort = new System.Windows.Forms.TextBox(); - this.label3 = new System.Windows.Forms.Label(); - this.txtMSAddress = new System.Windows.Forms.TextBox(); - this.panel3 = new System.Windows.Forms.Panel(); - this.panel7 = new System.Windows.Forms.Panel(); - this.groupBox3 = new System.Windows.Forms.GroupBox(); - this.txtParams = new System.Windows.Forms.TextBox(); - this.label9 = new System.Windows.Forms.Label(); - this.panel4 = new System.Windows.Forms.Panel(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.listviewBinaries = new System.Windows.Forms.ListView(); - this.colhdrVersion = new System.Windows.Forms.ColumnHeader(); - this.colhdrBinary = new System.Windows.Forms.ColumnHeader(); - this.textboxBinary = new System.Windows.Forms.TextBox(); - this.btnAdd = new System.Windows.Forms.Button(); - this.btnDel = new System.Windows.Forms.Button(); - this.label5 = new System.Windows.Forms.Label(); - this.label7 = new System.Windows.Forms.Label(); - this.btnBrowse = new System.Windows.Forms.Button(); - this.textboxVersion = new System.Windows.Forms.TextBox(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.tabControl1 = new System.Windows.Forms.TabControl(); - this.tabPage1 = new System.Windows.Forms.TabPage(); - this.tabPage2 = new System.Windows.Forms.TabPage(); - this.panel5 = new System.Windows.Forms.Panel(); - this.panel6 = new System.Windows.Forms.Panel(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.chkShowDefaultWads = new System.Windows.Forms.CheckBox(); - this.chkCloseOnStart = new System.Windows.Forms.CheckBox(); - this.groupDisplay.SuspendLayout(); - this.panel1.SuspendLayout(); - this.panel2.SuspendLayout(); - this.groupMS.SuspendLayout(); - this.panel3.SuspendLayout(); - this.panel7.SuspendLayout(); - this.groupBox3.SuspendLayout(); - this.panel4.SuspendLayout(); - this.groupBox1.SuspendLayout(); - this.tabControl1.SuspendLayout(); - this.tabPage1.SuspendLayout(); - this.tabPage2.SuspendLayout(); - this.panel5.SuspendLayout(); - this.panel6.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.SuspendLayout(); - // - // groupDisplay - // - this.groupDisplay.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupDisplay.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(230)))), ((int)(((byte)(217))))); - this.groupDisplay.Controls.Add(this.label2); - this.groupDisplay.Controls.Add(this.txtHeight); - this.groupDisplay.Controls.Add(this.label1); - this.groupDisplay.Controls.Add(this.txtWidth); - this.groupDisplay.Controls.Add(this.chkCustomResolution); - this.groupDisplay.Controls.Add(this.chkDisplayWindowed); - this.groupDisplay.Location = new System.Drawing.Point(8, 8); - this.groupDisplay.Name = "groupDisplay"; - this.groupDisplay.Size = new System.Drawing.Size(268, 102); - this.groupDisplay.TabIndex = 1; - this.groupDisplay.TabStop = false; - this.groupDisplay.Text = "Display Settings"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(128, 74); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(46, 15); - this.label2.TabIndex = 5; - this.label2.Text = "Height:"; - // - // txtHeight - // - this.txtHeight.Location = new System.Drawing.Point(175, 71); - this.txtHeight.MaxLength = 4; - this.txtHeight.Name = "txtHeight"; - this.txtHeight.Size = new System.Drawing.Size(46, 21); - this.txtHeight.TabIndex = 4; - this.txtHeight.Text = "768"; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(19, 74); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(41, 15); - this.label1.TabIndex = 3; - this.label1.Text = "Width:"; - // - // txtWidth - // - this.txtWidth.Location = new System.Drawing.Point(66, 71); - this.txtWidth.MaxLength = 4; - this.txtWidth.Name = "txtWidth"; - this.txtWidth.Size = new System.Drawing.Size(46, 21); - this.txtWidth.TabIndex = 2; - this.txtWidth.Text = "1024"; - // - // chkCustomResolution - // - this.chkCustomResolution.AutoSize = true; - this.chkCustomResolution.Location = new System.Drawing.Point(6, 46); - this.chkCustomResolution.Name = "chkCustomResolution"; - this.chkCustomResolution.Size = new System.Drawing.Size(159, 19); - this.chkCustomResolution.TabIndex = 1; - this.chkCustomResolution.Text = "Use Custom Resolution"; - this.chkCustomResolution.UseVisualStyleBackColor = true; - this.chkCustomResolution.CheckedChanged += new System.EventHandler(this.chkCustomResolution_CheckedChanged); - // - // chkDisplayWindowed - // - this.chkDisplayWindowed.AutoSize = true; - this.chkDisplayWindowed.Location = new System.Drawing.Point(6, 20); - this.chkDisplayWindowed.Name = "chkDisplayWindowed"; - this.chkDisplayWindowed.Size = new System.Drawing.Size(117, 19); - this.chkDisplayWindowed.TabIndex = 0; - this.chkDisplayWindowed.Text = "Windowed Mode"; - this.chkDisplayWindowed.UseVisualStyleBackColor = true; - // - // panel1 - // - this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(230)))), ((int)(((byte)(217))))); - this.panel1.Controls.Add(this.groupDisplay); - this.panel1.Location = new System.Drawing.Point(14, 13); - this.panel1.Name = "panel1"; - this.panel1.Padding = new System.Windows.Forms.Padding(5); - this.panel1.Size = new System.Drawing.Size(284, 118); - this.panel1.TabIndex = 2; - // - // btnCancel - // - this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnCancel.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.btnCancel.Location = new System.Drawing.Point(260, 525); - this.btnCancel.Name = "btnCancel"; - this.btnCancel.Size = new System.Drawing.Size(75, 23); - this.btnCancel.TabIndex = 3; - this.btnCancel.Text = "Cancel"; - this.btnCancel.UseVisualStyleBackColor = true; - this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); - // - // btnSave - // - this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnSave.Font = new System.Drawing.Font("Arial Rounded MT Bold", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.btnSave.Location = new System.Drawing.Point(174, 525); - this.btnSave.Name = "btnSave"; - this.btnSave.Size = new System.Drawing.Size(75, 23); - this.btnSave.TabIndex = 4; - this.btnSave.Text = "Ok"; - this.btnSave.UseVisualStyleBackColor = true; - this.btnSave.Click += new System.EventHandler(this.btnSave_Click); - // - // panel2 - // - this.panel2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(230)))), ((int)(((byte)(217))))); - this.panel2.Controls.Add(this.groupMS); - this.panel2.Location = new System.Drawing.Point(13, 13); - this.panel2.Name = "panel2"; - this.panel2.Padding = new System.Windows.Forms.Padding(5); - this.panel2.Size = new System.Drawing.Size(286, 95); - this.panel2.TabIndex = 5; - // - // groupMS - // - this.groupMS.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupMS.Controls.Add(this.label4); - this.groupMS.Controls.Add(this.txtMSPort); - this.groupMS.Controls.Add(this.label3); - this.groupMS.Controls.Add(this.txtMSAddress); - this.groupMS.Location = new System.Drawing.Point(9, 8); - this.groupMS.Name = "groupMS"; - this.groupMS.Size = new System.Drawing.Size(269, 79); - this.groupMS.TabIndex = 0; - this.groupMS.TabStop = false; - this.groupMS.Text = "Connection"; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(41, 51); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(32, 15); - this.label4.TabIndex = 3; - this.label4.Text = "Port:"; - // - // txtMSPort - // - this.txtMSPort.Location = new System.Drawing.Point(79, 48); - this.txtMSPort.Name = "txtMSPort"; - this.txtMSPort.Size = new System.Drawing.Size(86, 21); - this.txtMSPort.TabIndex = 2; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(17, 23); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(56, 15); - this.label3.TabIndex = 1; - this.label3.Text = "Address:"; - // - // txtMSAddress - // - this.txtMSAddress.Location = new System.Drawing.Point(79, 20); - this.txtMSAddress.Name = "txtMSAddress"; - this.txtMSAddress.Size = new System.Drawing.Size(184, 21); - this.txtMSAddress.TabIndex = 0; - // - // panel3 - // - this.panel3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(212)))), ((int)(((byte)(204)))), ((int)(((byte)(187))))); - this.panel3.Controls.Add(this.panel7); - this.panel3.Controls.Add(this.panel4); - this.panel3.Controls.Add(this.panel1); - this.panel3.Location = new System.Drawing.Point(6, 6); - this.panel3.Name = "panel3"; - this.panel3.Padding = new System.Windows.Forms.Padding(10); - this.panel3.Size = new System.Drawing.Size(312, 467); - this.panel3.TabIndex = 6; - // - // panel7 - // - this.panel7.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(230)))), ((int)(((byte)(217))))); - this.panel7.Controls.Add(this.groupBox3); - this.panel7.Location = new System.Drawing.Point(15, 350); - this.panel7.Name = "panel7"; - this.panel7.Padding = new System.Windows.Forms.Padding(5); - this.panel7.Size = new System.Drawing.Size(283, 106); - this.panel7.TabIndex = 7; - // - // groupBox3 - // - this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBox3.Controls.Add(this.chkCloseOnStart); - this.groupBox3.Controls.Add(this.txtParams); - this.groupBox3.Controls.Add(this.label9); - this.groupBox3.Location = new System.Drawing.Point(13, 8); - this.groupBox3.Name = "groupBox3"; - this.groupBox3.Size = new System.Drawing.Size(258, 83); - this.groupBox3.TabIndex = 12; - this.groupBox3.TabStop = false; - this.groupBox3.Text = "Command Line"; - // - // txtParams - // - this.txtParams.Location = new System.Drawing.Point(83, 20); - this.txtParams.Name = "txtParams"; - this.txtParams.Size = new System.Drawing.Size(167, 21); - this.txtParams.TabIndex = 6; - // - // label9 - // - this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(5, 23); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(75, 15); - this.label9.TabIndex = 7; - this.label9.Text = "Parameters:"; - // - // panel4 - // - this.panel4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(230)))), ((int)(((byte)(217))))); - this.panel4.Controls.Add(this.groupBox1); - this.panel4.Location = new System.Drawing.Point(15, 137); - this.panel4.Name = "panel4"; - this.panel4.Padding = new System.Windows.Forms.Padding(5); - this.panel4.Size = new System.Drawing.Size(284, 207); - this.panel4.TabIndex = 6; - // - // groupBox1 - // - this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBox1.Controls.Add(this.listviewBinaries); - this.groupBox1.Controls.Add(this.textboxBinary); - this.groupBox1.Controls.Add(this.btnAdd); - this.groupBox1.Controls.Add(this.btnDel); - this.groupBox1.Controls.Add(this.label5); - this.groupBox1.Controls.Add(this.label7); - this.groupBox1.Controls.Add(this.btnBrowse); - this.groupBox1.Controls.Add(this.textboxVersion); - this.groupBox1.Location = new System.Drawing.Point(13, 8); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(259, 191); - this.groupBox1.TabIndex = 12; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Executables"; - // - // listviewBinaries - // - this.listviewBinaries.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listviewBinaries.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.colhdrVersion, - this.colhdrBinary}); - this.listviewBinaries.FullRowSelect = true; - this.listviewBinaries.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.listviewBinaries.HideSelection = false; - this.listviewBinaries.Location = new System.Drawing.Point(6, 19); - this.listviewBinaries.Name = "listviewBinaries"; - this.listviewBinaries.Size = new System.Drawing.Size(245, 83); - this.listviewBinaries.TabIndex = 0; - this.listviewBinaries.UseCompatibleStateImageBehavior = false; - this.listviewBinaries.View = System.Windows.Forms.View.Details; - this.listviewBinaries.SelectedIndexChanged += new System.EventHandler(this.listviewBinaries_SelectedIndexChanged); - // - // colhdrVersion - // - this.colhdrVersion.Text = "Version"; - // - // colhdrBinary - // - this.colhdrBinary.Text = "Binary"; - this.colhdrBinary.Width = 198; - // - // textboxBinary - // - this.textboxBinary.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textboxBinary.Enabled = false; - this.textboxBinary.Location = new System.Drawing.Point(84, 161); - this.textboxBinary.Name = "textboxBinary"; - this.textboxBinary.Size = new System.Drawing.Size(93, 21); - this.textboxBinary.TabIndex = 4; - this.textboxBinary.TextChanged += new System.EventHandler(this.textboxBinary_TextChanged); - // - // btnAdd - // - this.btnAdd.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.btnAdd.Location = new System.Drawing.Point(51, 104); - this.btnAdd.Name = "btnAdd"; - this.btnAdd.Size = new System.Drawing.Size(98, 25); - this.btnAdd.TabIndex = 1; - this.btnAdd.Text = "&Add"; - this.btnAdd.UseVisualStyleBackColor = true; - this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); - // - // btnDel - // - this.btnDel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.btnDel.Enabled = false; - this.btnDel.Location = new System.Drawing.Point(155, 104); - this.btnDel.Name = "btnDel"; - this.btnDel.Size = new System.Drawing.Size(98, 25); - this.btnDel.TabIndex = 2; - this.btnDel.Text = "&Delete"; - this.btnDel.UseVisualStyleBackColor = true; - this.btnDel.Click += new System.EventHandler(this.btnDel_Click); - // - // label5 - // - this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(6, 138); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(51, 15); - this.label5.TabIndex = 2; - this.label5.Text = "Version:"; - // - // label7 - // - this.label7.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(6, 164); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(44, 15); - this.label7.TabIndex = 3; - this.label7.Text = "Binary:"; - // - // btnBrowse - // - this.btnBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.btnBrowse.Enabled = false; - this.btnBrowse.Location = new System.Drawing.Point(183, 161); - this.btnBrowse.Name = "btnBrowse"; - this.btnBrowse.Size = new System.Drawing.Size(68, 21); - this.btnBrowse.TabIndex = 5; - this.btnBrowse.Text = "&Browse..."; - this.btnBrowse.UseVisualStyleBackColor = true; - this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click); - // - // textboxVersion - // - this.textboxVersion.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textboxVersion.Enabled = false; - this.textboxVersion.Location = new System.Drawing.Point(84, 135); - this.textboxVersion.Name = "textboxVersion"; - this.textboxVersion.Size = new System.Drawing.Size(167, 21); - this.textboxVersion.TabIndex = 3; - this.textboxVersion.TextChanged += new System.EventHandler(this.textboxVersion_TextChanged); - // - // openFileDialog1 - // - this.openFileDialog1.DefaultExt = "exe"; - this.openFileDialog1.Filter = "Executable files|*.exe|All files|*.*"; - // - // tabControl1 - // - this.tabControl1.Controls.Add(this.tabPage1); - this.tabControl1.Controls.Add(this.tabPage2); - this.tabControl1.Location = new System.Drawing.Point(12, 12); - this.tabControl1.Name = "tabControl1"; - this.tabControl1.SelectedIndex = 0; - this.tabControl1.Size = new System.Drawing.Size(332, 507); - this.tabControl1.TabIndex = 7; - // - // tabPage1 - // - this.tabPage1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(212)))), ((int)(((byte)(204)))), ((int)(((byte)(187))))); - this.tabPage1.Controls.Add(this.panel3); - this.tabPage1.Location = new System.Drawing.Point(4, 24); - this.tabPage1.Name = "tabPage1"; - this.tabPage1.Padding = new System.Windows.Forms.Padding(3); - this.tabPage1.Size = new System.Drawing.Size(324, 479); - this.tabPage1.TabIndex = 0; - this.tabPage1.Text = "SRB2"; - // - // tabPage2 - // - this.tabPage2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(212)))), ((int)(((byte)(204)))), ((int)(((byte)(187))))); - this.tabPage2.Controls.Add(this.panel5); - this.tabPage2.Location = new System.Drawing.Point(4, 24); - this.tabPage2.Name = "tabPage2"; - this.tabPage2.Padding = new System.Windows.Forms.Padding(3); - this.tabPage2.Size = new System.Drawing.Size(324, 479); - this.tabPage2.TabIndex = 1; - this.tabPage2.Text = "Master Server"; - // - // panel5 - // - this.panel5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(212)))), ((int)(((byte)(204)))), ((int)(((byte)(187))))); - this.panel5.Controls.Add(this.panel6); - this.panel5.Controls.Add(this.panel2); - this.panel5.Location = new System.Drawing.Point(6, 6); - this.panel5.Name = "panel5"; - this.panel5.Padding = new System.Windows.Forms.Padding(10); - this.panel5.Size = new System.Drawing.Size(312, 507); - this.panel5.TabIndex = 7; - // - // panel6 - // - this.panel6.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(230)))), ((int)(((byte)(217))))); - this.panel6.Controls.Add(this.groupBox2); - this.panel6.Location = new System.Drawing.Point(13, 114); - this.panel6.Name = "panel6"; - this.panel6.Padding = new System.Windows.Forms.Padding(5); - this.panel6.Size = new System.Drawing.Size(286, 61); - this.panel6.TabIndex = 6; - // - // groupBox2 - // - this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBox2.Controls.Add(this.chkShowDefaultWads); - this.groupBox2.Location = new System.Drawing.Point(9, 8); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(269, 45); - this.groupBox2.TabIndex = 0; - this.groupBox2.TabStop = false; - this.groupBox2.Text = "List Settings"; - // - // chkShowDefaultWads - // - this.chkShowDefaultWads.AutoSize = true; - this.chkShowDefaultWads.Location = new System.Drawing.Point(6, 20); - this.chkShowDefaultWads.Name = "chkShowDefaultWads"; - this.chkShowDefaultWads.Size = new System.Drawing.Size(201, 19); - this.chkShowDefaultWads.TabIndex = 8; - this.chkShowDefaultWads.Text = "Show default files in list of wads"; - this.chkShowDefaultWads.UseVisualStyleBackColor = true; - // - // chkCloseOnStart - // - this.chkCloseOnStart.AutoSize = true; - this.chkCloseOnStart.Location = new System.Drawing.Point(9, 47); - this.chkCloseOnStart.Name = "chkCloseOnStart"; - this.chkCloseOnStart.Size = new System.Drawing.Size(216, 19); - this.chkCloseOnStart.TabIndex = 9; - this.chkCloseOnStart.Text = "Close Launcher when SRB2 starts"; - this.chkCloseOnStart.UseVisualStyleBackColor = true; - // - // Options - // - this.AcceptButton = this.btnSave; - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(230)))), ((int)(((byte)(217))))); - this.ClientSize = new System.Drawing.Size(356, 560); - this.Controls.Add(this.tabControl1); - this.Controls.Add(this.btnSave); - this.Controls.Add(this.btnCancel); - this.Font = new System.Drawing.Font("Arial", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.Name = "Options"; - this.Text = "Options"; - this.groupDisplay.ResumeLayout(false); - this.groupDisplay.PerformLayout(); - this.panel1.ResumeLayout(false); - this.panel2.ResumeLayout(false); - this.groupMS.ResumeLayout(false); - this.groupMS.PerformLayout(); - this.panel3.ResumeLayout(false); - this.panel7.ResumeLayout(false); - this.groupBox3.ResumeLayout(false); - this.groupBox3.PerformLayout(); - this.panel4.ResumeLayout(false); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.tabControl1.ResumeLayout(false); - this.tabPage1.ResumeLayout(false); - this.tabPage2.ResumeLayout(false); - this.panel5.ResumeLayout(false); - this.panel6.ResumeLayout(false); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupDisplay; - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.CheckBox chkDisplayWindowed; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.TextBox txtWidth; - private System.Windows.Forms.CheckBox chkCustomResolution; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.TextBox txtHeight; - private System.Windows.Forms.Button btnCancel; - private System.Windows.Forms.Button btnSave; - private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.GroupBox groupMS; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.TextBox txtMSAddress; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.TextBox txtMSPort; - private System.Windows.Forms.Panel panel3; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.Panel panel4; - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.ListView listviewBinaries; - private System.Windows.Forms.ColumnHeader colhdrVersion; - private System.Windows.Forms.ColumnHeader colhdrBinary; - private System.Windows.Forms.TextBox textboxBinary; - private System.Windows.Forms.Button btnAdd; - private System.Windows.Forms.Button btnDel; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.Label label7; - private System.Windows.Forms.Button btnBrowse; - private System.Windows.Forms.TextBox textboxVersion; - private System.Windows.Forms.TabControl tabControl1; - private System.Windows.Forms.TabPage tabPage1; - private System.Windows.Forms.TabPage tabPage2; - private System.Windows.Forms.Panel panel5; - private System.Windows.Forms.Panel panel6; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.CheckBox chkShowDefaultWads; - private System.Windows.Forms.Panel panel7; - private System.Windows.Forms.GroupBox groupBox3; - private System.Windows.Forms.TextBox txtParams; - private System.Windows.Forms.Label label9; - private System.Windows.Forms.CheckBox chkCloseOnStart; - } -} \ No newline at end of file diff --git a/tools/SRB2Updater/Options.cs b/tools/SRB2Updater/Options.cs deleted file mode 100644 index a45cb13af..000000000 --- a/tools/SRB2Updater/Options.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using System.IO; - -namespace SRB2Updater -{ - public partial class Options : Form - { - private Settings settings; - public Options(Settings settings) - { - InitializeComponent(); - this.settings = settings; - SetOptions(); - } - - private void SetOptions() - { - chkDisplayWindowed.Checked = settings.displayWindowed; - chkCustomResolution.Checked = settings.displayCustom; - txtHeight.Text = settings.displayHeight.ToString(); - txtWidth.Text = settings.displayWidth.ToString(); - txtMSPort.Text = settings.msPort.ToString(); - settings.AddBinariesToListView(listviewBinaries); - txtMSAddress.Text = settings.msAddress.ToString(); - txtParams.Text = settings.Params.ToString(); - chkCloseOnStart.Checked = settings.CloseOnStart; - chkShowDefaultWads.Checked = settings.ShowDefaultWads; - if (settings.displayCustom) - { - txtHeight.Enabled = true; - txtWidth.Enabled = true; - } - else - { - txtHeight.Enabled = false; - txtWidth.Enabled = false; - } - } - - private void chkCustomResolution_CheckedChanged(object sender, EventArgs e) - { - if (chkCustomResolution.Checked) - { - txtHeight.Enabled = true; - txtWidth.Enabled = true; - } - else - { - txtHeight.Enabled = false; - txtWidth.Enabled = false; - } - } - - private void btnSave_Click(object sender, EventArgs e) - { - settings.displayCustom = chkCustomResolution.Checked; - settings.displayHeight = Convert.ToInt32(txtHeight.Text); - settings.displayWidth = Convert.ToInt32(txtWidth.Text); - settings.displayWindowed = chkDisplayWindowed.Checked; - settings.msAddress = txtMSAddress.Text; - settings.ShowDefaultWads = chkShowDefaultWads.Checked; - settings.Params = txtParams.Text; - settings.msPort = Convert.ToInt32(txtMSPort.Text); - settings.CloseOnStart = chkCloseOnStart.Checked; - settings.SaveSettings(); - settings.SetBinariesFromListView(listviewBinaries); - Close(); - } - - private void btnCancel_Click(object sender, EventArgs e) - { - Close(); - } - - private void btnAdd_Click(object sender, EventArgs e) - { - listviewBinaries.Items.Add(new ListViewItem(new string[] { "[New Version]", "" })); - } - - private void btnDel_Click(object sender, EventArgs e) - { - if (listviewBinaries.SelectedItems.Count > 0) - listviewBinaries.Items.Remove(listviewBinaries.SelectedItems[0]); - } - - private void btnBrowse_Click(object sender, EventArgs e) - { - if (listviewBinaries.SelectedItems.Count > 0 && - openFileDialog1.ShowDialog() == DialogResult.OK) - textboxBinary.Text = openFileDialog1.FileName; - } - - private void textboxVersion_TextChanged(object sender, EventArgs e) - { - if (listviewBinaries.SelectedItems.Count > 0) - listviewBinaries.SelectedItems[0].Text = textboxVersion.Text; - } - - private void textboxBinary_TextChanged(object sender, EventArgs e) - { - if (listviewBinaries.SelectedItems.Count > 0) - listviewBinaries.SelectedItems[0].SubItems[1].Text = textboxBinary.Text; - } - - private void listviewBinaries_SelectedIndexChanged(object sender, EventArgs e) - { - if (listviewBinaries.SelectedItems.Count > 0) - { - btnDel.Enabled = true; - btnBrowse.Enabled = true; - textboxVersion.Text = listviewBinaries.SelectedItems[0].Text; - textboxBinary.Text = listviewBinaries.SelectedItems[0].SubItems[1].Text; - textboxVersion.Enabled = true; - textboxBinary.Enabled = true; - } - else - { - btnDel.Enabled = false; - btnBrowse.Enabled = false; - textboxVersion.Text = ""; - textboxBinary.Text = ""; - textboxVersion.Enabled = false; - textboxBinary.Enabled = false; - } - } - } -} diff --git a/tools/SRB2Updater/Options.resx b/tools/SRB2Updater/Options.resx deleted file mode 100644 index ee0d50c3f..000000000 --- a/tools/SRB2Updater/Options.resx +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - - - AAABAAEAICAAAAEACACoCAAAFgAAACgAAAAgAAAAQAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAADg4OAIAAAABQABkAlgAAALkAAABQGQAAcwAlAJYAMQBzJQAAuQA9AJYxAACWAGIAMjIyALk9 - AAD/JSUAPj4+AFZWVgD/SEgAYmJiAABilgBubm4Aenp6AP9rawCAgIAAhoaGAJKSkgD/jo4Anp6eAKSg - oAD/jqsAqqqqAGuP/wC2trYAwMDAAI6r/wDCwsIAa8b/AM7OzgCO1P8A2traAObm5gDy8vIA////AAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQ8PHQAAAAAAAAAAAAAAACMgJSUlJSUZ - AAAAABMNBgoPDw8AAAAAAAAAAAAAACInJycnJycnJyclFgYGBggPDw8PDwAAAAAAAAAAAAAjJycnJycn - JycnGScnFQkGCA8PDw8AAAAAAAAAAAAAISMnJycjIyMjJycnJycVDwYGDw8PDwAAAAAAAAAAAAAQAAEj - HygqKSkkHyMnJwoPDwYJDw8PAAAAAAAAAAAAACkTHxwrKysrKysrGhkMDw8PCwYJDw8AAAAAAAAAACkp - JA0pACkrKysrKyspDw8PDw8PAwYIAAAAAAAAAAAAACsiARwAISsrKysrKysSDw8PDw8PAwYAAAAAAAAA - AAAAKyIAEAAfKysrKysrKxcPDw8PDw8PDwgIABYAABcSCAArKAMPACIrKysrKysrGw8PDw8PDw8PDw8P - Dw8PDw8RACsoBA8EISsrKysrKyseDw8PDw8PDw8PDw8PDw8PDwAAKx8PDw8VKSsrKysrKxcPDw8PDw8P - Dw8PDw8PDw8AACooFQ8PDw8aKCsrKysmDw8PDw8PDw8PDw8PDw8PFQAAAAAKDw8PDw8VIigoIgoPDw8P - Dw8PDw8PDw8PDxEAAAAAAAoPDw8PDw8XFxcXEhIPDwUPDw8PDw8PDw8YAAAAAAAACA8PDw8SFxcXFxcX - FxcPFQ8PDw8PDw8KAAAAAAAAAAAACg8PEhcXFxcXFxcXFxkjBRISEhISGAAAAAAAAAAAIRcXCA8XFxcX - FxcXFxcaJyMFDwoLEQAAAAAAAAAAAAAAFxcSDxIXFxcXFxcSEyAlIwILCwsIAAAAAAAAAAAAABcXEg8A - EhIXFxcXEgoPDBUUBwsLCwsLAAAAAAAAAAAAFxcAAAAAFxIXFxcXFxIKDw8ICwsLDg4LAAAAAAAAAAAA - AAAAAAAAABISFxcXFw8PDw8PDw8PDwAAAAAAAAAAAAAAAAAAAAAAAAASEhcSDw8PDw8PDxIAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAFwoSDw8SFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///////////////////3////w//APAf/AAAH/gAAD/wAAA/8AAAP/AAAD/AAAB/4AA - Af+AAABYgAAAAIAAAAGAAAADAAAAA8AAAAfAAAAPwAAAP+AAAH+AAAH/wAAB/4QAAP+eAAB//4AA///g - Af//+A////////////////// - - - \ No newline at end of file diff --git a/tools/SRB2Updater/Program.cs b/tools/SRB2Updater/Program.cs deleted file mode 100644 index 51c0be56e..000000000 --- a/tools/SRB2Updater/Program.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Windows.Forms; - -namespace SRB2Updater -{ - static class Program - { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main(string[] args) - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Launcher(args)); - } - } -} diff --git a/tools/SRB2Updater/Properties/AssemblyInfo.cs b/tools/SRB2Updater/Properties/AssemblyInfo.cs deleted file mode 100644 index abc46e8cd..000000000 --- a/tools/SRB2Updater/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Resources; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("SRB2 Automatic Updater")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Sonic Team Junior")] -[assembly: AssemblyProduct("Sonic Robo Blast 2")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("94c164ce-02a9-4966-948f-004d35760ba1")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] -[assembly: NeutralResourcesLanguageAttribute("en-US")] diff --git a/tools/SRB2Updater/Properties/Resources.Designer.cs b/tools/SRB2Updater/Properties/Resources.Designer.cs deleted file mode 100644 index 246c91e52..000000000 --- a/tools/SRB2Updater/Properties/Resources.Designer.cs +++ /dev/null @@ -1,132 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.4927 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace SRB2Updater.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SRB2Updater.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - internal static System.Drawing.Bitmap Banner { - get { - object obj = ResourceManager.GetObject("Banner", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap Banner2 { - get { - object obj = ResourceManager.GetObject("Banner2", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap Banner3 { - get { - object obj = ResourceManager.GetObject("Banner3", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap Banner4 { - get { - object obj = ResourceManager.GetObject("Banner4", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap CONSBACK { - get { - object obj = ResourceManager.GetObject("CONSBACK", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.IO.UnmanagedMemoryStream Kotaku { - get { - return ResourceManager.GetStream("Kotaku", resourceCulture); - } - } - - internal static System.Drawing.Bitmap Sonic { - get { - object obj = ResourceManager.GetObject("Sonic", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap sonic_bottom { - get { - object obj = ResourceManager.GetObject("sonic_bottom", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap sonic_top { - get { - object obj = ResourceManager.GetObject("sonic_top", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap updaterbanner { - get { - object obj = ResourceManager.GetObject("updaterbanner", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - } -} diff --git a/tools/SRB2Updater/Properties/Resources.resx b/tools/SRB2Updater/Properties/Resources.resx deleted file mode 100644 index b5c93d021..000000000 --- a/tools/SRB2Updater/Properties/Resources.resx +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\CONSBACK.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Sonic.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Banner.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\sonic_bottom.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\sonic_top.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\updaterbanner.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Banner2.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Banner3.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Banner4.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Kotaku.wav;System.IO.MemoryStream, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/tools/SRB2Updater/Properties/Settings.Designer.cs b/tools/SRB2Updater/Properties/Settings.Designer.cs deleted file mode 100644 index 4e8aea28c..000000000 --- a/tools/SRB2Updater/Properties/Settings.Designer.cs +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.3506 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace SRB2Updater.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - } -} diff --git a/tools/SRB2Updater/Properties/Settings.settings b/tools/SRB2Updater/Properties/Settings.settings deleted file mode 100644 index abf36c5d3..000000000 --- a/tools/SRB2Updater/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/tools/SRB2Updater/Resources/Banner.png b/tools/SRB2Updater/Resources/Banner.png deleted file mode 100644 index 7d8d5560225e70104c970ced4ef171c9504b1083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48784 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 diff --git a/tools/SRB2Updater/Resources/Banner.psd b/tools/SRB2Updater/Resources/Banner.psd deleted file mode 100644 index eb29b8b6f3042fe7725a1aa5c8c036af3ff56574..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 833250 zcmeFa2YggT*FQd+O79?2BqD-J%O)fwNDoy&Fcd3lNEV2xWD`Ivi27KtAc*u1(yK@> zp@u3;4}B>@LJc)Nd;i}v_uk!m@0LU#-~aD<-gkFDd-vX%GiT16IdkUBnYl9|9sBfU zIwpQR@%Is9_$x&h`n+E)q+|D9US9mcw~hy69_8a14||@6RhpsGRgXXVu+7}Y&wL-* z{9rzhYd~>r*0ydpGBF}D#*pkc$S@>2zD@nCEvfbWqNCc>e?6#|f3L(a!_eq%qmm4L zN4?rFa#T!YXjJ`nZOgPC*=l55Vw@p4!f#|;Y`n46$TsyOq7nufTH&68o7eZ_AjvUp z>UW?Bzc+gI@e4~xGWfM<7SJr9X{3K}pkGj6v%sK$;D8oQ`~v*_Lz?@yY#!*}R3Fkx zAJ9r4;wOFTw=ILa)=5!=TZMP(B4voDHuZ-lCnvUQ-h9M}5zR&fHcLnv(p(=J8rs}H zpm{(*Q$RE|ei)w|F|ujA@i`HRjHi>q7?~8Em>iuD??-qe1|_52S_-oL4TP*Z(SKfS(H3wSHWyvlf)-YcyW~w z6=|)5#FV61Ue!^N%?+`JI75805%r)~*F#iftHB9LaS_RFBN7v1qa!1zs+$jwkCG}d zQLd5J&26CnG}WlzUcIb@I~1O{xaN+8&Y0YJIOI{1Z-*(3{XR@IG!Hiz6H<~Q4V{OB z4>lo}M6p+|R^8)`$r169hVGr(f}Cd2(NV2BhJC{yaBYJospr-aB9V!ebm3TQj{cWx0B7^e5{5bV#{7&1FfI14>p|Vil^JklgAuP3|A-8Iq$1+YAAfqNEu64w^z+K}SGl zd7sc$-@3V7n60?2dE6V+)?-t6TW$$U#oxcVo~}|-WwbWwo34{8qqRwGDf`DqC%1(H z<-}-$wW(f3v4$HuMGr9;ktQg(NkC9b{6g>xZ30`XNkGdM_#rH$MU$XFfBf{gM|enJ zlYr3RCV~F?CV~18{6d=q1>hGLfH2@`>5m^^Then7;_(Y?5g72Yf9K#3eW!rHkk9~q zU}#8Cr=YNoVJ$jzYT2?w#}=Vo0wuy#lu2a&V{%{^8SO+4D8^n6D700d=#hrlH#$Y5 zCo__sZW$cXy1By`1($8{Z`xAo15iqbG1`=239$)DePMGONc4CTMUWO+#k0WRkl+?g zTKIA zWgw)3u7Jlil&&Fw#Fg?2gsjk&atVYC(G_WN7E%YrAOIJ{fs~FOf--pmO6m;Us zVM2p&-!g#0TSD4!g-o{4LyY*9(uRgm+RzY!2@N5b&`=H&s^|BFEtF#m4W%4IInGd` z1cq~P6Uc27$a<6DCM}zUGzo12*68(3^Z`xuflc%+nm~>Lq;J^-LLUHFGzGK-G?E~+ z7l=Dr1_b`)kkF1`Qb?x`ExL5+65J`EMVH{9z)mfLS_Jxc^6wJTS*lD`js4S7ZZ%sS z+lJO?dwI7;wc^s&Dl48pFGG^y}UkR$XXtaMOTh z5MzgME(`J;(-vrEGe*N<*?x#o{1*3B*r zLtH<)+2xu)npiixGz@Y5=w_E|{%B&|?9wpA^`o0zuKA;hb+b#u5Z8}xcDd${Cf3a^ z4MSW%y4mHLKblxKyEF`O{pe~c9pTcpKXZ8OW7mv_BDUE+w-pY zZa3?Oe;xCX|M|P!4S8Gze&v^TpE2=`@bdhT-W4CoA)mHBKSR%+kN9(Ge#J${Q#Go@ zpUYU^LigaXPk3lI)_m|_#Khw2!$WjZ$lR&ZtRVp$*;}~EFhM+|sV#)#%*8WfiHr#j zKc1Ns?J!FCcj7oN2sK`wXWsk?@6qE^i(egHIFvt+Dz8(1L{3x5sI>Iv{<9pm6b~U@ zBFv+`_><}-7@>?U#!rf;$M}@kSp4yH1CosKu?g`*@XYrDFvLd;8iY5@39fW}N?b<+ z-gh=AAW9*y!{B5?k|K=tO^j4xDH9hR-y5$YMJInKL6JO^iHjJi4yD>-9b@BrNl?DL zJb@JIL9%2|a~X=$&|G?OQbe4gZ?Yk=_n;3V5if0OAQh7sP9-rU(cAMRl)FLaeW3rgf9i&9Z3AO>%Sl^EMoiO#W=8Ih0_ z(>=c5KSf_^REFND2OG1<+ULufmRfO^FGq9J2`lA4_MmR2x5B7|Rk20!7BRn!$ zk93^me%S9p;wDGc(=b@(E`RQroDe6)b27q*43*+JX+B2mTVRkGqEqGL&EtTj3Vy!) zp?fDqUcN(;5>gUXK|Trm-FgFB7}AvM+?TM6FU#Y(d_+oeLRUjPH9kWW0vNsIE&-Pj zfhmMyy2lOi!{7gO`8~1GL%+^%^g~usrI4afhx9TIF{na(B4U&KMGR4eRfseoond5h zcVoAHy?T9b%)0#7l**C>Fk(9E_B{QHH@0DY418Ej`?jlS0If@Bw3Zcsup1j;VF zEUJB|7M!=H7bqiE4nL1}_xZipb5-QQ-4NBSXLNjm2gE-vJ~@fr`g`NexBPsMppPt# z)&@b3h%_el>f43th~bSuKYBG##Kf;)bM|Sm_D(eI*2m9J5m%Di%8`jl;Igg{fCHnj zXAADX#C`0Da~Xxx)!QZ3F90S)LyJZq3_h#ZQ0f83W#>K7h{ z`__=EazhmNgB174kU+q)u!O`9d7b#Z5c#4XURDk9>t+}cYe-IR+6Rg@A}I>{rIOC)F63LY~T}Zh-^j-wSI~PutGY&QRLT*^0U6O>eoqZ z!hR&xk$5FLCCSf7FJ=2R)e7<7PN*PDK}VBt!(c;_0b8>84SEJ&e)3TVP?~{rnQUi9b9%CL&88he^O!=7U=u%;}4wPY`| z_N+5|h4p6r*qiKK7RiRPIP}~j*vD)P`-*+Xeqz6{X>2xIz?QI;>^HW7ZDl)I8au>} zvQz9lyUeb$+w4BeW(6?7eRbt^RdrA6>gk@>HP!{_LUe6)opn8R;kq|<@9T!>;&myy zk9A+@zSB+6P1DWQEzzyfZPM-39nc-qoz-2@-PAqQ<$HK~l=GkSAde-oK*0ZT+h-a8* zZ_l?p2YV)Ye(E{abCTyg&y}8=J@ z*Y{r2ycT<{_uAui!t09HeJ_i5dG9*jjlElWclUn7dx-Z4@2|Wkc`x){=e^hal=pS- zY#$$=8a|DDTKaVJdDG_upO1XL_nGOl%4dhqF`sKbPkeoSpZ0C++s3!IZ-j5M?^nK4 zeV6;D`X2Ya?webxY^i#s0!no$^;W6)QlFQaRBCCd?WK;F$|zM(x>D)qOSdZByL43P z4@-|Ly`c2w(x%eaOBa->T&7W(Hf8#i`Jl|0GE>T|EVH-Fg))!ImMvSqY-rin%0`#{ ztn8GstIO^$d!=k%xhmyeDi>DnopLGVek`}B+>UZ*%RMSzzI?;-?aRMaKDqpl<(HJ- zUH($}+zM4IG^^0PLR5v(6{c5MU*UL#dlgGpe7<6bitkn&RdG_qwG~Yj?^G&XsbQtC zN)eSltu(#Trb_9Ro>Z<{Szoz#<+#e0BkM%9mB#=stc;_t$MwhPqjwXx>x(4+IQ7fR6A1be)THVTT~xVePs3N)wfl@T*I?Q z!y4Ud#MT&BB`~ zn5V}-z2WJLwY+M*RO_``BWlg6wYS!t+SO{mTsyM%*xJ9wHvaex1X0 zp45G&Zr8erb*I+dUH8s2HJ)kz%m>d*d}jMIH|tfc*S21Cy@~Zw>)rCJ?$^OD)^Cd6 z9>4p~)_JzuvnkKcefG$+1@#-%?_dA(`m5?+e6GxMAV?z2*&?ztwzv^L@=N{z3k+{tNui>#OKr(SNSrtbZ8rQb1(D^njCr z!4jhMZqnDlY&<#O+`sd*&X>B>?=qyzvM%?#26g?Y>yB>T-FkEz-z~j+-R_aymvq1XO3PP1 zd1X(Jay|O?nAYQJ&zE{8_1xUcqt`3Fe(rVQ)#qQ0e|1A|*1LP}pL<{I)2Pp|K3iV% zd9BZD(_gz0t`Gk>d|%(Hec$W5v~PC5j{U~{we);4X8NaodHV*9;I<8%MdCw%_+i`T!{{AJxQKl}39zqzBWt{f*Z* z(cc{THt^f2-&)2-jXn6C|96wVEBrq4`-4B|f0*)v@Z;bgkBkc*H|r;#pW=TyJ-*%e z#S(2gecK)2`IcMf}ox6Ts!+DeD`^+Cc|Hgs=3-=CLeg+0EteEI+!U(~6BNo35O@s>Z7C zR|Ka-k8-{MUyz$MA$2PsPY1ihL zH?P~$Y|Emp&u*Q*t@^fc+skbKa=VZ^D)q^Z#2t5b4%vBa*L%Cp?|x(V$vv;_IkLCM z-u-D^(su9burGCgoBdl4v^ucqV93D@hk_5SKOA&;-5)`JtUD5XWWA}SY2(q*qnnSl zKDPaMyW=}gbUKlCvir$Hr(QjE>~#OrXVTwEzkDX@Oy=3xvk%ST*8fJjcVK)AY(xEg^>l#%6yIs z*%Nc{!`NPTnKAzz2p`O9GM#WnxXdcO(xrPBrt@I%Z(>9u+-2qXmWuC%^#a5_R)IgU zsLvRZ3+LIFtX!#5rAn77SGsh$%4N%xtz5lgxpEb&*Q{E#dey2mE0^OR=}&ynUUlWm zmMveQe5DE%Dpjjcp+YsfRH!Bk-0hikvweIn)Bqb`jmF8J5)zw9~r=i^`3?LBq<$$-JbznZjgecI_8*)6-i zK4iq#lNW8+m!6SRnR$4CS}#tMua9>SC*fIr6)#XQtbSGRfHC8%5d}NLkKGS!Fz8Cs z=M%#ER*y8cc<{Ur5#ZY}XxDKNG5@Kk&i#Xv4OgusIH#bIjRfHwE9c4ctjyZ6NB1V2 z4=`r_nzMe|x5m4hu6=s&c7^o?!^^K+b9lwLvjYTnTwuZLX8&?*Oxr0YJK7$*tEN zyA!u+U-q$WTe91o7T6a8E46r5Y{3`RzJD%sR?R&9$cwt1p(~+0o z{$^if_`ySW*ET#o>fOm_Z>_j9qG-wJn-AOd=)G$E?fm2czdhQ%>=VO|s4bN@oHQTV z+jdU9C#lB<3T(`Clc(0%I=}R*t@}PzdBXeM((ip4R-^T_sk)+L1yMI@-H-8m=R(@g zc`Js8>aV`NCivC1)i=JrrNZHHZ%y*uzI=S23agAUA1&Tcudr!_HIrIxc{Bf&HoYIe zGAV9hk9u#{dhpzb-s^+@$nTk$y=lwnq`kdzUSGHSWL4i@=N>#5FznU7pH2K%J)b(O zzi${>HF^H>DgGmWX?6Rz<4?cQ+?d+(aKV80KiW|#!}HHqGB^94+P-Y)zFXs(EGwOz z-y|hFc>URk3Pl5FEt`I;&D|Kw*q%Pm9Aoh^^nK7Mc3 zf=g2}Ms<4co%gmJ4|splC&3Ty7)K8`_eyy4SgmYx)Rpkd2Ufp6G{*B=U|ZzixWA zm*>>{u z`0@$fhYv0IYQskv#%>AEm|y$hQr3v0t1f-_?a@)|Kgv$NRUxK#aR1uAg@$qG&do6A zc0RV@)}gZ}o2G??OpH1f6B}1!;J_baUVV9H=B4w-XH3U~w|;N_Wc1~t-kIh(9roXB zGrHl}p*ucpI_|TqE_1^M4*P9GR6th8=}mq;eev7AmrT9Qh8ByaBrP}@5M?f0@P3y(&uLI*!+b}r+k^&rhV9}v!}<5 zSaaa)lP?16X6-w;;@7!5TDOP`ICZ9IVE*0{@p}#q=~L0P^2TR}V}8sp_-@2Hi@;vb zyaP%7_QdsTHJ^Sk)H}2Ct<^rMmp(51GrYw`{pE@|^^ceTeR7qI@JEYRjm|ikb$HZbF6yK5J0H^+=#10uVuKH5V#dU^AJfm2f6EgbaH_KPb*o94%^ zEW2Xi)^1np*2`B;&zt>V z{*@g98!&oT(^mwxU|?ZJx!n8r+Km_3=u2~MjLfZA!TjrcEiGej6+U$@b>z6zcdw5d zGA?gc^P;ycG2@O2tY7w}RkynKpTF=%yE121)e9UNxiKcL%F|mc?S}7bms3>zT*?;j zPinW?<@ufd&a*44wDg%deR@&KpNqbDoLhLWZOrl70{dp!=vkJr0=sEG@*q!O2L#q} zQ^jvSYWK;%p8jY?pPb~!xiNbm-CzIdi#emW&5p_6etF!Zciy{oy~sQ@)oeD@7z#WyWQ@y z0(uHr?{Ez`9wCnQH}f>}+Fd&g;i|XKWky z_{&f48+PxmeWHgYb=jW-k9=~X$ZzDbdzSCALq@iJ!;+B+x$#|*krh*K$g(|NG!jE5l>Gy9Uh9AE>tKfpb=4HhHW*V|2Kj^!>`IZirHWO2KjlSgD4m>*2 zfA@e#J=;Cln}5D?c6!$@D;AEucyn8i=FLk*{dxV$=E4aBM=yUP!+7`7zR_P6W+gqk zw0qXeOGXwo^Q|+y|E41qV@`HUe>}41t!?kL%_zK)wR@ZCtra{nwq-Ju%0x{P4u3oKZO& zEa#X0F#G;=frX7Z@u=Rn#@N{rer>itcct)`o=HD+Jy9=goaxHDyZ7DAfBDnNmd`iz zICXp2`Cd;hj*H1YF~0AYY+%E7T|FOtQqZoOz~*dX8LKmUywgJe=a#nPi+t{V`mguG z#%0tl%qgsRZ}jd_J$_8hD`>Ye>tO#Eh9$-n9A8zi>VE&mIfnCJwaa;X&9LFuwjQ|r z^U|?lU);Yl)7-7_wI0G*Zk;~MO|kyC>c||e$U3knmcRyKBFPUfu%Wn5#?Q#_5&==Q z7zjTW#`>}rgi!RU*T*f>HS5)jy@Z=m%vV>1@81rS58<`oAtO-62I*>B??2GJAi=== z)#>4NXRHo>NxA@jPd4?BUq|!FCQ7>izoV>7;b)9t#$Nh&u>m=wUBz4Z2er}%`|BhC)4Cq#9xBq6KS2QZ{IIIcZwA!*2MJ%K~Bv17b zQr5-TB}t}*u*yYI&p)OFf+krLBRuw7p32t!Ad2cWa5es zoc2D#1myT z@hih;Wg}S(8v@^M0!zXCY!ruyH_|Mv*PtQs;`4{mQS^+Tj^ZO@2gTAeRV_V7#}6JU z#q;Nw_?QIcbF49Ou=LDVaKuK&68=*7@ekoJ4vnKctkM;kV&ro&2&2Yo<66GlqzlYS@#?#F`Xq{#ZB4nCy3 zVr`r*PtX4br^WpKCpleMZBU;HZ@c8Q#4q{-hauja(-j|5z#t5;`4yZVDax>@DSBe{ z%!iQSBFo*x|DVm}YHQw{(MQE)i8qe^O338~++fo6{Ht89EO8m@CwkI?BLi$N z1;^1&SY-{z{jd(ekM%?i48g!EnQI;~jZMqc`Y))3-)^hT4Hi&oMJ+?aMDGxSz^BAo#=BocbgXQH3?2zJ?-47aP}sKeNQI9B`bNh3 z^^Z^P@?4*!$o6kau#8oRi!h=NyS&kNM09fGPz&j!R<#n5hag!wN-8f(hTdeX zSCpThw1$qa9j36pkxB9N9~PVBr$&QyIAMt3G=(E2U(=g#nSlAHYf`*jSjSiiZb)io zdkL<0Vq~(lJTm_f*EM!TKPxqz`*kMpzJoh*IS-48lhTZgRq%ificLupaUq=SJn8dl zg3%!7A&1d_-=R^jItuR)pWH!StIhf)#rIVgz3za}dK*<1_|D)+a!ECcQzhc*ckR^roKE1`QI|)5c|Kb7{t=-Um_##a&i4%ssDH_TrkTh zWUlAs=o8x$vx>Su6JsN3{NUNZ-#;>NaAfe{rosOHQBC!FoJ1bla&U0d&_RX}Lr{=@ zaKxZU0Mgiwex$oS+Na=(PkW3z`Tv;D#DDGc+dPt15<`z z!V_@ts!RsFNAcvhVC1vFpR;#LDUK$F8NE|0yJYBD{?NO%j>733TRFUa-yJeIqjzns z;pifzk55YPq$ukv^OU2{aCHdDW#0s-ui6tb zXV}W{y#d0o9zk9L!Yijky!DwXjKAY76$!==o|EDSOa8S|B)f7OM>A?E`A9LsWK{YCMYYfQ1Kdv!=v+pQBjk~)~e6k-R zxYWHKl{}P7iA@i&ZqQFWOsTVsv7*ijH^#OPM{4?zK9X0U$l@w@AtD67!j|-erXr7^ z5A7ksJYFSzg)2z#c$KiwD4>=&`-AtG`KRQg0MQE;M0ljNKlY>EpkjOdij@98demDm z>-$0Nm#DZd@yhn6!(_<+!S5Ks{dIG|%>g$D+#L9Cg$D#^5zUci-if12+fU9B^~M&4K?e4xsO<_78unU~gFZR&sy;76<-^>SGMHHr&aM zabM{JVJ@EN=MHo8z%2*7EudwLSGSITGla0sS%n4B{ z-28C!!>u3O`cZBL|8MlcPT?3I8$Do@zes~SY>eRMftv?3ULLP*9e*oC@;ueSI^iZ* zJsikFSS$Rx;5>%j>yP~!hU0k{8;BDeUSzeg*O%-u zA+J*{V0(cz$6Dq-`1VDb-`E`dwy_)R7~6||5caXv>@H4m*v`)Cp2j|I`MPSlcDjnJ zh~2|3b~D%n;2*%cvbI?J{5*S#)x*gV4Ot_6pT%7;DCmi|s)xdTGM&w1^VuJ43w}HK z|3Tp2jB_HM;CzTf?2hg!oE3499cCuvxdfOKu%_C8lCON0{0I>x-;0 zHYg5buYo(sNF9ar@8iBBc-R_eUNplR?N&Jdq6m*d@b<20lp0Z-wL~#`2oX=JWlcik}fZ~ z=16CPzK9iI8=P;z0JR3b%sjAOy$}%0Xu-Q2I(o1GoaukE12(hr0M@fKz22B+H0t&F zJQdRXXa`G(jf67IVieK@Bh!29k;0f(WEAu|qkf!&6gs1+z*vw5N_Y})6J?TS(OZ}& z^I!4E6e{cIh%vL@K6WvY0)PpvbICGZmVB zcv>^3*b^y@_Bm!Cl?N8^TlBg#BNCg;NLOHHxY7?K6V3KHUO^Fz#xx5c%qEi=^x}r@ zK)6{jF>?`8dzzTuSg4|wUvpmBE$(sk2EuA7fc1_B4nJ8UlE>kJP^@3 zy|IW_;$k!%WesD|u(g8EX|Ug*ohiYTG%AT$vIn5A(2VM`pjHa?sOg1h@nw}#kSoi; z84bD&R+`tiF%1Q^@B-cgofZ@m)nkzbVG*ZLDJp{AODQR5HF$4=Mz1vDWH!I{YfqZgzmjk7Wj_=+Gn&6ZLY70hTJ(7cxQ$<)SBXEsv68mMH% z==El^(R9}AYa#`K@Y|a7_kkZu0k|2mzlAFa8A9}{*%8Ef8L45MH+$g^VxqsLN&f)# zP|BDlwjQJufFYm6mEY%BLzqdtClT?2Ced>W1-*}v+Mmgq=7}{0K~k%>Bbkbf98rgW zCALxxSor;8T*W75qI+Lp2BeW^=A}njtkIMp%L?vEL|7o2_WVJ!;i8DNIgmp%>O%8l zv(AM3EOTknA6&t4e(@}f`65`B2!sY}N-Ko^vqw$E*Xz^3f?Tr?*F+{sh2)|wd67cm zEr6bUjHKuFJR3Agw74{sMNX9i7TD6Dc{`}8EL0VvDkZ!iu~5zfT#(dXA$TsBJODtE zqAC=_n3-!@{VJFNMS2fpZcC2F320_kruO0jm!XlC8z8}x)OtQd3_tTDw7z_xBK>B8 zX5-r8uo5a8kU4AO14?{xr)_MMt3~Vviy^Ik=o$>9Pp(XQS~6%f{Y4aIu!A&P(q$D z*%gbSvXn_ckdc%dNVTMSaduIk>5E>Qn*>_Uo@MB6P?UiDkX}eB}T87LVCDB@je{;N!9Euyu zkUdJ)%|<&|wKb}=Rd(3Hnw^*-+pUm9$6OpNr#3`2)obclk$LGLqwX+e_)VZ+8%p9fGq?MI2*Fb8E_89v?;?`XL z52XqekY_Fj<1k2c$@EN#C0gT``XJ|~?-@49j>#C;K>TTR^P6299|ZBZaSr0dRFh%k zl*A0Y$tkuosPCZTQ=8MLF$h(e(|LL*6KGn7j!zYlOKlxPC#L_N`A7yhv=llFs|EfG zJA=}dWMCt5)XqY`$?Y1oeV)$Q=t3ISfLo5Dp+reLVr(eJLzN5M7}vDGNh}>yYX((z z!YOjp-uBNVmf9@;v!GTXOUwv!k49wZq@+>gW@S7^N+xvjIz{|sb-Z@uFdIG(^-#`* z+&_RAkiI5uw~MI<8CPKtsfHM5APOastN zqD4HIJt^8YCk$Bw}*9*xzjepyn^#%twYS)<}BMF z^RO*E)BMmDzE~sNP~R9+x#~4mp+P8p0d~!lFIgTYZ`h7^vQH5s)Qs!xpz>l}0L36Yhl(v{)Z5n^UD|AHeV%_%IJBzK>PP8ZQ_ z@~eY3v>Mg-_tXJZuzf4HDG;kNIFBi$;{7vcF@>an$~M6q$W=LLXe?&+@{s?g$W)*L zSn99|t>psx*K`1t&Aw^dREAXpoX3Qf6NiseC(#*9fH_FRT|AE6MEf1Vv$R6)jw1h# z#;vr*)*|nlkK4M|jSy-Vnxl-(>&RtXr8=~3$Ma5-Z+sJ&aO6zw(-`pVWJZ$R-&u6leW&nRbwBi&=~8a>B(V(%2A z!HY9T+8NFj`!u2>jS+iPo-|^JGiW=v+iC#YyV2px!IeD5WkG^;0@iy9F^<{;OoO&MtH zhm9DFC=`_wcQn~9?t)M_ zHCMV)4T=eg4Oj!`-@=78Bg_!p-|#0gqyoM4;b(3%|^Xq=$dKgB3H8mC#bX-G+tggN!d zpCjj(?DsXXuQ8yJ{J!(~E&NjC7$O@;+bEf8w5DuSjtz|Uyh!#M#FdVs>Z3y0r*h)% zKZgXAgb&K6ihmP*8oIXzA8;|GXv*2Z3Pe#42yA{=u9r1cHpbn z0c%?-wqcS$WLd#QA=R|Zvz(&waH*?g&5~A#F5YFAx)PL#O~7d@AqHhBT7-4#;gBL% z`-*iX4y&+=#wx8@K$BsU*Mkz)9~50t zxbCINE6l-&^AqywuMMD1M-qx^HKOt0@uCJ~6T(Q7Vf{pr$s1-7?k#$=28#S=n7iej z6C6%78%>kim+ipF4@&$N>t|N=x&Xn8K9l zCYy>}pR1t5#Jg0Ucmu3)%w-k9Z3}r%!%P~@hRHeKv@(`laLP%b4bc3~7PIW*nAb83 z(vTvA>yGr2j5O1Udv6_dp2p2ixgzym2_dbcAxUBS3sT96Ko`!o^_)r<0BIbLI8Qbg z?nRfruvB1k319-YRHBHNmzu83Y+52GvfYe%FtW*uUn{jk>;sBjQ*{)%?jg>JD?wn= zfop#tbLTab&Nex%y$ldYzI~N**nx{G6(hEi&2SJ~b_1515Kt7D!#xc0oYnRzw$X_k zTnA~lNTAS&_^JUrKkW_-9#rmJT3cWTC34JabYo~kT0mx*3voHk`Q`%P1}MA>3Y4Cp zU0B#y;%SOAyfR@9@v&AB9FL?|kB}>$x8H@u$)Fh|x)jnZkoeG{(`P?w^sh}okiOfE zm58L`h+wQ8F&h5>dS|L(WeH{aGGw46ZR9=*^8ozTx_S0tXjJT61L?-y$fgW8IAL<) z|1i)wRzl0c`QlrJ8Ea)r)+)q$D3NbwKcu<@vk%lA++{`K=TIinyB^G_Kfo))g~YCa zbh>I$mtjT}-=e4<9>SO?!6K{u>?#nt^s`b=agPb%=FHRCm##Cduo#QN=fbt%NV>_4aM|og{2evB(&%u=oW{9~qO?17Ksp`F@8d=e z6^wL-az-!%^ye{5*P1*7vQ!HD zL7tP*`#!MWYQkX9069lNfO$^l};NOCJ62cdto=VgVQqd`u zd@<;sB!PDAl&bEoVhmb9D+yh$7!-xhfwxb&pjYGT6U%D}hk&ery9LE%>6R4*D6oJ! zU4#Ocs1c=dcdLu$d;<&9HO*OPqT%O!YNy=6%U|KwBjLngD!jm0Xu8Mg zU&1{r=y>JnL+u>EF_;98*rmVJwllGiQ_;3*?T)y#d@<=;`xTNKxq)i)+&NyFtaaRp zh4BqHu2_+tj&;y03XK-DvqG+~saz#%RmZq23*nD>JN#>EAcOm6)M|hn#|XiyUGh6f zF1`)oObV${yCu{mbGFkOyBoavyuyvf6{dW&xBPJE85j$Ux4k8#cS^jz`UHxtFg2d= z(wA6$WT1xsp88nKj*0#FdUb6yv89-AUBy{#qM?_dQ%~s!&NBXo)kRU+Ld>ttA+y{o%{d zTgzfE+phedVvSH~?9(~vQqM50)lz^~VpRd@Y(MelZ>j*D8D37(0Si$zYFRGc?J5=~ z`!BVCi;iuWBG^;h3_lHfT+slXG+*kX$0!7|SO>2tMYml`GA1q^n;#auxoUy0ce}He zt>B6AG8?MOtAK|49N6ULJrs%{y@v?m$?jDg5oz3^v<@gzU9&o~Xu4x8Qqp@r z=q~sgQtCFyr9VeXItK83%0UDsZAX56GnO?eJo`52KVfEp5c0i~50d6YzC{i4)!C+e z+0j26bPM_~IB_(QLtb&f+omVTclixZhc}*-{{NXAR{xchlpMSE(-tPge$BjTA|MUP zRZ{`mko9%Mi#~GlzM@3DTUAVG97Qw)k0$83ev~}^dnDG;f_?G`(kzsW$Ki~Jga>7n z9sN7NO=%Xu0!nNc$RVnl3^~G)ueb4&7TlsJn48kyw`NSPcL7T^6jLOBV1`=u*%tti zrgp6CwXQkW(Jas-E1nEk`u6iCN7+QJBfbbpwkWw?p0A++4~M*~Pn5@`js$mDA9mEXE9EvQ6V~&EsWp;c&gkD-fm)O|=&Am-x_GnT)b%KenqUD$91>VOrgx zkCBT@cjyh#`H2_XxR$^>cU;GyQf&EXYjnL-pV`O{esSgCg8Z0I#6GFm`KSz>#vNols*LzdVkXe7gv4wg9MmP1(^jfy<<@0-- z4BodA4blzrQpm_{>{;SMMpzoTK=sCjc#qkM{dp2hD3SY%xU%2Y*-+=5W*>kirIMgK z*iyxn6M7LSb7p|1gR~Mks))2hl#MK9qV06RaUgL}EpK<&LZlYujb4{2z>6nK=uKj) ziE0Tyi#l@Yw#|YeR206J%HzP|IOH^Zo!uDh0p63f$|X@_-OpeZh;m@rlDD7eE1CD` z9@aCGFbLs$LFyy!0kCzi)-@Z4okwhPEXI%6QXmw?_%iH2c^8G1z~szKK1*$)#2%pA zcl+8U z+*x>;OWnXp>Xh@z`Pd)H&f+}aIFR~yc@PLTLVWC77~bNe*H*<%CCIaT4MbC>f6Zlc zkF#9e>xHZB?T z1t^Hky#yu*c(clji^!^tJ`3M%a9 zd?2Ht3f?b63CQ@iZsGxNl(X$Pv~JTIoFsAVPpgToYbVV#|h=<0YjGb^Q1@uz5I98qkGzvrZA+Y^yt3eA^JS%I^<_DO?vzM1g zP_nUNJrp5{lX|eFo{iMX0mdVwC$|^n=ZvY3xNm)}L^tKHR^x-_J^3bA*)co z-kMmeFLQZfS_#1PzerH?9IKyv3G|6HG?1M<cBc`6f z@-ah{Pj;x2_G{sz!4t@9E|x`DeP{}w5Bb=}Ljw>UOE?uCE7GM&?gEIevOXDxwwyDk zIl?^tAPv#f9-#RgYc{73+qZx^Oq)wH$rfOBQ01O5M=_(s^y@fsTGMWI!Pz;3e&zTv zYXPCQ(Yu0Eo5$yS8FFzZ8w?9dL`RBT8>u``+K0ks)7rU=Xhvc@Ep1R0XEiG&&&={k zSzZn_dAm+TK(4Avlry!Nnp)SAm?KsiKrM>Jf_s?HiqfRKZAO${PP*Z+dUwbLbLe;y z*;t?{0Sye`B@TyA#5xTr01tUZt%D_XeUl2COYZjp z;|C*Lc%MX>gWRYHpN^DwT-R$FM^2S*?`{$s8mT{+uo$J#0G;ONX-_qq3sA(6&zCjW zyONYR96JET;?Yulr9WsEawR3j^LEPEJ&31OLk`_JHWU~;xZs^wf8>Ip)$cTYAZP4| zDWc&11jt8Byo%7boG?IypKNuGJVAFPJ2Ic}oc445lL`@2vw*fnnhR*|#-L=<4dr); zYnPpn9EU|0lTNX<3i3TfwH_laAm+q*PTBCAbx>n`_?)U}5Q@PwWn*h8st7R~M;d@K%2ij@ByGTY@<6~& z5m)Teie%NqMn3pw7bNDW)(G@61NAOeRVLQmR7ZiEP+0Xyl{VGX%#7smx4rEGDQ{{= zMaavl*{sz)-AVWs@b2d)(+HmDu!vf$kR4x6Adu3-)s_rK^>k{GBM3Q zXfyb$8eJ{rl|)r_3dxmDiG%#5R!zN5briS>#B1IxSq6l*qqgko^bn-YQSHre622A7 zROI2%5*2Fu`Z`P-iKuIAhJDahU{R82&;CP5WMlah)ze0v`UXZVm#ycCX&6hBv~xLF z23M~__!TRt9lPi)AQ6~cMT#NDRcjg>18CA%1ir^H%i{_gEX9ftSX-B& zfdY)dmoTYE2x>@d*uV!+S0rfdkRVfq7v3y&At;N7jzjlt?MvdtIs zmDG-DfQs4r6vmaZY^tGugRN-LwC3>5CEa1aq%X6)uMNH)E|i0W`x;F4 zj7sCwqydweTA^#iiu#jJ%PB`k zhp_fUT~UV|&`dd~`^!}d++x+;pqVyR`Huj%)2hRKj02;e-fgofNNvq!z$<4f_EDgB zUUQhlQJMUtOO%+^q}~E%`>LWG990#yTN^HARonp{N98&yDIR4i`}`=inrf4SbdK=f z0Y!81Q`4o!MUE~l3_Uvwo5CeNOHoo8dO8=-2M%J$DWepxhYn%Xyr;SGWBfEc+v$_o z%fKq$Ihy!fP8Ur$%yCd>TId2!>lzO2h;v$aK~sX?cuF-Vvo#c9XIz!wle0ou6T~;_ zz2x!w1_$w_naW{6`pprTH^8v|Sv}Hs1V~GTm1A}CTWM(mUDh+#ti1nQA?`Cf_(>b? zGdu9^obqHObS{{xai7^?J1eTBJ0ed(YgO|SU9fVqO`7#{pV@&C4V?1sGdnO@qdgk~ z>l@_F|J-MG@RNp=`~Npi;Xbp&;mREC$r7~gTQ#kZ?M+?>?lU{Ym#nPkK)OEEfOdLxpV>k4tS+{3+p3PGW#+WL z#C>K5Ud!O}1?0e%rvx6U`DxJ6EKC?sIT*G~42TrF@Zpba} za_>H~LwV||`^*l!%1lSWy3g#8Hq3LM*`=&!`^*manH|>m6~wLe zXnC7Bow6CeCkHPU&^DIxIzzhK3{~XdH2^J``^*mO7F6ytJMf+sZN7t%g!{}6n={va zW{3OC4%$7&eP#z=9O*u@gLcNVn8m~YT%B<4KC^>%OmUytp*_RgcJ=`suE=+$a-Z2D z`Y+vQcEDRlosIj<4(U90tAe$k196|(!FLdHpV>i2?_x;IM=tI&JKSe>@V#QNL7V-F zR`epS?ImybnH>x#zPQiqz_t{$po?#FjQPVt98rSxlsGIHhwM;{fPJtFXb)`nnH`Qd z0C1n#f%Wc_;dQ0WwCJR0)jp5zGdp0>((w^!MD(gEH7J2U(;fDs;;+ZM&+KrY*+EWM z`NR_UnH{u=FS+8~XLe+p-Dh^VI+wwHW(Pct((&HzGdnQv>pruCpG#~z8P|Pghr`2V z-Dh@~=@=LHnH{ja#D(SVGdpPI4Sb0QadZ}KIpyd~X7`yLbjVm*Io{9E@qo0Ez5C1# z?nT1skyv`=KC?sZgms_UVWh)IXqMBM#~Y8!Wx?(+dR`^*mYK@jdUI~=@cQOMu3IOPso_4e!*q`ymZv=ZVhm0vcAwc{ zEDSGXh1TQm+-G*6!3g2*Gdt8LEx6C@u!L(*)o`EL@gI3+MU{$)2)?`vI;KYlk$0SOgo&l97G{ zo4`I~AG1%`a`q$g8G&44kZU9x!d_agdmc&mZdMyxT)>JPeW zBc?IR{t|135_DqyQ2w{sVD>q38-%j-XRQ$WG9aHvIiCT>8o*c!80+Eb8TK@OF9O#K zz|oQg;=evH`Tf7EA@^B1F;=u0?p_foe!9U7?i!1K=z)tK;W@UItW@%RPRl&1q4xBd3Yu=@&Ho=CV&{hG*8%#g5d$liX;}ER3us`cp=tg zl1_OL3XqVQ7b2Bo#-356T_Vutpil72H)opjQGP1M5@8p@iQUncp+c>nID-1 z+>4FNVqPE|u*TvQ86gLl@=aG2bu%0BkRA)TMEb-6pgi26oQUuQbpo|v2Kg0CzoL;T zpef5diUN=)Rqz!B-k$+U5dv3H4+zLC0L!n!CfpYY-jo0Vrt^wK6Ob>|2d>xgTO@46 z^$}1gVg6}N``?7m41SP~+a&2-xyQK(#tJHhw%HECvGUrkfx7@qT1B--14FsFcqN{h z4pY?jY>;rM9K`1IPtcQO@zSRCH0Q@0dxCC{s8t+9jUuGH_9&Et2+} zRZ@2td1(v#Cr@?7+P!2Vw?o1&$o-yxcCwTgNM{nh!A*hi2-lyWuZm&FO^);`fJv8J z1u-ZhHM`@&&q#|0QZL5e$(Q=D)5uN5E1a%w=FQN& zLLE^^Jqp^iU>>WDkj#l+pc>RQBIbJ&w2D386>I-@R+xZLEvJ98h9SmGsYor4Cv}t5&z%(}^KSF8ITufP=B@nc0hayI(=R}d-hp(ktXH{Sf>sm_ znmNKTRn6Z<#XS+kMz>qI!+YMHW&!=~1z|c!0+()^vw(Z2_>jr_@5y4_;K*}yOJbc{ z4WT*0ap2R4!9!&82($^nViSZt$WZLV&jSnf;1`5xVh?`De4qGf-YGuP9@F$V6{v}c zV4v7Z<_M=9$U!#GP9+IeGjYFg*NH7)>)+Luz(rvOWJGBRT!Zwz6^9nh}Mc7Oo-QnfZ27m}-s9rv4%q znkwJ4O%ce1B2xhmor8kW=s{M6tI^*&vb!C(2@6OqvJ-h5EN>I1$%Z33L~~Iz00rc0 zL9oVHJcUkE1xrIxP>TAO%*BoBcqSBb^V1qXj|=gA^KoR#%xi^n1aGzU)r}{gb6U}S zq-bh9CxsJ0Eg&_KU^7Ke3EzU4Lcxdh4&p7Qh4>W+=-m;5TMUx<5X!d0@LII-;u{aO z`&{CR)1kr%^a7NXXy~R()SzjG0P42)E6u?g75D95F|$YOC;>1(K(N+^y`fbWStv_c$@NjXjc zRIX&;Nv=a#cD~V~&ceg(^@`x>AEd9<0cYvVZz{8MvbK#n8ZR zEi@VpYpLO%)zHJ^&|N^CX`|MQ3?(5jBjp9Vl(`(Ec38R!{TRU0HQ;}@pj6E?+FLE0 zk?wYI%rd?k=%b+3%r=X04a_}l*iNKLh5nRBadU+mC>=~FP^$J2u0v|aF?%@??<znoPHUNR zybZk0yWt&RwCLJ#=Y9-5I1#)9ZG*_>3`BRDjWqS+R7H5d=5U!$Z+OhIw zWPV=|(k-URkY@Wv_8UlcB_P+}U(*T*QFI5Xw0&$UC{Wvsl>0;U?&+Uj_N zaJe{TO>WJ{$V6O0LO%Z-TUBpF$sLQ&6=4g? zp%I@v7lCx(wxNFG5AgoJ5*> z>5Wjhj=k%)p@4csO|I!&fu$Fk7?#oq_@9AiSGB$wt+9BCyUgbyv=YZa>lh)!fla6M zyDKd^nmHh@380RpTQIhp4I7TS1CnR)r%cP6%VyMuy$G5?l2Qa=dlNM@C~{`?T|w^I zuttbSj^$w^)Uqp~y97VBD0EEF3Fi68@G24%HzuaWk&mV+n7)UUy3#8fFzcX_yfesA zDS2cqi`gn|LirwojuD+Jn@}W$CI`s_S)8WXfH@*j7S9N2e^C|}fH}5`!-!8a!ywu~ zBn?{avL5W(S0bq*TNoX@%k01v?o zx0W;xn4w9CxlfL8x;311{(k->`8Xz9qpqQn<)H{!haz#}mB)!BXrstjN3F>u9JWg- z4n^dlpp4fnTFd)5_zF;U!DpqqqJWb}~ZULLaC zl@Mp4C=($dV?h_WG1gHgm`yOzYzh>^Ju95WG)WR9a2jkK$ad z%)?z)-LoGm&1Rcr0Gr6^xl$Q&fOik-S2m>%Ko?uB=1eR2Y-A~@%9D$PG|j6pi4LOI zP?)?o6{#H;k(xB-$`uC8VLZDsU~Wk`S94Zm2(v(!mKF0jT{e|s!sIr=xG*{hZ7Mjj zN4oxISU*aE7V0vf~%2g2W(W;;2mMH!y2T#DL=uy6e38HqcsFbUGEb_J+)79Mjhx}aypkPwUK577XOM8(8akCr*gf!f4CbY2#hHv_y0ws5Ja(=% zW~QQG_cd{|)I}n5Rk^GX8eO4C$v#xZQesalFE}k zq4uUQ4`%T+RDB#?T_Q0FtwgeckvBtImR%gRECXX`)?QN%5t9w#rakrBG)S&%DBZ4! zKLxV1VamFfGnLbQMJN@(_@9=AzxlNGFdg2^8nW1nyc5&c{- z1}sG1C4tEggz+%1MLEA|5+5bYIu{EYM8;YJ#5Byb!AgbLgXAC|`Ho;HcUXZ~yGqyJ zF<7Nukn8VJWE$ySzi715i3k`5oj1;tLibBg0m7!;}d1nagiLFA5aD#L-zJz%&e7mDuObd?HTI~&=apj zyjTbk>b6x!uF}NZMQz9?)M`x}9Q#VOzeW=cue3r(uC>M<;3Qn)&xFFJDM^ipWF4{+ zWJbspY8CS#ONG2vMG#t$DpPhDKxXh}A?kqi61j0is3U3`ufP}rE^7Paq?u!dJEkJ` z8jKSQ7I?tr#j(jEF$PP#lmt^hc8%kaA$Ah_-GC{?AOzMul2c}KG=?geusOlQPavL_ zKFG1_C@B^91cHy^UyfLdL{~u(A=|B~SF$X3sKPdIIKm^=t(f%&z+KRUQH&Di?> z!sWq&jAROkzH2SFqt~V^1bWd< zBRnEbZOVWDndw*s_xJxU2V}`2`MP42Gxw95FCqurG9hbUHz(YjaO+5$ZSx<|9_6l}sh{tXapRomO7u(IY;(CZ3V<+*yiKXJYo~>qU@STD0LVSO~_a}Vk zoq(DJyQzhvzQ{k z_5a7-yT`_LXLp{rij@3lcdFBw>54L#Vld=VTqs=DiXc2#Ttoo5fB+T&350+i6hMTo z#lmYY2ov5Vi1~-6uo-)27l>mZS}ujRIKRV3OPo(^=qt1^p~)p|c*(if6GeWWt2t*TK5ckT=x4nk` zHWFHEe_3C5CFHPTHnBuM=a5$fl^`nU7X7B_X^yO88#D1U&Ngnl;c5AvE`HmHtGDGP z{f^5umsmtb2F>$G-vG^RT{OwkGp{ymlh+Nm%@16e^?Wwl{7gx+kx@d%Ei}v^C(GY! ze7~(*=q|qc9c7u|R(XBJZS{R!kT&AB+3u(MZQ9+|wcd-2;5YO#GFOo~uXJ>deyA_I zM_<>ofydv_Z*u&OZub6(ejGi_-dFj3PW^sazp5|lrQW=5^?sY9mG3{|`+4{Hk929Z zq^EoBXu0=0oT+^OG2bt^$A7F^E$bVq)w{YGHGA*E)uxUAXdawa?@RhcUt8zsD@eM_ zaT7^r^is6cyRMge?J*55{^Lb@P0swGe#zIqa{MHmR`hi^m3kNT@bu&~xUPHI0?MZ8zXb{cx3Kw%s8+%_b^!~U( z8;u?<_Lfzfcl0ZPe7tQgAZ=CGrbS-97tgE8!|Hk-dG^?cdam~;4O*pp!@WA~N~+bn z`e%W>{H-o}WM+FeluUEl&>!J?P&w^mwVUnaeFo-<|hK`ndoY74go95b%5-^Xeclm zicwSFh+24l0e3ErU5nadrDYc&JUKmEB1mn;rPQnSE(IuL4_Hbe;j?^CTpW$O zXv$1qc|I$>x1#N11gzQIbUte9%Z#CQyg@tmx#}HzGBoXWPiah}d&<#}Xw#V9M2owP z=q+YF#Ua~Jegk?@!G}P5!JM_Hwb^2g7FS802sS|o(vEDf&o-l84x-Ifke8X{nurb{ z7U(si+c5ZaiM}*R`7*sXt9@{VsIW?J^P8~|o*Wx1ka%5+X6OWM*3>P9ya{>e*x21V z>Kw_$dCjRiOu9p@5X7o)IxMv0x4IBpL+2XWC3NL9k(WduWwEdVf z0xm~a>1O7Js_hHC7wM5K)(cP0>ZRFcwA$E80Bw#$)}hWeky}rDRm~7y$&wLm7d5dI z%#A7Q<%+%zW^FRPEy_*AB9&SA1<2cH^|9XGkD_hIRE()wcv5-ybRin*WtDL;N>0fv zhI>yltQ(NJU>lQ`wnHdzTaoIzL}RJ<3vk=)3oqbOGQEDFCYjvy#poIitR4Fd7pBuE zb5+}#v+Z=i3$uYlD-B20OD2ZgHsNLEeOpR= z0D)>RSmd^EGidF}PpftmcMQ!=rb!piMX7~ELz5&c;*#F>7pexVX;1Zc8x&%^hB6)` zOiZ3*VkvF%6D*Z=hb|QgpQUD%rI37q_W}I#~4FaYEJr=n|_BeOCA?tJ}sLt_ajj$ z=629*610lQq46Gt~{n%3JVxNQT=++PfmfmqXT z;f8rqy~&SjOo3BVZ>hR(P3sFa*4S*lSB-cd>)OWeL)?t{{e&X3$D7I@+GfY5$Ii0G zG{-)RD)%_{jvC@stGqB<)A}Ogay_thm{pkRXYFq+E+X-xG4uNiMFRL~%pg{oJgcBO zE7i)t$@-!D+KZ~rOyOFRa8zmUSZ0gnVx0A>byG!0vSpe)mr{ryH`O*@v6 z1?I7{u4%YFzzTDgOpO8NHI1+JCD$^Wt);f*w66>)5A)jQ5@?#S_kby@fea;zq^m3EAA!cxehhT)ja zPvmi!AR-xulq`L6>PVc4Wh+S@M+=hl<-)V2=+7!r<6=SEqzYnr<~}=WcU+H#k8$;p zsqSs(0#wy{bwrnNm`oiJM#t|Qqs#cLkrYI9hUrjU>}o9Q6Bg$W5DYU z&^?eCwUKhi=h1S<1_j7GG0^625pCp>&zw?Z8;eG*j$e>;v4ZQ+Mm9|v%;37uvK|JK z=2ciY*4-9^k1%v=80?X3)EZf?Dq@e^#4|idw!>zls!ko7))aEkG-Ok&R&lo2u^!br zD8G#qJHohnPVN#>{X@yJ!yKWc?_W9cKBK zP&H(=NZ-}s3U$y;c7Tp{M|p&m-H6uVbYUGd8za=~*#f@?_#A$<%I=JxU*j^jX&uXT zWC-;1YSbLbc4Sp@#@dF!wJ~CKtnoXqlE)JIn+!Q>+4TQ3)mZK#qP>aQOB|QNwGR#;9h_}}+ zTk&pWmEGW7V-syU-N7ZD4#^Dc5sPu1CJZ=1Kt_6&&@I6rA1!uh#|q*$45T7Q^U+cV zw_`?g9o(Ub!>mQ~aM6y*=;Kxt)dMqO@{VdXB*id6mH;KW`|rAwmjH( z#y<@L#t7#7qWGtq@K%>ERxt|$aO8GJC@MWlno5tBN3Jtii{$Cjdv{%vTxT%To&l;6 z+rqPQt!=X#tL*6X-C}ngRyR8&rwFrtb8(FnD_wTCgByLpJUvZE=D;bj31lPwPEyEr zhn4E@>FXHiW=Cj@+kCj-DC6h)rXPv51k$k^j1&-#07}d?Dc8U@&Gkiay3rxaHBw{{ z@qMI#IVv3}kS1#&jWvR_Lq>8xfHrcCm@bUumivO!k;H%Tj*5v~Jgz_07-(xIWm#5L zwQ9`ea~DW%T43D5gY&Lm6I|&*Zie<41_#o($z`*r1jvqA5c94%y`mmLaDe21L4u4I zi_36>lfYQ+;D(frk`F*@)Hq=S>PeA(y@Q(mDApKZM+_tiC?)Vo?rdRnfTk9J z+!*i3m&&7zTW#8FiCtqdd(91P6(o*ZI>uO{r)0dkrqD*RctkyrEqIit_YgFja*-Q5 zT_El-EfcyO)g_25buh*hlWT6LNPLybjod4|IYf4m&oMDS#*je9yexQF3#f1S$gzr2 zuCt11+Hu#hAV|B&N{M5R93kXOAC*V$;IJ7L*JS*9%_Odz9Sa}p=-_s+S~K|>N#3zD zM$C&0Ut0}ohZAK+=5q%WPBb?8xf<4jHqWlkoyD&kAr zSC2OlvKfXF=eWc{oU1cY%UrHA=QrXa5v=KQGV8qonSW;~&CAC^LpXJ2h62tJqdaZVc&vh2P zi$QoSGR317bfd2ixq5S zPVZ5jjca8=Ochoxdib*+sY3gh6jj{*?hyeiMV}lSd3<3uXRuRZl zQn-e|4DUCKwkv$hSqDvMWK6Q30{OeGz^n_bO(-`z(m*MU$zZGlQ^O=LOR{@l5*j;n zyJHO#ghnO>OrEugrTB1nBRn}=HO(y=O76_+Y}&aW)oUF}vSZevMK7})i?n-YHfR81hK#=^I5*90V)5W%?f@@pHv1uNKR$VtacDutsk&3;%8G=?$)*-aJ?t#mBQ8d;$$bgZk%TJGF8>d~!GMz~85E>j;M<0B#jAe<~5GO8>I zwncinNVpT88CJ{|3;sI2TjG37I4{w;l5)#abWBYK#wx;F3W>s5N)=Mc%6RQMjdzry z%Okd`Y_PBj!hI}%Xw}cX+#$+3+{4F4;A&D-O$Tw-D1$LV12~swbBESDZqwbBLTs3fAV0wBLR(D6J9RaptVs9=T$nZ8*8i(C#bYq+BvWGT0ZUM@q z2*?;Bd!3ve>$o{WVNe0Aa&+fhMmx%4jpE2k)NxWjzB-01pT}-+Jwdw3h~||OD3#$T zNv`4;9*LrY6q}XS!fQeo3RADGRZ75bn#h8cuqU|HmkrCx#_J~~PRC$6*ql*lz zG9_J$ikvpGC>1a@yqwEun^RhOR^+5nzUYxTRXUp2^u`(Wug!Vvdqg;)$cu*s?2uMU`Y;JmOAH_6{x~Vct}C#&`>H72X!m zEtfZDI>yrqBcZ73t+e8ML!N7DndQcz0`tWspmIavEGD)o^$NTjJPDw3Lc-VdbgAR* zs?Fy6q8qYmZUhAkG6FWbUQ%sH({cU{oG-~I-Jh()gwfc zk9W!<4GT*>;4wR0L17JO-IVIPv5J&zy&btz4y9S`*xTF)F*cbMck+V} zLzbevje(ja-T78DbSxN011{wO3uRj5VX76>+dRlHmf^7y=}a+)!=vb+$g5kaSZ_^p z*~4dv-Jo7a*cI+!Z~*X-BhO09jc26+yW4cs;Pob$0*`-3E{yXWY7mM>e2VaBm5-$L z+*}gs9^ev1cafh~_bnB!veb}gr$3LbfGrEh!hkJqA{PPx#*;cy*rr2j(xqKzXiq;f zI~g5_M!V@_I|__$J1QzNAK)y7>AhTI;C_(FYe3D9WfassQL@i56}mu5sgps8PkYOh z60p8F&aytiD>DqS+yF0-06VD&$>rmq^VPmXB7`|r+r#xX* z#4Wuh{eqZ^OHI=ESW_%&cbB8>gsmtpsZGkWiED)4#pqqGRo)t~Cv6$mlV=#$a=Q+* zK@G;1*;!*ZT4g80P5N;IW3DS3G9`!|0#T0?S&w0TQTFQ<$=#z zWHv3#u4A(`g{m<9C{b2!u9}`)Qh~=BxHdq&V@#s2jO@v=_wh=(snZU?wgo$`R<_7a zhU4sIu&ud$$U~Hq7))hdtZPG)0|xlk$4W31yU9FH?RV^gns5c7^sINOrdYn$lpXJD z*#L(%U1*v7#10du<&i0?{*WPfS_DmU};t{t$O-Fq+)|Ca{R0~}@G ziHo4C17GTTlQ%2)S$s0;U#RJThU{e`wgyNt2X@AuN#KJ4C-v8Oh?+YP`M4^`3|5tq z9Z=@Rl$=)G-@OzKqh*f9MR`UaMI_Cx*JLYE*9Tk~=>cB#w0#*xRREm)r2w5| zd{*?Kz9X|Q19!5!dwTM+62r~IX;gVa5;~df)IU)O!DDwBz-bIzasxE?v-9uK65+_uYryrMUg;<%~gLm~1t;*etjDCU=lRG2+g@R|DQnBrB$M^+mfH;($UaoZ5WPX6U1PU?Y`A4&9 z9w0!kM`Soil$I{zol*gc?Vd2n5Jj=(vOZCYsdrhRnDdrH(U9Th40{5a1X)x0sA!a`g%|l{bGdgb%lEsua|vxU_oO}@`J z$M?nSrSBK9ht~vOJ_fD(P7Q{KTR{95z6Hd|<0oI{BR{XYzaRefpQj~0IhmWge6q~v z<&!^mzpv2emG74F0BQBv$->+fx0QT1+*b14rqwODoIH8Po8%FUgeDU zZ%t8@=Kf4kTvhyUoh;3LPf^I*TqU>AAa{E1%5FiQMAc>nGpx99x63 z_Sn^vx54=xKHACiCpYF+XkkK=J88p9&b@xJ$j@^%=ggCzHasVEcjpRlcmuo_Ppue13gSb2((;ouQQ=yLmD{mp^IpJ>$yy5G{gQSSL+S8|&oF z050A(SLV_#r|ik)Il(G&vhXOL6f38}v(AyVlPjD(!%-W2A~~qNebT~)-u4>$+em1w z{pGoJS3(XeW=}4GAcwpns02}A&Qgfd99hRU=E8Y-R`Gzw`q5KP8+{CXPxcouePlExSiw zpUVawe`D?@$M4LU<9{-D96ikOSNVNT{eF4w>fGX7X*@q?jenb?mG3{|`+4{HkLIM+ z(p-Anj+e*3!!HJ)#viavlAcA<;H)~pjCQ2JU&Oe zl4|wt+-HHj{H-o}WM;=VluR>a%oXByKyD=%1LHTa65by_Tb1i?nI6xMvn7qE<*lmh zty<=gzcv?|Ku_01iOBI5Za9Cu=&G8kbL@*0mX`!W-g7j$4qN0cw2j*X)H|+7%xR$U| zVMarN(NK(=a~p9B&oAK4#l*F^ohYTOB)e$Ev*VZIghcwoifc(xW=kfeaeI6@kcrJU zVZvtV-k4mAmwZ@ASp)Sc#4T5!;`n-?J~o|W#ly+eM2R4^6_*mbGcE-vWKYSSW)7d_ zd*b3~X>a(C4am>|`kAc26mx(LLpONVI88 zZ=%KBM)Vf5p5l;gD8B){sNh4OJ!ekXDQ%)yqs3K{CxT57g0v$W>=VtXmxE~8hOI&! znrI?AfLNf{h;GB+sSFj+(sycR(-r{qmWvC#;mYP5j}Bxw*2!-;BPA0{6_IqJhJpJW)(pr0|kv6DG#5 z#oLFR5pX%aN;fk%RBc}vzetZ{v0gYiF;|*sMyn-O0%&t2vJQ2&iQIbHt7?YuN|uah zyQqn!U~WuVFIV(+Fl)*5wkS6di&SRe=OAyNm`jY0e-v*UQZc4#;iU5JR3RQ3XO(d= zPEN@zhI^+N)(uEqu#HJe+aVOVtw?oUqOsKb1-NbEx#w^xnO;9olT0pkF}{WaYeS#m z!gP8vSGBD<(M|_EHxWp*(tzYqMG_>YmZDY$eh}E%iR>qQ=yBA-?X~P24h- z$}kOHh%*d^it+XdtbkW4%lXL|D{({Ft`S*z!hTMh*qZ7yoN-HW4=T!Xign+ac$?%A z6p%M}y)TRSGKX|2UcI#Z7AwrK7ct|5EJWHsy?w%%nh6BA{;>%DkR zd@6Z9zJZSk6gwel@Oe7Cfd4Um9n<)mUyR$#M*ikv7l)uc5q_?D`zy+$nh3bhczWr4r{rnNiNhx@&^E!}vLztr*{5vcC9o!j_4J|ctM+gRh6H22u7LF@Nv*@U?t ziApiIgJzSURYVTOuN11c#P1UyVMa4?l__jf>AF61nw}?)Zqzibw@+}}29~+M7$gI+ zQg7jgc~ZUP$2F$Fsi~M$-M6Oog&J#Yw%)5oypMHl9^KTwuw%Km<%u~Lp@ zWPv$!)-_EiMY2mry)6UGYZ_ncORi-$TT5-rXpCD1fu?*UU*1%;N;RGPO6 z$7$aLPdJfOZsX)&RPD=ZW%;%mX_PvN9Tues2{;u$OHwbA(yruRK7zcmkwYRsn-T~n z2|SHti1$1Yptx>4L1?BfmOxwSI-7beUkf;qqX8Z!6OUske|vF_jJLgGq$-76jqvjK zwcoT+wY_wOpW^-_veDh1U`ChXAx0uj=MtgBkg}5UrvxbnNvSolCnaS;O0_i^^vLW zZRY}1)p~VAmvER&9T7&y?;NAc_^go>M0AGfP+jb5Eb9{%=MNGa!3rlPCQRjk0aTZj5o@T#lPh#oJL+WxP@Pe+vO*>P6hQYt zV$^iDfQYjN1O>=EG0^625lz43Gp7{U67e`&K#+8?g6q)qO_K&QxbCy8hk>Md6&8+l zx5eNi4BZ+AThGQVeYvWLt>45mJV>^~W}~W39h=q^a?mtnQ>#{Sf-NB8Yym-EumuFJ zo|C&oRR2)2>@amo`mS+VV~wZ_Up7RXB0`wp{wOQ;&MTBPr4 zafLeQCObe!wt&!C+39Qnp}MdR8e295=-C3l2KXF)waV^{pI_rLw`mQr1q6YfUX7bN z8y%?RjI|AcYeQ!X2!7{P^2inty2+5EmQDYssK#;^5$)LmLSN#z6t1O^$QBSfNruHm z?=88fsn)UugiOpWaL?24RsMzD=H3Xqt$N*S8Mc7X*#g32nLL)d7rQj#?X}BRyc=0% zH+a|BL`$)e0^Ki}fvsDNYqo%>It*Jt5V|E8iF4vH^s=32LLW*E7=xhN&KE|>< z$(v$zwt!$IrSmFgOw|_ehzs15y4L_2wt&#N&ZhHvOML_1Vhaea3R@oRJLAt55b!T! zzAuV@x(RP}`GWU~qH2*3{Z{O7M_r6 zZJXU#Wk;v)7CZKB(AffloFdHn&Bdh`D_zD*VyUM{{fUmufm31=$aH@vDP+6DO7(Y& zEg*muN^qMG7aV2$@ZR!GP$dOvi1+yeNz(x(=1R&nuuXG)5uA9rJrKwC2@%d)DfRbwvf z-=KixQUc=^F!HWn6I|&*Zie<41_#o($z`*r1jvqA5cAjoL13sy5F8*mV2~i=#bOU` za1t170g+$}2p@pfsByvu)Jc)e77#Lwbw@VEAACbeXSpHL#fhO$C))Imj$|!>U0{Jn zIDT0jHtfK_;9v^~F@nxj2njy|gDoHuygIkW2s>gRQ9vm{A8=<2qXRUx0OZDaN4``Z zW!!2huO)Vk$pkwusL)nH;<%+_47Pw!umwbl`_N&+77(gaB)&@JM(!2f93s2OXGqMCF(i;NFAE;l0_qz+GE`B@ zbyiWT9d}IxLE1%DN*r^fPRN%&D(mdGpl4KElkw{{lels=5guX-hm8A;x;Ge*pd z3}0IfYKN1on~E}?oT)L9WD5v2yfTSUN3t=bUEqYl^XQ|Js}%VIIM@P$-V;RZNRTw~ zCPFsDP~seyIEZs~p42iIwt#5JMI?YkmnUyWYH;@iAFEFSn|yB!erfL!LAFsncAZ| z8`sJLget6D^zdgtQib+0DX`AD2PP>tU7%yc^#n>mXRifa_^<^89AywVV6cinrjo)n z1ZH@@S+rf@V@^0|LV7~7p91;2t-!1ctW79v0RfakLIz_Um>MQ|S(4oYlTbpofWQPH zJt<)FtW7M%hr1i$$>FML*aAZN0anDAV~g9 z35ylG>0(<`!L_YpD8-}Ds_T*owtzr(#a`YFL6wVT3y2Ckc5Kku0-^~shL9d_#!qbl zAxkeV0Ft}FkS!n-!xb`=oG$kTIyP#E-z5l_sSl9x5fK6qCe;=YE=yuITR`wB zp|O?7uwu4Y@Ym_x66Ybc1q7WdDYraD$JAtCtRlRnkSLs`R3VkDjMuIyy0a8t*4Y9A z_n?%^RFt|mp*bP#8@fM~$EJfXILpwl&(>yx1g?0ScyGuQSN zZUc^7HE>-Zm0}ABj7;qauoV+~bLl{ax2e)N>{jC&+hnJ9Yygx=5s)!N_L`hXbllV_ z3@U(Cj_#bxXh&JBQPfxBj+6TF)iGrGoVdaD1nDLto>xwwREDGEr;1}(kE=SCTyzNH zstcr>;5BbI0^|-Dp53_Z-&Z+VQkw6lGZ&1>;sFrE^qEx`t@NzDr zZBA+B3AF_T$`?JdOtf9&W6}SPuPtF5Gv1~L2>GZXa~Z#C3kcIzL@Vw+O0z`Mbd04gUWe5F!soltewT9XPgwFQKJvBKu^Hd&M> z)D{ptJ}W4=V`PnIgL84~D33FMLOnd6R3KF0iwb4s84z#Jsx2TI^AJ9wM{^dR$OGeo zB6)>pNs5VlyzS`JQ3nYACQP)%&mAVL!|5zvJwi13c&9Ab0wQjy2RtTH6%^K#c9e4Q zQLG{*8@ay-7boTfKwt}q9nrtJBWf-2CY`_oJQFEy%Un$qy&btz4y6fg=xuI+dRmS$naQ+bf%cY;Zbx@lSUc7=Nw8~{Az$g|RN z<5_9SK59B@@Ol$Wfycii7sh!GH3&r`K1F!6%16?AZY~KOo#GP3(IP*sqqkJJ%2Gp~ zNPQk(0b3T1g(+LyL@opXj3;%ZuuX^5q)WTb&`v!vk&I8p<45UZI}VJac3f0sKEPQD zsl8ld;C_(gHK67b83lDuoa{59LKjFWbuuXNX>XZQ0@fGDS=J|bWriV^o8ko$U?&wJ zxqKY7yh$OIjK>qVKwLgz0|xJ|y$@3PJbIR6BE6f|Urv_YC2bC#;INrPrii5L0ofBz=!H#iI7na=e|e z6~`sDq&%CrM)+Nf-{o56ttmTc%eYRSVO-1YI?M(&7+Yp%C2q9JPKKNG;|9iDS2koy z5If2xer(9ABof!ANP_8M+k@@7AZ%MPxmK!#cnds%axG}ahY%hq4cbGC8=1x*OVRaYuN@nNhE$T6(;04oyi3(fK~po0bk}* zATuiXxZ1q^q)q(On#!xuvlj}4Xh zrbsfUcE+Ab;Dagfs2?JC7d};a$0qN_fkBJmN^<1WZM`i{)L4BX_=qp9R&C5D@a z)2Q-a-=btEq;Kbdygi4!)&k4}n&+6-!FH@2fdbQL?1VE|&i%#4Tn|f3d3VKZ{ zY4%a2@Mq}7sU-6`ZuSj{mFgerO{i#!C*tO^Fqt~KD(<6#tJH5Lka`#EMLDvC)IFFI zGgqW$>9b#HsUJK3EpCJFS4_+TTRbOBIwUjY=h#>xy_O;+aY98o^|(|k#LDCzysL+3 zRX)1N=qD&KxijLQD|pr^72EEXJdK3Ij+;mRlEn=Dg)lG-S9r!=8X9LDp10x#D!0$qX+Vst!vL{+^KH5Q^fuj-p8v z6%-YfIY(cL%{R(aS2~4gvpf*SroM;r&7sv z6elvv!igN1_rKu{crr7YmEaXTP!k)Om2RQ$5*;g5=`Ta(^#<~IQxo?6lwML=CS{Tf zqotL=gF$a6SiZPp&0XS zLb|woSzh|ddo`y@G9~f$I@(Q5rBd8iLtCDiqn8tWb9`UCUiy9!dw5OoLhYeB|d<_xHoU{`0iNCkJyqmk*ZtynOKI?)Me?yz<>r9w4ngJ6Pzs z;aPQ{;esBQqP|$imQtMt%IeW?3N1`% zatCdA$+_1L7WsLu=A3!((}w4S?ru*34sU?>;=xtE8}MJ_x23o`XWu+n3OFyEgU_$` zXfB5=yfd^CWH+&D{-DYCj4SIyvF%SNXvyIzscv`;KBYxY6tGDH)o;xnr+`&a;WY9d1^bOG5?h#G0^vtUb z+vIx;x6Kb+ne}`&+x$#Pvyo9k#w|3=AScV;Yka@mW1+kF>UWf7f?MT#R@_$K?-8Vp zxNWxkY0qui-R{w17a75C^puggip+VXqjU7bo@Mvw>pj`P<8Sobi5e%S9=zFO0j&875g?vE8l;__w(-YAN5G9rJi)mj+A5H;Y{WGkNJMVJ^o|W zYPn}awR*S5jF_>zaJ6aUKbi-p6?>`YqOYxU^c5uC<+zEYGd-n9DYo8Ij@kVhT>Qt2 z^qQRc!=6jN_Lbu&;k44T4yRIVu_rt{IE-$Q9GVtmR{t-c{bAsFtA`$TTfEhSuh((# zwm63rqh~Evjuc}?k2P!$TEj$xNG2v+%zmx^{hmVX#|_$O^k^|wR&Cztxf007+vWn& zR(rHzk(ZC*c~yB>y(f=6yZ^(UT5IndY$3 zQ;6IFxz*1Yh~2QTojaaTH9XZ#8Dih1avVl~0kk&|6W2ypF>-bn5$ilD< zpaP~5prwAgD5CLM?6HSK{R-)N!*lBZgxDg?gcNY5djqwY0CRU8CDf|J{8jKek z!EZ`!_vEV5?O_A+mt$-AxIG#Y^AiDkGLh9-4go95b%)IV78t6+8(0iX>Rf|YPsWMgJ* zMJW-?!d6;n!%IPWG-pv!#ES#-uh1KIY&D|wTf<>SLxIsyjF>$e5ev^R;LgSVYZ1G@ zG;9rO{iR4Yb}2$gq(7{PHYmz$$)pssW6Oa|?0!?RS-LkS*CHh!7E;zgeF_oF)u$L+ z57ft|bF4^saCo#tklKn%DW=7i0u-`4Ev1m~S-vMOjz(TIWu~t@pOx6HNP9m4Ycw~U zkJvrSjG=YBK|Aod>K%J9H0*Xysb8ae%8`(0)0o~wi@S~JEoME%A=^-X1A0-xhk(NB zs6DKW7HhP)O7cXo2||!|WP^RQ8TE1yZLWg6%p})DbO5nHuMypb!G}xqrAf+{iQTOB z!4;yyD!t8b#zuIszrR4@bt#ge6SPsY$5P0fkcSTR->sw0k=)!nz2NuDXSyD>hRto_ z50CcrlokGF^i34FX9g7w90ujl;;=;uFKIT>CUz~-e!v+4mm{lmGjl`L_J!C*dL)bW z!h@qdrO{@zTK`G_ZH`3Nq0TmuTTgpc%@AJ6k`ZkeHL(=TjVbHpioOnJZ7{tp%1y)~ zm036mdHZNje=PPD(@aHL_#rE85bkul+0qd_b|h{0jUeNF==T#gaWq} zsjf>jmU_Pcw~Z!~xRgwrc2F=kUS4-&Q#X`(j#KIx*y)OR7W?%GYNA{iOK}e>%JMMlzB7?F$s;PZyb>u%qMCLMS%{P?CiJ&>ZQUuy5FUm%)sVmhrClB02G?!Sj&~d`zI&{gMWsr^5^QALG|C zjlcQDh|O%|Z!UIm2+E`3Wb^h{lt(oYaG&vT$LXjkj`JR|D(_lIJCG(-(GHOQP^G9? zNtCup_6W4~L}DlHz+9{3IVNi=?L4v`G>Dd1@m)3i)Fd_Be-4xxPpftmcMOdV zrb!piMW}^DLW3kL;*#F>7pexVX;1Zc8x&%^hB6)`OiZ5rVkvF#6D*Z=hb|QgpQT2X zrI37pt52A#~4FaYEJr=8-9l| zOCA?tJ}sLt_ajj$=629*610lQq46Gt~{n%3JVxNQT=++Pfmfmp+D;f8rqy}^%bOo3BVZ>hR(P3sFa z*4S*lSB-cd>)OWeL)?t{{e&X3$D7I@+D7|_`_Hn*H2Xh`DEBzL8N@1sXBAXurCJ#{SwD1Ndr{SyDO^hujw1T+c?W7s`h2IvV2>O zG)kSs4(|O_0jJ_;gVc+pv@7|Sk07sX@;FQok&Hu1mOeRkB+kULl_Za& z1xfmH;n`C3XBDY&v7l{G1+hGHpB-Tfh)DPVS09<`-gYiPRjpS?bP0#a)DdBH{LV4D zjL#ZLK}2Vm4%Nl3#4dNU*~F zqobyBzyPYt%7`^o;>i^{svY&R0;tZYSXrSGe+r;`ATerPYylBr3kV93d19c=-6C4o zC7(H^$krc;umuE37c009t!vYy!3?hZEbCz)XsR zO+3ScWIJp&s_N9SX-y#qO+z-dY86M>0wTf|5cCCGK;Y^*xl2U#4<*YEvx}0xs~npn zII0zg#jxv_W9cKBKP&H(=NZ-}s3U$y;c7Tp-0nx?Eu8S=o zR2SAkW6OpBJzL<{0H4FJR@t5L^J`q@Hmw6}0YRXrS0iQ@8y%?RjI|AcYom)TAo!hE z$s?OIbeRk}YT5MvFx6P@BBDK8Ky)o}Tng7xNMs9$E|Lt3i{4vuPgAXB3kaE*Ti~9j z->du!yUo23c3btj*D`DY(Zv=J9?Rsh)VH*a8BF;SKbhGrQIzY(ap-$mru%6y+`3 z30lpsh*_S*CRqy4V7OZrto#wtyfGrXWX+L}pOmQ_`)8gpU)1_dNHEHHSz z{DHjd*92F3kei`BhQWa}ZgSb|DFL!$7Q{R@KoA(}5d;TF4j3fJc(K@n8=M3NTR`-) z1%wYkYt%Sl1L{GM%@zZmX0yl0z!=s*A!Y;7LTY0vIURw@E(HZaK)fOT;#@17l=Dd%Y<%6 zbqOMD0Wr*d=rCam2-PVPU!`&*_X=+gkzM3-K+KOZB#<#L3m(=2>Ki_CprVxPtfEvq z?%E#&X%|^3amKJScX%{$Q@I3mcaW>QcoL^69GnCZG$D%rczR?Rr6U+3@$MYFRa&UclfY-105WIhus^P z;D=rV`*sLsZ< zvH+n9D;GWd*^gAAeM}0hbMAr3FqX+=NK>ltkFzW(q6AD{E0Hx6HJOWY!riMvgmSp$9B-AfkKwyGU z*PwvOvo^65AMS31Cx@%1VG9W52V~X5&i$xf>rj&IS6e`AGRv_@yJu#@Y6}P~0tCsQ zDPgfD#TF1vm@$O9BF*@z zEg)p+#RWie7Z|bygkrcthLY=&`kFNkTtSG#}*K3vX(pdje2x!)DXE#5H3?6Ambw<1Rxw#TR^xhiP>xc z!KZ}AR)2;Sv&DkHPVbgDA5dFB(7BRw%TshrO$Np)!dnW7!dXfcQpw7A?K(_%mLkht zYykms7FI#H52!65yxiFW0%aZU;R9W8H7Tm5gE(uH!GbxLN7WV(bh;*U{a|PmyWXMb z%(Z=m+khii4O|x(9$tmj-7acJfUTI=n@a~WyiJwHVYeFD*d{x*V*{W}ihztEve&`U z{*Ien6b2Q*Do1zDWwfI#)+lzZL>wpepG+RJ$<$^LS)iSMX zQ7T|+csZBRHm9`msM-Po<%=F!Cfcs?vFLxt*OoAj8ENYZ5b{w&<}!ZO77)r&Z!1;y z42~X%L{yQDVvdqg;)$bD|FSEAMU`Y;JmOAH_6{x~Vct}C#&`>H72X!mtuBW*W;(#r z3SFUy>aDcmdqbXUYMG_l0)mTmvg!(rVq%+8ufV&(lK?6wBzz4Ivvoq%S!+!y$kY}P zT^B2CE^m`Xc~ory!Q-=nf;&dmcs4i}vG(ye11QwP^MeY6Dtu9)tULqa?OC-2L}MPp zNAzgU;uCpbTu=;N;aQSme?HQ-uXCRR1b-7ITK~@-CalBhEMGlBH2HX^EZ71fVyOo_ zMu#gXtWIqo<>Gx9 zl^KRuu9Fu?fSpu?ZukXv?@BJj1w_+jW=?YB09U&g#F> zDmxi&(vKS$b6wexDM9Qgm-w+EuafA$)=3gf58EDW$slZ7G2^M_&d*z9HZ07pW3x4d zsxbU0QI@qmKbBPBu{y7HQt#-O=qn?8u>XC$Qf}(B1F&tuj;oa|vXkLBdKqkMZXfax z3wuVowTB$4<uTw^GydjxLsBZbc-RW(bL~n@m)!f>`yH~^UuQwo2EUYr_aKF7_zA+b{ZL%mTIP4PtBToxvs`&Pw$RB)C0tprl< zV!bFwwvf69Q)1?d)GU4WD=qb7$G^pG7`_z~v%nV5VSw;c8~hv_OQhF^NlBbgQ67F= zsuf~oau43sL$oUITV(VTl$hKZ@yUW`ol>#wZpqU~IP8dt#PXIBWl&{+UshFo$9pKd zifWzKV7PN|aIrJjDGyu&Jx7n`DUQ<35|Jt1(<-ktBUMm~>0F>*JC(w;f=)8I+`)>$ zvcNO?v5X1AE}aA5ukcd_h3YZ61%Nn|9bT?<*kGPn*F+&kJpX7m%mW1I^@t1yiPF+# zyi+PbvE36U8KNlGT-GN_G4(DB6m#BkC>k={oMBHulOSs_OSzix|qF;>gy{>St;`Or6c5bNNlmPY!>kk3X*T*G%sSu`K zhK1&BgPp^J>nKiSmW2~JFzzz@s0@zRPye!((p}O zYe`iB%RVjdr&MilSZSB9( zV%k2pPH>RFe@i<|%iq<8wWnzFJAC`+eD8K!baQ?{oj=N%gPebobH78Io$((=#{Z=K zp7t-aS?%w%?`eOmeP4T9ThvxV|18uK`tL$d^4S-9B=imKs`hj3l=d_2Z?x}fKhfs3 zSNZm;_P=WXm-c^a|6cp4c1^Ri_0U&CzZL2V>7nt^bD{qw^nB=#L;q)JGW735KMcJZ z`u{@zGW0)({>RYog?=~mPeZ>Q`maNsq5mfI-)eT~5iPCV(0&N7KhXZA_B{Xo2Q>Sw zFTRR$+&FH$%twA+b$>tn>sQtiSB_tKnUDOudgb`p<7Z#yBR{X6J$~x=sh9c4&#R}7 zFC1TZnUDOux^R5{`25R!Q;XgPKEhx}aSb5VOu(~f+^ zaB}`$)?VT7>)K!X{!Z7)`X#N-(&hr3E8my+{-50AOA6md3c(`B-g4z^9y#Yq`f0U| zb3|kb$3=DgZ32ks^s(pIc~_SkN}AKIax4S&C2(DV!*xElT)Ez3Ial&~o_5YLk$qVU z_dVN}(X?mZSCVgQ1-ykKU+Fwzq7bd^22*v%<>YF&D^X<jMPF9`{v4j(ztu)y44W)m0vR9jQO|H%FOHUi}MpKE`j zepmkfzALx@?Pp4`*!g=(s2p2WLgm;$X#WpC{l`9l`W;$bP;MhbMP&R(+NC|m*BBad z{0+_K%->hrSB`(EVPq)YRa`D8Bqm23V`%Ub>Wt_7s&?0N{vWh9O^KDUBIN$lAE1`Q zK%o9DlfC?fw=0)&fWE1%RFB@Q!t@@^x*(5h0_|^9>$CK+0CE1hMPF|ImBTc|z9TYb zq+_no5!#VYe8&trLpyR)19P>Vb1Vz>vXUYG_a8W)hx_J{pJ*kH{qNevY8&Uszj37+ z%9MYr&K9(Pt!ev^Q%}N1Qmb?6!Q5=wL{bi{1kUw3`Ro z&ib_PwtpmD)8~Bub6Vl;jOTx=o#5!Q z``2G;FY;Ge{GM}viM*UT>u`Jx982oVU6=1G)gz|MU5=!+yxZ!yJEIHz!z{&d!iQPP z!z|@E3u-6dd6=cRbHKwa1&^p?GY?vp@(ZxZ$}X>wn;apx*#ExDUgY?y%9Thv)$z}y zMPL2#Rc4$&S5s()^DEk$>O0e&{=Vn9r8zm39REz^C6buRT4(dPaQX+N$pq`Hr)cqP zSs`23v{R(D&%Ezx;jE&V$DWlWrPAUvH3A(T!7W728ww>!1c+~Guq)Z{QQAhW}>(<2@+2C_VpQ0ozgU;_ng*t_}Ld1oQ6MBE6?DDH?)k_E=?87 zW-T);Cl%AsD@V#0LvmavH~A0lIyzsm+`1NuB`odnf$qb7GltQp8LB#0rzf8= zlD#v@KEp^FH?{U}&c8N)IxF~I`6CSn-ZpJ|+muY=L~tRXnZAU%p94SIW=I+Bo8wfqa7Xl`*7yhUU|_v@yIJrAO7akGq0Rk6{TML zW2wlgFmg}a9<6XQR_=w_UKd(h9X8X@X8sgMUqo9sDx2DG*L&BA6Y~qNoOtoszHZ$} z_RUzvZ|E}yktZ3OndzI+4jn%H^!#h5t{N47MfBY{zcu5oi*I-MT{ValPZzY%^G7ae z)|1-P*7M={mtHE*=l`Jmk~I@L?8e(AR&!Ec_?l-*sdwCr@%Vxw1dp~%d>0|{cKFIIxssU$K8&W3&y zR|-Enf8xTteWFdwbeRl;#D(GB{tVd&6ZO|B6ZIh@RvAH$dqz;%cIz zqek*6WwKM}n#oxqSJ@>wcZ{XR`s|{d0+uU^B&NowZV>$2_dogM)6ai6zvskDGfyAh z|2Y%NZys^-L#-}buqQ z7%^Kx1X-GGgkmJqd-gNay!g_)^X)IqeDm=B8e#NxxozBOrq8a)k)c{J9=&B8A@S7pR}8J~(6cYT^t1W! z%s2Pn!fG9EQr|af^d9zQQ~|@$G#=57?x*zLg@v3EKD}`IY-8q9VBZ<@TiB=p@|`o! zVVJz}$Svd9BSs>5xGa-mQL~>6|K77No|+Fm`{W%h>!hAfRDzdo#Hy*=Ba*t+jk=Oy zEu3!7w!k`2Enc?C_N;Nc8QObgdkZs=pWh-GjrAIYB_=)w*^_Ng<0U_uZ+r3SC-=*8 zUE812{#ji-lEiy62Q-Y@(e!s)@-~?(?0e$4 zgcVGy zXq~~kXptt6lUeQUBfc>{|3Yc-R^=Z_nE<1EU4Cy z^CiV1+Y*DnqYr8jY>&ZvD8XFNcWS^g9(~Fb0>-&po29%OK>F?Z z+pUoP9mBs?YKx=-dEIzC);nN4jn7Efn-3j%{?FzM^V+F$O^UUrZ(+fcAN*Ai<@e_A zY)$zSqi z>^}lCZ?rwjgjP1%_Zx;2Q|9OU3_bd-d2{|Nr>@9k7m#V6Y)tt2{M{ym-(^N`Ah9{2 z1NJxZho@LxK5rP62m;)gVI2PV;BBW88kpd|0^G)=e*@x%q^|+^9!XCr`)bcy#v`$3 z4pXs}aPinv#^L$-S9E;gyYt%q%)G@Ys!K8d6u^xM|3--RuLlwSHE{2V@b3XzG_)gp z^rAav=MN_n#t~rZ8KwyBRFO>Y4;r*mnDh;|)t|CN3gYE&_18+~KS@3lqrhZ{*KH2> zBSx=u>knXvvd?7ZL-VKR4Q>BrE^keu>GpgWn#{bWNLE;WZy}|Y#DS*i4A-QA4}mO6 zhaD!7O&W&}FU-sJka@0$%+JUAipl`t{rZV3fNMe&dOrDR0F?p0?NPNO%TU()HJ!AW z)YwoSWIToZKFetD9yN^p{|VpC&Q}WQ^Ycb;X0e~l(MkMykz*Ce#&+5JS>IviUPZ<`ad0ExWf2Fcmnm1xE zS@YqAGY0CMLY>iPdPSYqS%n6=A9F76IJ`m&Xa1_nN)+1#R_&m2RBT(&!Efww+?r}; zuVsW!8C2=R1E=~f$kyQ9Xv7xK5Yz0S8In)SH^dF{_FY-Bi(yV zXr6G5=J*Mk9~qd5iRSxTX1Ld7_?6A8O!KF{UB@p+9iSzEP5JFn_(Wp>GS{D8SYRCP zRpU^9$}}ELNOFb4_q{p)Pd%|imO=BrWzc+?gi720L*>&betM=??<4iIrp#EaW}Yxr>>7V{5KkN7pr`6+;5YD zww+cn;1OZ~F+6s-DASAa>@S>XSG@pDgen?Oc-LvKnc@m3Uf6%;XLM=7_^RW6M&CfP zdz7Mr5uS++ZC8Sp{EDaE@>+UJ0eRBl?WnMA0ZIc27S;?y|8T)*CnxPYd}jV1*T%^c z?v=Bzcxoi4EiuxJo?zJ(+JE+4!aJ67ytD5WLuWlHbLDAcwD5U*s(O^l2@r2qoq5 zYsAP$B}N*o^YoIjH%Z)lCV7}kT)xTUF_}CnSNy(Gz2e6*J8bMfQ#SU@$7TkOoRPvb z@d1PPJ~LWo{pp5>aJR-ME5l;{*vB1bDD6{hN(}T z!HdM@En}Z_uZkhh8{LV4*i5(4_x$KH(NW{XBB5tX>AzkpePO}!RsnY)zeob`h0Fh1 zo&Jyd4DhHYYCrKjxA#1yi%2&0UwW#U-s=N(7fVc|?Ik^i!+-U(K?e2IONJpG zFfSb;L%}j^(uUuFbzd?$^9&c_l6{AVjG3nn_enRjjw0fj7D2JF(B`dh?f{1L#+M7@ zagQ|~^_ZhzgkO`}bi!N?FBxAy@(jg0DXqx87y~TGUt9Q?EZ%?rN?Tv`l1+1GB%VrD?M-zg3HwRzj10u zlEv=#N3!VrwbzLM+-)>dodC!R6U+!Kru5fdvrdFwTevv?m4#EmWq0ncV*>d4YuJ5Z zMjuLy8mHW7Li0PAu&liAhiF3YHT6u|uo0 zf@NQ0yV!k?sQgeFhIQg8HAT$KV6~*&I7jjF(PxZAtXCiE=6)3Gbo*;EIIhk=v2g0l znJa;p9q6c+?ASjtM$ew6D+q(!PwXOCpcX+%=DhKQJ9PStQ-(ySuMnZQ1e2VhJtL=G zz4zUB?|t{ZckAn9ddN9e z`~>EzAr19n(R(kB5M0P$Q9o;F_DJ<$=&&XEGNvZW`wTVFhEqJvzz$VjqNHOh`jxQ`RuC0Rx-U$>hQi z!4t$M zts*ZpZcvs5jL-I@u}Q+vKy5%Vn=1@y#+lgJjKxbuv#86!6xGushRJ|YCJ+S^IPFR# zXE921aF_Fj6!m`q%bX^^+P2g1{)yh!W{rUqrg0H_Y_A$6334keo;56s+R6~_^n_-l z^$H4uh?L~uYiB-zk@#TLzbV{l9M;zL&EzinK9=y_i|px7bbH>h^p0}Qp@iAP25_E} zNKQlV&l`>*zfq1H45r;od&6aIyP;qm3YIi%D_Q&B=Z!nzD~9DOdYG!?Kc-`HD^oG3 zZ4|_q_AU+hYWco~+MKQ6ycvwsr0$;<;}X$hDbwY7V+%OzP&1~9RKhVdHijy$Q5g3? zf)2b%$3uo=Y_z$osTxLYs0+pib72SP`1VHLYbe7IMo;GyDprKXZp0q%o%*P#m8J+} zRJVx;bQN>@&AGk`4Q~P8O=D|f-oC|bORe5o0XNs(Ib+*cB0)hOk5VCJ8Z)+xCMbuB z#}kQpXc)VqLx%ogktZQd#d8~Nb=eSN#G!R-U;Z_u?!w4F*tXk9>iSL;q9bDLgzb9` zgcBJVn+PZGBE!82&zGU!8gSh_rfH$8S) z6v05EaJyAQUWtfoSQ^|$bdAi;)foIAl_zaj-~Ne?oXOj^Q^y7d;zXDpju6MyL;k}-PKD5O3LHEkjKn?v3-zF8pr#>hKK z`jSHNPulbc;HjfyXN?jpj&>SlVrr*U>isI_YhCy&R1w7$I)GEh4OvUjvIk$vhIt<@ zib@dZ2s`HvI4w3$$Yrk@h2&qt8PZn4U~}l3#@7qP-!Od#;=dE&Cf9+djS^uzC{Y|8 z8^&Zy&V`i5An&3_WwZnW47?6|joCHb1=N_}I1XzDH@2=YGhn}kq7XfNgSwM^2Q-WV z4zG}g1dmm-_@$e(_-cM9*1_TfOIdJZYhgDADLnKbWfYov!C;BBkwUJ5EpQzCV5ZdX zpjeJ@W33aAtf;RedZFkxZQO;))S#GD=dJ!2MSC4HHcDQ|^U}0LPhK+$8N3EXvBd0V zF~EZ3ctHo&NdH5{JK!kj!S@VlG?5+<3Oa`a7U5a%x1$Ut5u-XO!v$J;wMuD*waW}O zAK);pw%u)LAbFu8XY+3T-fKoak8#BFN{h=TF)1M?C^^aX zW5Yb;Oh?$Fo}4iFs3SRGsq00fG$}mIfmtzSd{8sI2uv^(%5!((DOj<=;-rHr*P6cCX!p1O)$)KsJ zglnL?ySgstf(hK4q4@^o2Jr>suC)^Vz*3^9QnUnJH&JPz`+bW={j^awMA3xGSIRL% z>mtX&DzwSONrVfXq)1FTx`CQA6-5U38oQh6hzQQ(g(oc}N=6N1Y-m0K@@BOYhMBku z_|RFSL=eWQ-e!?Cfk?VZWX(jnKwhXJL9SsKn2O;VPyj3ilQh;3BYNvD z^p|zgN{Nnch}Lz?pjpWt6%LCW3quMogv;ufB`F9}M=0E34$b7H7Y#>;aj#iDm$-u9 zGl6c+iRS6GH(o$L*46kuG$Y=R!qfEKs9TnFxLP^6T2Ht`hjdUmCN#-Pw?tOCfchDd zbuBH<3jx>C;$2h*KWfMs^LOa5f4vm;uMZ5&ChoA3G}>84MncEDaUoOIU2b-JLI||# z+fPFp@>**!%Pq6)?jD#*z*8v)LMqurInbAcb-L^um%r~@!t!o@-x)COMr94gqPp5q z-90d$C>a_vjM0UJ)5?+u9X--(PpMVPR zCTP^BR=R=4dBq!OWIqWXVA%hfL(=BB*XZ~nsNTRe92VMFz5z0YSAKwYhfxN%koa5N zeGY%Wiud&QY4OQzXzSas-WHho&p)L3Z6N*?f%tzz0P+7%c|iPUY#{!pfQWlDApZZF z1>*nv+d%xcW5Q1%Cfo+%2OQvSAbtzJ@iq|uZ6N;JK>W9X_)#B4VDeco{M$hMw}JR! z61Rc)Zv*ke3OF-p#Q&pT@V55-y$IX$TC3u zk!67RBdY-7AHOLO|M*RT_{UcO;*UTbe0d;#>*HmC_^po%fcPT>#6NhN4L2atG!z2y zFZyf|5dWf2mj&VUktTmguG(VeRT;WE;0la-5hQ~O5l!sfoxDg&dz9JC+$}Lv};$OMxGC=&f z(S@WD4jVPPjwS|;_C6z06o`N221S7QS8lKz5dY$#CLsRfgBbL|abvKZ528qDa5*6U zHMK1O;$KzEWr6r30GwYk*aXBM=`++p9R6y{VvEwn`v=%e@JRe~EQvf%sb@#-Pdp#2*1>0_?7V z^JRhfH%xC45dVhh5zKsXApVDz0picak)?(!fcSY|q@@Kw{2T}MD**8q($4|quZ{ll zK>V9Se{Deg5dz}RMKl2M=Q{)e@ed*{VTUM!(k$3Y3m#nIYXah5ABVL7@vo0V0T6#= zB_RHBWFwfU@5oHlKBFPyK^1u(L_qw|Qdd{QV0(kfx9G;;u+UjP68}<0c?kI%W|RlT ze`^`#WAXoLWLYeJ%h}nIIYa>Q6nGt;4uPRH7~>We|IrqXInik7%VF^sWn+QlZ=6jI zi~p9gDa7J$SPqNd4k(cZ6((LfE!U2#XjE*#u6e1a67r6~gfsB`a|A*FiQ1$G@p$^WgX!+HVHOza%74`kl)J z4P&uGW#RajrJaS$Uo-729RDq#ZNu>&Z8+Lx!SP3y!tpQ3jFB6@FK=ecdWnGJFG4B{ zqQ7cN0*-%EC}rXJ2T?6eaQqa(7sK%*7Y-K&g@W0~hT~sMArDReCIoCa{`C{E;rNdu zzbaD+j=y0s9Dn|rYnyP{f|N|a@#i;Rgr|R#<^qm?{mrv*{8(s51RQ@PQWTCq-^mtb zNj4sTK80d%`YTYd0r@vTA&bc0h35r_1tLFUl!eIOVy~L=b3Q`k&*myNB7Z?s3s(Q8 zO>IQ}^)$5+`5W512$5ezkVT06d8S^PL*%C{K_K!kZkdOxzkEx9$iJ?ZIYj;jV{p*u zGwdi(h{#`T)lrDZU!-*wQ-Ar^8ASf|wYCxY`+&$lZX89LK_Lf-{McE_BJvks0tiU{ zV(qe!{KeY|O#XGW%YpI_;_(s1Ff89DQ2xlTW}hQgzs({7NGnQ zm_q?5e_^Vb1?4Z=umF_5uwfRIf2|GkK=~s81g^ z%Le5i9B+tVFv;q$!)be+X0+3=+MxX7g`oVaX;A>mzm^6zD1T%yVYIh&Mbrj3Fubb* z-VEg3E`%Zi<&OY2mM;S3U%3g35GX${1m#~_6C0F20(TuWdLt1?HVC{n!WAF1LHP$y z$8k0ik2hpN`6Cu6|MHEb@E}0>m$VX~{A+4eqC|RZQ2q##V;sT) z29$qwM9XZV+p>p5M3q4K3u#)Q{F^}&p!|@N_J&Ve82Vi;Ms4vP)S4?7`H{x04?Jy%vuu*@d7HFx49K=~KZvq1S*A>fMiN`-vXV+fc7 zOi znok5vN}4NA8^_x-p!`cYRTbw%p#1r)2$X+SjBHT;ThEA)+ksTy$7$;xS~DVj$cqP! z;jZxpoEr&H{v{!I@mW9yl>dS8<2g|Nh(e(JmLFm*(|0t&6Jomu;eMT5fsfDo%CZN4 z7AXI!ncATIYwhaBm{Ly>oJAzV4BOt&CqVhzktPaI{w0AO*-XLFT`A88A;cD%JTj+$+j6IWV>wj*2Hqu5 z`Jrk;K9ZlUsvxS&DhU08<@JpJ(q&qL*3EAxsx=I}cUmVa%$v#|WPj5p!(7xY`; z^4lFJWPA?13tm3V$p*v6BS>h5BV8@+Mq)4`aQX8mrzOW1BG(-tT>eNq7r6XTw!q~l z)3b2-tuPWcTKc*gcne_ZkB|TA@eD5iO}KwxF?S1>Kf4#W0sa;)|1IW!2U)lXqnZ8_ zE`Lq|fTGU^Zo=gs9FD*e+6N8f(kw!_{Fyz?{DXoerzSvWiAEZR1TH_4sNpEEu`vK~ z!sRD}v~l@CS{)qZQ@`G4v%NbQ5=1&RPj zJ;z*7I>>1*04_hR+jF@5@RP!s7ezAym%sgZ2A6+0B5?Udc)|p3;qsG@U;uztoe4@7 zE`Q5l!_mGBF8^8?Te$oi;%wvc{|q?WxcrzGu!_n~0H}EA!;FCSRHOixpIl*S{Y^eF zKaU*kJ5Ip-A{-Ggf5ZajC!au2RIzBb15x`RZ@|{2l?w4JF#m=`DMZ8HfG{>P|1B2= z(EQ73hM@T|DuY5b0tlaG3C^LnK`Nz-;0$ft=xbY942)Y>!!pqPMGsRfXnr0!E};33B9-L=nx96h z2SbM)AcE$%Odinug94f#`&4r^h37{WH2?8m9X}pcjTYX})z<=OerrH%XnyQSS> zGhrv0-Bu@Peqr>O!3`CQLZb_@Cvqnrh36Qscq}^Y2xLR^--N3T&EL0aY;9=%TgkT6 z>g~2g-L+uyDafw`&Cfq9@+2gxgAIJJJsUyIss)pEMCNS{jc zJ5>mtFQEBbc&QaBand#{p!o+0n%~-JvY`3fDeE6>hoR$K0MPuL9mO&MI*Y*dxp4jE zq4_h>W25Akf#zQ)c_&FHArXH z8axa|8qiS-ZTqwgV-JU1b{S~?OzN;<`pZD`ub;jH@!yGXlj}eMaK3=%M|eU?V~}^H zIYILyz`*OU-G~j560umZq4}|9AZUKf41KsCI-Gx-$Ah);l^4g7}&@b(EJhXkKBdH)S#Hu9%&e+ zXwM_~isU}wd1+drFAvSXISiJE=3gEC4;Al#qo4=h%Y(ER(EQ|C@3*52B@v^Xl;Hv` z-k?&NVJ%@SX#N)LB@MSg7g$J{4durNhz3!|Tb=Er6@ z7fS)?Lrh$K28TYZ%-DwJKZ?C!l$1eJ7BqiDd(H)sD`aVAQS{eJl%V++5nT$+zgD6G zntu^h3z|O?L8py!%+OrqI9P=qHL(rvLMJJPQI2l3V+I2>|8b+Mk4}l;JP~+OAvAx3 z6NZ@w%}<`WX=HQI{2L~lf#%Q1YeDnln9#sf4A+1HU@4fSBbZUdf*gR~gBCP@UrPhj zHHbYlEGtV|`i`yy&Cd~lHi2Lcnt$B{i$e2TCVm%uo@^XG-_k%+DD@5FE};2El1tG1 z*zn!jVhlG#+S?lveMO-83;boBv@+2A8=zGTnx8Wa>0QEQxsEZ#Y)KuVaECcGla~r; z{^MrD5@`OlH_n6RUt8lmX#V58s}J)OCm$kL12jK}bb#i^geF<(mdGlz(EMv?VMFt; zp@j|2pD}+2hyC+X*uMqMZzXB8vy6;{PI_%<{>=S1yWNK7U+wJ~Xnt!j%Pq6aK=V@$ zg!-m>`DvoYk#3*xUz(_wh2~#!=d#fJOYU3>&EJ=>rW64l5Gex9zvzag(EN*T zSOm@A;5fbrnqOQgfaVuhZbS1wj;|uP4YmDKfZ7&XzLmQEIfv%|O}3N0U;Nw2eu3>~ z_3SrU3x4X^uP_fj`xW-T;in#V?8K|z#J~I4Z{yBiU>|0`%&OUTyLCO@{{r)i_IugK zaL=#cUaQ4k_Mh;{e_)?rUu6HpjHIw2!m*h4IgfB!qA`vqHiO9Qv$_x~4c_;w$%5#nDbG{5Jt=W+bd?+c#8%3C3)L;WO*qlrkee{WgAI!_TYAfWow&D4F-~D7|?9hVo_m zbL;&LK|P<>3%F|(_q+ninb#9|{V(?Q2_ex>galV`?T0p>+?AJXPA9YXSXYP_QM@9q z|H$ssNZz%V?Y_JzxLNmQu1%r!dB`;e3UA=&lFc{&+KkQlxxD+VYsC9C#i4epQwr-G z781Oz%qd*x>if9=wI!d=Dwp#Tfb6=tF99)Na}*c;{P>WwF+8 zlDP0Q13e+zJO>&-1}%(b_WkR)H~;;6g7#O1C@*_8eUe~AM9 zrI!DIzb2@^qJW?Fb(_!i?DYv{+`c}kNQ(N`_U*aLB<6LcUod@9nG}CNXTN_N49Fe7 zpv1)A%=@p~jOWmHTreg*|C3-!*RBbsbnW}f|AXI!*Pch~XK>dm!feP@h{quAyODQ& z60SklpH?_N`Cj(^%=I5DP%>IPE2z98BuV3nr3?mo)OsrK^J~hxd7pn@aVml>`3f~J z{P=lv%OXIceoHaMJ6O9gDNE2Z%GK=Ex3Xg9U!AsvJgkstUlVtaVvI=;>)j=cW$xV! zRD;;3kfx%$fTMA^(-e+B#M(cM353;{+;`3Qh&t3UvWdYYdt-PAO z$GY-)o2wyI`7QD399ohj*0t{{DRK2t!L{((U!pa|(F{L&o#Avk`(H#&@{WDybBG8A-STSw1p{q!7o6xN z$dN+7q&$t^WVvJF{kN2_+V2grO)c}@Vq+{g`YJf9bx=wb#K9 zULiPH;p?0*11JwZQ~1eS6j*7h(w;}4&To_ZF!`hP?g#iR_ijYoE4=Lm z+;RZ}F@oDI|H@o>6HN-Q&^!nWR6j4+d{Vsrk|6sz8XDDl{RP|w3x^N?rP70|@7V9Y ztaRgDifkR9eHr{_#HSX;0mv~SK6%%s+nc?TwyD#V8_KMG*X_)Ng6Zwd{N zGvYO-wc6pl>!xDmOLTo)mJaY8ArRTND-{e0eKQ;BCTUqEt0DFNM`cX`ql z_h~EyS?xPYMc8{`quW{y?lAi{JRBGNqKzt%BrAcTQnRD2PhENTI05-?Z1j zvl&&qr%09crczO}-LIm6N>z-?SCmqZKb$m-Y^ziD%6O$#Zz9i-t#%n^t7$f+T*|UD zdWW+*nk~@&v~ov1hQaXEY2ocPni1aP=^3YXIx0PJc4xJ;RB`i`Z^8WSwm5hfOjp}< z8h)Q;izl^%pTsIIe-t5UEi!Sf;rjz{k&l^2%|>x}XN)#Jqgd-oXLYR!w1d9U%7QWA_0#7|F?Y`vd@uP-r& z7265;{8hJ_#xgs@4;2ByPtkrr?Lv{kg{38G>kSp(qAqETcpSdIa=SXAlvSx6J;~9r z8z?Ja!D9-1YAwwRA@kSPdInxsz<%IU%0=6e(Ss#}KC8?dlGjLUrO6sY^ZMaqRc^PU z!e$40yUiZCx5FRo(0hljQC|j*(I%OQ3hN=Z2rPe%v~Gfx51+h(uG%3rt$cW?8D+8Z zx7Qk86%~jdtVOVafmLdnsw+Ofzau`7ynuRQrvEkQ%|pVC)3dSiH;tZ+m9I!)?Yv@o zSce&Q#G}zveD-66mCyWG|D#(I${WfZc~iquLlrRjT7B*I?SRSG(CG|J{>?})C_h;< zX&WK`R*=qt<0}${G1=3p>*4P1=*4(Rcc`u<^YJIIxOZ z{DN(4rzc0U*!U|jn8&odeg+w6{9DE#hl~#vwQs?29G&r=SK_?KNjiEB$pNeeu3fSR zi3H}_J2G>v!OGTc)5Hdb=R8v#wt*$gRAme)*g~qbT_(d6AMV_%)j55ghx13Q9 z8DDX_Y7O;@!aY()_{Z^*o~Yj8zkmtjF3rm2lqDH}z``kTGvMOG$SRFJ7A}6>b`2Aq zQCXkC#V^W)(!R}Ll0n74rA%^|_zE|qO7&f(1T#u^^x3#Gst5gVKw&#Gv8lF_5b^U8 zks|(w`PEZ{n%>%)93p;YrItm+FUp0^S~i7C1`q$%a>=3LBZaK3?KKpqud_S)gSeyz z--5#2b{4LBjB0;DdQ{8_@k~suvAwajdNCOOQsT5Py+Ps`Ec{zSJRb_b-s?}%95N3N zbc8y)lX0ojb6J_T62fhnm{n_3W|K0RlCmYfRtSY(l!t!=RqJi}P*Ls<~~<*25hhc#2p!ryNyRU7!e zuClHM=yZx~)GD6NaJ1*^ai<>CJlD|w4=l-Xk?6fIZ{o^&gaE!TLP`MNqtC0SB!KTX zg;Eyy-ive_!&^$zO&;()majV~u?-gnfP(482EJcRAp?AWa{@N-{rU;m!1o>`Ph~1% z0=)4{l#6K|&n&j=%RB|i=r-Y?1^Jc$zRz!-2YkPZ<^uSB{mrw$_gEU&j;cx$;n@EL zcvz=@-jnu}`aB+AXWY&lWy`M?eLjIAxc6e^Rh)ngd%u1HS=9R)Jc`#SQ120r zEY$mA`5d9%XEPBS^}e8~g?fL}rZ(#RdYam(_m$N(gnBOmM_kgve-odJvm_q8PZ)W2 zo`-r*nSemOU)(Ye^?v!50`-1fEpw>%m4?@A)EjmPC`7$4ww@?Ny)V)_i+aC&>kR7s z`dZtl_w_)%-(%DvpP+aH)O&0MWl`^or}qN&zF4~~>V5Hc0`-0!?Q*F1UObtBU}8Bo zq2AZJvZ(h(6Y31=eUXM))cc|hGpP4#ZkR*8Z^ZgBOsMyk3q#yW;BEa~JRL8=re)D= zHiLR!ylDpYzG%}7>is&J=AqtK?(t)DH3{F{(kM{xYhexrsP~0AWft|mXu|^3`@)7< z)cdtI%tO7e1?s(U+qmCbFHrAmi=f^wx=YAZdmZs)9*{PFZCt^Vr~v9(@h%(n-n*v~ z+eQXi9X2IxuhWcb8de+ieorCl{c2j=fGBvzOSuYBcC4j=je1|}O&HbNYiiX>I551c z0^SU0+Zu!-LcOmA7Phts^?v0htd_^Q#!gSg*%$;%UNt6+Eo*CHqu$rTUA;zcZ7n48 zLdgW&?X^+wy{F?ivWUkk)p?-+hf-^y-Y?%s3VVTizoeBwy<2XLRO7vgNFA43IvvHIFdfqH+__R{HULcMP!)cZvQ1nT{I z36wyB9O`{NIRGpX&%;*kscFRK=4fp-Y}G=&uLbHoc68!fGpnPxQCWz3@7YtGLA_rc zDXC`r7V9L&qLo9v2dNC|{RT;u2vQd6eJ$iC)O#{(Y*bbYBu;F&J8H71_j`bPUr(s_ zd8aQq)caZs_1;?#q}mMX{pyI8*+jQx&vY`V_k}bq)ceh#3DkSYY2eVuM!m1uURP^7 z4^2oNMhy)$^PkT6H&E|uHA215+eNWa?_no|dS9beQqOJF`&AGuvk7j^9S{lB`$hCD z)ccLnD;4rlj|))mg&)>7;yJi_%CBJX0`)!@J7^^oFIWlXQ14+qgnF-4*Q!fV?~78t z6FX9w_>!SqkvoLSpx!SboR50HVZx?{o2~U{O^< zi>jeK)O#{1Lu=G3HGz6xS(}G?zZ~^D?JXw?UKVwFU|1Y=S@g50_e-hgQ15RA^$aFG zVt|YofEZp$sQ1{p?>uWoyX;vpB9y&UE3=kr0~Y9gTMqP|yaUEnVuS`FKdB55Ytd+hEd0$g)YVdo4yhmy%Anz9k$sYSKY-`>gi4A#QTaRUz zq>Mg`JYddvpJkeWc&^2IQWcQ*p6U$b{ZdX<#W@k=eLgFKyk8X~8}k0vGqSov^^ zI!0|hl47sXShELNmIZmgB;GFG=FdRhx9#ze5|fGN3`b8bl85)(PKZT7eO;}#81jCt zT!B8X)t6-t@hr&uRWr3A?|-^XE!=rcgfUF7)s^)E^1d25qJX?#64jB)6r9MFYWa}& z^YMj)Yd;sF4kZJ+;VY8f$B|R~rd$EkWLkJ;2Q7{NfWqk>?H& z;(cwkCJ^tTYk_!AmS-W}TTvuzY_G4W)V2fg-LuE#$spdZhWS?eWB|-9!29er;0D-R zfcLkSJ>lIK_MY(WbKM8teKu+n-o3Z67G_Y59Uo+xwS;${+0D#9A6RlgLO}Dim9Y2s zoi>m@HAVrl4)wHc^9p&5CMoJ>~&8X%_E(jS`fS1bKM(8eO5IB@1AA}O@rRNR1=5I%kn)&ePwlR-F6h8EXKPpdU_!6?kg(| zkHEV}Bt$8&Edk-(V++N?yC?4msh1OI6`>(eJ3_1m-u)&>W8>X#OdK2U{%0r-W?|O)dJ#te6LATxpyI%`)8|;2lxLaWN zKP&D+@neZv53;8{P`a3OZU%PWh-jzQ)5dU_w+0H4t<`&-Gj z)atDjZgbtW!0su;uLO3leOM$($WrkrhPOH!LIl{owUPH477fD4Kj^J7lA5+1#pW1+ z?Xdk?0d|jcO@xyS*!>DTZLoW7^O$D9?l+ZbWwD+bDD2I3^=4rAbrOYJK+q$pgmGFL z+(vW>>|ShJjlutCjk{1rVC>NhiV52_Y+xWxgpo5?XX2{?yBC3d!<<$FcE4IqcNXbW zX?~}QfZcD`O07tV12$OLtWn`jL^Hcg7T7%w)=~UXjhPH50sy<$SRK{~&{-{Q1_{?+ z9_&67JvK^y8L<0xl6R8yC57S_0lP<#D-%<@4MvZUCj1qu5McN4CmZY@ue@|rO)iSs z4Cn|u=MFe6HgL#gmjS!aqz)UVzYN&@`sq6m|D6aoxehD^yGM9JN@I|Br8NS(M}UFX zVXqOpAthp^VuRgd!9Za5m>IC&LQ#mGutCvDz5^Bqy9bX|vmmhho3JPbcE1)D1a`lO z1;FkLyRi(|JyH)8OQ@JBwL2)5BivYv1Ot260_?sPnp zSHIoVDyr)>a>m-q?e)um-3y1_7?-ViT#AF;Z-j|Mud9a{Eb2=ZnEqvhp+IK4ft_$o zECrwsF>#@Mj81>VV!#HwufxVLD#@TJ3+%qKI_HAO6|yw5VE1b!N?`Ykh%N=YUn@}o zcE5^>u}1$K`ULIYDVTmuS#rC^d4yVA5E2iU#W0=uu@j#^i8 zhI%Y3OSae7tps+jApmUx!5rBAx(OBqySGgIF8DmzIDCFPN}#O1VcZ4Sy(s)7uzT$G zZiRbP)>c&Gis{!m@gLDA9$Al(X>6XYUvtajYXkmlhuc3tv zcAqhShX(uCN@4#N*u9mc(Y7)&5=iyI<|?8L)e6Fv~5o%z)Ta4ur}s zDu>O2-RDNVy0X}P8L<1C-IoQs*F2S#j>-bCdn>bG$m)?;7@jQHJq=qS*!`kAvtai( zy>of6dzz?mo{LGzo~V}vyI*qWvS9a1?pz9XU!Sn16oCd%TLkQW(G5$%?iby#2<*Pn z;aLQBFRm1T-HR)?!R~K^-9K(z01!O^{%3)v|5d&N*!{NK|11q0W`{ZcG5gBkYtV{g;Q>KegboOcXf3Og1V}HQ@h5>|ds#c)`N8iVT>E{z4&pDp_Cp#C6#fubHBkKn-1#wlEzBXb zX=cBJwjX7`3rT+q@BauKejo4tJ-$HZ*O?C*l=08jV~@=EJ9+O9%iqG4XR@CkmL-{g zQf3{Q2Gsaj+>)?vp{Ch?pOLv|KKt&Ivcq#an!>$#j6Yihjo_YD0%sZHCPNtv3GXC<<;O`e?huY!3AmdhdVn}%gw>bt9?s?f!r7P5k z@vDOHKjYP9G#;0~BTI_sNAffD=T+I^4^~ad97G*eooIJh{tWIU7L5NHem^TaUBS+( z^Rhz=R$UOJa=kh%PvExC%QN_W1fRW(zh7Q*&tZ8C*S}z2zlPU;f!9|c%wLLYbF$=f ze^$JlkR_MTsQq&&p1PcdBTqPE+TvK#x@zM^DIg4b8uTdtbzmT*a+utf=2bL#BL3v;Tp6)uL_clDSqW;ydQ?v zFDJi&R~O`Q*VEP=pnyBHUXAV;f@pra;iCMi>m>euh3r;+S^ghr>Z`hfD=(pcRbP?c zl)0N}ueeT;9ST#&En3`9x1`ad*U)$OSLC-~mO774yQC^*R+SX@doJk4Hw6h8|B5X2 z!rM-Pz;}s*5>lx71$2b%NV7TjJWI%zWYZ-Dl{pu4Uju=vDc6WBU4kY*1It0@tkz`f zZ_8=M-ES);ZpL;%L2qL`Sk)Dkxu;#{pr9$-^CEb?jv;&&um2ve&&%(k6>~2rSKL6G zayt-DUnRm<%4cPwHk&>etPHsmmu%;S%Q~6I?bvY8b~6vS>LRGR>(2u`Y}nNDrX_VF!%PP`Axk0V@!go8hZX~pe=(w(I8l!u>Ux~bj> zaP+k7_)&bb`tM-EERCZMlPL9sSBPh$3`LtjvYAg(GiQ;MNEv;**U@P9l;K- zm3h|-@}n5sdBh~<>IGwe6}i=)!^BdEly24Za8KzGkE(jmRVk)U2ISaS44u?t(}5B( z?ilRY<=9N%L;9(cy4rs#>G^nn(&IUjymV}Yk9g*x>^B7eIaqhfcg5yz@#a+v@*9W{ z1K@vMehP|zN#rPB#b~EV0tF+Dv3@O3uEzrO|MJN+^gS2&MLiblKY21~7^lbtPbH6h zy#FZ}*ny8e6*=I+SCTkXH@gmkQ((SecRmF>leLcS-ri_uaL%8?phFMtg{&UlppcF1 zO#QZ;fI8Hwv+_}4_oR%phpTCI3c62Uy`rWa47Q_j+AfC@6ftO7r0}rCpa%e!gUPIPcRS{ zp%%9`XN!i3T1S7UXXtT zfnLSWn3(s2(JBg}P|_1nk`M?M1Azjho;fhR3Z-10!JBsjABc_g$NGxTWusQ%|R}~WXc?^l~hZqZw3zHIZ2W0oz?wbe*&j%d(sQw;2H3ef$ z2V5}{1oo>ZPksE-$GMS4V0a2MKUWb8-i7;R?13a<(MitYq<)fO-t`Wwcmml9GRyw~ zqga3x@dTzAH>YGHjkH3odPaT{G6)U0X$a;6(}By4?*-V&3viuNdf=3*A`($79AO@d zvFoZ}JP*H2`xc;pu}P>Wn6iy<9y8<>@CpSpT%$dgg(i@yyA@ieD9BwI$NCI266u~? zbvBR+yxz!Ssm52)e;$x^UeA!CYYmm_x0ew2MX{1p%0Da2CzzKcD># znJY(0?XD_Fpmh7cD1TlqM_%WBl1IIYHGo6s?r+Nf zf-LI$NXs)kc>vziXzp5Iud$h3(~a*S;)5A}A)P>g13PnMKI!EXTVshYx|*H^31F`+ZvYx_xijd`-+OCR97aUSe~*W*Xl{1Vj9c!ADTwaA{;@ zHt9HEalBE;F$|79g&dK@yO1ck{jLe9)9N5`>v&5}v2wSn1_F(ZZufO|PVkyUlrRHM z{qp5l3f$Ob^O7_+nmUWuu?V2tHLzyY?`*b8hPT{JLNpX8TFp^i&qW9BFuGEcK)`lR`k^O&vO=`3T4 z$!q{2VQ794-w^n!qXYf&*TF0r7EJwIJ%d$m3R!yq$?H`%43@KvlNiR)G%qp6#zsd| zLyptQWIEwYV%1>U6`%VI zwlX+-Q7(63dA4I0lG_RP99sZ)D_79rlvq5BjS}LO?!wnG@4wDq$u| z5(Dx0KspYtkutccim)(eajl{-ltzLeg$>MqM$cSkB0zpXlkv+?a;Kk`O{)45-Xr>| zzAwt@9TL``3=0uiHo^Ocf;Zwml7TY)GFYEZ%neBKM5@=>)7u+2bFA5X-qZ)iq2wHw zhB~aoWL~v$0PJmHbEwL%o|Bz!UB@;A?Fzxr-SAwFJqN7AyRp(`=^axH>uP4g)#lh~ zA;vU<|7Ct@G?^Gkrs6!o2YB3!nmw%7j5!ZPJcv`sZWn|YRzi~YP5b3gZ*p|>bi88* znx7MLB*E(>HVe4xCBYlB4gWhCi|HNL8N)&}CC}kooKw*HH2l{v#*zbO5_OCNCGpL{I=~&6wKY=>s!ha=mKZ7fOL6+E#8|YbDF!~oT zng=5Xa&0r|ObiUf)4g*~axjs4z@zMdDtHi!OkVT0U_hOD0fYtV5UV26?=eij?E5S& zgfBapgtFqj^G_~3#>2eZ5$!?vD?1`6vb0!*&VZ_wI4s!tESYB>W$bc%5lUgMX{4a@ zY*5HM6DW-h5$W`k^N+B{%ty987N)N^KrS7#XAD!U3Kpg5m?=mXR&q?68bo-WVa@7# z4_g185PUY^98E&M_^#`jN49+8kw@^=3E}Q2zDS}R$i1pZfpv-%kK3Y7YYuFL3bBbg z?eTFe+y5S#cFiIsSz!MR!t;%D7|x#flTSikN9QAt%zlDD!gUAaPV2Iu>?Xo}BiNzi+6{u2uia?r(BX@rR?&B$Vz zEmoW}zLbB)qKSbUrfnnaRuSbd!HcoY1c#b|xy?f4ZwbN+0Y~R!k1Rmexd-_n_Mq9p zI@5Zor2}hkfOK#L$>R+AKP(>yNz2x-r^$%u4M;f$f(fAmOyiA@bar%1J(xbk_wz$? zFx1hZhjpD2B$AcZ=iGDE+7Q6{{4%`nGI<}ic4;>mdyOvjF&Qa%m3sgiryLUoN1b&s1>127ZN~|ME`JqFgz;BEFwNc*CNhJs zxF=>yle{kP^Gw9mCZ+~!qu#pJE*A=3yGO^87^*St?b`8ny4$J=l zVsFV)>^O)`HS+!JP+Grh|G|T39NfQuUjTGqBGhFXKu$R=Qh3^Z#2%(XdziEXj4k`G zBg0~@AIgKmOq>j=yad_|<2E1!m5~KeCUnT$&kvUD3+~@{FdZrj?Ay10|AUX1x)VxO zORz<$A`oDURk;FNshR;rOt~)iw~0%KN?bT%=rb5I4hGmB1%rPCgISmzZb@D?^BrgiLPJwT zR%|E3#QKF!#1bNy2GKi0fzZB#__zNMOsu1`Q!n$7n=2q|xKdRH_QdHlM(_0?%R`1s zo5oMrA%xC@zLAxAhW&#eo(`lMrQks`wB=wZbTD*qUx=)Y2YH7C>X;5m*H^@rJgK+} zTa=z&w`~<9=_LD#O=zK!1?JK15J>Fbuk8y$MBS-lSItxyyDawov8ltcH|h?#K;kOg ztFx*H=7kMO{6Inkh)MR8Aech(Ed}>2gx0-hp_;o;}QD7 z>5QvK?#GzVqpw6YC0_$YnnTk>QQK#R9Oz{_#P`Xt-2J4;5|AV@-?Wc6#9G#)yG%$J z_7LSKZJH!07W5QvuCXtJY`U=oJ#GZ)EwEdSdLIIdihcVJ67@sDP-nT0X^s@R4Oq3Vq<_|OMC$V%!8FOPKl1n{|H~e;TJ?U*q5LL68Qs-fyST~YCQ+}>qLYw0Enj7E5M98`$s4!PKp)%}^atR+ zpy)W%(aAfVfle`6uFoQ!kUI2koN-9LDmwA`kt}I$a@K1|u4MTg&~oljc7dEpaW-f+ zR_qIC!N$h@fl#Q`+{gEu9qGxYfd$q8mCcj#Xy6q)Ec1fN{8S!IVLJ!+K`b+r z-nS*RFGv%SO{$|i`P5T17VI&37F`QMJ|ahSaLx!iCUkD@!cK_~9Ynl=HIvH){8|8- zH}`Jad;h~d15Z6gCm%#*0VCS!@{9)Qs18#a`3MtRoF;og?uAUSx_kVMS^#qaTvpl_ zutFI~-G3~e7)V4SL<-X&VcWzIQA@cbp(3?X%J`f z-(Y2I(nthM^p+oV>Ie60bBL7pKU{vSzrQyQ>Ic%;){0_V9D52r(DTKEICWRvA({%Z zZP4_D6r!1e3QYNn%z>RSLA4o15|UweI)$8csI+z8p@)z4^Zv3P{r>x#71eZ0%8n>@ zxG;@>AH$5e=y$zKl-(hs%%O;{A^RGUQ}W+qJ8{e13e4Ic2(&_6Ou1Sb74q-@L!<;rqSbkh{smW@;2>h*d961uz}Hgz$~CN$zvVAr&)&harW8&@Q-- zIMW_L%$$Q^&B^~rn*dlEneJ`sjvXFYS8G7i{Fp0D1Ag8WZV%P0fIh-8 z5{3}^w0H0B^zO8m4lsx?RP0mdKu1YJ;O<_z>G_n3yrWf z=q}xHx3B4*=7rYxBO3u}eIFtTNblym@qox~Jmr(49}gdc^c_{Rbat=c?7jzYH5|BF z#Vj}E6J*uchDu?DkS5})&(|EdC*4{eqU?#30&CnW?cU3^be8tZ(7Nl}=m5vLE*Uow z#0HQ)hJ$FByIWJ2Yw=u^!l+(RaL=j~yphC-Ym^!*ezE$NqChAZg!?0YF2Stxip^)LG z-mRLxEzPakAq=pXy)hZJI`7%5?RM<0v)QHHVCIU31T%NE6WiOWR+WMixX0zc0e@fB z8z6reyL#VcY2+m-D2v}+Me1s94N(#v!XUS{?rpuNuCZ>nS(oyrMJFD|c@dqGI{ck( zBr;WFL{8IHi`={N_t_01rSiMEuo`57h;o6wt$}-XYGxg;W4jmZA$^>x2V8ChOuzaZ zkwMojGVjPwgABIXRTE^=&1v%XK&xNd>)*Q<3f*1a)a>={_IlmIHUuG02M7gy*GR47 z=ow~mzebtCgnW`+hb0SQDih=&73PE>nVHvnXVb&YOI* zBF075a#?-`3tZZInu2&Hdg=7-^1;5O5b_JYU)~qg>by-4A9Ef9P0M=AEt+aC#uarU zRmclS^B8viX;gMR3q!*C&*gBFFPo}-x9`_{_xPLP#0)D6xwRe?@9*y~JJ$cOw+=($ zEw!Y49MOhhDkWlvUZw+>v4)`_rg}F z%dlgZ=F<@7dD>mA@?cBXqWG5lJd)l8*Az&V2~ziv7OJ2e(8f3rcSwt^|j4Dl?+F_6->mBFN6Tu`x+wQRch**T{fra$p#ba)iH! zF)j4RDq=l2m=c5$ba52*4OmAvjV#fHuOzy$B*&hR4+SuoZutQ63ryQ^aE@St3J`2m z5DOgr+${?x$a~C#Wmq~93$q`G2V5`j$T6Wh7aZ{WI*7}t>^yCZ4GhS%y@;KM(*v*J z>g)0-lU!^HDlzXyVZz-diW?qC!M5U{j-+beepsm2ykF`JI0B&{GGh!s71c2I1Zg}XgQ@ycl$t5o$_%g!-d@gUEha9LyWl_aUuX(C2n${47IDEbj+r7 zL4Jvq(EO#Q-3uhzuT2vn9|JM6N(!NHWOa;K6yj@y%@FQIh(f@#+Egf8x`JL}}`S>{Dp-F;Msq`28R8@ApLs>HX|J6ufG<>PLYom8Q1f z_ix#yseg#88p=% zeS~?~uhaNt)OnbWK5v(%ip`Lpqtev)?b6hr)6&%VH{d%Le!fdnOHi8X^G$_JA75i} zDrd}RhThhB$l+T{c`7O_eWB2TekC+-wOwz4szu1u&x4pVg4qH2?YI`vWM5K0nhR91UYP|o2Z*6Sb@F5^s;6yQ>nKo#aI>Mj0#)6FE~U^~3sikGp=^QbWTrrM z0<{^oWNR!?bwFthX+vRw>V#dOI!OhplM}j5b}9MRQK1@|3zbCk>Qg7FK6P^0`qW9P zPd#H8=c6{qbrz_G7D79svDi@mq;Vt`6XmHBNOAMaQzvufsgsu`qNnWg)QR)4*m-V1 zqv$g8t+_l^V!nlt87k3Z6Bm!9VrF!$^{MC2Uz#{Sba65^2lnf&PYp4>JcI+~AHK%C+=sgqQbIyrG<^4z)D#3Y}HrZGJFX4Rx(D^F;{j22X+PR61~ zCU}4BOzg--sz^O2nEE!mBGu};i2$&CJ?ccR9`z!oc@)rua4@@B^{5DlQ2o+c)M(VM zMV+M5ePX(qwWulRoLqC6O4JFf5_OWD6Rc4yivDh>5*2&;p%PyR^A2?u$8@2hm8g>v zsTk(9j!INwfjzY-y0z*`)JZ2MGu@0b-+C%hOLv4qK3^yu6{V=56-!YuucH(-$8X)G zsL~GP-3&}oi>lwO7Ikud!g0px;AYgKf-g$rR;opvoSdC-3|SmEREvsYJzse!8l@VH zQ0S)Bs24L#H=!DpSfit;p$LU;UXOawdEVCW2J2CYts{gw>Ch@FQqO1lyLlC}^gRnAnSF2s2s|2#jMEk+$WhowwZ(l=a;iaq``j=7eWqsGlX^YbM~ zAAR)jVKY~b3bsfgLpUK=b2%zXe{iOgLa}Y8Aax50Qt=hReV_mQ(e$HphjRs~Ls7wH zwFRjtjKYa&UP&rQ9({EF@WMm+C8>g@ZyhD6D3~0~m825s^x^pj*hA(6@Dza;u zIdG6bRimq`NOe;6^&AE;zbG~S=%eOg_R!1&TMj(%K&~him2lCRjtZAG6s6AMK{XuV z;2buuH1+7=!;st2`M?9S2lxZo(o{hoN7}0`O{F7^YoMH0o(i(k0Z?W4r4MAvQ&UJ* z95EjbAlFcwN~aI+;;=qfpn4b-@0&lca32R{Do{-cWpA`R^`QqAAnV+Hyp7#wm#12K zSZ{gi15}=RU%HLA^0rc|Je4%Se4ALD`T#pHeV^I3(8_})D7*=yuowxUzKNx&2WCOv z(c0XcYAtOOEK)j)O0m#p6{bSzj{Dl~n{Q*SDVznBwP6DZek4@2zOvM|6sU1fBeBg^ zt1LBzGC!opVT1LkAiTxj)Z}mSVf^V3jSbD*hE8E zTW>XL^Fq`6n;{rT;=f&u8WTcclfr_&SX(t}v)SZ8AJZ@?8Agj!f2u}}2{G4Kjfx&; zt5K=#Hn9Wp*hl9=*3pQJb557!OdD zd`;9_sSTqdN>PQF>ncT6Go`3aO(@a8P&aWO;z+ZzwYjae0*XK>st|hJrKpe^V*BAv z_-mrN#7R^Ut#QJ!zEV__Jn&|QP{*64)?6v-IWl*jRolACQdG#)!LZ3^Hl>@l zG&KiB46;a}6!qdo8Vld5N>LHScr)giCcoAMy_;>@+Vm%S1}ZxrIPLv4~)0HKGXB1B$*hg)a;^Dn#|NC-g`p6gp~# z)1kH1png8D2GxOD-vyM&Z}H&qbYBw+P!Y(9Nx7fWrlvMTp@`Y#2u32rXiWvE^hCfe zl=6BwwCqIfDNSxj4&aY%tSjA>j&Pggno3Xc+}{){bML58f6WU}l5|srzgcTW%xG)t z>f&7}ZtLRtlvh=BI){gj=23EF;*q{4FE+iJC^;e>!0g(jt~S)0X2|;1S8s|+u?6Vb zQKLd7GKIP(=o_VnZHUxPUt6#Z!nc#~r0I1Ro2I}8J*i2nTRc9k4TI>XlnK*}&*^Q` zx*T2Yf{7y(w%Dw;%#@4~<$8?QppedUr>{vENOLQ!z0K!sZ*1=}+fxyXEMqsXGi5FV zv{2Ov`=AhA*3{-}^0sJZJ8x%Q3-%DMRAic<(o1H72GB)dvt>TN*5+?(gATjOkM>0( zUGNZLVmGTW{T3*pJ{CQ*C~ZNQ50X7aA{9rU=sOyrS40ZWsI5?3dKwC%PC3~7WT_n>EZAOiDkDahz&&Xo0^ zc_Pvdbw?O=&bLe<>AS4FhQZiC02Ca)rlz!yw>VKhieR+mILv@L6&B&>X`J#EuOEE} z0f?x0(I1SG5AN0OY@^!IGtv{mj8CjwIcnfJ;00DH=wP6DQwdG-ZDxB(myW8@twU!} zH5#&{NrzTZGkO_1E@L%!ISl?)Lz&xrESEhrDol3hi0=nr5~C=0E@vwZ-MfSFey2vXt=%ZdOADq9tr8Ojx^ zLa#Ha2IOwQ^-Q0uNo&7WVkvMnLQ?z)*7*xot zD7wMjTFiFI-?gnPM5UnUVki_wg-~8aCQ3n{V<`lc8)!I(86w?|#%RdfD?;sl(I&FE z%@}H$%^C*=%2cm=B(HC_iDA@B{p~II&sx&$=`Lp|5-Mbc;?L(TmVS!;89Ro1{tNyc!l(4pfl|%;ard9%_5CQ{ z`~!UUCnzNS7=G@>l|RO351|&i>y#F-*KFB(8_s2o= zKcaN>04P&gsfPQg%^v~(^!Hc;P)ToNlDg+ny!RPIv^o6!xx^%m-Y)$7`7Hdr9{pEP z_*v#sK7s@9&|H{@OdoIy)&@;l>Qa2j{od{^35R?iSpzz0iDkRumt_?txQg6b&y;sA$ckTpFn!VE?>InPXYb^k^2~B}e*@?3kE^sbD zN;&5joM%t;_Rfb>L|55h38;{ECS2MJ9$bKw@(UM0K4p_%V-2Y5BjIrGY`CQN1gMR2 z=Y_M$-n2!^y`BGKDTRUOwSce!>Ioxf;K>Dg>jbivjB+W*RQ{h@=wlB^oB`JpKGlEr5{26!eyaw zlJID!IXj!iUkAT%!aOVS6K32z!7iAb8E>QL6PTeqY4cfE(WjCMr^6*+Ha2GR4;g%H zj1&avPM}BN04%Y%;{yJk6^xU_oG?i_?xvf^dePDK6n(mU3t=-X^@4S3%uJS@ zHO`&@>-ji4Yo3tKo=C@~69n_cjT31uoj7aagDD{%GiITfIdENHt>;JP!whcTJ2sZ) zY%G-o<>UgWzZc(nVhnw!|JV72`8bT1Unjsp4iP!-#bD6iv-4zvt1I**Akt7O>?AD< zA}7q`jW|d5$}U_dMW4M9cZ^-Ydww<*cS7eEQptre>LGCf6!Mx8NI#MaW6_&5$M{$& zA4?|3&_n5LaxyNT9XpG@oj5xkFA-ymp*?&3>HqZ$X{dM(Dn5G_0fuas8*|{cz@@Py95ERdI1!rwItsI<{-?)y zGM$`)UfGFjaR%q9_)i2w)wD}J4EEevs2 zxeIAwJwKQrT4ax{K+IE91-e9~^|XGE9Rgpvx|PKBwKknO;<&8Np>Celph$fp8a;1Ksrk z3Ey^FT8PnAMXOwJ<)j{@|7}-J{i9}c7~M;6TkVSWatdyq$;zi% zg{j@1x^c$wZk$yP4jU)|h>#MT0_+gr!#= zVv^v%&qvt)eJ9Si5nLkn&@e~Zm|&d{LQ?h z5WNF1E-G>*p%#O`!1Rhp8>dOSUyDKznNO1%faJ)55)odwb>P*ndT11W4I z3C49Hw8($z?-|D=@?^ME#fhv&FG4;Md*YqM#+15L7uaCW#ykNdL9(a*w`8OXT&>AS zf2RUzPkx^$|5N8r)*VOCA+A(07=w^`PDDY|)x_qM##Wk|U{lq%WF}n()wBR-OH*2% zK|zzC3Zg2={r8QVihE$Db=0s0%Mx^S;Uj8bQ!mR zngZ1&8Mcu3*6$0pKWjx!6HnP})jz14ncA#>5 zS}D0w2s~59J4QQ4(k#j+HHG?ZMf5Lukn&jpHHkbveyf|X^&;d8j&F>=2CmvYTyO;8T)u{rD_e3v8kyk{OIC+OGQX6qj$yE#NTX1 z$2ZSbAUv~d{CI9O8QDBso;n-{7C?v8r+Z|D7++Pno(z5P*VO;B)TctdM$d97!bIee zvx(qrDnbT2`95bN9w_t^|*eg zoL-uU#wCJ6PK1CagN)fz08D~ZAR_%C&yO;t?x8Sxn5xHiMn&o+ z4R&=f9^-*e1dmkqA=?;#FVU9bM9Vm^(orCoJQ^taJ5rtfDNuQmrveeI4;WYA;bSCE zmFN>$q)bCH9AsPrBR$Q!$2Q?=6I+U_6_c}o89Q>g6Ya70r%A|N@wQ^@7Uf!kwg+)v0Q>I3EnLjf32*J za1=%B#TtGpAf^Qy|(3+?ftrO-J<|4uT zKTgz&Ov!+)*C2NoGS@iSb5L5fo?dIgAm%Y74RI&QVv>?#ViMTc1Y~Yah)o!hFeKZP zxs~rhpep=(ZnB!2ytwN%PCaGM0D7H=PrRw!m`xK%k~=0Sfn@=0NJ2tv3;;j!n+0H+ zi?zgKInMIZa7)T3p@B9;CQXOF%7csN6_3l2Erm78Tck-`0%b+9LlRiXG zmjSd)|G18|7+T1Q2sH)mVb|B_uc2-A9$c7B(KaZJ>=c%Z#StbNrHW;NDxrUiqirE} zeR2hbkK<^I7TxC2@OW(cYW)qC!w_~rH?^?Pv+x_@1`=;Wj3JiAPeKyJ8lJa%BvrhI z%GE!%=j|WcWYgcn?Pa(|CXuGp{Q;r7z?F>~&^UvfH5ga}8*AW2{E;^<3=qD%{;oGJ z8skK=r#l|d4*}NQI&9np&TJCn0HX{5n2?YXJH+Fiy9c|STrQu1nZG0M@8yd1C~iBH zfCDMx8uhpJ*I8kFVmvzJcML8pv;;$9od$I*ClJ`g3`#zw zET5MSsl4?!fyfOkPP7B|8)hXpk0m7*N8VtJ+dyNb7(WRf7ha&@+wzZHc=;4!eB=l} z_%WetfQssE_Dpl5;75YrFC$|DGH z{VkAG6=VTp)<1Rq)gTQm?iQ&=_}4Ww5S<2hC}45{uq2juXz+{sXQXM3&QyZ=$auIUWpnFA=>oxw6qS|P**lG;_|Yohd2VE zKp(^NP>=*w!Mh=QS~%hn!oQgj7gtl>)6{7m@>mlcX~OihbR=a5OJU@4XrVJj#A-C! zION1l6KLa|*+`R{Jp_!@10%f3^aLn{39(5D3NRKZJ&k-!-(*dVrWS}*iD}ts+1Q6l zPfbBvdC_#XBIo%)u}K86)T5Csl!~5jq&q>$ql10u;pyY#&(%ECJm3wr6fVu3El5js zB{INf2cl+=0^@tJDVxS}dK!ysZ=h8K2`Rs&)usI4{s+Fyng`$^u3d~zOyxVrosH~o zsiG9VK{gKxr)M_dclY39h6xfZgfs$=FxD_6yCvyvN8Zz!R-s8*f78=hb6-;fB=W=* zjNsJN^t5bun#jYnCKl=XA^nb2z8R|Qv`~FE^hOI7&Y;AoHlz&U^>N3Jw4-83a@O~h z0#B~~Z+JoTY8WYbHFq@)U>IC?F+X8V=}HrM`Uk@SEOU8AGfh)wBeE4j&&HxfoWUI{ zH^dI%t&3JnaFV8AURLh^aFS-&cwC@MG`BTPFkIk7iB%R0-IU5f3{w*m>%cb~1kmYe z6ZR<+!8@pX3}aqJ#q>*wfh2GpMIDoee)=VDJuC#4f9OVyRLeN5y@k0Ec}mbQC|nj7 zceN~*x%he@#FYdo4Az&t^+eM!xQzX>Q(`dnLl+8SV_K#huA^6SI`45!`Gd;btRLb1 z^7x5=d7Bn@jt~$+(VM(|NaGpLAm_EFJH7^G2V~L?J;w0@6T^YCxPc&sO-Qk0(n}sH zOP@81cgm*JokiHk$_)%>0NA^He&E|0SnseDF@QY-?H>N(S{JmLiGyb@kCDH=%OJ&g zi{YmNw?V9rO&Xd$3wPvvIypJHb8aDj#2M#tuKq`PgZTvm!JSAh>0PuH_hagR_26=$ zZK`;<0c%(c{C+Vp*boAX;m8f7hM0u@L(|h~x@2gpSt9P+fe-|CfPeTrj#6&cnBXUg~G7YDN#>5y96>LCjA+aQZOO^~xwpd1FwR2?s zYd+qyV4&if4PLQe%-Avi39)p+z=6gFe*PjgVG2}&J5?Cp;sPEgkJpBV>SN#n4jY1} zK*nMPU@&w{P9_!z*bs{aC%Kx(%0SF7UMLVZV|M3vV)U??aJLygH3K^@PW-gRkK06C zw<3&7W3^l;)%(Jf0D4Tiuw)HjM#qi@x4~_3LYN*eK{0SP!hGS^X?!|XH{Y!+r@sS^ zV_abfi&9~30H;JBr_qKQL!EjxY-iw$iG>CSJ_Ec!F;&vvk^WN$@)}^mwJDwfa}_fp z@2LxAo1W_Qc$G_VJ)<@>#^~0|4E#!fXDbkN6c{?ftGor%zwA?9i_Ybf{__2aSxNuU zgI5aWo1Ts)dOXcFT5wg0+?$x5Vq)A_^70?_9fx#88+EO1{P#S~?`f*_wH~I5fif*U zh4Z+b!^fS|%0u-jNst_mO$d`iFEn;cF)#+52PINeXI+3z_E^b{>(N3tQ1LpKOO!xh zQ{&?w`JrpH1bhwE8~BB)0Rp4fchnno**XKKb6Ma5kTn8(|C)d1iOy#N#`cdJ6J;I5 z1!9uIVSk?YPS;S6SYo|{nIop7KE@cF!s)1v7@WL#=>L&(I<6zZV8=KD+;qC*c`XcphY|HJtmvG>rl)gEvRE7iNC@Po&Y z*J=R_&=|b|DpnF691KTzD05Xj`^+0IKhCR%Wp7Z1$(yoCwytQ#!w_{@7yc*I1+ z+n60Woyd@ka|cZs=GlU*-w6L_Uh~Z!Wyq^2{vuy2wGy$Mx=k^{{?QkTV^;iz|%^I6W9X2O6vlLwbkU)ap8mR{jtY(gt zV7r1x!p*`dtM{JCZ~qAmE}Hx&*_WHJ3a8kwZN`Qp(bV#py|oSvk}yLr@Y9Kcje%tz zn*hPLaLIzP1xx{wFc%(ZAQf3H5(Mr5=AUyhHv^sx^B%?gr{SIOA=*tmFfDJ+@bb-122d)&oKDcs zATwm8^z$%+%R;Uu55Pwml`kVWo4+-@9%H_qK>ceQ&`e}x#(eG8!66?&s7{@w>&N$3 zmL==2-mj9@VX+}#H4UJGL639V`cQ!}(Pki!EO9?wF#eHXw+{Bs|9BgI`46GX8j)`v zAz1vIRL>Y-u(iG%tm_vXEYS6H>#+VBA^8nCeDl3MKR(3gPk&o#`QLm!|1JO5m-u;p z`=Z4EZ~5KwtS@RFz18x33&cltkD&bH+DCBxfQkR?hyOgLmJ(mXV`=%_LX$UveBnp! z`B4!S@%qD$lJGx@zy7Hqg02@=*k;>q*aVlKv=NjC)vrKa?Hg3kG|W?e`F?BpVVb8r zthLNE%+uQW7p6A0Jiu@#{5%yin)r(ARB$==ugYERq?RzEnU5a0H`G(nJ=cR1Z?seh zVyZrFfzVp^t$0)(!oMKsaiz8VV1%dq!mZYF(+p3!{l(UD<5W+%)31Ln$6o(anX&9~ zw36KVf+G7557ZE5P{!?*Efnz&ph8AY|G7ey^jA-q_c{0{u2J$nPXp6^W?d_vF7|uf zPU?tIIr*Bawd#z(hp!U!EMJay!2IiNZKR$sUKtNtDww(%fp)&8XQjKfhAZ*rYXl=} zKk|^q+)C3rNCRQKr#@({;VwVV*9dx@|IkAUQ#UujNpQ2J;FW5=<|-9bw)Iq~r{8a> zV6LYKTzEv__5Cu>6HM)*08d5F^L)h>{uNKT*TvTI_2)e0!PTwhy4P`W9$|z-@3d4f z)o%#he2wqohpjbrD}(qNfu-~Vz`RTar3O#AOJ!@htb?cA>r!j^Vv?u)+=JHgSzHy- zjBXfqy|v=T3!Vze!iLt0heP=afo8{24+iG;n+lGvh&kF?VOuNrRCFriE2^kqr^Hik zU));W-cnAw_UCfH+kY-Ub?e_LU#1MVwFN;7094!=ui}Uez4OdX9wgZE0F6L}V*GCv z!}tmT^XZb-2U^O)6^~i2e%bTBV0r8FHwSpis*SB>p09wf+16S|k!rw5>GhcQlK$Az(T>Uh4Prg3eQli*%a$w)!A{2Bg zYHX=t?u}O<5SB2?_wOviGvG{BjEms1VL`j&3q2LggDFb*J3s)k@9;H{h>Pvr#7!8+ z^34KI1#@Mf815M0&giqPHBIaM_!@z7Lk=E+U|)$xR4fnn=avf5t+4?x1)*LRKWwdO z{J9ffBT#Ogk9RIn;mOW~AO$wl^@rAqtH~`D&o#7G+5Ga<=3gBM_!%w|sFVS|G~&{j>O^*3XA50%m>d=kksM?bofJ zZ}bp6cc%68)dVtaP79c8@nmW1$BWOBg{>cJr?-5(K*=I9kFUh19J1xNPhb7^>C4|f z{a)vR=y}5f(DNy0j%&8-f(tQv0?hL*R)U&@k!aGEu%r!XkI1rxqgVL%r?3f2^=Xs_dGF=8rv( zGnOcnX0x@dmszI|_t$u9{K6u1ru6{LSd0O7ZH;+3yhF5RUAUi6ELKJ&Je8dMbSJe` zEba=yv<{lZF1PD+`4l9tHItrfuY8H_Btyt>FoMP z&pKI&Im}Py|Kg%*Ds#-}tr3PA%$9AxJr>CL^B~>)V`{l^R?QtM{dt(b&@akt`GUoo z$NaDrpf{t6#FHE=(#b^$3$9b~kzsxUKl2WjSnL)_v@w!pEtdM$r$d+^qh&SASr}AG zq9c8XWwP@Mm3%kITN!F$i!B1y?6%xviOFVC7(#*~jRrGowpeU~fcw8v@umbOKo?aJNg}vNNmNjPJ~ATWUH}dR)k<#( z@lq)K0|WF%vyHV`YCR3bo|@Sh*${zsM1&&1-_K944-bfl2rcxJ_;`6~e0_Ww(($A7 zRD9z#g-D?~rIdMTyp&2WA(3x=1 z)?X=ZRQf4YYBk=(1&vaC5Np&jp%_=52}LKQoQx3?BItkhES0#I1Q73_pfg%|V2D0A zP^%3J)^g$1dZEr3q385yn90YW)9WJJL`Q}Mg?M4v8O4IhwL!8#gT)--OXTXtK)-uEIc!oLLwp_IiihuB4Lfu|h*k8_QXinjP$2Gh;HF z-DbDRZKfvNZ^Oz=Q5r_>i+*TiYyD-uQEZr0;APY|uy~54CcC-LM9sHMgmqX1ZQ3KD zWGvTJ+L5&wm5LmCk}4|W86DfHYnLvaJ2=}5+F5WKYC3MLG0IH_y*XG)ybUHmR?EGN z;SylUc#canlMa z-y1+8lLtKi+{j7DnKo(W`T|$JAa9rbTfDeausz>dAjr?VzPV4(_|wLujB2dM7B{p(9b8QDh1tFW={=n@VoX4h;>|FTYEr+v3#So3vt?0i&%}BT=gY42A_Z7ZugjH(me5RVduIe|ffZo?yo7t~Z3EMn2!m zmBb{+ML8pIS)VhQ2@2CYb=cA|3QXn)tWZz7UxV*8l~wlinzZ-lfs)JzRB>azrq7qB zPi_zD_^XqOY~x6f1zT2TyAk_iIz}HBW+ASB$a!{&mem$RoN@x@ouhK<_krm}`-Am>;*x3x#tX~e3KD6_5*kSoV` z3FX3w&K^lHKK8IokndXfgHtAhY=Vpb7wXAyy+60+9Qa!jOV+^kUs%^Su-rkJ^Bpul zvo14dCPuuhLojt5hqg3iF5oxuQ)+R?83RsavFB;g4R?zE~ z@lF8wMKcn==Xb4gQ(lyX0= zvV)%;q~;&tXXs_pr6X4AM{H~ue7)^H^=df?j(Q$9L}Zvxv)I*(W+I~uT(sSCg=KV- z47^KMnfGy&`J~f&&|D~c5$@y6XT~F_8cn_d;#IOV#7H#TDD$B*#BDhS0&Q$Ht27(t zyJ%CqnYBb~DK3zgaH=ycs)tCqMRMON*5fK#?aSGFhG};^)6={yP zIN1lR!ese@6Dg!+eB&#s?ze}s1G_mF&l|$2@k$dT){kL;;RXg)# z)(1rC6pTP5k7+yV{Z*^itXt*M7|Kj{W|wBN5$`SD=-XxfMK^nMHB;f)=?>PE3A1}7;L!(A&3YM4c7(* z1^fAk8K;0s1^%(_j)J&w4yz1}5wrL`aBnx~+K3}9Q;^E3Y0$~SjfN-A(Z*iJtE|SP z3&G?lRYkr#fAyw~oAVmC_~&ijj8BW_PDzMs=kKQw3jOurkq%a2F^c6c8UuxbJ`e0r zJ4*NVFp(-CT&E6L@8+l+T&0)VPX1*oI#=#|Po~lZF!FKkCMrMqgx88@w=Gy0Se5#BNW2PZ2^n*BQ z3@2h)||QXKg)Z#iP^Y$OJknTmi$eNKALFqRfy$5QEZGb@)|z^ z2Nhz5pzCJ8L2Zu>h7@ee(w5_Q2-XA za%mcUWEfKc`E+Nj@j9!rM2JNqY@YU+IDO8-1-0{;?2k9QH;_En7FQnK;#Kg)<|QNb zYK1z8w7XRYm3X$ZARI0TX4BA$6de=%RgI0R-M3N*3{F#r#fM|HlB^mkZ1(eoKzf^W z!M;j?M5FDPk+pQ|_U-xhEl_eE5r8E@vQk8G>P)8{Q%vY;l%IghM!uNQ2{=eE#1#g>9yn^rvO z&t@F0Zlu0t7EF$;IqH@2QSWUxv4JGwdnfg&*`OmK(X6rE(*4PwPLB+bF07?KccX~E zQX~rrN?EoffA{wM0`wBMp2=OEjrn};d|Qrm>9jPVKxS(5kf+ex&UP~h6q+JkQJ~Od zF?6Wf)WLKCdbACz4+eox5Bf{a2TK<$sLpZE_0L|oVcpsd`CIb0%r`leuJGLym00q6|F|hZ~`$@310s`#m>iK*{LE5F;3 zk8aM-FW9hV?fQk;+}s+_w{(P*@i#_W9rHpGAVLPRB` zQPIX6sl+Vw!hm@TZsi2<#C^DS)g}P^{Hu+F!;}H=3iKubrw~r@wv6OBtB(+NN)|exAqW%L_KHTC;BH zoVj!7-$&1mK);$Smis(q#wV@^^OV7d!M7)9rv?I?(Vj1Lbl6R)`yLZ}mn=r*sVp#Q4^2Qw|OcX)B{$FF|uyFTSkTt6w^*iaijk)&D%c&;WRe&# z){If+O4bX5%U4E}J<=8~{BXg=95RoaOFxl+_WAbRUu}H9n{t4>KT*$kb@svMB6xZ* zBPJhuM`#-JPB%brv*3lT+oFx2$E=9EeQwKZUS4fqT$KA2sQK)ZPgZ8nojdPRj@N?4 zulMeuA_BD@#MJS$nDrK(7Ng!B(HzEvMp-IYFN@je4=doQksl+y{^=Y#S3d8Pm8-UH z+qLukCuI^M55=k%RM9 z%Yaw1VCC{v+rHi@nf0PC>HMS#+Zq;wBv?=0hOKhv2@+%)+{OTbu|&5Cg?mu&OYi4x z+p%W($_3oq@*L%|^^Qt?KOG)j+7^R=`w>2Qkm%xfQg^-bkC)D!H*fy_9NFTJrgkA}Yz;X)V8c}$?_P&da)y;eVe=+EXGvj> zPY$SFvht&)BP2o@cK*qXtIbqyTOm>g5i(%RVs04&D);0_7R~Q3lp5On0Tx!N25dV> z^b*p0&XR?{3H{6t%f&`grSy{CS6%$RZg^wGY$009a9 z9kvZ4EjYT0^)`nJEOQoSj~kOd<}ZJF``rYc(;#WnZe)isV=_xJI6!eu6i)J&pTV-s z)x;r$oU=LM5V}+zGj5V&q8km8XHJ~>&gfUo79&n}1dM=VsE`RTdzzv1=6rFlxGDsw zG~r6kdm~?aBPA%(UnCb3;$Wx%YpLLwCo-7KiIeCg)s*)}zxl=+qei_xGKTcP4u;6l zOzn33z21%t9mTz(e09W#k#COv%U{M#nFR8@Cr+9?X4I=uVgO@A3a#GYj3SX7TLrs1 z8Vghp;>)ba1UnE%j8Y*ZQu%8mj5dP^)^6MBr!wdy(c~!;-hQ2?iQecEq7-r>fyNg! zrPel4ZO!w(p(^6->!Sn$MMRjk>uV#&PsNo)lTKx5GSgol8G(hRSf{3 zM<^wcBB@la)nUuXV2+87ZnlWcA%ZTmC!7OH`Q#~+-gUmZT|wNYy^rjV!J@ zTeU>=>4`IEPfnG+ebYfT^&hDR>^t`&DJ&^2EngeF1FP~YyWd0y(EzFUQ-epoId$sf z3mLMRDiQHDwBcv)N6oFm5VgPr5}DNE=OE^T3?mWmU&#oZFlpNRV_tfukDrpX z@Acw}P4Ulg5l>^+kjmE>zPM6+c$eaX!`uD*k74&GKr%4%dPeZXsnchTd9J^nFqR%Kj{WKE>5{^cZD|hK1|rPsgx}H!R|>s8 zJ89xQv|`(ybXyysevA3Rt*P<-r;gSuDhTr_0G6Mr!*KC$ zdY3LnBGsi1e{bf*YZ>C{gOnuHRQ=oBZ1ZRQ!a;@5B-c&5nGu#beb%@k&vnBjWqE1Z zx5p|gj_log;KGEcyH#PGZejy$JweBY+|qn~ z0Nw6hALiny?vtLY5?}cK%%w|3KkqFnI)1X^XyNCBQ;b9ql{$Xb^ochz#8XpLGCejC zJ%)nLt#9cQ5ED!WLt92wz`o-w2Q9eDH7iG$#y!a?9QcSep7xexri-7 zW@Og}j(Ry)guCcT-CIkPlZ);{N*D+mxg4-iC%BNSZ*1W2v6r?lrj3@5zJbo3J-=Gw||{t%RI9 zwR7BX2?=i3e`eP7srNHP6H)~F7D_y8faYjo;d!DaLu)d$6Q<0ZJuohqkZv=V9W5>^ zJ_+##zYuLH>v7RZ)j0#|HcWN^bik+pvv!z-uaY0*CvebCmU?bo+aEIo_k~ zcL#1aP|2-37k}7Wc#td794|ih;q+JiNucqWL9=I0olpaYyi3$=JPe5rmtm1)v10g` zNpNNz2Jndo+Rud%DOkWW#XPmf};kIvV1-bMM>_d-okII(Vq0;_$jT@8}3I#}3M#HhDsQ zhB)(`K*kKE$#;v1x2z+X2&1J0?7-%J0|=QsW8UCs0STM%(Y~XlM~e>Z{i&q-fvtv$ zYxaHB)^u7#KOkfmHsQK-Z3Z3IsOg|XJKD}s#c@CK#=%t4q~f!VYASKuuRi(X-u+<3 zA#3T;{ACj&K}O$K=1iW@2rAx%|1zk!3UM$+8Qq5F2u2rWDTSG176**WY|aRnICV~1 zOpsWb{%QW9;zI`y?EU#zZB5eyDt28vxUF*+@devFVZ<6t{)z3IK**K8*u>O?4umMI z)f>xhy-r>^y7$UmDzQDRE&XZl0nl;qSnYraM&h@TX%t+bO%>vF~gz z8dybNkL8KD(SI~gM1NW}NILXd-5~PH;RBWSTj<2P`eQ#Ia2Kf$9zA|w$A_u@g20$J zW>3wuXNV?_7RqC4vEGrIjcxcHk^q+$6Dibt2`h?`3CCnQGyF5BWW5!wBmwVk`)2>q zLq+=v3mY1nZc>r!+RxTa%IN<0=`?VPI`r!ko zoY!#b(Rk>WLRXRM;L*c-3UWFV?~sn^(*a&I@oh%h)EL| zg3~iy8NO5A>EJIW&u#v;@W|nVMf>;G+H6;;kh`|`sB%|l|EvbvmF{A3cnwInliU|$ zR(&DRiwwJ8H^J9u{r;j#*JX@in{EHT{jMUfLx+pL+nb6Nadi5$OgAJVJydAMUePU9 zVv;fXX#N1jrj~#WIC;?9A|#Rgwn|j=b*xLmWrVzfmwYC@6YVWfjW7K95a>B@;OB?- zOYj`JwpVrJr{U_j)3k1FDCxQdhZDk^z4|#_R8xDhFX?`=c|#Y;E595(^vk)6IEG*v z3J*Ao6o)PhBG0906yBpJa~YD%bUnfDdOc)A94eQZOgg8&$t;Z4`%7-Zj`9&|yxojI zjLmO_kDT!iV2mFJy*iQ0kdN)CX2RRb->-lY5dLz<<+=bf?`m6M+t@a0W{vyaoVGG{ z#;#@lfzGJqToQ;tJnR6>$hC(Tb&?Dk>W;O*`*!I#(vOlNtL>`gB)9!lm;wJ1QfFR5olj z%Q`N^&}H^j;&IC99~2%uvbTFs&X(NV^&4MRc()xle$oiy?;{XMeS9QxZ>NR?5^bGE zsK(i|on=h^YP-f3$l>%b#B#5rt&^)WjScPGp-gb>ZqlO(TRPkPLk!Gh!grlY~kYvZft8b9M zu0zI8hqxlwLFXaYVZp(D?n1K1^*#B9+Y$QZ=d(w@$tvHxjtHnYp@B%lU*57IcYXd; z(xavvwv4(8L>?^J5TlU3Q*f^V-Kf5kyLCf3XWRXxmPddOWQI8s?kB^9P#TQ{#; z@6PqxuxV15RLZLVLhrsL_A|Bb)b+_HkWIWR?aH-hI>fcJ<6t`09w&}vP1tnCC3qUK z+Sfm**Vj(!b_-nf?pnda+wL3Ele@4hyyJs(_g@4rgmZdvL{ta~-{hv=&IBUYX6A3s zUAI2(n@`o|qvbe0t83;i97b`%jio zxg%4$kM7&D5qHYw25#Ci!CxpG+ejPUQTV?wVa=D@c7Ol<-UEW7LtGhG!W3Jr-0`Mk z;^X^YX&V{F^AlsichEVkiK;K0`+g0#O7_X9Aw!1_PhkVNAQJ4tF{CS!kD?b_j6T?` zh0%K_$@{&}^K#d%%m2Eno=zw8%5l7-ytsdV(ZO$I!)6TVt8x&P+_&qnPrsVNjN4zd zzqq29GT)2d;h@Zqf04g_-FhxpoVR&E%*yMS{T4|?Vft`w%4=ye*DBV3UR8DFeswk0 zgEdsNs;eQ?%c+J(xwnu1fYUfLY8)Tv7X)L3M7SdbQRZqaaHCY}=Z=B^*MXe(b2qG8 zQ}E4I*ndnenO}}Wcjd*>qQfve^9r_Z$#P|TWv$+|wP54=ugqS%4wPH5Na!1ZQ(aa4 zweLUQuy%cJ?uO5|ZoA6Q$;K(BzUAdzCL1a}0XlWcI%(qi9cm2qh8`g5U%(~C7;)r)g6wzYu&CQ0J z;fxX<9HRB}G4^}$nVBCf_;$~pit{xX-`n+}dY8_rp=yC;Bj~vDW-!jcu;t)SIsv5g z{*Egn~^3tn%}rRyc@)~wnxf_#3QGJD1EG*VgZ!7o>> z$pry87yia9@He{Ide+YrsgDT3k({q@n_kn;Q`$Jw$KMs`)G%u8Twt}nr1xNr@*>Zi zwNdevybU|ct8G-&IGbd+PXei|S+m^w^|tlvRykJ7*R3!3>bv3}6f2#@RM_yW;S4qv zoDaVL^0QS1R~=OPQ&-}{;!Fcu`^JdS=PN0_|ALoG>(a>8^8S}`B=?*jj!Gn!=tzn8 z+jp9&@cQ><4;rcPguMGh9+&)x@>g1Wy{!1h-L7vHUmq;J^bp2p5ZhRS^X$3e9ko>K zzW2k0!#I>vuZBNf!w)MI|^ z8&t?6Vcw6tj%1F`I#&a!!>M@>(o{m3ugM$LScu#&y$mj#Ng~jxH&|&{+}907QNDhh zzgsO+dG$C>ou3(_uHs}Mm_)3BTjgpp-viUs*Y$uh%as>Osqhrr^Ts_&>YAyjvOfS_ zXC;y5jdz~&!7iQKU*@MAd)mg5y;%JLEiTMQ+`mJ_DU8f*u!mG;VfF%4@_OZK+ zGX2D-FHzy;=ZQaw#^YhnmCW$==KS1#QeV?2^kV-&9!MLbob*2icipMV!#oW599Zw; zXj}Zgs~o1n2W0L=%2Xv0K}hrsR%VR;AlEw#$F!VE;-%c}o7pQQDG|P3GLh>(qPqhO?hM23M%rtWN3>EDqQZpWw7`yk?>-2iJS``0vk--F; z!NP`;4oA*YVSTr!>O8L>lz+wH^-a=}li21H%{fiQ^h=^NO8t>A*%z%TzR#w^43F0;0qH{Nb$;{KAhR zt+Wp~g=EqV?FQGK;olw-a}RI-syt8$0oSJ9$7rD9hhvD=fY*i5!Adn3A=Gz#D(V(b zx;Gi~ppr6MB;R^o?%wG>UT#(`KMlo!B?>v;ga0ch2r_J=tDfB2WIhFSm;b6*g-$-*B&!7+_OcLFL} zp;9by)Z!F)jd&#oP}~Qiedl;LDlTF(cZUiF2cE;1lZ3nQrKmYe@=jA7<{`0bwGhA{ zK`n4ZW*_D)9*k=p^S%p%tdFkpJP)NrwUvi5ReK&#zV{hccOCn6pGwBs>+!9aTP^aC zM9qlqiMWLx@?{3xM!Q`3WWW`;av6-5F5p3CGWq#7I347;2rx&2p16ONirgQI$J-jv zYH{tmLVu&>E_RrLy=XXzyp3HZE%U-Xo}RCL6P%YJ3%;WsUgRN-Qd|P0JlVmERCv^{ z>&eShuvqVEBSK8W%01z92-W47H7Am^WqxPh@YoE-ZVJQO;+ zKE*@XEI)?V&$abE0Fur`n@XA})X)}{vJKAVu-eiy+8{VwiYyU=wg&*^PJ&nddCK$+ zyMBp>ayfM1L!LMCAFDt_U-1r%rd?j$t~JvpDqJA@H+*HLwIpwzu&ThDI=Og&ILB?LjZ}218wtmrAi!X) zWWZ*i#jFfiiAA$(1rA;xo`r18BeNY>ct{t5b^y|4#ph79)h|d3PE*nSo!xaMcG`eJ z5hyZaPYFj)kpeX!iYz8?l7r3mJkoCGDLm>POlCJ<<>7p<`WbM36)nDoRu3Z|RZ?;N z{#k;Nn5FBfXc7sq01&khKUg^yQ!sh02K4+8XjxiN4=vD?OtyHyyhly}OttY72(asI zGR+OAOlR@xr)A4+P9D&;{+^~03kiGJ0;od+0R5s1U7UB|Bn*N`OY=3Jp2dn_X z^bHKB*T~q~lWjq&i172!{tBQ;d=rOr5K^ZIiYRQN;G zi-)fBa7wf#fb)`xU)~NOljh zWWkmVTN*GytRv>a8$6`bA;p07Lf9>^|2Z*d$YVxrYpx#oB+q@xn)!j1K3LBzC>)p3`SZ|SX!1_>Oy+fISWOE6X z*6m*P#RT%UjRPoQU4KSb>!He2&+9QYnbcfEWi!dETQ=sd-|K+=QSy}LQxB+FgeNOk zSqkMifUGU13b%D_Zhn&dd*mF&3C}h!g$EQ5$P_|S?*q_J@|aIH=jN_GZKa~0g{sxu zU7o1Lf-*o_t1P`oh26+!PAfb|x2@T{!LJ)q*kU|14IpS5c!jO?m@q;6${H#^7wek^ zNbB<(0Lrn$D4*>Cbu}dHwFyxnB$=%Q(2C3V&28&2Yo~Yo)?M(P?Y^fILrYtr;l&H>$oEI7yaB*AY)JO{i9?-Z zsw~_Cj6^i??2>wK;9&djWcqE|2qSpS8SW?+Cs`z|<^d0`GH_Q5IE*Q48}cK*m2<`G z*XM5fMBT#%YiGY&Wo~E@ie|twtH=^`rRcaZW;yTSvgRyz1V>*hy$q$*JiJpO$6Mgx znI8iat=wTMySaUBZtmtx=}h7RfvyokT`NEv-wi=z;B7qYM#RB(09;?tbO?Il=LqGe z*kyypI_g?NaKh+No=$c43tk@yf#PsVLV zd^7~MLlCWyKsu2p5u?x#pHmP^!QYpZiQoL)MzaBFDOrqnvJqi1$8&>H7Rf@*hh!CM zSK;qWKuZIpB+>`*6x|U0kchue0Ok|8v#Etz{&P1Hk8*c>iuZim%@c>wj&vaHNGxjN z@NGL1gVuE<@&6x1L--3tB6(=LxY*b((JDBC`GxfRdFe;P3%370F9cAPzN#VS2@a=uyk-;SCP5&g6im6xp2(i2-!>Pe;8*WH3c*M_LNzz)T$^h+5J{PkWcu# zg=N)NMfvgh9aM200^5HE{>aKIvlOcTKSW$eb)@a?a_kMNtj8}EwD(E*^n<6o1{9Xr ztxR!QiOZ@weyVV!SHg^)+ujd0eGAgXC(6^9V3?=>mjM_eWkBvJbg0@|xjou@K2C@C zO=q6pSL(0|i}(Ig!dW%P&;0O&Anm8pii+a-zOPi`S;_IrJ?$j_-Ea(1uwVAcVz*UO zQZax`DJ!>vM-zPpA1iZNwG}(3Y_G6dkDuEbLq_i}153+(PW0YZ>9PtdwnX~<%fT69 zON8jDa&&=r`A<>(50+WWO06ZwvVHpA|ki_2c^@6R#EZ!QIgQd57!Vyc>8Xsa9Z1){Xq0S!0g;t4oq{DPaQsCwU(5=)MbB}wS0eP z#hMD>DVsZ@vgGjm+2zG9tLVg@Ncq1Wxgpd^UO(Zmwmm;xzpBz&nQ5F?Qe1o_Taok& z_;+S#nz2JZGJ4bp4ihh`Ov91MI(y%#(tn2w(pqLT3l?$bW~{a`nN+leBpX7k;o!K zMVy36y<{Rd9Q`qr1Bp|_Z9MCGzg+J7>i!bY zG$*wGcPHwtOyw9E4od!mfDW&gfDT5aG)5z4q#M&c;Yn9FuP1xPnk{X8Kp^vbM2EaJ zqC>jQL!`ObdSb`S-pFGjn}BXA`6?r?y!2?Fu1mw7F9hFC%uo_(uMdlgo1l>Q4km-= zzwC+aQ2rsdL*jxL6@okbV%*V!w!x1X+<_3G5Sf4xEA$C{dUSu#LzB>}Py6T?gO9fi zp*o(R4yDB?QS^@R7Ye#;E^$~ntMb$mZEIA=d?*I(vE$bAZ)2Wa^6uB@{i4BAwJwm6 z4L(|Ivnoz}9jlss*t*LT*CFBKI<$daZbpG%O|_4=${1tm>F%xR)xCR<9*N!BL`WVp zt^?dt6QNgl!c&QtdnkMMj6;hqXFA0ti>m`#yyJd@M^QO+-?<> z?EUfx`at+eYkY?q;d^3%5X|uN@6b27Pg4(fPm;v-p~iRj$B zH| zv6htObrbv+;30bJw9P6gF5xxmA>Wob4}GYgO2kNf4DH+Z>6Mt+)7FFQDd^GL$rIeG z8)7^H9w){_>51_Wi2QY(d-mdzANCO>C%Sqz_E7fi5$Pongl#-_qO`c#N=p5TpZ}}q zj?}YIyuQVy>mvUU-ysS9qN3jFUwovy8bJ_2fpURJ9prE7{WLnz-ow>X&^y`IN1oif zTgbl>*MV#V;c>ls^-aFp#|bdX#HYK5N+bTVX@5x>^dULrx78#x{VAeDzX}$DU-@^_ z{}j^^D1Prkqty=%I(v0QtCmZ=H0IbIeS7ul(cOuT5+o)!^pPd^?G+_`?1&CV5)$4e z@hJqiSNCxxlRgld?(QC5-Fx)w7D_}fE%>SIWQo&CF1DRU{yL_^v=_75iK6HK9Mlm+ zhMa{0(3GA$@!iL-ix{aw*R_AYK0Td1NOxCHcXB-_e0#a5*X;bGXHP=xiqEti`ai-t0_UEwTF)+G+iCp&7}vpcJqG>Y zU2^hd(U$CZWKfFi65l5gmxK2Zcjv+PaVOXGk@f9kkcu8Vv_niJq2Y`>2?Yd`1*>1y=P9AA5=d5r^t>le??mE$gd~KQdmssULzasQb%g+H4JF4DlpZZ-Yg-#yZPWHtvDLCz zTNf*J5rs{%3Cm5_mRhB@MzrorYip=c@rH@`(3KIRCdx?4v5bgvNfd zr^7zQK55sZw^U`5jACf}_`DeE@MdM|!nqgBoin~L4F>`KqYWKdW|BJff-f#!wCH6> z5WUFgoICHL`7<)iIIG~){T!3VkxQHY{I}mPGyQ!(N9xomrowNOOC-Odvhu=t&NvEx zwKBdaW$_m;nOmH06+d?~2TFA<+J{~+R$g?GbKXTxqhp+f%w(H6vap#Wdo*$F`ST+! zPwbdUUU&E{CuTtk!#-UNvXt?HS%^2)1)kHNSN(f{1nQP zDleMvG&{dAdx9{unFB?cO;tH1oA*52((=e-Kguxc`#Cb$evT9YXMJC|@IvSOiz*i` zY^$^`a=9)5aM3j4b`Fcaog=N{3zZ9>WU{ruJl{G0!kGnv9osoflPso{r6$jw!IsgF zK6azUIDTkDhmjb@R(xUMf{W%aSh(=7m2|Oj?zA)^ z`Ey_oirL?Oq_2fOYP>#0DwuQ8qK7K!B6)^s7Z0-1Dw>3NBUb#kNi3q3|%fy*;NuRjhC3Feqoj|?K3+& ztW)xY{EI8+&#ydhYG276i$&DRcU>C8RW7N=wER zvGx1OlO~escWlFoNb`LyJDULq+VQhO12$)kGmW1xVbav%X<$ej3bdCLO&V`uLVo6b z8|iG{hDCw{b;`z#(L~BBd!a-woj$#^h)$3uDr4+%i)hUm4N<>v>o)LChewUtzG+rg zK_`I6M>0C-x6aJG9lGQX3NQGv5 zc?Zg}Oe=)nBuT{!YO_AQWy5x9{kFki`aQw#XI%Q(O&i8IHc98^7LG5DPwy--s|Mql zwrq%#)8tnnTGPwQO2z_4nVu$(U6i5k*C_h*evO6qW2I}$j)rPs*{61FWbT`$oD^~yJ*Y~WSG7K~}RH-F~Hdo;#nkIO!PggqLCjiujTaM9Yw_U;X=-_RJ?ao@cg zZobZSUZ%;OJ+-{7^qms9IBmoo8e$%q{$5ET`e1aHP0YIRs&A~?cHj0*ciy?->8D?! zzmivW-bk()d3T0&-tDLD&X_W^JL948-}zeRsy*n#_NSiSxPC(*5Zt=`{w>$L=VhC5 zdXZYzg)uvI#Jw5fG*ia=C8J8q%BSa;<+P0Qt8Qri)xA6JUcYYd^UuG4y&3OMRGxok z$yx8s7`OZ;%hI*@0BG+1=b!c6xuGc#Xx{$orW>xjc(T!)Q(CT;MoXlu5w~WDQ_0j1 zOR~$#r{!9ObVv0Mu3!I~?VImjf7@U7zW|imp|9uM{J}#w{3`MfH)d3x|I5)c{ClvS zEBB@SZMUz#t0~afy!}_(Z@qM8hG0sciduY7B26J9Z_Ai=s3d2)TAqg!vx=_1e*NZq zwr|%oD|TX!`6^ao#3EF^7u`Sgz=l#@r^hXDYKVRZ44lB}}Q zF(zZ`7q9zS{npLRjT?MBqFo{XfhrH$2q&ZE@nrn=mHiZMgr7WO2~<3^rjL z>5AU}%MA_jfW3LkwtDZ6zBF1ije#OMs@LFi_Fza;`bx4&)v|12pLD5b(-r`9@7fSJ z@Zm?mVZ6I;>#7{voIky^VVd!>5w>8M7vCRRNEU6r`_VpZ!RYf8eG1MR!+_diM zDLKS4wp1-WRw5Od&bR?XDlwa<9xur(o35BiR@EBcrp?Vw8}GjRK+i{jrwlxI$M%)B z)Wr|K{QKp`37^@0F}2{v-AxmOC7UhL=1so(g+xvrUs~Erl&zSCi<{{6R&+fV?_dWdcsRoz7q4_QiShr(+ z2k&Ya4A3U?Zz~D*+*{M84V1`*XSwIX!1i2>!qJ|>EY8MD6r(gK5>>hJu`l<1NW<~!UsgSpdYzC#L$TY13m}%53pS!IQ9k<0$B-+Dhgj@K;d8L2jD*T znADDA4n7C*FBF(MA-GeXVL8dnZX%2U*q;=?jH8r459lvs7+%4laB|&Y2DBF*&+f)~ z3ds1~{X{0#GXVT00Q{wwi7@>|J=3jeQ9^zPVE+xG@G|BzgUvcJupj5aWJvpoVBDqW zTOlFerkAL&%JdS>gO+8($bfz^LlR#CCthWMd~(@)glySQg?nr-;#g`bh$F!GWx)7N zrWdgQ`-q;W8hL77rh+#51$JgOjsqPLye|kZ;2@TL475)i$Wjcz{&`m6MRpW75bdYK z^}gY1n#c@@R{M)(Hj-mz9IBqb%~(E+WX=-hj>c z@D!u;Do7qhR@rE>oDQiMr;IlJ75)i%k|F7ZBbTsz_W(x!!~_x91lfEPC%4P^^vAT* zK=e39%Jc-k$A7{2lxb2z?$g{1K`_{+W(= zUzsYRf}#g z?AQunMxA8gX?&exH$$%r4TbL#QUTa`{}oTL_=wX3i22cA0 z*$v%gm!x~4MxJCiZsAuG^$dq`#A({&kQKtx3pi(*@d%&)fn1C>piqnXQ6gqscaTA~ zg`K&2CY+0UrTiGiN-7aBNgLBgL}yP0me~O`wPP5a{R5z}-8em-p|f`bd(F_nr^;sg+^>D@x^@1+dh4w}S$TPx&6I{C zOGh}Zo+US0CSG<+Lt{fjeZQa9(*|qP9jg`=TFDuZ*_J7VsmAFH#7xq zo|;CovHW$01ME$T-7spIe{8}q+B z$=*2DW}SZ1*1%hSQ}dSEbZOMsb9$P6mQ1p*+8lhtPa6!^oo6;A_C$MW>P=f3U-O&m zw>G-7|4&Y}H>E5RZr{=2H#ctoUZ!DkLQvUun|r&^ys6!v(h#W2Hzop=onp9RYr~-5 zP``P{Jiv4>entxvyt5D+XILEw#JQLokk{(HBJ6L ztC+cdTdg(i{|}gKSs?|tH^=>U|E7Cym|!}u?%Nkw9k&OLW8@9^Q=0rvGUM`}-F#J6 z{<@|Z`gij}vEct0k1eHUd~a*apXv|(q|o+_yEkvS>no&uUE_dX-qiHV+Zy8jv`sVN#u_3T2(BN;l`%3Zr zUpB=tvE){kuW$7GH+u>*uelS2ZQkl{yv|Y*Xo&gc`fZElG5-`CJMDYT1OC#jwFdVV zf8&ko8vP9$uMp4sB?@S$pIuVl;BRawCf{#vK%>5SVX$GtH^0SrANWPuzl6q?FKO)e zmu_F4@%^AbxNPh-4gUJOuOt`Lqqwb?+OOZzSpNm`O~%27Zx~8^4gO7=FqcZf|1$pz zXl%*w>GSlZbn7aVUlO?ao3}Ok>o=8TU5g5A`k`_1-2s2&hO+Y;n&yj_ZDMWxfu+*7 z(eJOXKjAku`Z8@;ng1sb*0<;f>t|%jqKGf2q}ok!vt%(_3~|wva>~K_Kx507pp+^8 zO&d3%z|Ct$XMG2?@_&0&;m?~I@19Zci|?e)zk}83YMbNMK(F5vTmn1wG&DBF*9>DB z=1eS{pWOlbC-K-OAuU@(bP|pTp|XY8aJ2kLVC;0`Pa977WBv&Z>#oKLqr|iveN_MR zt8Qs*+%SE5U3TRLRzbIg7$#qT#BXW5eGXYrw-}o@qD7|wu`_ibwq!C&*@IbdO<>KR z#UcB49fvI#g%q1fBye2P1!BM_J2O)e>K3HGBe6~5)Ix)VBgq>2p?_`7-^!Bo^Yyc? zt;ew0lLL{@vEcKBT!DKSq(s5+@Sst#Bc)iH79uz);Z-gT`@$rUqYyQNd5|i;3#;jXc zPWw43YV>dWiqUlPTz$LgyNxk_PH^R1=)U^KRbzzVll4<4{J80aUv9X4_1)mRbQ2C* zV5jR#&CZMjeR7B9SQ>`laOjW8`QOR2z4!*fPp^*;I3g%_?S@1V#0bwMuD7p zYXIe7NdT%sZn$F_16*5&0oS8{%7jxbKIf2pi+)JH&4{YS4aEFDBtT#~ zn^n&asMV~m-q5hMnT?9gr5Ak$O>O^X5EI!qCgdANorb0!w-MvVQs1;?DC78tkc2M_H6GxTN-co-P1JXRPc0aM*iA>zhTQ3Z|$;i z2&^9`F?`uDZtgZ&A!Q`%Y*Eu$DF~|zcFFuErdxC&PBa!wDL}myUH&ucMWE?)3BEa-S)i6W(4n`-EC($_}(-r+k$TinT$^j6=V?6 zE*93)kG*F|X+ycOc;lZLQab$I6zeBQ=`=`((S%kRWDLAENSD!qPhk@4h)8J@kkUwO zG5!VRpydYCQMMQ}hH%n`Wx3`xe;#bHKlboSgJtO8`_X1Yj2O`l1Ni<|li6s3mJ_o^ zf=S~OO__q#A{+OZvY?&}_(mVXLF~x;(TJu!zI(7G>*2>A`I=}0OxkXdtXK<0D)Zx* z-9_1uF(OLZFd>T&vo&mro6^ii*(4J-NeU8KwowB}`j3x%L$v3jMQFXrVBT#q8clYS zb)*CD4P#RvDaOZ5{U!=|vtiF%*0&x4^4IcM%hydKCcxpoy5*bn-o=!tb%rfyG{|L8hfkR#-42oM4YbATZ-V z97GZEbHS22V3#t|g^Z`L*n|CsHvkcA9ELo{aZ=!a8ExVt1kIAN((N``JU-%C_34Ev zx}ulTQcYNCFhRdS;ZhXzH2Vy$DD{)fG%|V}JNxA%()pe>N*`O8k;GPF$GA^NYDn`L zkEItTV`{RQWh2hfFrOB4`nuD%%CGn?+&JP<70{;P`w?`;ntCW^GE!#ZdmQi0C3B$b1P`xSitI%yl7Wbzy z%sGSC%$hZ-+%dB>cWip93_uUYo7M0Jpgk7ThyZ3{kB}V92l&p3(VU@-pEI3dhXy{Ola>4LRqHh+Y24#8i9A1tVaW3pN)nt;m`^AwOT8 z=}=Wi#f+kHiuO>PyI^A}E)vywTu=s?MmWm{~S{Vx|FF!ibf4$t;X? zq`WxIZ0aUC0yCWr=Jf2b6HCzu$IRJzqekVhnbMlSed7#+{JXO{QGWlp1uN~NW~C1h zL-wfLSu-7RHKn}5Q94n{N@aWau!1S2oB^{eWW7%^tr!=QbyQJtxuc@IV&PZ%i;)sA{ z$#j5Z;X6veWfkS>jG5;t8Ch5X#}UWbnLoJi`?6`_=fag2SyvPqr=Op3gydvp z6r4A+f)zib4EtSDbSuUV1P_kpKK=A~Y3dXq?GTEFrj@K&lT^oy87O+r#Iy{#7rjzq z$-3!R^0k@P&pA21px~-9QaE?K@nbSd%t#x1-pm=SMM`!?3cLpEA$VOj9L_!B zq47q;VUlUV5yM$99;eSJSIcM4F0!Wry`*#slN?j1}KJ&!Eg02attP zPP0##Gqara{EUj}C6lwWML|fnA#@>TiX$EtkM>^m-_)MuoPR-YzK;umz$@TPRvOcv6=`d zfh>LwJlP~4C1!IbR6<_1E}R-SU|!@*5yFYL>lxVph8H?fRRq&L?wDKL&m=8GE(w+H8Y@-6$1>uOUP# zS{&sAs#rcN8wQ8b46+6>^`FBdpMYhBBQN0EO`Z``B?m+ZkR2hnbf#L7Wl3GOq49^8 zW|%&6`nz@9mA)U3G1$hT_7&rVS6~2H(IsMeX)2;a##ESq2u&k}|9t=Yb^cZ3APSjkc}x{b$3M#qUyMm}`rx^T z93O-8itrsG8qdS@HRY8+l4n$4|7wa^{rau9-14)Z|NOSEUp8xy7>k&Q&zSfOv#t-r z#%6%ubB{L$_Qhg<9_T$|LHP`|d@PVx20OG&5ef$6DCgW_jcwNF;ffgwiqshv5m;l( z)ESeW#(bAQru%;lHD+Kv;|t^jkqRqp3}~D`v5g4n02BSMVa93MF95?Q6o`NsPiSMP z+Khh*X559W8Gv$vR*C@5mr76LYWzQqGtSA^X%xx8AW6A!i9|7#8MJ2$G-jYY)FBNR zCPB8L4yhTy;+_T0_)VmjSYBd+nPScpo2SsT@+CK&uzk)hu>ltMj zge2!VM5`IT*z`FEi34BU0X1Hj{xX26LXHG@vGhDHL}*%YYvcpOPvVQSQ&}!C+bSU2 z_!o&d#*BPWOP`M~CgOfpSh@l5;xYh-jbA|0?!rE9RaAkTn0`a5l$>j$zth^Z=v@`13W%} z!3+zE2*8nx>GJ2Ji2bV%+CPW%W&DJ9@Bjql(XlK3@J&*^41w3#6$$%cS6RSEMGo6TR|9&j5)bXtnjU?GXaPN z31TLU&wfiUFP-HZ1?v;*h~nQqA3BU!>$t49_2TTPCPYILZ5CngnLxu-Ce!rfqfD$- z5Jp3$`N=b2h7GCd?=aG42DlYcq1VN9`(GIf_)MVTtc-VAh72RikcO=Z3!`Wg*P$?2%ByJJ1BKs#W~p;cl~4qq&ppv|+w_z5OF9NoOE)79>O)a36st z84I{)&)p>MBP83XO@t)}oaVVS3lm9;n;Rr?EJ#GhC7FTDS%9^bbIpXrNi5e}iBjE( znP+%7F1doT+(+O(0{0QPk3hfzKG$*jP5?y7!yV>$qZ!90**CGgbeU?1eiuV9G7e?NX$ILQ47fx zl;u7G_Yt^{zkZUw1LNc50LBoo5cgau`}kHCEd?jt0? zHsn46n3{A3GIx^_vZ|P5267@4Vv@0d`v}}e;66gKdG?7>T--ilaPQnUq?s?TN7q&a36vD2#J^ylg>cq zii_`APJ|3_9|030_Ysnf1$-TWyGh(fNVZX%2uqIdN8o#w6SGT^`v`m;fn$x55pI>3 zd4@+MlPf68eFW|!a36vD2rRzC*AX}i5@8i^AA$P_+(+O(!qCzTUq?tbYlHg;+(+O( zLb8q8L|Ag%N8sxSd>sM0@Z3Z38O?+t1QQdLJ@-sVI-m__0pGLCzYh<+#eD?M0`4Pl zAAzqUU=$?Tmk$%8yAxp~Cz*lFS-|%rBtiy~&P_^8EGjWxZ6Z31>n#@BNX$ILQ47h1 zTHvELxe$Vh(cOI1CfBG)(lFZ!TLG%QyCvhJELyKdLl8pt4nP<4QkzCdW z_Yt^{z_CVr9f4zw65<~)w~PA-m}I!Mkz6cDOe~698_8vD@KKvwqc$<|9X@K4Yt$x2 zcXQ7^xjg&C=x)A_kPttC`v}}e;Ohu{9f28eNw$=dn0ba<8_8vDa36vD2z(uZuOskv zgoOA9d>sJ`DM@D_Cng-1R0daKVo}`MNG@w5sYI5K+5~|l`KV2x_vvNllLlz+#cn+gBn9N-+_9N-*CRu1sF zD_MJv*PC;IbAWT;-4BXA!fG3Rz9*-=*9 zN8mmJ_Yt^{kaTD8B}Q>^AA$P_iIA+M`y>W;llU&2M92W&g~NB@Fy}kT+@!?BqPVq@ zT-F8;$0aBnmx!4rVM{4|)F#)cO^ohNDv{-iD?y5juOskv1ip@tu&Fkw^j2c#8E$PP zm$i{pBAbX%XOemLiD3aBwaGPV6QjGikB|`HWs;d2+(+O(0{0P;Y|ti1bth(?;nqfS zSsUC(NKiN~L8F%Y2plAtD3D}Qi7Z!K2~u3#N8mmJ_Yt^{K)?d-BXAZVZkCYH8MihP z!q$W-F7DYUmuH_C-OWdBa*f)==x**Ka36vD2nm~N6EkQNq`DI`&v0uaxvY((64}HA z(K!o}OJup?N>FekK@$xhwMli1BKHxvkHCEd?j!JZ1d?3}n8P!p}ZUgbXBIM3VamNwxTw2$@A}gM0Rz1$;k3vU&E2(cRp$=fRCcNEY`I z_&UNMU$Rd^79>I&@O6Y_vo^Sozlt8{9|WJ_7dR!$K=}m$VY8*joQR4 zfbvnBT%$HIx|^>f@O6YlNETm5;OhuU7(`FZRGU-=S0c0lUq?u`h-6ZUEFZO)Y|b@8 zkS&06AAz%guOskv1ip@N&eiKlbeFT245kJ?6D=zLMz%Jmy4X}W( zBXAZZ!YbhF2z(uZuOsmN2t)2NpK6oM+Tfmja(VWA9f5oHG(jxjJ_7dSK5fT8X98>!fkP1w|Ut^?^wHr1Z%<}-Q;V*y`B;Ohv9m=Y5xvRrW`NO$ufdIHvy zxQ_rkBgud^iBO11#sa>Mz}+N5U>l|UJO12E_z&j*=K$vb=RmS@fX`jY+H<_#oCBN# zoCE*99N=@;zi;33mU9kp4sZ@6D+lzsD~qHPJATqgsvbXN*X$>C_&>X1KPR6L{Y}yD zKkv6yr)DEIV%2}l_S`ty{eL>i!d;q9 znY|w>V<@E!b!61+pmy>q1L<=}E`CPg|7iVh4xVHW|73!CI?7-*NX2iKHjj)MZhzJ= zJx1*$MfNuv)JBs6q(8|yoqtafqI^tA@iXKYd74lqK9>w0rqceUON*b!qvuFmAOKq#JyU3a=J_h`YDh z-EMYw0C(@OyB3!6Anx8}cYmOyZs>+A|2-AHx%3d;bfMtiQQ^_z9^AZ#n+K^7Ek2B! zC~khs-h4E4v-W-}94!7AH{EE|PDZ*HH}50aufPX({Q<7;qr#@8M}}^`7h=SY;^srV zxrdThhp*S(!&3F(#R0HkJ0pAyHwTewD{47>J$EZwv-CJ#9KwqrOLb!CX8C5MV%I%* z(aZ|zAG(>_#OgJGo5Oh1h~UgPOX(ivlY2qgvu^0!F^Kdlzhu{Sq>l*8zjX(@ z-p{K3z#a5B@DN9l;sGDKEFNO*=~sP3RMvhp^d7{PZ~Y}px)jw?9+ZB9IRcBzen(3)zAgm!;qjr(`Xw9OLs#!XCvF~M5C-|&W_Gz016feM*Tk-i**KotICS|T9xrbgx;}vG zwe`5B7@bg!{^8!kP+h)hxSKIL=WZOnW&`qW2!*s?A23k6b7N4w>=CJpqesyv>(~vX z>^Sn>e%du8u`Z@3`e+>;5=+)KSAI-s`DXS2GTTSUo{y>uX1Fzum73KYetk$1m zoH1c|C8v*)E6^k5d$zGbxxb(2-M;Dwi0IGzwhs?hCI}CFM8(yNicsFSgX*K1b?%-+ zROr*6?t$)O!yW7Cdk#=xH6DuPtNTKz#&ImK3d@}zqP*jHctsx+E3^eg{;eP2A=+8K zdMBP8V_=teKA^(Ba>#r6Z-#V_NY>^cSs%pkir-SPj%g{#(fi2R%W^(2ti`%nsUPFX z;az$^K%*lG6lVGFbPntH$BFd6u(CfreaaZo*s~lV$RvG zYhzaIA<_a0OoOAYua-kl_B?_N>;aMJZ3Ad&LEeLbwxFfXjeM7Ok< zO%i|!lnZ^Y9--o+edU-+${z<2HpdL$g?Pp4)iFv}$I2nj<*Wb1G&q}#Fvnl9`Y((! zo4}rD@18_9HqSi=24RZcug{I_=0zGWhUD!>d2A}hqw*J#md)V9*Gq@4LF6TL6ua4n zd@r#%iB0Xe(Q^!452eyyJgcW7b?gPM%aMC0yM6}G_p^zM*#gh7%I!yi?B;2t!nJNB zw4n{J9-z|F;-z(mho3!#XVHVyu#^xyh0&v@{2NI09ny!7gvUFN4nN<^NcZ5TpU`5u zRH!>Rz!<~|YGtn&)uZHuUe_n_;EIp%U?1N8g|V*}bz(P9FlpQan)=r~lTuPbX5zPs-*fOYn>cXg(4Us!?}fxkD)DoHo@y>}k&DPYJZBW4?V zg?c(h?OaK=Z{LUG+ubGVw zYxqejb*H7}#uTy0=^RWWk!LWyJWXkLyhB>+4Yb9(E->j|9)r zc(=TFRiLf+C>46U2EvAb7cV0(;oS?=(A}}d8|Z>qb@hkkUEZr&TVKYD7pb^+RR>f+ zZ`<*(=v@=(z{CAi?7p+(FdlZq+de{SH^{t-7wvd)Z`;RI=xU3GCD4exj;9?|==L6^ zVpj(elU>KXBrphCDSU=7 zqHcX*+3R+?eEpg=pKEaiCssLq(-d`9oLM0w^LPGBX8sNYgE`9 zh*E+=&^m`Z)Tc>4^}*J6@a}b%HBQC0s!9-OJA$e^-N8YPw#GEE`oY$Bk>(9*=?GBj zb$a)y9S11w{TQhn?v}V_ZSCoawrZOH$_FFwA!P)-Ttz!-9>Of7c6>}Fw7cy98eHUI ziKCSEv?KLxkthBWvE`}&a_Rz%0gAnkNu zp7!@>BmzTByDjnoQoRN4-iicHjO~uY;rK2vu&6qS(pzIu8i}`pY81)aS4KWW^0!&? z0V;1_MX6J-^Wm@@@K!Qr2$7zCD)mI$BPXaBSs6Ki^zRI%H>%ZD$j}Q#({&g)5j2d}6`qBSw zOl%a@9Xza&c1+-&NDtD!hqSApMVFyzvJ+{Mk#s>o0#2pw0GNo%_qZd6ku-{=Hz4UM zUrdu-y)@v3wZVGG>vTF$nGb1pE2bG*Jso-;p$j5_swgh^ z0NM*?Um5urX)%-UZA0P}Ata9a1GK9O_3nbS8g_Y|s=KZqso$Yu>ur%g(}9ncGlLE=f7lv;BJg?KZjaLkL4L^nCgb)oK{!Z9NX^kgx6=Kz&6> z!+lzG3GJ<<9UWa=y_7lk%cVl3%-_O^q3#HndL$EfV?fHb1BdOKoa z!Mp4uDtJRk9rZuRQbXFiSD}QRby}p48bV&$QPm6CZ5s>=ZZA~#oSuUq9gX&ay>4(t z&(eXCvRC+9DUG)J{dI0tQJt!zmwI(s9taCnK4cAe4p2D?#zc=&sU13G0J-tJd)09| zdYKmWyQ=Gg!AKNZ(W$O@fXFHxTGhdq5&O$VeQgQfufz=mAE8K#7Ul z)gbyf>RGYxD7Eif=5VVK8rivO$*NV`PejbxcJB(O)6){gMAtgN)DL5+=4y?^Kmttc z4uIscpa$U*TU^>mZc5rnw%(;9{kb8;(KiLbXI_v^ww%l^$AB*8@T9 zX+>f*N^WKJSz64g-5L_Bam-4>vVE_yp&a+doQ4`NX8bM`8mLBpkjQc5j8PLNB*)4K z)w2@lM&gQVqGv_qO={~3xE+ofy;>PMMlI+^r-J-ZND#Qu1+NCHVSP@ZVatGY#8VZfkjeKNZJB10<*3lKiq~)#F zpuw0RqC}<%jri+#R;s#$vu<+-$b&$!Z*|!k|aTu+sNEMKfv?#a*c`gXt6wgGSpD{yd3st=%_xlyYElm<~4mka-J$k3K>Umk|aZGD9VXq^EAyh-d!b+&8;mpR~aJY-I z+?F2A<8-JkkO~+Fksb&S=wRY@gu_)XHNXSn8l|KeB_*epekj ztCg8($c+JvX;}?~0}eJ3yCrXU*Mma^BfEqV*AbznFvJ}*Nf6!53Tr`c;V*54Y@q>| zsH@#jc1-+bCu%W6>jTtLX(i_0mv4r?{UUaSqL-<%9Y5E zcdWt41Y^)t{ zfLdMas`-E#*@arw8>g14V7tp5?(kMa?4Zyzu|=sp0&NIWxkd4!CY5yqn!yc9k@2$0 zqk52vA*BPZK+gb8b+^Gl2~pbacJ8888ibBXPzy$D4}{K%iP7o9APTubZ)GG7GIDo- zR<&W$>u^F9h#_ZNl&1Qmj?iIE^ecgQSls3CqsuhbWdWU%q1#JU zwF@l__>NJrRrS74&8-ef-7Vl4#*j1Y^@9``3{tz?Zb)a#2}aJ#CVm&BMl0F{HVso- zOI;y1s5#qV5J%LS-VcY!RYi4jCcheRvA$sB9AU4sAN{7b;I~c?_48pUYA)23tchd9 zA}p&!T^%r~+MGwACftrTO#iHcPR4H(A9N^M55+)|J#;34O()98ao0?lzP0!;c!85n`7jbMWnQ&8#7?Hw+fYUdzq=_gw@a!g8?AHpjv`R6nIzL0?CMg4+alL ztQ*2Ft2F@yPf=ZWe^{)kWn`-u*;YnY?6{xNz1IX@&G8A)-1 zq^=pZ+Jk{e?0!L_S)Y0Zbr&B0GkK%QLY!OEME)^B8c0jhBbvoG^koBq*^9Kfz z=+^0WucJLdRdHb?M<8ZYsL>8W4yx6c$id5evCD|4lonL)a`*_yA&uuBRET`lTr37LG2n)_9!k*Yp1QC?DmGeb)f94 z(NzQlv_)~_(hIid!Q)CC7uWz0f{wv3b%UPj9t@i>1!$U2@q*qi)z8#tO$341ZWrjWj&DB< zvQVy0kOMbEYE<=Lc6WhIf)@ix@PLZZ3kxyG2CC7Cfm*AR3%fmxoL488TMNITr&iTI zVx6NnU_6;LMbWDLZuJK^4U_Y_mg(fs&hGo`LhyK{h}#V( zmT8Irs^?OwgYI_4kLvlWkaU-W%`QdoLJTmsv^oqTqg&Nrs0Ps5@Ggf#rw0YRH`oJp zq^WKX6eukD2S5$>U!B_Su14+Ls1pG(OrMCLc|pQe1zJpbxEL)O7M)Dd3*J_^Gw2GY zbt9zbBWj2QJ*pp1#mEERI6Rp)jGyYbBKm@ia1iu#!Y;5*C#-tmtD{R!()BWpPe8!3 zx4pe?-QMmF1yWNG^{FmT5aZB;M*Fmo-|xmBkD}DJs(l!aASXEdkdzi>*8l=Fs^+Ua z9+oRTn$yw8>N`vq_Gic5O-$#p9*1`x@y9$uNP{Xs6_i?9>u1IWeu<$XP!g&@6!Z9r zu%v2kM$%oUIi07FT!|UBdvEt3ey?M`N$tB7Q<&QWg(kS%F^xh!3T{Tl=|#{H%v8M~ z<5e_gO)`8E}UYArIWOz=a_UHxH$8w1bhIF34?QpgM$R)#V= z^~}uXZGpA!d<&iFcIg8KGm=otn9DM|+-QJTtwkou0lC!+KAD%SgX86Fe}`ru@Z@m? zHBXfzsQKA^+l2uGRprAJ)rLvQtE$K4!BTc2NWZOm2^-3PwF;;Si+~I-(8rl-$FldO>QXK4zfVq0w20Kn$rN&AMDw1FYRE_S_N`1bfC5(h#daRQV)_|+16ms+71 zoQgBNOR0sfCT($w3B{>EWiz)zyVk3~(P+GQ|Ay}4NJ&xKk@ zYu8XUEI`#bna1yMouFCKYDX`YEYw=JsybOTkM{QVv7yRz4S2^!DhQ*kjIhwrf+$%u zSbdEHV1ryN;0RH$E~Uj8_6BHMjl&yuhhS0lR2RT%(b@-LQ-^%jio@FlU5$Q(tIddl z8H^}%i*=$fb~G2OW|{`iA;P>lHz-07+bSJS$Zk(HDX7*k5k(_DC&K$|yn+@Ry;zsP zY_jXY7$enPcNFf1-w6Pr2b9`D3HG*|ExC9-2+jHk@f=2BDr5#73+>8;lwjyG9|O)l zCV{<}R}evKadviAgGMW8R0noBm}3+0L2e@|sb(uWeg|k^Pz}}N1f$@H#9*+Kb?E0F z7Dwu&H!}1=4?KDY7Rw-2*Z3hUJ?$P+5J3pBRe}1T=({*X6*AqsMkjzZJQxR2EHI(R zJQ}5)K~Q0A!Hn-@N)&EY)PR?2fg1s$9tG-y=^`cq;V@*0HHJk}>>ULJobv=}L~C(( zqKM8L5qw8|5P++JI=v={YYz8H8{*aD}d$ zZ(^2wONdoc?7Tb*q3MZ6kjdEMQ^Q#HU|Pe=^d9ss!~oGxwGFFSbPbaLW^5vQ>vCU? z>{92Ael6Y(J4H)(D_&?zC-h{Mv(Dr6q7%gqM+9-QS>A{)KbS*6qhdm4o;_a3-KTA2t5d$Cvm5!HMe^gyR} zxu;)C3)ML>x|ume0}gL>T}&~wwikJot7F#*j#l{TSV}-804InXXFTtQX)j0BkY9uE z)frONm>a==#egt7BCZgk8pS`T7}O{e95h;U!bCHUybsi&^) za+u0=*p_FlpSN1E#R?TQjH_8JVC1brBi()buTE-C4+CiWl-2y~d=l78X ze*b0iE>W#oyhVtoju>8GYuwppB+)41wqTNzk!)OE|OfL}(3@M_yJJIKziUWEXL9t;HD3n>4RDwH#abkNQ z=vz_b^0(Bv9FPs615s5FfUwI5@h}QtKkm#yH)xA)G&>aH8Zy?d)z^E5`9*74C zJVXL}MC@RS02H8XV4G@}gMy*c7aFQX?=>+cy{gi?3!%+`qG3+N@()I>6!BG~jRZ0w zcCbh|;{)VdpKZyFSkvls_aIn?p^$xzqK4q-VO|O-b#P6ij6{sudNhZkdicLhEMO9;Khkz!;(NEeTiq6yE%%eew8Y_Oy6NiW>u68UVw`)GO(vV&}sKGin;_bC+wMPRP1m9i09vX4F{3oas z4JmD~!a6R)utDQG-3K-JAqQ!Cr;k$Rw>oMZ)$op;=uA5n3lMPDJWh@Jlpr*by9(wO zTEy0GW!iapUGO7Kgpxi$EtvbU3aa^hEpT`NB8Y2t3~NN}>Vm4T=Q=fn$cUzNUYC9CD-vJn6 z;6cPd7>-9mn9qe^q`%gUG_j!QQGA0zafKQ|F;S%rwGOP&!3WRNl+FB2&1}=kwWZ)q|bHuMUqEz1sMUA^?oyn=-4*opW2||kEZo?>) zIsg%3=#1y6Rjc0j0Ny)_Y7t#FsVKtX)S!@rh!T&G2V-jx;$(1==cu{UNqZh}U|IIK zhB%e)YNbVM$2{iJkvq>(6W#}vU=NK)g-AQ%wvgCbtW#kT7fbvM-SZq{)OBoDBJCKo zK}A7SfdKA7_1F7YS7{hL(Lqggqm3GgAn%nChW^!^(&x!tsJjkd%%lf_tuh|lj=+Z$b5yWH3ZS3tc z$m_vPyZ+7(RoROEgWtxWM$aH?2%^EP4OZJhyk&K$)89Ug>bkIWjF*V*{Xh2JKQ^u_ zyYsxSs>mu)wwqCPniSbdr9&mpNhSS8VYez7DXxxRi?uD8%Uww|!m7w6Mj}DD%LEY< z1!soXunm&h4BRs`K)}_22{35=K>;3uS!)R)aZf5elMOu~AjRpnXv;rJ@()qg50`%P zN0IgRbMC9+FOib$?9N{XLGrzK?>+a|x#ymH&-dKRE*z0qDx!FeYM>I%37HNFFTezo z*~!0ZrNJf<>WhltHH}Bf@`Z zrEiQ@9sH)04>8V^m6=3$$~u!<{wfh`>g`Rp{*^A{q{QeIYe8mY@~$(l+v^|bBlh@a zFq3C9>B+Oy^zWUr%qTi4OEDiS_Q9-t{BKUh`Ako5W^x*M0=1x39>6^5G2`j+xO5lLC%=C?fG+sh!H?R}hKeO%aLT zQQszPr}{&%dxGv0MB*MLXv0R3e&6H!clg;2u5T|tHW<4^(2X(~0oAR``5LxY=vsGddTFu!KBGJB`@^-ejx7=;??hP*^ z5-r=_+qgG6DYl05LgG4QyVvO09!n63Wr9cyTLqiJTtXx!t`OyJqtA|Rh)7J#q!gJ@ z-tc{h#6%(GiAU-o5Whpwfu=2@S~1#JArcd*lx-dEvs$jDoX%Us3U7u;Y)!R9y9*}` ztL0Y8OTFXQsPJZp#Q)f7H!Yp?q{A)JF)cZ&sOs~U6H-ychOyZut{7EBa%~AVXl*0-$*Qf6XCH5?w^c+uF^F+JRSlCM|J_MH7 zlRxQ8Hl!w0P2KbuzvvebaJJ_^2hm(D=249eD^SQQEL8#+sG#*ewewqa`k! zvmq$4iT1P6NpvoWMamA3B&>})|pD!1-FZA%L+dTlz7tUiJ?VI_O|FW zMmtPEQ8of4_CkL@vk;)fM5;YPx!YmbG8%G2P~u^tCp%nFVl0&k&r1Ax8TxxR1ttFJ z!bxM#C^LFiK#BAL0z<`@sBwJ>l(_#`q0dOJ1tkuVRbLayG$^q>WhZoIOTuxi$pn>63f%jq_M3S z^Kb9r!!ON}(OOVq_rghEYi|*hNK-7OROdotMFLqc*ejsK*1IQ-?zN!AKb=46jZikR z=*3gfmQ+fTAf&ANsBMR0FWqI_u0tjEkxzG55tS(QNu_Q#dJr*W)?d_eZ6l^RlSKl{x(nudKAQ;x66JH{mp=icMC$`YqutI0c62fEt zq?69440|0wv5D_ph6_-n$s(QbaeT4Sun*JU>ErXMO;CzM^C!Q)e;rCO+?ld9bLSh4 zNGqM1K0cQ+5-d75geo@8ovgOkK^6DEntpY^6|?s)Qsn$eb^IPh-W09aJ%6&SZw0Nm z2cGbE?TOfpjkdjb(wlBi#PZQHJCSJF6t37achZwA!WH-T-97nupB=WXp_4;hO?#S} zlJi4>p5)>E4~8oqn>*>XOK`=W8z;;6TgU7@$(M2`%X^OPe;{0ugmiO(WkGM#^^=}H zsX{)TKVC>XCw)DK9{^i?cJ|~lZ1LD781DG-&r{{c)9LO#55O<>kjj$n0mJUQEFGjr zW5Hgsw!*rJczY^!Jh2|c7;etW_5s@JJNHhqz|VMk_YYmwSD-k&xYv6sIAk0Zait!CvQ>Ciz#1={a}P+!bLbXkxgII?UO2fS#*Z>_Jx$M zGw~plW5O<>97(JCNP7HI3e_s!!akQ5ts;YsWj)f-s<-qKNBY)Il#q^HpONn;2+<|m zNbD^%`ddT>*}XHYGB-dw+AC0_K1d;Q zdtKloOwwX^!Py%CAML&24puq6B)5ye$JT44|1jmWcxizV7yM`^028ncLaTutWYG&X zS@R7>8}0Dud`3l`Mx&W6A2C3;Ue^UE?`&*j8iaxdK!!H}K!zI|BQa9%A+=ph-ItSj zq9xJ!VXDyRMY2B#0-0z`gu50pKp^eLy+sIQA95+3V&Vz6WK;e|1_)Ev2&|BmJ#1z( z{;x(siV!WLAbC8LbpeTeH{pmyS}`2IkP1XX^g_Jdnp|WddoAN4A*}+XZemS1;;V-S zVN(0PJIp`ocs}KAiH18b(~hchDYb=tjC#8<9^U{DNeL4!9+HP1mr8P0Q&~V%2r4pq zB~>mDR;06#+7ba3X*agm8=@j@N>$$_s7UDASr^X893_RCP5JF6x^55Nk(QgNzjss znDma23^&?QV2vfTBt$9aAmc9+qs*#DqZ@ltpe0+F+2T=+mJG*dQ}i->wiGlfeISU* za41tmOj?Zza}{FJ7WIco62v4;shTy-6YU@-Bha*qh)KH>jr6ZwqAjfu&8|UBT1-G} zjI5w0?R=v*jG_r@5~|)PH4@ZhLQs=7YLcKPw`M_2hND&!V)kPp9i_*mHCF>Cpirej8QwaXUTDB%T?$} z8T1SipA}6M(UbNM9So&($bxi2gDCgVjXfKHDBBllZ$Om3T#6n=9cx4$^@G(5O3APSOy$?2k}U+ezayAz1GN}eCZKs zScFt2>=AJ18dBMrO6Q&Ob)ZUVSr=5fmy~uF8;u>7jJ~Lw0aWc)O|==S%b?1zfGYh0 zszfBFF|M!1Rf=$y@nMXFg;FatEk?ATxkP}KHZ=EIX_36q>_)&!i`Dr_oG)nEWpE`; zX4nii6oSRZavPm>L`Ge?#dz+}BpdBsA!%!p>%f)ac1Zp;aN|s91z?G^LL5ReRw6kV zNTL*0l*R-)-+dxEF+X)Z&;=&6D7I~O)t~MAS<^m0a+%fdE?%2SQitk z!g`Qp&tj_LuN^k|S8$dTO+nA-wb&OFDzS(rCpb&UIgK7Gq$|Qwcr%>kPwWCqusCNn zG!;T6oF()$;TWx`30pSX4;p9b(zS)VzBtYjaz+@l1FXL{&(0I}-}<>mA87Sxm`y^4 ztV{O`;VhwKL?CJmB3J}xDI{%hmewkg&DzR-c~P6bH^5mkau(=uArs}vM{8QP&;e)} zz1IjggzKsCq0NAn*4_nLiXD-`@EnC0HTRMjo({Q*EuDB%pry2~B#!aGT+u-yZx|ld z8JE)D544Pg1!&21-Od0)hz&CL#Pw`rk<=TGhNyzkBBe*DQhHH@M(+b!+K@prL*W!M ztr-^RarR{dT?wDcb^}&QO{$&!WTCPN(9&W~O^fJkPqC-rw|jddjg2iS+2RS+Guq>n zQ>aR*+B+fDygAU)hL*@#hYg>l#(+I&A@Dm>EwTv>YLjZoq6uQNjYcPXBJ4J90<^Rm z_l7!<;woN9G2!4fuc=ZNj~%9h9#%Vi*QCg;-KDe+Xo>I+S)#%qEVjg%dctAa9g391 zisYr3?V1RpmgkfZSp&4BeG_3iVJTH6+x#J_rdkj@aXr&8Fm&PgF6oUF+o5ZLmf(EZ zPhFJs?aZk%uB9yeGE=$zB-D@|^)#;sz1B$4iHN*4KucX}XvddWr#3cPP+g=|6tYbh zhe{}hxTJUJIFfGww50y+6oSkY`%w-lc#1Ek?zu%`m)%XT=q)I$1zINJtgqT(HfaEK zlSU#Dk;IFs<%D#OacD!JrJbVI5QSrfq6{P9 zQkS0YcJvbgTK;J|wFYPzPSi&doqBIH6^Pri=L0qN75JN?whJyT_;f8ToR}`Z*(Gbp zwLnXoFOhJfb2hcb258A^dn4NvWpRe4t}idbyha?ZWiU`(%~fpSVB^0$Hl&xO_W>=L z;e73}aFn`Lv|Acz*^-L4%u{JEMeZy#qJYboXcuNK2vxp$nq8pfUqCgy0<;Y0VMp7t z84;d#YlN)_mQ&E8LE%(-BkmHTXW3=eBU$ocm&iexds7#28EBc9Pcf%P6Sg(7=&;_J zO*s(p!0uv9VYAgG!kSb_YlR$J{yRM<3n_0ryb5U@7q0X?3vu;JVNUxFZw4LwFS>(suMrB*$09x6Jf?o1)wghGfh^+1zUzi!swAB zea?Dx@*!Z$utjHVNrda!^Nu6X1Z)|(1CcwDJeGYZ*wTtJvM9Qd&|u5xrIaVt+4DfK zrQK}idJsY_VnEF&{a1+JxKEzUAY0*07HYU&{( z2ttCh#D$r2@4^~oSx*IMhx<{MVM*QDNGlXm`&uH{kTE%BTDL7IZ&?Xr85If%WC2he z#={E6GK@Gj;-&0m^H(sI9$AT~K$(lL48sma3%j%=hQC+iD|Pbr2t^i^6mem&VMp@Q z;kydRLHtuHCu5$Jt?O`=I%#KYDfG2Sy}dV%?L3rW2Fzr_9B@XB6rJyBkq!2ZF_mFB zJ{WT`l}ta05~eb|ptfMG)qu)y%Vk}F2LLLi7;HEf0hM75sPq7+%&V>86*Oh!a!U0) z6itbJ^zpUdDM2&??m(9cZ!M_8HjlD6Db%yo#ZlHXw|Ejy zBl}z&Ww@}F7B6#Altxq^2nzQJh!TYuaob||WL*%Y%H)+dTtrZAh40oND0=`Jxd=+* zJiWl0xQL)sTkk_qT9kfdHG(qS0We}6f^z#;2uk|sD+J|c2+D8jlL)`2PxJm&PACj< zI(HTSe~X{r2`|nV`-=x&v;H<^prG&plslG#*!o2-1F$BB0 zoBX~@nmrofxtp&$`S!<@N6vEm6J62>rQF5$KjM8a$j;q-l@k9p6wQADf^z+tj-F@z z!3E_63x228_r2#C&lQo9 z#^rziuJYEA!Uaegmw)oMj=l_y^j}nSeicN5`G2qsiS&P@JVAj%md7}pv8v85Vt*M5 zNfMvGu4?&U#vl>=D=^652Ly*Ugg^!G|WR#jX%uCeNpDPs*jW}=&yayIg3Osvzl-? ztI8@*-G)#`qLhaRGj%wnaqfF?$-h*$A&&9bV%#6W+z_Izuc)t)F;iS?@8*XpO7qw; z?673-zp6WYgX0v#v`m;D^F@gj{9Jj1RrjM7)#U|ZY0x4?^nb3({Z&=L2LTr2#{QTF zEK2+!SplYhj7eg?L$*eRTJ%#30qY zr98DoNMe0-KF*&{7xuRs#%Zu5??BX%F)i1mqCGFS^oj4i}{5v)qA3%xPwd>5G$ zC_xb;cjHEEEfleJK3;?(db=2Ech#0)sH!&PuM3%pyK&F1btuGxkVj*cvk`rxQhX{L zWG_GN+qGQ<+-@GUPBOlGdpNaD(bI2IL9#E&QaRyV226l9*Y)Xhr&}F$?gx& z$DLg)Z~UVlfNxtl6Or#;%qL>k8ude&)7tCm>AYRrIrV$vGZBx?$G={`4s9s%$Irpm zwGsMh*LIFN5B6??Gz`zhtHSG$hV|AitG>$gO92@VYCETW`!_`z#^&Q?2Un1WJLqb^ zy`z@m`@@TI?=BTISs40*LA5E;@P~78Pqc_MtUq`+{`kRgu+BObKW2w_0HB*c7T6!H zuYWMoa5tTTF=Ylb)9Kj$8}agbYj=1@G?9y!@84bjK%^lFOGv};^|!K6qKWhqa!6smdGj`9l;X7Fmf*r zz;MS6DZmv~=C8#keA9Cine1J7;r@GZffq`mPnmJ59sn;4`E?rLg>j=cdW%wCU`l>4 zx-jUX3&Z4cFnl|%b}`KdAA~9l)|F6&q)`V+vi)5o!iHeNs#?KKOwLFr)&)yoLi;na z`Iz=oK~CHEZw4atuYd?^5e#fmiBvSUoVW@5eL5S1Q za~eU|Dg-X5twCC!Eg+6fto5@3+_4#eaEGdj34qY=Q6Ype0K&*sD4@gzt9o4kVJ&s5 z+XO&JB|Csi^pf0P1Q159k^VeY8gapcb-}8Q!Gj^>Cm<0O!e#0Q>}`lqHFBNA@3@II zZjjCba0-58)xn7}oyJJGgM@X(ga>m-CuF;%eGp`j$sp)L1{qdG$l$>n@v>d;c^#@F zN{VbTY>pRXa`PAQf;@hY4IL@>!JBmYBEt?281#lu_tn1bKMQO&pyqCN2vKMli&flLxDINo}bGA}9sj5F#jf z)PjC0Yn7>mjWFHtc};DWxyFSE2Cu;aE<_MF{w=iv5fqZGt098yC_v0_2}Y3i48o~G z%wO2fJrMpTtVW|Du432)L{POBR0ULk2v*U58G)y*f(TYglMOPQM(d#X12*_Lxa)FI z)!tO>fnqfpt>T)8UkE->CL^H()tNsZ?V23>fd5DTUS9Vq=5EE4l8%VORSy5K-Rba&-A z7jKf*tUIlteBP+?ub=}}T`SD$q5~O=6i+Cc%M{BlKdWM+b*Kkbatv733URND#v2Nw z&uEH(1B1)pz@YL+SAhfl?9c`W5ki?*kb7^Q6C9uKSp_zbOFW`re`Z>PO#0h%oEjsA zj7rlBGBCJ|46I^aUxf@5ihiawkby9Z`hi9U{sfArYf(h}AOpQP7W=tqB_-%RXi7I^ z*8l_Q>k*Q1QGxW_q@V(WY6TVOkIrTcQ#eUxw+FoBx(eVD+YrmQi6LAC3COrVSzh_}k% ztrOzukUZA*>c^^C<*gbSlrPVT^ebWlgZ^bqAPjduCQvul=mL$&V5{o_FV#^c!!GL5 zhbTwB$wcx4h%Q3{gUgUWx_;L>NTA4K85zb1`zc0UD>SXTMP^wS638OLtE{w0+E8{Q zNFYKEJd1AFWk?_`X80LqMlY1g{pgq@A;w#I6(hMLq)FEG3Q4~vxe5{pWIF_}snj|| zpj6x+gJKLZqbUxCf>5l}h(JxzuT9|ojS+z*nyV3kwTtjS+Z=wXiJ$j*f7aNL-*uXsvz2m z`rgK1K&E_Jr%tedqDg}VoTYL=0o|lkI_aiRKxtV?8>^%Ieyf8--XOfIvn{1vh5|m0 zU#&iKu{J1BK&dM*z^XY(YLUhpj24s1x=wvhw44$E@QLM<7X2iSNd@Zw|M8!OXRCrE zkR&ZKh-8}}{+NJA(jrOfdV85;Nyv7Ax2}}%2b<&j>PXotqo!`qf{CQB@3I{y8I$8C zP(G&6P)99S)m2Gj8g=YrtWL5HvxjgERS74tO=DEm%GOS($|YZf=K1v*h)i+?qOo-= z%1qEtMEyuPva8QJlog3=`9Oxh+^`9&QD~W6mO*wtIn9tQJEN)&Z79fXiIh>txDQ9C zqTCu6d|N{6)?nm}Sn%)U>-RPQz#)Ay687A~p>1`4t7NJ!!q&du>TC>K^Xq6RAA&_| z-KADx(aL&*!P;7>g#Vv}7Lhc_%$8NhYLJ;9JyZp2gS4X055~;@&k~&#x(1LPlj#2Y z0A#XxZU&j0%c?qNIHpgh`GE@$`}d>?uE4|4RoIq8k{eYc8~~K||AM>Dyj0B*^p~c; zjQ$F8Z=xST=dT)Bbc~D}m6AJx@!B6pxd<*pyo@wV%ic5VCS%f#iGBcv%X_&#zP*4f zT8-gCgpmKdqiS{b&k=J4q$SbIYQM&8KRV<1IhQS1%l^KoLcJ(;GgZG(ls>o)iWO#x z_Lrbo9HW;xT_w|Al`vWiO@F3IHUVq(v3FH$&0G*7b=ftrD^sS3RcG7@1(-AFS9LDz z>N~|V?#lHUcR~NhLPS<7o58H=pg=R#2BR8fmHbXq#y!%mD)=dBIhRI~ZghqndCC;- z?`3;*uqoNA&#((#;&MO3zZsCqD|M8Kz{OGZyNA}fiGtZpu~RH2q;<_AcB<(+Sx&2& z4C%a{)5$hPOnC>nh8F>kR_X$#zSAlv!jV>{c)iAb{GIP4sdw+l{Rh(d{Y+MdIkJqA zDy4ibE5Io4<#&?(h2ipK)B2O>yr<0|%voU;u~D@yHj0{}zf6_@QGurKG?DfC)8~R! zBxQGuoh_Mu0Du^iwU?MA4Kw>tFjQ6O25B@9ib`@<;&TrGLU}t_Q|kB{2j#z{*dt+! zWl^-b2OK)5;2M|%kWzDOc38)Gh*`py97&bG^eoZO+eipObS=VZ*cL%Jf-tD6TZAU%*d3PMY(})uq8A z_KEDVPi7y4ee!V799J%e@VE@!4}79uDgOq*r+QQ@%ws|DF?A?bRVC0s;q()dX$>$lo`$QNUw-N8txLKj~Jb|QPveOM=s9Ac=cI+8O0icqN$J^D1p z36Ao*8@;O`PR98oFsrhCeQhhq|@1P;b^c3W0Vl%FMJ@TcPF2=w4+1THtq59zdtA^Ger#teIH zp5Svuyi(wN5wC>cHL4is>=7`<#6PG||Er0&Bgi3Yp|qZI78AETtc!YIKfUtyFs#wb;)8ud+nYE?B))%<)z zJ+7YMNB%ypf8_sTYOAWyx2ejVsuJ$TS&8L7Jx0uxRPt1!BF_@KRfo&d6Z-dY=(+JE zrNpjPatCg(7|+d3!XD$>*OlD%`Wqmr-2Xd3CVhht2^TtBd6M5>g@#c1y4uFqCx~6k zw{P(Gn>wwe52;_{w}v=hC+t_3|Nok*(zUIi#!_qfE2VbZLH?HN=@2QK*ThTl)c9)Y< zd}9Lx6%}A8Dh9@!v5NOODc48Xz}PKWj*O8Ai$cW!R*Zr7xv5;I`<(TaXKbK?UHysy z7CYyfKTubc2Z~pnD>{VR!3P#d@&VVCJI&76XB-wUDG*u%V+&jwQSqV5DGzyGVnJz) z4It*4$L2`!p+aQx{S$|Sp9Y$d!_C}nr^Y^1EPDsWK5{;mB3Cqzaq#lFfh?EX8_fe3 zI9*fm!ZNyfEXxZST;R522%Y=TdCO7F7vwtg=CSwXW$c2iWCzCHK9Wek zC_bvOf0m~)VpmA>oa4`%KNq%XMC$ za7CeURE&M@Owt@z;33tlp9l1FMd?{04U}F;UqO0O5UWU;m$56VnCGNWzFI2IKRAjP z3OYbR-Irp8+?Qfii-~B43Yx*C$Eu0zjx%sxWhKpB&TtfQ@h-2b`Hu6xew!}7edvfR zdwcm!4g8|`{DIIb1-wtyOV0%nWfkfpKAn@e100?{=4-A{s^TKwH01##%GiLaV9d)< zgZHi@?#StePQiKMLPCdTNrQQH08`tT4sGT%bYvv}b4mQ6B)&m7Chg{%lDdM8p0NRz zebUVotXVT2R$ip51S3SpnnAFuX4pdwz=_R>Z8e~YSFrUoRsn}pz#+!D3iz%hE8FL0;!DfYgDj#T8B4yYZ8mnNh7CBF*A1a4h!o$`M=3jKf@e6^Bu&haLNP$i@ZoH zO*l@4S6cg=#{rR}Ey~nC3;IdubO6Pb&{V zT# z>EgnG(=5Fs6QlQKrC$C8WadbCTUX5Yvo^lTP@$#Yl4-3%IN)at$(Qw*nbltvoTgru zk00uBS{S4JcikZ2i8g}TII?%Fg3kSnDAx%?W(hIlXLvwJD20@Ia8qxy8?34Rj0V(! zy0utxj164ViS<0Xq~Ke~*ixlR5ps0cCpyGUNLx#u1OMcHV@#-* z`6jh!E`8IjQjDlSQhc|>$Y4ob{OD4Aly90M5nm>8g=C{g7B4@8-!mVCEWm`UMq4yh`fQqnn&?22XRvc};7YK_Y$pq0ZwM?zp-rF9ZLiOZ2fM zZyr12c(0P^lDrMbB*oihkqyWt4y(R8z?>6<+=zC z5+P%ZtIeN_$ITS9RMBsHD|-|b&9K4}l6tZEmx{g1O7$&V9>g7D2b+OU;M$N8Zi$B5t6ZV?ji+x+|<@89J|j*b4;I6V9zKM~$79aj#H{x;9w#sxwa zCch3nS%}Gkzo{2$+esm%_;u}^QA5gK$CX5=e2Ws+ zLG#<>_6N|H@>$wB<4^eVUCQz_P8qg7d|TW^VjO7weZEV)@A9;lxVyB|$?uWh?`zkT z--hC^>3n68So#sy6{+#>k#7}Csc#X7O;}2`Q`hlH(*CCYspGHIOsQYC-Y-#8ySNX9^+CT|)h8zqiaFr6AtWkAh1PC%*moQqDG3RKpZ zCh@8lcd7%01B*Kg)s8ANYbq<1!beP1)=;eXxj$9 zZb031%IVz>(%pWQIojT?Sp`X>%v}O z=}Ie@*J!+ZreTQ!RlQRp?X0#;orM*+fLTbWT&?yfvwCS~;efZ}aFexYdZMudmtBHj zXrz^DE(jjUEifgJ`WFuPyPBFT(`-F(Md*@w!Oi@lLwnE#>NEPePz@NwG@0c{wdFu} z_kpgMXknZ;}& zTRwd%WtrB_Po$-(3$Z=0d5K8P^6!C!WZyOwTXL14JB1x8ET(0wj^%5#Pz&ls#(n;m%9}M&qp3L zfsbi78JCQV&)nG7A$(<>|75D$nrp9j!D`3J4$4&LQ=7T%k z#(|wn)qecL^w9bgqZ$odb6u6YkzZjBPbu?iHTp*Ny`77~ZFC>48@S{$c@3*hX>h|# zq0s*)^EzBGCtQ0M-jIr_%1aCw8jTgHj%Y>bc&e5oX1Uok2o(SH(x|tImbgPvXpidZ zn!pT05%#EI(O^M7piDM&a+K<3wGXCj8oxK`8*QRfW+m)!6CtW{hH-9G*4!qINwp-& zA*kJgkHx2HGJm!(S$-M}Jb5itSI|V`ldYtzQJ2MJtttU+DpLB)ap%v?LiKHFn!(Al z*<23DS1#LS@|Nk64y>@uXykN8XL}hjL_N{uq=G&(H7oz`P*8Iun`3d2TQbX9Pfw0W z+ifM+)8^sqpo!49%&rnCQC1~|SG7DtjC)et!)I@C2BK+3GEEe6P=X&LWjbS~&&H(0 zpMeixOrUK_82w@{lG0;!YDJyMenqAJ}!`UV!>9`dyP=l^mOvmV-BVCMr_a}(hr$4{G+qoyRgEXhy^rAtK4&P!pl++LO`n7=ye44S7WPt&drWsc-Jdb3eg z^BLC+>O{)CM|{J4fm_#F3uZ+&7wb4XInt4JM#!Tp9VI!ESoYIY4K8|`KWD2Kwrp_*! z9FovvR!Vd_Mf%Tx6D77eN$l*B=^1HiLRcJLGJPG+s6@TQWLPQfF7uVC=Bo3$I5Upw z&70~pLuyn<&Prqe42UWb9S39(>DY!kOoei>MN^l2(~c9XxgszVH~LbyPZvf4jk!(wvPdqA;W9v2g8Nw1Ky;*$^twNY|lzpIS7#@?Ks<~Z#3lXDveUcUK z>45%TiCD}r1{gSIQ|@C7_tRN6RB}tx7{#3~1~ok*k*+hk7?oxRH(DB#uzsOy$#f!K zGh#vs8BVoltFP)lC{h}%}P z1^0hz!SoNNGt=pqa3aexhIjQ0&3RWOP-Fz9DVH{%8J7~?HjNq@he(ywi>)?c5!?Pe;CfVBR6)|qKB505ek{kiNob3$!8;X`AVUiKde17l=+nDzh{1 zJT}9u9_21)q)7WXTlKG?Suj(ISg8I0!JvDBgKx`EA3vUIKYkoxW(Gc$7y-zl@)?GdG zJp(ZlJ%IKT;bb|cswq^e0G?BULZxG}IHnqgb?9A*cabT-oB?Ro)C88`1n8*(`kq4@ z66Zb12we^xg6SOPl14BEw<;pZVz=|)lLQM1Uv++wyYGx!Wqrb|)o zsWQtnpBc>D&X#9RJY%wOc$+X4xWjf1qS$`sQ0m0uslcmRNjzj#{z9juwNa&U??*T0 zZ@~^68ay?fJ$tB9C)c?HUy+kFszS{CqG|ig_OoZFXS2qk%2E~u^%#Y5R7hq%li7;u z4BpOqrVmw~lTy$wiWSnffI?d{Ekye(j)N+t%+$@SXZD#&sfVg$w?|eoYRM@__pGkA z+PNfznb&N;k@Y$=DE^{g2hOlg}D*-x@s0)rpm{ z(cT(KN0r#}WMNg%d?zVIfWe$O)9eIGG|Li({99p&uE0%6q2MH=rgBj@goTO-U!Kvz zP(V5Zw^;F2_U6#AqO8?)bgEwyU@_ppk|O1EY(tu;9HW&8(m>51Bd4`e3d88e51>Y| z9n2_}(K1d{3oXNBsYYF+8R8CB=7=j&p89H`BqH+_LXMk6ZK-4dqSt60WaP=zs2m)J z0$n*r|10E@VWkL|HIH9)9v2NhR>@kHk`s5fnM77b?qYnz~+K)R7i(pha-L8gu}CETuVZ{y8Hgb=Yyx zAiUGgcogw4-DQTB0{%*l;eVm`be2BqfWR-MZJ5497ctD^WRfypx$bNw@rY^0=#Rms zC1=awsA(SV7#tnP;fAKs>0p*6^lZ{83()kRn}1H#X9~yRwi&!dQcZ)*>xh|LBu#_G z$n0%dx}x4ygN!Q5LGLT3HM{6|kE2X2nE?dzE6TX1`L98(!?kVP>>~o znOSgt<&|fw_E*ewF4`*0^a6SmJHNT6CjR-er&|vn?mgTzZ!R5%c_n=%dC!vCvD9nx z&f~`;CJ?I(twd6AG`?IDI^|OKYtw_RW~6nn%k1dw9l<5MAl))vgXlo=h^{h=AVu9i zltr|7a%P&pgC>5h>hK(T;;0nH%&;n-lr&|!;-tyTGRe+lh1x3-sb|I<0coB)%MzRf zTnCxUo*k{>hAzZDt6;XXQ2h}PEz`7)bEu0XsLRrcO*gp`FS3*?WS!}yN$=@crKGB~ z=pTfwgW&hTj|;L|F;i!=)8;5?2hA)JIBSC3@#R>~jLfn=8I006BqqM_ktqXR<|BsL zyv(Kc;0gSAq=18D`~u9ll&i>QMh9D)SkaI4=0{XlA%Z*nj{43&w%h5pF6!Ne8={B8SmdmLd+S_N0`FH&3WCum}w=!JI<2FgC2B|4+@xnb3f;GmgR}(2SVEKvP-u%8ZPL*vvq-YD zW|pgQb6i+z4lYc3M+YMenYScKC2DrfQe_ze)2ya{3ZX@_JTnkET}>A@GexVL^V8knOXFsY0k43TCPiI-U2k4$zTA12FygiV`ZTyb^lT|#eE zgY%P~5fPAYiEb+j5oIu$UnH4jc8s%hoOGsfD!qrp2Pz}uOOxs}H^&dA z89N0S4{>s~<~m7GuN6}gN&Lkm6jDzzFhYkJ9UNVt+aiHt+<@NvGf@qz7!tB^fxuIh zO@sN##~4FqthGZ9M69X2=F%2j(V()9-(QT6ObS#soz72gp^ex(Fqtr}mLj`lCx58R z8moqxB~a6mhRX)gY~PYS5`=+X3Bs7AShympKuv3Ue$r?vMq@6~IWzxMvG|459j78t z!|)oPOs8L9^)JM+>GQPeJ8U4k(3L0)((oaw==h5f7$mzAHn51w_ zU+ZBsink?Rpr&h*x#O$^uvs$gu&`ktBp2b`&sx*T_D0av@MtYA}F&<5ynu&=s2yXWM&nYZ1yfm z>82MV7{ZzLJkw2N`4%i>zA(;mHEm7;@Sip#G7-InPItJ=%%D-F%|Y&%&t)gmlZVkH zAy!$|#m?9?`$voc^M$j8>7}eOeKs$`Zdx!0m=Q9Ilg8QXLavbYao?$V`qm_hfg2dT zHfcl#?=TZJnQrMSjn?$%lZM$bJL$>vBA1yW0_wajI7_*v$jwQW=4%vJ@da~h?*xp_(m6h8o@IFTny)N4&U@ZYGWb~PgT9u_Gvj8CpGuu7Ol{%5>hWn> zGt;zW8j-WK^J#OGHROAv7UjMqNh&*8es-EKAWfdgHkr@7GBt(1^FnSqlDg&iGASZn z7M)DhbaMU4d$!D*-b~ca!2FqK5X=ns)FlK$?(EXIQO|NiNVboU7seG0#nD3Kj84ub+u2TYaB+Mw zlP6xK8;`0kj{CAXDoNaq`cH^894GZP&FgO zcsw4-FuP{VUMY^OVY5W6@0=TVMtp;v^-@>23m5ntTbiUyoeQ*1A*)c43fV$talE3l zzOyqP=eIsy(Dt$$ns;hCacv^oL6W^-4t_-DEM8E#uIjN`8L;BLgM;JaTIcDi|75&u zWH8R=h_W_{dj>K#0t>8hU@_v=8|`~txREO!nwEW1Etk{efCj_sQ2J|OfS z610Fe!hB)Y7di`ri=9rrTe5cvhI>^20lQS=R4xX7i7|;?utzbq{yt_$*Z3$#)cq?xKR=~TEe-jPYDNBm=2oJXPrdP~P-Oe+!RFS3^Ha{0=S49licS9^=2m-t z$~*P%9%gPWT2S9unDRXT$oAG3^Hb{RBidV!E>0Q$?$PY6x^7?8-ul|q)Ct(*i`ZL9 zVzVIo686@gO#Sf7+gp#mCM&fsV{hHRho!++_SUcLtzX$&zp}S}345#k;){=HZ{2@l z>a|C+x9(x`R3{!_Z}nkseg2KbDc?}?sJ*Gd)m|~U9z8KP<(%3w#N2&w&t@jqAHFvA z>i#t**Q2l9nkqYWV(6v%^)^?m!$(dnPCfQ2lY7zVdhjRLm}NFHx;{TU<^Rj)pFeu= z`R7kvo$|b~k=gb6cczS^_nTc0zN2a0Z+895cc(nBZf17fL*S`LvAf#mb;Ji7UhVfJ ztD4OWuOCc#PxWnVd3|+$%5&5@adpafYN-1@)9Vp8^g2yE^wQC_wpZHsrBe&2I=Lx7 z9Wc~gzuE#@R&CisCr({MXF5?B^7h#4Y_N7=$T^`--InkrbgF}Fu&gn|*0=U84mq!? z*Yc;-iN&F^p4L4?nRc{c@h&zFc7@G7tv$Dg%6pP~?lZ&I@3D_27rO(;v;t{wW`?Z~ z*sa|!4fSC?78C0xX4r#$eJ{-p8TJFsu&uX;JTKXsnPFd?nnJ@;=Fyu&p4awlW`;dj znDV`h8TR0fA@3WnKFkdJa$zd)6U?w^G&JI?`61)g6X>)@AHfVuJnsq9JaT=?^V&nr zu|GV7@coC+#dVll4z@MT%9uZKY~H_ zD6wBNpT9cwxG4FLZjiMXr#$=jP^8C>ehG{033B~Q^M}`_d`G{yMfQ2JK5D*reQGO- zAK4;{%i2S)<)=I+9^EX9 zm9xGF8CO95e<8c<{+EVGW_Pgz`6cYKNBf3e`to+!`qt!EcG<7&vR~O{zp~4IWtTO- zvdjJtw99T=ZI{>#3 z$4j>waxA!aJIRU$+HEX5qP=X_x+dECM84NZ>?xSI3O>1PpOr%)?4o)0;B2oaVTCz^ zd|SyntH6nRtfF!D@SR>%y=@%&P%_PKV`<~rCiV1XBlwvVLR^d3y4cGS%G}1m3d;ss z9Iuqz_kt496uw0~j|y8vc(P=k6~LKio0w;fLGvmXq3P7FWtN+9#JK{qET|@qbuhPa zOoMBYRVdY*$+b<)v7THkJVQ$SXSNkBv2+3$TFKYQn3q5$Ny4K2)eUovuVL=|v2H-8 zWOgNxDz-^`k7LBWvRszQf>!rLe) zzhSk;aLUz-+H7jPU|y73thSn}CpikjHJMU6&l-Da7zY(?FAZ~Rk#;j&XDp>p3)?m} zl!go2a9`Wzgdb`sl_PM(?^2Gm5&zLD-oAwy@V7BWeg|Wu7)E~w2&`P(CEl0fmAZ?c z-Rdc>>k_}zKf+YGi$2}OQJCaJ-l!(OPm+sV4)zE9FBwXoE*eVhWkcy7g5azQyhvsNda)&d0-_AgDSGrBa(zNC(t5MR=y(LZs~!D2`h zA}srnCINQ$;~H3WA~m8hiZ_f~FodMmY=60Ryy7^?y8sf(i~gfCPT7QM4o|q1FM5wA z&wNI-f)nUxAE}=}hr>->*U`(4&oYw}6A)eY98KbIOvm6k8s1mfA?8eF<~AUK7%kEF8PcOf9eE? zKVcr}>q#yiD;z6J#P(sxq`{>8h~qQM4x_ZK5g_J%OCUZuQmGtp_x7o07>HfLH|yiIdhf%l86*wKCSwegkti{ z2gLJEz>-A6S2Wpwnf3-oYYr1Y#Pak|5_-eu9a`kfu=W!z7pTaA{^83LZnWL=X(#P@ z)=W+l=|IwT5cTT;U?qpI6009Het16ZP5)bS_?%M)`@rww7+NOy`Q-5RiE_zs*c@6& zdybeB=N$jAN!y;OsT7A$Do}G^IOj$>V?LWtbGaa%0F;!{;+!>X(lxZ7b_o?{)BYP1 zhDrY$=Dx+W@o!CG&wgTOmdA^C{64iwvuNY z$Mp&Y>RHo&dje(_4l{ew>28XTchH$tZlS}o5(cz$m`)J4PzGrK9TJ(qKqXC>3W6OQ zUhfw=jH4$*Nc=)4oE5*&yAwu|q(1XU=>tG#Z#({ekh=Fdh9>h)MbR;|pNz#Z6sdCH z-h`*$q+@;Nz8?7x+B>=4HMD=p*$OMVuA$C^b`6!ZvlBEhX}rn$9f&93XJ_tn4(%^E zkI}8Jb7()s7UxhvZ~b$USh$-|IWhNs_fVQ)#XXcFi+iZ_%N+dzSrGzqn&$@oq5TtP zQ^`NHe^~p6O2T=!Lp>8FgB)P^gB?UCw1X(=`WM{JQLqQ1X5xV!qDk!`D!DC8;37(b zM{yCA1}QKqJ!i~`Sws?<2nKBOAwHr9Od0c5Qj$E1kEoVYz}boYARkfK*hIuhVdfmr z+7xC6U(by^M5W+T#iT?u`ZsqDm39Qkn>2OA2e^e2ktQ&P-H4kzgi1X8mvsqo^t{g% z6d=F$^;_)&D%0p?Dd@^a?OTnQm#Jix&nNXlj_Wp9{j}Mc8*noG{{TNvX422~1k3n(kf$d_y2@Yzj(TR<(=+_+vm00*>HW`$ ziI8A$7Ck-dyVE@zSsopkY~(T~sFr*^cQECt?p3x&#GyKK36{ni!u9qP>*JB3#Wa^3 z?hCKAK02Qe@vc*junDhNANO_7rJcSl$Cz+;?^tDhq@3!^M~tmmXDd?XKu|b;)5Fb2#zxj0EV*0Tp({j=Nxcf)fm_JtRkI>Fec$hTkoPP7j zY})@9M~>{@EFjK1X=7i}2FY}IenM#$+5L{DTeLxPArbTS zLVu1>J!t>p-87wFbO22{ixY)mPtwv(pq^y^@SMzc{X2++kx)EAx718b3=_dL*SLau zn9&y}6m4Qy;qy9n(Ja}&;t!fk;tx83s)r_Ih2N8m*V`qTl85sXj+Q~z2WfBL!Bw_N zkt4Gc1qn2h^J&jMtNUu&*LN(oVw{{<(hAPgZs>K||5#$5Yn(J>9$TcfX#GUr0$NNi z?WcQ=#cEyaq*2*_Z(?Dh3~l3Bci%Piq3#0uP}nt3lKC*Bh(0mHg=0>)>bos5mX7)M z??%@x87L>_CVazYZRFtMF(;{d@_nj%@mSgZ$PVI^ER++o6Xl{>?uhKaeXM+cbVtcV zX#@`3g@9+cKZ(0&?T+xi=wd9eTPug*6+7ibe!`F#%3A7I2ei*W;pWoItP4fHI;p71dhdYfq+%Jx!sH#aba{HJk5!NP4 zqcS-=f#6&59Yqa%Hl0S*N}Bs_9`p3<&_+w*%};oTWijGP4nsNX;04vrpqPNm=zaNNial$KGW=`v!C9`c3GHU1yuARl@*E3fds-Gf3|_~ za)R2sj-&`4LlkiDkYx=qw1+k{UQz=VU(#^IeijY#h&gmM4RZV;-lUA5eZ=lDk6cYZ zF1r0A884XzjbwN+?Wx~EksjOk=*G)_E_XUJaRwc`n{5BWJa8@T+xN)UOQy&r#+_jv zA@67aJVM_|S_n(;0rS8RYma2%$kw5BvM-(9w~6%q-4E3^6ZYyt(OQ+!#T5n5J93I%%{K69X9uMr_;}V5%Z;kmmxw5@wPvo z-q!c*4r}+bU%-5czB@~D$1?1`eENx@BVW#ZiP|%ZJVsLwAM44dJ>3sAUou`NNJC#w zn6>+nfd!_Hhng?XI0eM2>MzLRob>~%kNU(hQimVGib-EhluaP-YP5rC5^W?fY?}KH z9!osjkXc?cOo4}!t6WSc&~uo-Ya`JwXv%bkWt(M{iz$SRGfY@t-p7>TwuQCem-I1Z z!N*L9lKaJ+OlMJwXv2rNnaa{5j{r@Y%-S3>D+wO#Y`TS2YjUE$KY8E)9;XwJTgm?Z zFX3@2{ml^mm-w8@if_X8Ic00?3;LWgu$_q~w9jc0&iMjPr>t=LSveb_BpmzbUZ*50 zdY!VVm3)ZbDQjrfQLf+V(uBYN(Hu`Djq7;IbaiIpA+D#gQKnr_+16s2{t(wwwxo;$ zA?#0QA*!7e> z!)4b~sMc)cdMZ1BCD&7lgRkGR>#5{29Aak2Wt3c&T~9@kP0Dv%PkCB)J(cez*VEE> z*Y#BD#GJ3`thkc8wYdMgTWGw2uBTAn*!7fv$0k;}p7OrA>uGZPYS&Y?JQ*TiIiJQhaX!UCevR|#68AKh zOq~0~#JMlLV&cT66x0UJGS};rL#m4g&S$lO^Jz54qSq;=yrz9(->iRteRJEgeG}`R zwr@VI?VFF|cDm!)WD=!F?3??`w>kRYl`w{heN8AC|{u+oqU4bqz6Xa&bw?wCU*yo7w_ebUoFU z&EO#Xo@?T=xdN8WU=_y8Z7Y^dOrI-;&EP7-CRd%UHf$I)wWU8RtPE)dDiWQVAy*R3ZBUGR%Z)+`> z5)!f#R z+fGV9ZktI9m44j&ODZUX$v0_hxtHXz54hVwvFue(y{A6l{svE=p^pbQcqptmE$Y}ZJhA;=2Mq>W0(ip zI9qh?i2n+&jMj!5S^avASMUQ37vAH%sHd*;23rQ&-XZ0Y&v}Cp8!o)_fjc`!p1Q@GM>X8wc7+lDZC+H{KN9ISNAMegKCXIr z>W;dgJPjA*4u>QDyWFwDVeE3d!;!m+k=eE+2Vjr*@2QV@S(FBP5(TXWvGUGoRh7N z%yX#+&d;yQ8}t_B_K!f@E$6=ywjk{qc>N|XlrGPkYP;cZhW3%XLS_Um=$8?BQFzt= z9ran1=LY?Jr1YF|`ukrP^d>!#4-i4XopqL<0+Vs;? z%nS{Ecje<#SNN!(j&R9IpzWS~JOVBy&^D_dY32r+S-v8;+m@di^iw65+yvTadcrF; z8P5Yuj>e$Zx8XD zex^$rZrsq1dOY0JkDtR|ZGE@(Gfi{ z<1T|XIffsN_5xw5VUZxxNXs(H8VKW)(I(9AhDr1WPQ7XitPX>KL?as#o`Wdo5pi6S z(NG*UY?E`*fDSWW4={)Wl*9J2WCVKp6v3)N?v9YeiUN_g z7)UF)fh->SP;^xTrvkKbY*GU$X%PY$pPUb*$@Y=7FEFRd8yx2X#~HYxsLq-$DH}N1 zFW@+|+$XYi=e*uPhNMz$+=)y8RJa=_fKKj6l7OZsL9f3~<^<6LRDmFAo7Wp)EaLH< zLa5huJGM*>omvf)WU5L2wg`WsRp+N5sHBe(&O$&qDr2etnfOQD>ZyhOkW#q zAepN+PP)3?Sl%cdCn27;*V`7T&bv<8?M9`_8|kvXK#mY;G+&_4>1$Jc=N;pABL$LV z4Y^|9zw7YserwB7bGRVSMFz&-Z-*nk+b%ieN+R^Uqy9p^{%4xAFK`oSfnaPXKzd&8 zKG;pYzRPyV1sV(?+3@pQm^V1~uk91Z_g#Yi{x136F3K?au|YBC`2I8HZRci-zS|-) z8-9L+L=2-q8|QyCQWegjx4 z#$eKGBPOD#;fl_@$Sv--KKW++Trw(>yP@PpP@5dN>N32n z-_^b!bE^(TM&}LubR~?;bF?xhNHwk-$3w`w2R{`h0J$yi{l z3xq1?tjj@|_l3y--nSg)=BNh~%#jnKgwaFAqEf@3N(~W6?54P(ZFi)OeNuhZN0XGo zxDbfxq*#BElEpA7>T(zjAg99Wj+BJ^q>?!|r8^N62c;$}SxbQ+TbwYcx^yDL%*aWo zG&-SfZz2Wz8r)FzV_^W@?h?vCxQ5uIr)VpNXp&gc?$ngKWjKlldOvR{1@d3ooj_rz zpMI{zqDVtYDN53hKhce=6|WqkkF*3MXVpIBB1UTX;*QMSZGAUIGK#b;hLV^Qt}nn1 zrKw6}Bi$t70sjA(qh|XWZlS2iOa=nx=Lkl1p%|LvEXOuR>lFlIn@nN`!k~ecyFe*& zq^C8(&-@gTfOZsMJQo@e{3lK`Q`~Us^`wC%ZzTb16 z^PF>@bA8U|Ip>I+H7RGsQgdmQ>zB&Jkt6b!I@a$ZmCkSVe)MMU{K@@jZ!g_-ismg7 zO->liUH|3N7Bd-Jz?=^k=ru1YbiKa368m)GaYT$LhQ`hs*g2kn>je?-nBp4X4@ zylaH}8P77MT%YS&ia2(`4G!Gh$0XB|-u@sHOGf^5=H;+*=l+n<_>n;z5Z$57+)##} z4obwzPac1Arg>oC& zE{=TW`Bg40V>XQh)%sWDdDjUozCUH2_0&VZJaR%tq4h6|$NJ%C-L319NN&ZWd`~f1 zS4f6gITdW^c~|zCYwzepZFiojqdc#FNv^}=nUN|XkM!+o>5FGSvui! z$SX9s+(&k;U%zxI>Wg&H-IABwG?fx@EbU)ExXXHkdQSzma*d@@`5&RoAbWv^r_e;~ zXOa0MC@GK7rflVB7aGhDrNg$BqouoEwH%K~vye*`T{63SiSuuNC~-?gXS8O*u5!@> z474u$9?Cp)uZz*%eK%Z(>M07gJfeTxOB7Pat|HVdTmcIk8BtU3mxeS3oV{#Jo2EkE{4zf)VgFnB-nf zNI9=)0mi`PoLRIGj`k%sat@N5Ycz}4?XY6J`%XeHQXxY4;X4P~D>Pr*%vg+m-^rh( z)vr@^o#ttq?v~(MLI}CK=5j)1uaJ4W&U=BrK*p!}&m&#)Ny)YRT}?W#BgRGi$(y{F z62s->bQWALC8q13^tm1Y-TT;M z;0vZVfh(}J#|-VIe|gLq!tGDEarBzkymc=pmOaLiey`%fqqso)Sh>%82p3Mq^O#r; zIUWmn5A)95DZF!V`mLttHQq64^Oo<$igPaxM{&U7#v6L<1p@fI$9QKX_n43U&SF9C zIIq}j;Qd=pOpBPEyr;zb)&rdFWkk#qI4}i<{&_1U4kvK{2la;bK5r!xM!c)-)eJBY?_tp0@2YIcc90B1}-MrYI62Lo@n^^y+$tkny>={YSHy5_AGz0c`{ zQD>gUp4TvUra23jBi4z*)5B$-hWS`Z`nS$gLenFr!lY@CBVjv*q?a2893J0ZIhOUf z#LHpnEQGVV{RhGvO&B3>AB93n`beJYd`)P?Mefi@Scf3+^m8|W;eD)^_*LhtLeS4u z6lsqUNc3WUtU6zomdCLuCo1BfFwh+*t8n5Pr&SSVE26n{yioaBUm!xK7@ zNWr29$vRsDk@z1IMteZKT%Ni_qP;6|OkxhiPb0|I*25y*L40$(t%*b^u=8}{c)}5p zUsog$ibNoYn?hiCTS;@o^fmP+P9!+}HPXxJ;ycT$Dmj}DE}oQ*ekTW(x0?PytUtkN z-a9#3SE38mr{hLN2)cIDri-K!Idv6nHU3aMnV@_kAqeAio&MHC35O_|e9Sx3Ml+=w`mKzXPSW7MN!T?ti}_K_PZPEFkr1W5@xNF@D&*&2yMSrH>*73of> z2#{bqGoWT63<+V}6hdz#5);A$aV{b<<2~@i;3rOOjR+-9y9tp1!=%DrggQVM<1j-NP*)0LhmYI8DSls#1$_+qU~3|7whDa{^dS#+ z^(L^EtFfK4G%+8KKpv>96!JE*m+;Z?tPVlHx&iu#7qeZjFU}G}V{;{T@D08|g8Jjy zSrxB5AUP#WBTbFUK$rlP(b(x_rO>SGWHQ{wwIba9QRhn~+^zn^fnX&;khde@k0Y2? zUn^C+orP*?8-((hjfCoy^NFWoP7(@5XlQ{pE8!F<*>AA>3hWvKL&;>Wnw~eUYhjJ)Mtz za_5Sjkv;yP#CPDNH5rj|!f0e?yeUA?ra-KfF2U@uCYio?gMUS&4f8w8wI{@FGYl1R ze`qHc2d(z4G*2a5?U6t%W|O|v@}1DPuC9)W1VBB6-dyp? z9;(@--qzMnezNtk);5mIbabo`%2*&`Q*z{}}L!kkD8RirILWyR?2GLcdE499~Bh2Rpx32e76(nAx8tzMZW(&K)0dlF6q zGCp<&dm-B?WUaA4b(V~#%5@FZbhD~McD6X$f>atBR!_o;3EYy2lcV`PUUNkg<3>lP z#o*=Y_~dFiDArif+DoS%i}+S&Y1vBRHT{nsU^MFJWeH<7=iQ^&n8K1V!h|U@3mm31 zB<>aDgtpSr`GVzSR13(!5sR(#nxql3&_T-snZJ&HmGQr$Q^rl`_sR&<8jA%y9s~oS z$@UI2Ufz>MmCdZhUJF0Ij=Nw=!%l{1N0}0ihjxoKE(5nf} zz$6nVDZrSsDQc1vsjsUCNlSzyQFE$&GFEvBZN>-esF`_qJS$`IM4gww0R zhct+l-LXk4E1LpMk(C@dO`<)F%(UDX1Azqf5j5hV#>pgzuoADA?K>WGWyBXaP09M& zqSQSH!BOtKbpr^D2@fV#^ri`)R93@F5-kxJvAWHbu}FoFkSnX={-$Ki9YD}#D@~wP z$0{Ks?Tm0bWMohmrWmh?2xE~Ne?xD~74f$<2l`{q21K2Su@6y35<9&Tj_x4ldA`uH$L0If>RNb?>mC8qSE0dBttXimi2~WJTGt}B1Z%xJAkx)EdQ{5j+C#*WgIH?Rw zcAcJ;btDbE%Y$T8ld)Q&^e_^+VwF}~C`A)!t@g*_ZGH;d*-#yk@kORiI&L2`Xs0I- zKqjz|+GI2}7*si4>KGSyhAgX+^iOJ!RCHRMHLK$c0-ksTdv(S>m`Jq>Fmb0z!a*v9 z(G*bBQo|&UX>pTKVNSi~Y72{zl7bVOXNZ~2mm+(?{O9ILE4 zKsqXzi8?~2DKk#moXL`mR96<6yep;hHe`%#&^RJZ^mwrly+*4U;E-=Eqa&J>_Rk3E zwM2vQ1)y!MLH9WjWP&^?!W0M6CesvJ=^tFwFH306CTJb;5M3`jkQquQ2jU6(6wZ#0 zc#lHuW*CJyZL#IZ8)^5^PlaNrO=P;8QV%8K>6qKMGZFWBj?q22z17quGi7lvktdW8 zdZx3T#MI`GaC=UOL6#aJbC$Si2Z-3s(_?u8)IP2aNq8dRwnS4n(8`251id5Rqr908 z9VZ5t*|1W#bIYWXwfc7UC*%NR#bm~)TTRyRm3c5ajF3C%X}N5~+?i-cxPe#6V3SCh zvDl=ju|A?VrF7YiF_m?BO~IYFKi|6k{9$9DC@kPbPH~?f*U>Jjv5YECShje zP{N8xbCnulXRDL)rn9Lh*SVZA?_0Uj>+y9Y+;MXyJq{g_*Jp-EF;z!vZjFMjL7*rf) z1^SjV(OeNyje~Jllh=~$xkJcGE+%m$;wS=L%!`;|aM72FIV!@jblhEUBFxxfMmc$C zwB$M#?!t?sd3HlR)h`Fax3@Kg!wqenorBgzRxB88i&xN*csQv%@ut?D)PH|4SP=?B z(vI#F@^qvA=X)#Tab~{$P*YPh8sy5C0~Y^WiD^wEHww39fM#@Bet@*HTWipAqGbar+Q zdVT&z<^c{`D3zTdvx0Gj>ftk6slrreW`>;&(Rd?bV;*Gs8WU)q?G-g#vqn8|dwdO4 z3{O+}ZT&5QDOQ)fS4dz7buWt(bYZ6%IF{*W0Xky;_BNoDl2Yo^~C^MHpTsk7Zzlo%B zFuhIZOB}HVg^t{?|6dcDb;*RQH4?5*U~kYVgiMsYl>&%35<$8l#!!Zp2v;n$(&2C% zdqXEmOwcAYWBLlXHrj~8Y^4*QyxL=VeF-j3XyghyqaJxOW%kH@V=QGSphIO#v@%Z! z(csLcNHES?#Q{xbcxyD|VpGvxq4FUCj~P55=W*IZX1ykoC_SRj(pO1m?rUf4luAQ% zX2Ss;T?`s}c~Nylxi&l%ObMzqjnk}(BMs7|M=(v)zM4V8@U}7eJPX$rCnnkAG0ePg-~< z+WazDY4)}hLXt{W1{$Siw>MDNIwet5Br{6OYfp4h?_8bjQG48xbcG~0zBUQSEG$eT zj8(7(;7r7ubV$^ewgCw$d%X2qMMM(NMZs@V7{lqJ46YfNNTr=n<>R?~o zMfWc^tI|}Zqw!Lky{Uv;OvaGbmWt^joYJ0O+_g?a=RwtwbLLx(8zcvm$m<0tCGT z@WFqlmwID1cE@vq78#A!5K|Ch^dQvcSXbPN8pj^+@J z!B&W>+D^wE@d~rorjK}N06u@LH|`DvL;lL9!8q3suuyrFp&9nk80FN~Xat#B(FPe* z31FE;TbM)HF7=H8)h4tZKYqVKXJ_vky9_w@~_U7B$m_E*7c+-ZVW=%2Xa%7EW4IJf^pB z)~rI7Fj~FoS%hOvx-c~>mlLn{YlcDr78K?zF7z&*gTD`@gjFY(cg`H2=b$F_n6nno!*5oq(3+Dw zZ}H+eg@tqG%u6q}=8%**7QaTJ*QRxuv+znSw#u!=YF=uNRoFkrnl~`Vm}S}ohB@mb zt|!jv;>*$$4$Ml=NzSs!P5+!hj{g|)I62Gk7M_@86yhYS&!#7b#d)94Ti7+rQRvfN zM8!h1H&pM>@kM1V&6_UlM-I$Xe1*wb$wD`|EG&c!)zxd(H2NJ)@hA&LfkEGZH^;{k zegqA#kbWR6H%zh7rP2pAi#(nns-nL#6b^=RYQo{NeXY#RE^d$2MOa^IV%id*h+^oU zTv8Te($N-Tm_5XD^b~Knu_D+^PvG}e=2XdjWcvcL)DdWBx*jMCHCM5@j^R1(X5LUy zWp>aaEYF)PbnwP#s6O6SAFQbl8Vv{ND3-Ufz8-2yCnmR+wT9dL4fP@EfpZ#ZD$ITk zGfTh?P zu5UqW+1basrjP8oBFil+n2tLu!}V>0aZi{e`D1>T4_WW>`a*52p3;Iwk13Tf~9`F$_*Z#EXUHYx)Nt4h_STKkuSk|?2_f;_q3x`6D z$+#otZ%8*fLea`&5|KBOOfbQ$;gY77ZX8_uX!gtza)>$>-$~SyTBGrpzoxMvNJW~| z7OZM$sPZ?p`HzcyOj%%v_^5zgB*(FFXFL@{d1i4Vu#cd`TM=z+toPGD=2mcWL?h{7 zw4w%>EX$+=s#U^CO^6u{O#O{W)u1)CwISXRstEh)sQ}HiG`|8A6ESO-&7c9n_4md>`7!bml;-YVB>AynLlz!3->K zK~7T}LbR(;$nOj6Y-(*!CaiXMYh8r(API~{LyGIAHnyf)dRive`ywnKMao-RTA8ku zg+u;GYkNC50@~t9Nt`D{h&W|Oh-AxYGFi4V*5FIEFas$Mpe(*dr8Yg>HHkcS9#1&U zeXXs1E!{dtW>u=ixz7s4Ku?+&;)JH|M8X+w4b=C*%vI%!1ePaTjPll363S;2_yCOb zdV?WEJuRx9uBRNLve=(Q$75r=bds&%gV5xP zr6Gc{W9mmb5}j3*y2UC_mpQ}n#JyEz<>hsshUyNSijI1<*v3FGusG_}1PABbDAiy9j^ zafBrJs#;8zn~YZE&t+6Kp)PBx#S)m`U)j*mEF61dR+}>hZ93*?Y;Jl>LrpYVsdq=C zDTHv3h04nU2(LAMJmIeM(QKJNQIkDsrV0qy+s~#o?)mgFW_v9U3wa#T;wK>8p}G2W zEZu6wlkMqvE*FXg>FAmW{sI#)CaLN8fYYw5Ar@d~|Uq$OnnHHJ(Ge#NO4#BoDu(a0GAT_stnE_;FhE^tP)CbnFI141kayC z?C${IpRKJ4u7F++F%xSDiA!t@7GMuBAG++3WOC5hI|y|dF=67Fr$bKa?ywcY;))X?hkt|-!s3dfAy%P=Z4knTLWY0X1R?xN$gz0X z1R+rIa>!YMgKdJqF19~}SO~NY5Dbs`TLPQ5{Q-Wz4LP|a${eykSbQMF@^Btq>I=Fv zH=hs5-JG~&4G{bl&xf%5EzTMs1fGKe!?j{vlMOR0@7Sc#1tnyT{A>uru{>IkOaT2A zzrmM{0$KY5gd+45kjVvtH57eT!59BZF>NB4jt6{vdm5hIDpcx3SJcH+J*<5q&TS9Q5#BYiRS&D zLlAABf)g0+8F|IO6k(5yKPOtc ziUQafV5yylLJjckDI&e5zqn8A&WfPpEXaE14;6mQs!f}O%(x50!oWWu=8AcKebi(u z8COE&*X9Mq)Q)0i07jKBiP4(nms2IP#swS?NqTML0_eoHz>teAG4slkV998Wfa`RR>qqXHx0 zJ4jHkz*cS#=S$|rhinQ85R9W}giQfVZCe2si=laXjR0-L6l3GO5Zq;P!szs8shmWe z$NW_+3j8OPJ1=8Vpu$iT+r|XNDlftGOB)klbyhHBN>IS|2n6RKX<|u0x*)SH3Gy)R z%L9aNXThdf=(yt++W@g6$jgffnZW(hWK@A|Mqo4!lZjD4USpPuLo%hU#bMWm%3g!8 zOg4Jt!LeA|5BMt})%F91&!ljNtOrz3s(FT1CjX;t2Piye@hIB?Ww5xRlpEH0XP6Ff zl56n*B|6e@KsOU<#5@>9s3xQB1`4Pnt`TMfMgl3w&N~nc(ly#(z>UFx-_IeMuHv>4 z1_LxSRfILTDIv~fD&VJi44VoV&9JsOtkjNTl#Re$Q$PNdy^ntUf%lca@2;(*Yy>#% zHm``XBv`S;lQj@1zw6<>`+N51Jh6XkXvjq1eW{N-Z=vXDaCsSOu@AWGp~3xJZ}QMB zwtYa3whwq8$K5*~E{9gRvEIZq04&e9_T${eabmyw;rEqm+W?Q)1}wj?<%z!ijt2up zv{CmIl7V3W)MohudwcgE+dug$4?Xn20}p-tp@$#c+szFklx{Zkq+X@6qo4 z&*8TmKknV7*0BaXWDu~nOFSQyfZ8)}q$z-csrarHUkX~`n=u0@*WvcAEyBXnt-UfP z0Lvfk+W#V#g0yfY8QuisC->?N3PfKD?z#xfzo3G~B;@7guOJig;fl(ZR1k@IDBP z;wi$wUf5c`LvGpFo7(>}Wf1&$?|#{7rhLM}hWMF{Kj>_EbnpIG_q$pixW)JJp8cwv zEwgz(w{Wqs{f!?Pc+k=EmAxJNDfP9F_HymTUQ>t|T1amO*)J!#Dd-;Eo8Wd9ZdfVC z^4Dul5qV@#{k1zDe6U}W9I`J`F=|P%v)JPinVJIW7n{K96PjqqB#@@Y; z4m@bA6H?Q%7*T|jev_QIe1Ww)KGMa_E7qeHiw@H(^+VIAlxIpY z^Y7&wKazORQS0|1P5NoWBURW2@-Y#ne8KU{H|{$4AO|%qX5j@gMj9FA7;;$s_R`^T zrEwmU9kBSST}L0B^pRcb$~AspOmD`pWth?(_%-zup*D(rHg+FazI-i*2T^nc+O?6p zgEH8?bZ{~v8eR!%?7n^s2=ssJxCx z0Qo$`XosMWCxqbfIbK}zYWz$A@_^$R@Er(GMy!X zT|}%33S@?hf}Vxcb@wfhSCSeX9|F`>1@kDsZr?y@x;6oNdr4LnNGGQnNcT$(gbNwB zL39%8D9&K$(yVJ(@i`ErW6CR#8KaG!r)c#Qus~kY)fyS>yok02FQ+drPXp(wSl1RC zIM0(V+wjK(MGA9hwoEA8J_aotH8;FdWT>}Mb3d*KCj**mVi_i6PHO|^Qo(2<4$DIn zLYtGP@p8`UWcvG(BdKaJ6CbVpCShiWuTK zKU*e7E;8xSp**7@a;ZL?8ZK0Js%4sO6r2H%v6Z6_BcYK0w^+ij7h{ILOW!^`~%V5Ibj zW5VCEGgP#{^P%5DFC6vO;WUIlPSATe;9rAz)2aUzm^a;>pca)EjCso#Abo%R1wr06^*9i3(JiSh z7lwG-#21cuQ@kueT`=O!V4wq7<^>|&62MOkE{~r5vxtGqK2?~IqM6gkg< zcx&%oMv*tmB1-X?h&Oc3k|kNhdx?u>l;SfGZ^o{YCCipAK?heQ>1FN`ug6=mB(+Qq zy74b58G(2&8C+%vS#HS^0+_zLm!+3j%O*pYhr^PRVZ?jc-GfWsQeyi3#U(!9-S;mk zx&LnbeI-7Y41BJVyYC)GyqDd-1;1sfCDz@!TkgOA?j=j^zI#jhe(Ub^GV5-OUt`G- z;=K&7)cw}St^3uM)ZNyS{=2O$19uzC%q(cV>?E!y>UI(kvNRmcBc=%py1acMmQb zM!c7tTxOIkIYAzw9f^3CEa_V2SmM)OL^T@mE=e!xM-EOhx+J+Qxx`H_mn?zo48*$_ z#JeO1+LVksZgwAX{XcUV>nTBuCKCKZP+6zpF9 z1he}PGg0Q3lR`T#6zLAN&||cS0w~etEpNF1pgSZ$w+f+W_?bmIeJ!sKbB8p{y^2XF z(?=$lc_;_L3q!d>PiU08MQ#&9D;2}A3xv2sEgIrxNmQn(7v)tT*s<_!KV_Q5w?i$0 zZ>tdD5QtJjDnAE!jr4cW7jLhbSv1Wo;Di0M>398`fsg#jR28Rf1|$3g{io zosA-5oV4S7h&Bs=%!k9F7L81Ysb!fMTL?*vV*=U;F7=wLh0g>`&+<>1*n&W~ra zF5xH&0l%|i*|K9*K<7`sd@bPF%U=i2&XeWqutouQq*fW_T6-YylpuIExXgL*Y+2j0 z;p~F7zE#~i4`z94m7~S-gI{FeYbNeSaYYYY zT--rb97?WI0T7WacAfF3xmBJDT7h&(FzV1CvAjqc&c>&UGx&7K9SDWa zflr501m$q3BEnt(G##o~waSG23{-l`5Gq~1%H%MB;=c@z4upzd0ZADr674>uJO#yP z0noVuK!YnyL7BGlxS#p|UG&*To#iCA;eGIOvfJ=}cpH0uvqr27KvLhT3P7sme6=Dl zT|sy4-RAG$U9P{nTqD9hjq3{1Yooze;4Wvh$(2|I;IcE}BN(l{GyWZ5$5#>d9bm(P zGZ%v=3v%tpbvFD28X z&ohbnYK=aJ$djBXHzxW#3FCsxZS)xgY6SZ174(@!k74xrazUT5kQmwmf4QK~Ge)4# zzC$5v7<~2tK3_fzKF`qLGY&TRYIs<#ArvO@JBbir2&$8B{EgU`O zGd^U1XUnT>;5k1FJkQ7g&-oeP*>@K3%-JRycb2ec;LeCc$Ym+phMiRgcFrFGJJa!> zg*xXmA%7jz*?L{jnVn#Y$t&FYsjJ&H1d%<%@u9w3%g9 zZ$9Tb(&NiMcV%+&hKYE|B{;M9kHSIYzTS}_v&#P+T*O0pIyoLtIw zhR|dVU>gRKRaoN65;+?* zj0`lKlEV*2g2){6nV~~d$BxY!i6MI%M_|aWB3glv4NpF!YkUYomQ(XcK54agrNhxi zkm1Ymdf83sa*!2E0A~WoqL*dxV~WHz5kcHC8Gn6gFziF)4cMxoRAu5y)5#LB_h!vWT&&As<*x82L14 zhv_{(S`3}{Or)3_JM%~4#7Nr9!syuuaXyIhFhI;6ARPF$FcO`~yPh*_mW5F_`EUq5yGj$O6eH{4Nt$Mts&VZv^~=CQ>h zoh*%>99pi0~cUAmI2= zvB^m@88rCj?Yjn=Pc*wfbO$Spp;V1VgRfq*@xi`kW8Dm)vvJ_!4ZC`qk2O!;asT}r zHr&7c{twme>Tc%x2pS+_AHsm|sO@fk4)?2Z2Qm<=`(X(9<}UH8l`yROkHUXpCSEt& z?1sSKVjW^v#yJE0UR~SO{34gFY#iY0W|GMK(Z+nk>vlcZEq)t{wcjZs>Qgr0drNAa zQM;>0e6Rly7f0NTr*tu-Z$@~KYejbTH76uwAAX0GhIy}E&V3`b$m}KVO9<}3=MGfb z{9a{4yjR~M*OBZ>HNT8dgWG$X)%AG$dX)|E76-XMZ)5GQ=2x3t8#e@e+k2XosKgN1 z;BIKuz&gjq9lJW3DZiU*d$|^5mx=j{K)d-FXt$WOrJ$4au%uwFB$a)ldSHoPq1k zxcQb)gw)zI+6zOU2eGExmP8c{HS399({M-K15^uP)Y*ZoUoa%IHJ4@CqoH z23YfbHlRD>>Z@-Kh0_!gL6(QOj!6T$GN8!#lj*;PgE8^|=F%fF82ZvP99LgH<4iDj zILt7X%hnwFMfWg>E2$C;S9hSWhg1d}a|pt9R5sDe)7g2*J_pIt_h|$dDjUG1@8vlQ z;3^+OBrDBP4L#Cb0xgRbnG69odMofB`l3W3j>ZV^Ha`R2<})AA0Vq$9SUZ4Vw|Y&t z2CUEta!ZXD)v%1q2Xm&t(;-isS zHlNV=&W+5{Ff=f$O#^iE(~v8*){&oqWyRHoWslO(hY;C(N=+lO_#1-A8lALa>HM9n zYubP;Rf?3_fGkph&>N##b%yE51laJ&ih|z7EJZHTv{?7`;*o)4jW)lKO5qCbAg0S?o2R>7*VDWpYJxJ`eN?M?qdCK3$n% zat82fXA^_ReA=s2Fqz-KF6Jtw4&CsEHgdB*2C%|s^<9NR?K0KDUbIrMO&Go7;iAz%1&i^Xlm;Dz*ed4 z)`eoNV(Iw0P^)yl4DGJ`^CGPS#7ZA}K9m(R6+l*Wn6WWdfZ7X!Sm_*rSk)L1t8Q|v zB#(`-N(V_(w#EclZG!W`tD1st_rkzc9oPR~z*XscBn>FX zoWNEyyNMa4E*M(1X)hRAm5J9lfK?eVp}$~URfbO4@+0Hxn7FDQNHngh&cszSUNY94 zjjLMPm(<9S8ER_&n6RpZo;E!Tt4?>x)bcZi+3Bu=>C=Wm)q=vo>2H~4dcFD6*j;%Zwy{o`6-KV{XYBZ=iEj_&-IXKDa^khMDx|>{1pAOj>plUv#>a-m87@G>+ zWV&P8`9M`S+lXiSnM7JLX=An|3exMrsSE;sG(RDqlt1%A;Z%P)++~51m?q6MFBDES zF_bj?qI{vJSblKBs@K~#JTool1J9JzQml)7e)YP0hS44g!QC&S88~H-yD%hmX8E85 zWV?h^&I<%lP0UZJ&?7^(^CO0by(lX9Ag9jGWTXKxQiWd)KSvT3z{lc zB>_H_OyX1d#%1=jU#S_Gyqf1lOl9edfb2x{n*;fZ`XxGp;lo6AG-B#a(R|KCOud*6 z8|5ZK%9pA|NN2uj3nz=1%3VrXv=sbPEMfg-I=?61SY5;HDK=2Mngpp->*7L+r-Gn@VRW^q!N z-pvb&nqS-tU+c2ujPy)_NM{aGCtf5UXG5g<8HjYId&bO}=YU9Orbw9`6m9hNHt)_X zMyBUONH5D5gf#yzLr7=L%>NT>;1{%2*OT3<`>M*xKMNks5qK0Ngw_84=a5l3Pg{1k z%HNgXk#ARj15)``P|LUQH&dgRa?g}~uhb=K28d)9WfY`QaLh9Pa))kx%HIBT_U|R? zZ5k02{%8JOqU3L~${G3h6QzB=5^jvn3L_>o^ zI{8cWOP(+uNcQo|3N=1LYbEKw;C75BhBtiD$*0xR@MBBA4$V$`o#NB{(!8NPs-G-P z(XQGF#aSIX^a=f|;G#0LM=Y0QH`$5LGwK;=x!NHULSmMbSeok*%ZWUaoRgLOwfZ#) zunFzR5R!OH>_;GYjZn|3XW_#kSbV>hiBIxp2+=b<{00K030U3H$vH*PK{?kSzu)Mj zBvsb$wM>}b5QYPy)S*nmUgL%UiR?KYSxUWXr{guQ5wJ+;bHYHql68C*$6w+2TV%#L ziIU>iILUi}yo)3C0XBVEk3Uk>B7}B4A>wJs>jfD76lW{>htVD{;_(wwug>Lea(&Huk)-@W%Zl3yv=}5sR&u`Vrm-Ygf2m>x>GGxEvluBT^L~yWFysn}g8clL90ZK2j9o^BXN@ zjxN{L{V3u-4X*)B!=4|Vye#-hTxjMqGVk`NO^&Os%0&-i)W~+_oV*+?5KWTlN z^c<6GJM=SBGbju8u)rCBLpt zT0bO}z1Fd$gC2<`_T)E!#(oIhLHrf-Fe}L}BwSBYJ;mMbEu9+r0z&H0XxZ zPnG;8?v|!MjJxcqvyyC;Pksx4&36AY?t=h8c9-^T+|!y~I=rOJ^mSL)2IQ7?ms&gQ z-bwA2^hk#|p!pmjxwZ*2iB&{KtY*PoVC-k#O>?pE2XnmXC&(ec_PQ~alKc^m6 zf8zUd>SewkQ7`fRs7mntdG#XSU?8q@{>fndHcWyRshiabwOrk)-mPv`H)K=}pxEjNw%T*!Ya#+VKCJcK3nwv!O|WHU&~~@wv^d@X)Rq_Z5mR?;~gD8C8VR{@yC<3SO}05M`>*>a}UDF zn;jExBv1Sl6$l2@797~31~GNE)(NAq3{4KJqazJ3w%tB1`49rkQshy`iz_h``{Pz^ zF5LKEEBCbtT}q|MKw6kTp02eXcXU|cC#7Sx(j9$|D^lg?fU4A}ef%`>yCrz-8kL`#2>*B;rGVWWh@fz-u4#x`B#89V?|z3@VHe!-FK8RPmk)bGxwk zlMbmD;H8AM!XR+r3KB(NqoQ&j^VD>usz`>B0Nyosv0Mc6l zvuI6aWtwzQ|A;wVnW{2s1cA1LQa7t4De17YqO!6ImNivL5~QNYEt;-L!<25a(ot0t zmC270twH6k5{{s;j%ZCyy0VwFq^nXjDoXRSgChgspRRCLR#nx&mE$9;EGUphbg+iQ zr3hiwSW%fVrK4621AdLFN)t1!l6X~BZzaO1NefRqFg%4h_YPFm)I^bdw68|hlZg5# zEK{0TW>=1e`uddkRi&f-nt8AGqtC!q5|FG)R}lp~jQZ$6jS+1aP^oAS$w}AC+$+_f z>bs&=eV=w6j4GZqrR30xrfLQWQ;+BxBxWnB8sJ@@Hr+5tTA8QuJJ=vI ztAU2s_+UN;r!=Wiget4kU5v@Kmwnng}mWL-=%+1wYs=+piA~e zh)bHOI3^?(IpqW9P3Xh{nWwoq(Nr_w8cfK96dhAPk9=q9*~RpM#P?@>hnWtC;^!i#v}@_)iO!Z9R}*9s8khO)2(I*D&}5S*k{v1C zvpM&ZOghV<@;D!7Nr9yITxn)XOPa^}xKNF|M&(FKS4wtd>dqH;nrf9EQSo}LzmbEm z$NUrdiG*nJ&rh6?1|vimP<>S%81hG}Q;r#YNEY}_(9>9~ui^vAFoK!O{(hTT$K zV+ZZ-QVnQJ4g8)bg447{)o}VeG(SN6i8DD&%2qhb`jJvyY_~!0h$DbsvK#z?LXDk%l2iC6hmog-~wt!$RF}%DOZNZLbY%!m@t`tOo%LW1c@>En5CSs z(W*z9Z){{+g&@_1G6F$=tL>W7%1m$DK03ug-6f^F_Nm@Bg}bOK91*X2g1GACb2^3faQ~71}Zg1H%b~B^(NKT-SrD)wR4<4)Fj?! z3$2U*Z#|=~k8BG+CzON{t?M{Nf6{u}Nbk|l9IW`Hl)n0!>S0{4bc@KgjM2X*t*@*9 zP~CL)hoCxPeS=GxPtiXgIwDJuGhN0^G51yvH&YrITmm=;d{~6R;s^MtJVKj8???QhZxFnhN81ws{Ur^@2$LD z#j@@dEDVe8b_IIh#d>j9bhineZ9->5Lz>XpCUmw5ovo*4LT5WmXN#ovSXr$tf~GmF zw?$aNiCBC3Mrv*mwuD8_(%d3o&XGL>7oxgFID<5@M^vphN_UIArW}zydqf=?p4;0h z;a{)4MbJ)RK3X;UtM#`CmI4vY^bJ$sxaU?mBNXLGDZEiS+&P)QQED8AtEdP%4^42K^m#deNPQUSmlbO zB4?{||Ec;T++DBz&Q#>SkKa+yqqCK`xJvCwMnD52$;kQCw;!tHo`ik40 zR0Pz5?_P+{qqglylVpq1PDM^f#@5>QSP>Qvv(1k{5}-RWhTaDCTgPfUd%E_VrMK;Q z+vrv>@@>zlJwtk1gav(gXWPJ8zk5#Z(V81{sXd2CHl)J&(8&K3!!^0&?b-x8I?GCiGDz!>2Q{`MFUk-(hzU6|z$-xC)T<%owf$mN;y1!GmpuH8Lui3{C z$N>d~Aau5|j(iLLCWqu-&eL?Q!(D`-j{WBnTT&rRNnaA@lR!ffR$0dh zZ6_dYC!Q4%SfzoTawQC*I-VXRF>cKP-jc3Cih`BIj($r(2v#pi3&2E&gIJU5aEC2m zW%Ut{4oLRNWvW99d$7aeQF6)$-0ZX^K&*@d1LT)cOXnlY1~slpJ3?6|lMn*nvSLK- zlraxku(Tz3ALyg-VbMu=h!2}9MJ6D3JW86y0!L6>nd5X5yqC3BP&)}Gt43n;VOO>c zHFjqjs}*yYK0mw9d3-=7?!zBU;v#nhfSQhqO4`;hhrrQHF;{>a+L;)JND%_r)kzrzkP4l20)x_Q1t_)aheOG;-Ezl* zOLHnDKUus~w|aq0C6HKk^^p}}GRbb6Hg+m9M&{?kPjf1T?PvhisMO&!hT5LtEHElH z2*mwDk<>|oqzd!%L#gnSw&@@Zf~M*k{rZ6FBmq=~`5TF-<_e;!nf`T$*_ z`Zy|f?FICxZh>2X&Ne0bl8gy!II*3 zPEEGp5I$o=km#_Q;`LxhxoL(YoB!*4nrnt8J|@ywfC4PnD8cCa=f)QcnDZ8N6`ZAy zYWGtGw%++UHK^ZD7JQxVHAVVW!HI%z@SHA?E~2wwFV8O*9548${ykRkEq?z*If(t{ z%lcP3W-K@D?Gw}36d^jK96x9OWo;|vw+p9zbmtX+ zR-BJtaAW-!e)I5<-y@dmH(#i~k)q)2LuYB#KYj1;7lu3^v)qTj_fJ)&&X?7T%6&FTS1ot<&ps0^zvPeVcgp?tTk9Wry1#YE_v@Cs|LI5SZ+-g#Gzj6L@bCj` zu6w)jS@n?enAf~_$EVt!?>;p|(QSFUpKtrrj`v<;ep3Cj%FQpiedCA!ecwx|fgzGX zD>wDhzJLGl#@kEso79JuXGU5D)5#db)D~`UQKmEO}hBX>+Y)k=;y!x+%dZve%6|F?78oM{-d>bU3cZh$2C=lnw(QO z|Muz+e&Q=X`rXNY*UY|1jKBNQS3dE<>f7fR<{Z>?FQ_TG=KNdN-q-YnCw_Hk@avjz zuQg@x(665OLeqU~Z=G-E{y|gzT20Bn;+i{ZKKRdH_+I-fz5l5x|I3=v`%3%wzVOc< zthwWwEApSwls{D$O?~^^8{Zq<^~o=P|Cv{Mex^x(VO`Yo$}`{p@+Wsi-+SZSw@-ai z(>|f5PM+z%e#Jf8|M4?l`@yeYIsKd_K448f{mQR@@U_qUYwAs& zw_dsEmiI>f_s2f_HHcHnm(p3o@QQk?QQSf z_<;{U^w_t5{Orq}scs!Xk9BdX^W|rM{O!jc`tS!fzW26kuQI3on-0^Yre5^6E9RHK z`|md1x97o!zxrL*Po7O2>Dyy{$ja$El6dwf-~H;8hacQ?-^RatclrD)-gePH=}-?~ zNOFn$%`>l@yX4l&wVUtT-Sp`%{Kxm6Z2$eM$NN5Geb&09@A#{~Z-4T8|M7)SH|@S} z^V-T=m(0C#=9{^YMM_@&I@C<(RBzEc1B;hd+_~m`TX*dK=)eBk7asrC_n&;~H-CKP z$f^GCvVUV{|EVLd{P8zWJ^B4_J^qD%``3@|-m&$4YwoOAx;XI8BJWhEU8chA7pmOI zop#C0%dRY$zxetaZ(ng&RrUL})P0~~_lH0BFU>6vfBuVK{f}>c=ZW~fpZxr(XP$lj zw|{u?rB@Di{Q1bS&XZl;J-vPX1IfWuI*r*H%Nf_D29pE*eZ4*1T_-z_9r<&|!B<{- z@ejX!{@G`q`uR`x#h>`jH~-_SU;O;TEzSS(u@CQV_(0v3_f=Qjwc_?0uU|aBt3N*(;T?R#*~rVUGP;Ms9`Ny)mvJ?rM*GiQED$@)2^rR(pRvoLti z{5cEPRxhZYH?Q=bHEY*Fc##ULttzVO)D~1QxjA|ZJF(U(Rh0RcVaz?z*DqVn);{~6 ziys!f)k|P;PTT38_egqN;-i%3Z=iI1{|7pau6Jm+i{J8|=c>NZvnJjDeBVDb?`e%{ z`pd;{@#4jy?OWEY+gQD=Xl-@PhRxSp+WAEM(xMIPuer2x-fbnfZ7Hw5cf*Yz*jl~( z1GleO_koS;7OuZEbnWED+ZSz*Y>8BFTT`?>vT1YeqV3mQx@LWJZS^9a#o2#pktW%; z@tRAo6OW=hZ(CMW9^G19H212qtIFoAE14fCnise#Ft2QW+1%MhWhEsG{3Stupkz+z zf<>iei%J({C2{GslX+acb^Sey?zmxTCPLn>x%A#`+qNw7`|IoLuc{AR72R6nFI~8B zp}(ZeUsg5;iaE9SZQizK`<%_Sm)T6Rd~T?&UAJ|^mTeoNn~Q|+nzhloZP#3SsYEpN zFO###mZ69?*IuP_dDXgT#J_#b7JungCH^7K1YC?%7L{+UUb8K_bwxC~=~_GQ%kGVC zi`L#7-BMJ(d~Q+YhRy4v^|g!rXA%#`KFp{3hBe!&uPrMnEtyj?Z%*mF6{V$%0ws&) z%`Yw~T~tysf{9Ie29MjK>o?qU-?@0eX5L61BPh@0L3yrUvu(`!I_nATe_WVIddY>6|IONLB8@63rmWk~Q=QBgyPPX1(eZz*D>RQ6g zn?Jj3UXafMJ_~2lu4b17=kmdA!Q9#N0wsJ(dB%M~V0PKU`LhEhrLzO23-~OYJ+F*U zpbR(o1WWip8Gb)l?m?qdHreMU%m z*#B>bLk1U)3^>B$%z)+5P0_8(>0Ya)=4oCdoX(^kC9=T$1@q_5o?EhTeu@63n1ZEc z_IH_fvA+Yj&nvZQ=FXN-LH$jUQe3$3jmz8x^GftL#mO^;$v4Fx3{W}b8+yJM%J%{& z`Ifi>R2BJ_SOQcb`6eviIxH1vZs}Zn<(t&(>npJ6r0uZqlRM z`gQ*5P1V%kZMD?$($PcD`gM!$iEfRo*>>%kEn7BiSf{%@|NA$u&x~1HvV+iK|1jwr zo$8@Th7v!jpC0l)yO9ogEz)g-;i&rBz+(TooJX{rVegyD%a?79-m_s-^|iHkgs(5U z>0RaXOBc?cKd0;}8s9nT-ssFTp5J!cxig-fEJPyyb4@a8x4rBA%s(>onNcFkhOAw2 z-3R6Ey=lR!-n;X7A~c?4wRRc zTsObuhNY#Y*Ug<DkBf>i;#`H9IZYv_a2CwyfD&TP>2m z=F+U_N6zV&HJm@FZPde8&1@jfj0alMP~CJ5p-<+_4igY+>M?= zj-373tTffwOlqU|Y^z_hwfedmYQg!ZwKl)e0mf#$?%p+(9z7>u_ced-||x z!|3v|T}KyVwnCp#?B||;*sdrRXf^&JwPtiALnZbGKb)DxH<-Q6ZX%L#iFHC;6XF_| z1ja=?QM)F@H7*H^i+G}TO^9n;5*QcpMD3ao*SI7wF5-#WH6gBXNnl*W6SZqXT;r0! zxQHie*MzvnC4q4fPt>jnag9p?<077@T@&IOmjuQ|JW;zQ#5FDnjEi`pc1?(DToM=; z@kH&K5ZAaQFfQVW+BG4raYXdD&(eNx(%oA}PrE=I=X zbD#S3kPG|Ap}C9iERCewP;-V|G*6Cx=ie5|$+`YH4~zG?d@Sp)@zb&p)@&$OPW@)@ zLeI4w?NV@+=r@xZ`!=#jY{1V;a5?&ZCnh`mq2xE z`Q~jSs>`&RP0_V$Hqke&+juKm$KJE))>>P{YSO)HYHy2*Xmlmi^Hcj&<9(5LkDcY6T}9WaOzi-CBK5 zR=)cE`fbrj#$PAnj+%S3{x3n0Q_J?%>a0kNQSrF7A4GY4Jo@FP8%D(Cso5H>+cL^2 zC#rWDR@24^bJ4q&3wL|lAn#Mx)NPA~t2ayYt6qk9#xQNe9k(wfY{=4(< zWWVo23H{I3rWc@RY19^EXmp0q8xg*IMWovj$+H+d5k=`7ca)<(Bcq0VxjLb2a_ zCb@23R|qqXV4)iiozTyAJDaARZ^Y}yTQ_WuI;j4U&D*xhcH%q#_O2q&(~N|ZXoFPr zHS21(+_rqFl#ybqagppfwmIo<#N6||U3$;Xxp7%h(Fnf_d3^J_EnAVYu?*tCdQL0h zc{k6S>bGqXcS-g1wHxJGk3`eAl0cr{D(*G*^K4CHKQEEz^^wg~aEGLM%lgQAdHyla zA9{bCRD9>HJnwn`hHB2ZcK(Lv%Qw|UHt;O-kLi)>HS~clk=fzo6*G>iSL9+qTVFMpwIL>v~Rz ziELT3nHip)X9=b9&f3qdo$asldXAtw-=mbR?ceooU1r85zZ`ZO4ms==eT4Z7b3NzB zhuzkGN~yMgQ0lF}A9lO^VWp<+R_fdBBl2^J)Rz%Q*KDX>ca;cq=-=xS3{j5#Fe1LI zB)*}&@I^P+O}I#E^*T)Upkm zYbfr`>o>?~TC`#Fs2%$wIQ)gdMsScvyI%8<|M|31 zW2oG2o%9}VQsL%wv%{|UJmaswM}0Y(cy-in(8Gc%zhgzwy1K3Jw@F;`<5rW^G;UBS z;LP32xKm}0DpNsqwOYb0EjKd;ui$3QzeA_Fmy2w+s(ST7PFLKcKB7LZ{#AWi#nk83 zm$*vw8>)?CoPWrrEBm=m;5qdNM(~52V9N#CD#^s#V@x&jjRM0o-eD9QWyS*ITH{^D zt;QY3-x_xtHO6M6&iJ6Q%lL@#FUF^h&lz7bzHWTi_@VK0<5$M-jF*i+8>fr`htqM9 zW4dFeW0u43Sm3zMaf@SxW3{8k@xL4&aO`$`%<+)p5yw{@-*)`avET8W<0Z!t$7!c> zPH|r1e7kdwbAhw`|FHKTa8(>%|2V$8TrMCecBM#%ORv(K73|oth8PPP1)_+=_)%hF z@JTU#G>ICG8e@wEjT(Ews8M6XhF!5lQAAPc+u|L6OE1)aOQGiT16 znK^T2=FFKHohY4QI^%Sv=*-gjLT8cAPdZz4_UW9^xukPfCs(IbCYQC4S;^dF!Ln|$ zL9)@Z$+B6puVhPQKg)K>j>#^`?#W)rc-_Xj=DIGrLAu>_hv>%YChMl^F4A46yHodf z-AvtwxAG4=b{&?7o|5!Z>nCZ z-uHT&_0sh&>OIse(Z~6y`ri5x`or|&^*_;Hq`y)Bkp4yeY<;CcQv-X0AcH7_F$U8O z<{PXr*k_Po@X$cns97ULqtHeJ8@=CXcB3VYwlw;^(XB@LhK7bVhJl9t3?~?VY`Dbm z7sHc=_Y6yonj1MAbv7Ddlw|a^(R!o9M%Rt<8#iw3(6~e6VU4FY{<`so#z!09XZlU+?NHhFGrU~F&P(fA$XkBk=??=a3V&TVSY)S+qTrlXq9YPziH z-lkWZ7B*|q%&S>cv$$qoHQU(ik7kdX>os?1-nIFd=5v~_Zho}+gBCh1Y+H10F}lU4 zE!MR7y~V?p@|KF0-CMrj^2?TKEzh-l(W-f?_N@lD`moiqRtH<%ZLQPVp>_AxlUmPj zy}k97)@5zlwdvSqY@5&9Y-w|`O>tYZwjJ7zZTm&rt!*>gmYG8Ro0a&zKjsvuGFD?t^yUw>#P{ z*P^vW2aESDzO^`H@x-!)Wtimz%Wo~yEpx0|S#`9UWVOWVnAHnwbL(!_N!F{Z&si&N z6gGowKC#(qbKAC&ZGi1K+iz`;*uJo{wCip6AG=LZ-#VyCij^U1z9e;AX>?C&zaGL0}-08eC=j`h|-g%jGh70H7=Q6=% zxyuDtU7QXR@A{MLRW~EIj&9T3Ho4t%Z|&a8{S)`y?$15!JcfBJ@HpYYd-{4#@?7J2 z)2q2x53f(W_IbVXcJ?0az0CWvPh+15pA?@xJ}=w5v>)4kMf+>MEqr_X&hu_87pKRh1Re-14e|?`8nitqFW4=3V(`Y`$03T4 zu_0?h9)#M2jtX5BdN<4}?A@>*!|sM#hmQ*XDg1s1+YVzotm}~7(W&G69XEG;-pRAm zlukQ46?YEmJhSuRE;?NzyL{2*T-WAZ2X$TA^-hFML~O*Sh!>H*kuxF>chl|Gv)h7h zSG%|CKDzsc?k{@y_n6t^SWly#19~p)dB2x)uPMFu_2zo_=>1LaTYc>N#P``9#YASH6*cOoQHAeyfA5F)UX1QMdhzI|V>*oacFdEp zp<@@0%^nvzZsEAcv7xcw#6B4xK7P^o+zFj0ES>Q3{ci8Ce7|^N)Wr1@g-Owqw#Mnl zy&JbTzIpt__+tqc2_Gh0_`v0Z)DP}X4x0SkUEoS?sL$ zW*tefO_`JO@Z-pjf1cfF_Qcs|Kk@uz;U@*3Mt{0*PP;iD&w21!{m+E|Irq8G=ih(Me=+8ZQ(t<1x#&yPSEIi=HP36_l6k_{ZsnIN%YK~jja<;v@?aKC^+mGxB*se)ruyL-$_iLi{Tf4yVT{<@yp#WpU&))dEv^SE7z`$xO(^6m}`%(PrCl{#4oPZ$23P;OU=N+|C-k!@63xKFCM;}@=|#9RlZ67`hxZaM+*BE z-YJSJQWk$vVp8&RX+Y_TvS?gZm8{ZJEm1qE_whaXTez=O5a${##nAu_1|)45ji8xk zf8dA46FQZ)9L#)XcDvVY61oMn=Z1+O}xXszr;o&5Xo9%|rUA{>wHt zG;G|YanmMEnzn4xq)AKqY0^@P(ySo}gu_fTePriH9oB~7nz1^~Sm8D_0*!=YY&fXY zB_$!N9Y*OOb244Ip1wgNL$-P#G|4*Jz@`iiH|*VQrdL0~f-nRRn7-H!c6 zwXm5y+gsjp!K!VYZ0%b0|Lr}W_ESE&&{@xZ;eZ$SUXD)mZT-{sPaV2^GjL4TBde$S zwYfOx{@7PL<{Z70^dLV%@$H(=e*Ny)_{@7S9 zT8&O@|I%Jg1n4>V9=Ql2R<{|`b&%iGvG>bKsG9;s1qs3p#z;p@vl%Y(D;&76yS>^N0?3iXzt^YUk~4%Xz?m6!wR`LEZvp?A5>Hp-TLV*c5`&FW4^7Fh?wxrvmpcA5 z&1d4wWdgH8V0y-FiZxz6Gq&vZrOEm7(fhu6nKsLDUH0iG6Rv-_vncf340ZCbyo=ZQ z)Q#$q-(5cS^lo&a_li}E=Us6>nbdYmtA5iQu6}vvV$qnGL*`dT&oC*9iYh&otG2!P z@RwH~j&i-eH7wDIU%hC4n;pM}Cv^KLU|_G$SN-^WP+`xfR|l2t{BF4Gj8{QJ7F|yr z(R0}KTiN&Hi!MzJTaht#8tw!WnBGIfkI(Q|CuMwa(`@{oQ6;9|3@>!?%Z*KP9nh{_ z;mB_Wk6pVyZqTxk^PZOVaZ`59%p8n6)_xnAuzGA#+K8l z&pG_tk>VTY^CpJIytD5aKd~Ts#)YPT>IJ8cwwt;6+QYzEb7gB^eRaUnH8ba4(EEm; z7mj}FyIirpaMrwqcRhpFS#%zH#>eVnSuG^m{k`1N9<0gU;e0Dr9y>7f(I+VZhj#7GOk3Hp=+dFB0}5vSwEp6uwMmn1 zotZRlVDEUN!rZ1a1No`p6T-XR+_lL(-Q(mBrQRp37JE3F40Q-GvGy1dRhT|mcIxA_ zcgE=57*YJ+;ytHPbBSLrf1db5-no&BdkKum@)_%=x_-UnX`hHuZf%E7YkYj;$q)A@ z-pLLs-gb6t?xD4_GA@?w8ags*^v0QnIr9$28oQN5CY4-|`03QiUs7A2P1v5EZ8o6j z`r|CV#hqiNmV+mMFl&3koo_BDY-+db;>|?M#DnvE7EGLQ^4g=B%XfQkoLH9f)7U%v z1?IxW{Q1`I(I(%SZ}Z+0vvJ$YQ|Wt;>f248+-Bu&mtcj}xRFVV{#17RW9Rdvg&B`- z-5k;T(Ao6W#anLX%r7~YbI|+B{lcsJ!`bs;=X>4mmN#munfG-izgnG85cBxE89$dT zzu+-`*M-ZICMVu0`|Z%i!;NqDalAc0B0eG;489=Y+WT8C7tWla4vJ1HjLBJ?*)wK- z;iv1bB`!1DU~JTC`}tWbSC35ExButcU^P{SDrw;L;eiLT8V8(-2-(}X?Sl;cqfNrR z%9;w8(mwC))#Bjc7c*Ke?Eap&likAZQNnphltKCVKR+p%fBNLgK6}iD`3Ihx@!6n3 z!}Tuhdiu_(O$m8x)*bmQV`fs=@xf159AE6WZqeL;**3e(%uf}E^UZSKJGEi?jGuo! zl)Gr^#?Ol~zqpe1;e&(?-+z1h1A&>5xpA{$%H17pygn~nGuB^zrLf7aGqcuy>$xp& z=1fIG+Wv7j+n%zVVVYI)?YFP8hHl77ADVA=+3mofnFEF#nHzWfMsl#(jnHWiFAK~Q zk9{jI4K3@THc#0xc=p_R%P($T?{w8L=u5+89U8lDzn^#E>YP)#32EOy{b;}I?U<5; z5|5!tGrJ%34-Vd7v??=b`SNC~_J04);_eeh>%{!`{OL)X+Bl!uRkpPNA|h_pfXn-g zBert6=7&~&u6+N~nPYbrEbViA;%*n0pryn2?oaP>;?JAP?-V8{k9D|eH0@$Y%mYF%kk{|6aN?HFTGwExAF_{0(pu)_a&y?X|S({q6 zDf>9^Owi7cmA1E_A?ek7pW(ZyA2kV^eU8p9e+WxZ}Qlo$qI#-TQIDrJwiBy{5E$ zUg)A$lnjjM{;7?<)!6)g_wFCc`SD&s!X}TL(#=QKuFuW9b|O10CE~d6*=?CY=}GQ? zoSYcyH@Yn4EWgsW;GOwf64I_k8R*xzAa@9$dVre$J!n*AP`N1=DQ$t3s&hLKl z$?X=-TjqarrEJvpANa*fhZOf)JJ;k|$zZkIH*37ocfVVKtJ?5oSZ4J4*vH@8ygX}L zVVmf8V)`E{Yq##km+z0hIYuvDY33N;H7cPjs^7}T{L+<~8JqPC#~E&qf3hcI#>%lJ zX=~3V&A)LWKI-PS{FG&B^EMT{v-0uPK~W{?j|X2lz47Fp?T0N+_#GJhKVkQFrX7jT z$niaN?3eter{D9l^Z)A8Ho+$o&3`CKjM)0{hnYjN)z`yDpZB!L9WggzC4l}p`j@47Jm zV}a@POWFH7Y?L==54v`Z-xU#T`6L|Rv%Yz3Rp`7=k!i7he%GPXmy{0O8M3SF`-@M_ zOozpc+$NL!R@?WgTUh4!=Iy@zxa`Z=7K*2h zKb&-WT<*r@Td#lg@lTr6s@9JJ!$2Titul&Xl7M2QOW}s(bX|bE|)T&&R`J zX0Tn{2R9z={n~fi4R{C8#V z_s&H9dihyFbjk+RoNv$GPF_=Rd&%DE?A~b+XM&EVot*l~*gZqe?shs`r1t2VxFobi z&f=(mX``Yuo&NZ3`)QMJgQj)d`RtdxnI`Tjy=Hi<-NMJtoORIhZhV^8@o`?qf7`k) z>(b`^;myvBJHBuK^1;1Lrbmq%?2;Gvd{Y~X-1)|N)*>c~4gJ12i=d(H&w_34MX=%85_?6B3H;>C6+2MF%-jh=H(2@^+iQC#@?fo6o z9&Ooc_ibtVl>@o)8!`=cz3kmKcl?R<_KW(y82NnHX|L_S`-Ala#y77ZXJ|>NV%^wV zLyP8`F0s#UVR7rUUYX^Edzt^eAu!=rcGzBzJ-=b)mNVi7yVI`vXYgC15v_QQ7mzIuY&<)G~y%G`Zpo@DjBmG>gqCv$7*%924>XAaHT{N#3U?%tH~ z2RBbI=o981(V?;R+B1coPfn&Si_6-+dq$DFP5S1PAuAqb4j#01#>t6o&zonrSUv2@ z&b1jc7H=pp?{(mv#hratJoT}-U8?(MbBnymo34$>xRBzXJ7}-bbpGY@rgE>}e_iXb zY<$^|*GsOSoxeCWq|`d_$U`Xy)=GWqS$DfGqJo&}sn^7CV_t&2Y%#HaM zGoP&6xMJD-`IjCa&uKSn_Qj`316z+8^WR7NZ)E*?DWS&>Q%I4m=Pw+Zf5C@uQ}E@E z?)D*_gAy_q6&O9A^B^<#L{4~JZXKnTgJHKyY`KY z?_K)g)>(rGJdSI!yN%5c^M~s_^Uv(PV(rRvm!8@O#|+N*e4H>K?&{S68U0Rr7VliI zvdpu*J=}J~)cfy_?H~2=w)9f_Wfx{`x%Z$T=jO_Jy-TMB7RQWDYZIQdC27SsueKJt zpHljcI}r8jjc3JIBhiixKZ@*i=4q3|>Bbgc4I6TE+5E>>13ws&7d`82`k15X7YoP7 zKH)DsR&Tm^Y`597CsD%1=a0({em6hI^rI_KSDoFJKF%cZ&NKgO#Z%SiZXDmf6ob-! zg9ctLb6#NFHRFRD{O%tfwKG3|E25j~QQ5b5ug0ZZ-H0j5@A<>JJC#k;TXk>Lohj>X z{qVD!NuXcQQ`1YQos!nGQ@?~F(Z-11JZg~v)3-wC~ta#moz zxp(u#m$*Be`R(bA#oK0OmnPidx0V>E`K-Gze0OyGk@mViZPx(DA0_b*<#abb+}n%#FM zmlGSCJvGGj^znf==Y7YnSD2m{FnVdg*mFOp-Z?HXpBCPXU0W8_Gxq1gd}m~^@6-`R z^EN-7e)io9X>P~o139Nhl8$h5sfxjtMnh2C( z-eb+m-`{5)H84;kv0hlcW^flI!%Shl#dp$8eLZ)AXtY6b*T9`;8mT^J7}&RIp7mT| z!O*F~L7u)rUcOdzF9n?{3>1vck8A~PKXT>x@BXM${w^AR09MXo5eZKg>*|&A!CF-0 zgLSB!502I1VBNV2+>|c;L02Z0gZLy3obiw3&FaUEil5NEe?)(LsK~!#d>69nxdqph z0O0VaG0Gx}n2r$xDq9~g5mUOyYwUEY8l`AsQTY;-Xpl1I5Mw8OcbOy^s7Tg$Kw7(L zix!Kxa2SzT#fAm6OwpRm5K<;0F=C3A7Q(Jgt*R*#<+Fc6g*6?;6w724y)ou- zk?5{e2HLV9kPe&a7tarI4Se-KS-ItUT{-JbI0qK6Z+gXx$Sg=3!D&Jkf3i*MtdSJeXdv5uJ_(HwAvN_?0f#5v^2l zMa>kz$tJ;`gz`UW`h+p`4W}=DCyt(~`4%l5CnbI`PV+6LHF^@o*M}4TC{E(|IKolR zXQPu62?zaAv#lskeYy~bE>M9l3uiEivO?BtWWd+)qH=kO>y*J_I^#Z^@&Uy?oOl=y zhB-_oRTY1(c(sH3l_@WIU2AQy{wLa!$D5`;8g(H`rIIJ&S=ecae+@2qJ*nKi#Zr<= zoTP?cmD2W>xT?IAM@^q1!dH~C0ez32^xh=Il~Ezk_k{RyAJR9R_&qUxVnXHb|Mgl( zlw@srEleiLPzzl@7N7W`(x*R?UUw^ML8k+G(x2Y3@>+ntR^umH#=eDG@Ts>JV3#U} zYk9q9Ej0RnqZY5mN$SJB89Yd+3>ayNw$SnUNvf=>Q!DJ7-9ClN=&PBN2K!!P&!+EHZ;5 zA>RhB6dp_dRvjERB5mr#D@qCPLmBybzNEz_G6k!DA zD?EwfLOgjqv&E+%h9e7z^&CDF`-S*qfSnN`9|n^Q zK?kUmdDtVsBP#xB0CUB}P)Gzoa6D2|i?IaYc`9OqdP+=>a>p{t^MVR5=&%ui0HB{1 zgI^)?d8EfG(fE`|Kv^DiND~FI$@`I*0HZvlO$vC_%%2hshv=SKAOu?Gfz}Izqad## zo5hmX5!52;5MJN`P+B5+|4!bJzbMh`xJRBiK+M>2#8;w{1m(@j-Y4Kqx6LC$HGipO z)d-`!oBG1nPf%TC2vn<=Q8-k8rKnLx^t&Vw zhvp#$aRfo0M@!UU zvQb}!An3kGC^4B-*px|vA#{%`!4MO@EUzVkAVPDHyF#S)09c5=S6Yq$4$2I%VHqG) zs8ebzJQz`lxReTb5QRW_DlLbg7=T6yah1gS)byxnlmJS}6rco9G-Avm4L!ugct^9R zCpG3mv2KgRf+gq@grG?yj7I@evsNo#Xr5YOAvIyD3W`xAhN5CYH8pk;D><4ci5n6x zE#hE}}5mxW*=!A8QbHm4PK)QyoN!AO3VaKUh0;QGQ1g^PiE2W|*lf4Dwyo#1-F z4Tc*7HyV!MXedJQdc*aEqXB6Eoarl++%vHz3K^w<91BHEKE72#sZb;oFt6}kjHgO? zj3>$w{>8#erbu|jl#2e3m@>RG@GlYam=fUyzVjKi@DOocAc-=eOvuIWbKr+i75;?F zLmetn-#LKEg_HaRz@QdT%jBN}94|5C{}Z^Mp>BBa;S=~j#vA!(kl@1~`DMcoX~7Q- z8h#Z25&RB{-weK$Rlc9%`%eHKMBCBv!pjpR_5jbLjM5A2g%LF`u#DFeV7m`*yk;ePfWxMJU}oSjf4tK5ua*?Lj)D0Oq2m-B(RkNUI2Dr%xAbX${B(1 zz$xX^zzYdr{*?w#FOZWaB+5}r_@4+_4p23tMxJ;)g)}}VjZw)*(hmBn*xynXaxsF zqOO6RQc*?XDWXSC#X(!BL$%>8^Zt)0TLp0qp7oxRz(SjPpqgCN*Fep zFru8KHw>F1)lozaF+3uH=a?uS$*YhJ(Lx`#+UN*ygguu)T#V(J1uCMpUA8^uHeUre+T^vGjHW=T-SFwqdf(ZG*3$U}Gm zEAkP=Gr9tk5E~uMgE;Uph~cBvF`MK9)xU zYAUuE9YjT3VjngkwwNdZ?r5o9Cd9__(Z!&Uk5R|638FlZa7pzP6I~Le6CD#1i!>5q zl`#SV5yLPEs#qaLjd)C~EH(j2pjzS0CkU}%t5_z62SE};CV(C$rWmxSVtGK4(2k$R;P0#c~NLR0NDVp(s{J;FA#(|J5l>a(;r4Oe}&ggsBpcIEfjGq$!RB zA}JvmLMVkO5)#-HB#j8kO7W9RNKWQcP`E&!!Y7viA(w*D6sSplLHJ0XA*x!FcQI#5 z`bYtFDamCCTylz(XmU{kldMW%#mq9wl#*lth|zg7$p}(|&=R~;6riQ-A~iM{XawX$ zm7tTHk|L&?qQ;j1Oe74bwhB^sj5g5BH3&ga3QAH)MqWr#BP#-es0}cDiVFFmq)>Z! z7g8v9JQ@)sFz~$4JZb31BPD_*94X3VwS=JvJ{aMM(A0OAF*$IrAW=%iUOivz)k{%i zXr2F#K>i(p{5t|c3;K5i^6v=b-x0{aBanYbApbuYfp}shLe59yeDNgxMMt;@ILs5o zCx-ZCRhbhLBMx({>FPVdHjJpU%(v1jAA;OCgUW6w`TvgyHE{%K%M$(xu%uC>a z8k%{9CxuZwOcsF~!?ij1q~W_1OaNs-ou>hPfu~Z8!eMgCy+KKy<25y@F5- z7@E-`3eqRdK^ddYhNfkXST&EcMFa?iUPLX32vEx?0{{^=lnY*^LV!{ryA+db!X)t@ z@wteZ$^?Fov$Zu%bABb^!#|-k8`EYWLmD&>LncX8EHMYMF|n^wM5W3u11~{a3qmO} zDx(}nl6H!X((sp7K}EdIqZvR≪#PL5YxVRMgtM5TwW@ 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 l@G^?d`F6wnra2wS+XZFm-X;UXv6z8Q|5SR!T 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 diff --git a/tools/SRB2Updater/Resources/Banner3.png b/tools/SRB2Updater/Resources/Banner3.png deleted file mode 100644 index 04713070a54b2d5bcc22c4a8390aa7bf7a89c19a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53400 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 K;3@=|kpB;HGj+uP diff --git a/tools/SRB2Updater/Resources/Kotaku.wav b/tools/SRB2Updater/Resources/Kotaku.wav deleted file mode 100644 index 49e7f613ae41723cbf17e1fbd062074d67a5d4ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243476 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 M~RrnSq^t3cg>x071((^d*P8tn(wo@wp^ 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 diff --git a/tools/SRB2Updater/Resources/Sonic.png b/tools/SRB2Updater/Resources/Sonic.png deleted file mode 100644 index a19cf225d4d8aec383152a7bff02f91e4ffe7d69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14237 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 U=R#}X{4+>SN?Ec_+&JX_0F&hk+5i9m diff --git a/tools/SRB2Updater/Resources/Srb2win.ico b/tools/SRB2Updater/Resources/Srb2win.ico deleted file mode 100644 index 0036a827a4625745397da1631e48101879a4f212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2238 zcmeHJJ#5-Q6#gi|ad5&Vrj83u3)pqB!xZ+Aju|_l&a6l**;w#UF;a{?;SLoO*~!$+;Pxqwa{+2!EbNT>2!e3 z1ifAl{eB<3+lBA@7!HRRkH_Gn5vJ2AzTe+d{D9ePhVD0x`FxHb2rzo!SS%Lk{^VFL zml*xxSglsrY&O_#x8R)9%=Wh5f&C8r?>kU_aRCNn@6rUj>IkDd2`HW@dB#`@w(7At z=Zd1Jgr;#jM(d?|-8ho?uDm92n=GUmOi`YfpCV&d+)K~!E#+ohB3;{ z!c{~`lT4@e%*uQW|d?Z1GbhXg&(j*Zucglk&T-84mLN(EvtmC!q&)iJ*rK)9HU1(>FD31J0jrp0dHRcmerWs-Mz36>`4LaQ=s-`|-a(GqAz{ diff --git a/tools/SRB2Updater/Resources/sonic_bottom.png b/tools/SRB2Updater/Resources/sonic_bottom.png deleted file mode 100644 index 42c17c78505a07e2e1e25acc4495c58f46667081..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10226 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 CLOnkK diff --git a/tools/SRB2Updater/Resources/sonic_top.png b/tools/SRB2Updater/Resources/sonic_top.png deleted file mode 100644 index 66d6fccaa00bd933548f8a0fee0b10c49983ec53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7000 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νyN-atR$HqL&?u$n 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 - - Debug - AnyCPU - 9.0.21022 - 2.0 - {2E2F67C6-8492-4034-A142-50872504D86D} - WinExe - Properties - SRB2Updater - srb2update - - - - - 2.0 - v2.0 - - - false - Srb2win.ico - SRB2Updater.Program - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - Form - - - Debug.cs - - - Form - - - Launcher.cs - - - - Form - - - Options.cs - - - - - Debug.cs - Designer - - - Launcher.cs - Designer - - - Options.cs - Designer - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - - False - .NET Framework Client Profile - false - - - False - .NET Framework 2.0 %28x86%29 - true - - - False - .NET Framework 3.0 %28x86%29 - false - - - False - .NET Framework 3.5 - false - - - False - .NET Framework 3.5 SP1 - false - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tools/SRB2Updater/SRB2Updater.sln b/tools/SRB2Updater/SRB2Updater.sln deleted file mode 100644 index f4e88dc64..000000000 --- a/tools/SRB2Updater/SRB2Updater.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SRB2Updater", "SRB2Updater.csproj", "{2E2F67C6-8492-4034-A142-50872504D86D}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2E2F67C6-8492-4034-A142-50872504D86D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2E2F67C6-8492-4034-A142-50872504D86D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2E2F67C6-8492-4034-A142-50872504D86D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2E2F67C6-8492-4034-A142-50872504D86D}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tools/SRB2Updater/ServerQuerier.cs b/tools/SRB2Updater/ServerQuerier.cs deleted file mode 100644 index 51b6940f6..000000000 --- a/tools/SRB2Updater/ServerQuerier.cs +++ /dev/null @@ -1,362 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Net; -using System.Net.Sockets; -using System.IO; - -namespace SRB2Updater -{ - class ServerQuerier - { - private UdpClient udpclient; - private IPEndPoint ipepMS; - - private const int MS_HOLEPUNCH_SIZE = 0; - private const int PT_ASKINFO_SIZE = 16; - private const byte PT_ASKINFO = 12; - private const byte PT_SERVERINFO = 13; - private const int MAXSERVERNAME = 32; - private const int MAX_WADPATH = 128; - - ///

- /// Constructs a ServerQuerier object. - /// - public ServerQuerier() - { - udpclient = new UdpClient(0, AddressFamily.InterNetwork); - - // Fix for WSAECONNRESET. Only affects Win2k and up. If I send a - // packet to a host which replies with an ICMP Port Unreachable, - // subsequent socket operations go doo-lally. So, we enable the - // older behaviour of ignoring these ICMP messages, since we don't - // care about them anyway. - if (Environment.OSVersion.Platform == PlatformID.Win32NT && - Environment.OSVersion.Version.Major >= 5) - { - const uint IOC_IN = 0x80000000; - const uint IOC_VENDOR = 0x18000000; - const uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12; - - udpclient.Client.IOControl(unchecked((int)SIO_UDP_CONNRESET), new byte[] { Convert.ToByte(false) }, null); - } - } - - public void StartListening(ServerInfoReceiveHandler sirh) - { - // Start listening. - udpclient.BeginReceive(new AsyncCallback(ServerInfoReceiveHandler.Receive), sirh); - } - - - /// - /// Sets the master server address. Necessary before querying via the MS. - /// - /// IP address of hostname of MS. - /// Port of MS. - public void SetMasterServer(string strAddress, ushort unPort) - { - IPAddress address = Dns.GetHostEntry(strAddress).AddressList[0]; - ipepMS = new IPEndPoint(address, unPort); - } - - public void Query(string strAddress, ushort unPort) - { - // Build the packet. - byte[] byPacket = new byte[PT_ASKINFO_SIZE]; - BinaryWriter bw = new BinaryWriter(new MemoryStream(byPacket)); - - bw.Seek(4, SeekOrigin.Begin); // Skip the checksum. - bw.Write((byte)0); // ack - bw.Write((byte)0); // ackreturn - bw.Write((byte)PT_ASKINFO); // Packet type. - bw.Write((byte)0); // Reserved. - bw.Write((byte)0); // Version. This is actually unnecessary -- the client will reply anyway. -MattW_CFI - bw.Write((byte)0); // Reserved. - bw.Write((byte)0); // Reserved. - bw.Write((byte)0); // Reserved. - // Time for ping calculation. - bw.Write(unchecked((uint)(DateTime.Now.Ticks / 10000))); - - // Calculate the checksum. - bw.Seek(0, SeekOrigin.Begin); - bw.Write(SRB2Checksum(byPacket)); - - // Send the packet. - udpclient.Send(byPacket, byPacket.Length, strAddress, unPort); - } - - /// - /// Calculates the checksum of an SRB2 packet. - /// - /// Packet. - /// Checksum. - private static uint SRB2Checksum(byte[] byPacket) - { - uint c = 0x1234567; - int i; - - for (i = 4; i < byPacket.Length; i++) - unchecked - { - c += (uint)byPacket[i] * (uint)(i - 3); - } - - return c; - } - - private static string ReadFixedLengthStr(BinaryReader br, int iLen) - { - String str = Encoding.ASCII.GetString(br.ReadBytes(iLen)); - int iPos = str.IndexOf("\0"); - if (iPos >= 0) - str = str.Remove(iPos); - - return str; - } - - public abstract class ServerInfoReceiveHandler - { - UdpClient udpclient; - IPEndPoint ipepRemote; - - /// - /// Called after a server info packet is received. - /// - /// Server info. - public abstract void ProcessServerInfo(SRB2ServerInfo srb2si); - public abstract void HandleException(Exception e); - - public ServerInfoReceiveHandler(ServerQuerier sq) - { - ipepRemote = new IPEndPoint(IPAddress.Any, 0); - - udpclient = sq.udpclient; - } - - public static void Receive(IAsyncResult ar) - { - ServerInfoReceiveHandler sirh = (ServerInfoReceiveHandler)ar.AsyncState; - - byte[] byPacket = sirh.udpclient.EndReceive(ar, ref sirh.ipepRemote); - - // Analyse the packet. - BinaryReader br = new BinaryReader(new MemoryStream(byPacket)); - - // Get the checksum. - uint uiChecksum = br.ReadUInt32(); - - // Skip ack and ackreturn and get packet type. - br.ReadBytes(2); - byte byPacketType = br.ReadByte(); - - // Only interested in valid PT_SERVERINFO packets. - if (byPacketType == PT_SERVERINFO && uiChecksum == SRB2Checksum(byPacket)) - { - bool bMalformed = true; - - // Skip padding. - br.ReadByte(); - - // Remember where we are. - long iPacketStart = br.BaseStream.Position; - - // Try to interpret the packet in each recognised format. - foreach (ServerInfoVer siv in Enum.GetValues(typeof(ServerInfoVer))) - { - SRB2ServerInfo srb2si; - byte byNumWads = 0; - - srb2si.siv = siv; - - br.BaseStream.Position = iPacketStart; - - // Get address from socket. - srb2si.strAddress = sirh.ipepRemote.Address.ToString(); - srb2si.unPort = unchecked((ushort)sirh.ipepRemote.Port); - - // Get version. - byte byVersion = br.ReadByte(); - - if (siv == ServerInfoVer.SIV_PREME) - { - br.ReadBytes(3); - - uint uiSubVersion = br.ReadUInt32(); - - // Format version. - // MattW_CFI: I hope you don't mind this exception, Oogaland, but 0.01.6 looks odd >_> - if (byVersion == 1 && uiSubVersion == 6) - srb2si.strVersion = "X.01.6"; - else - srb2si.strVersion = byVersion.ToString(); - //srb2si.strVersion = String.Format("{0}.{1:00}.{2}", byVersion / 100, byVersion % 100, uiSubVersion); - } - else - { - byte bySubVersion = br.ReadByte(); - - // Format version. - //srb2si.strVersion = String.Format("{0}.{1:00}.{2}", byVersion / 100, byVersion % 100, bySubVersion); - srb2si.strVersion = byVersion.ToString(); - } - - srb2si.byPlayers = br.ReadByte(); - srb2si.byMaxplayers = br.ReadByte(); - srb2si.byGametype = br.ReadByte(); - srb2si.bModified = (br.ReadByte() != 0); - - if (siv == ServerInfoVer.SIV_ME) - byNumWads = br.ReadByte(); - - srb2si.sbyAdminplayer = br.ReadSByte(); - - if (siv == ServerInfoVer.SIV_PREME) - br.ReadBytes(3); - - // Calculate ping. - srb2si.uiTime = unchecked((uint)((long)(DateTime.Now.Ticks / 10000 - br.ReadUInt32()) % ((long)UInt32.MaxValue + 1))); - - if (siv == ServerInfoVer.SIV_PREME) - br.ReadUInt32(); - - // Get and tidy map name. - if (siv == ServerInfoVer.SIV_PREME) - { - srb2si.strMapName = ReadFixedLengthStr(br, 8); - srb2si.strName = ReadFixedLengthStr(br, MAXSERVERNAME); - } - else - { - srb2si.strName = ReadFixedLengthStr(br, MAXSERVERNAME); - srb2si.strMapName = ReadFixedLengthStr(br, 8); - } - - if (siv == ServerInfoVer.SIV_PREME) - byNumWads = br.ReadByte(); - - // Create new list of strings of initial size equal to number of wads. - srb2si.listFiles = new List(byNumWads); - - // Get the files info. - byte[] byFiles = br.ReadBytes(siv == ServerInfoVer.SIV_PREME ? 4096 : 936); - BinaryReader brFiles = new BinaryReader(new MemoryStream(byFiles)); - - // Extract the filenames. - try - { - for (int i = 0; i < byNumWads; i++) - { - bool bFullString = false; - AddedWad aw = new AddedWad(); - - if (siv == ServerInfoVer.SIV_PREME) - { - aw.bImportant = brFiles.ReadByte() != 0; - aw.downloadtype = (DownloadTypes)brFiles.ReadByte(); - } - else - { - byte byFileStatus = brFiles.ReadByte(); - aw.bImportant = (byFileStatus & 0xF) != 0; - aw.downloadtype = (DownloadTypes)(byFileStatus >> 4); - } - - aw.uiSize = brFiles.ReadUInt32(); - - // Work out how long the string is. - int iStringPos = (int)brFiles.BaseStream.Position; - while (iStringPos < byFiles.Length && byFiles[iStringPos] != 0) iStringPos++; - - // Make sure it's not longer than the max name length. - if (iStringPos - (int)brFiles.BaseStream.Position > MAX_WADPATH) - { - bFullString = true; - iStringPos = MAX_WADPATH + (int)brFiles.BaseStream.Position; - } - - // Get the info and add it, if possible. - if (iStringPos > (int)brFiles.BaseStream.Position) - { - aw.strFilename = Encoding.ASCII.GetString(brFiles.ReadBytes(iStringPos - (int)brFiles.BaseStream.Position)); - srb2si.listFiles.Add(aw); - } - - // Skip nul. - if (!bFullString) brFiles.ReadByte(); - - // Skip the md5sum. - brFiles.ReadBytes(16); - } - - // Okay, done! Do something useful with the server info. - sirh.ProcessServerInfo(srb2si); - - // If we got this far without an exception, leave the foreach loop. - bMalformed = false; - break; - } - catch (EndOfStreamException) - { - // Packet doesn't match supposed type, so we swallow the exception - // and try remaining types. - } - catch (Exception e) - { - sirh.HandleException(e); - break; - } - } - - if (bMalformed) - sirh.HandleException(new Exception("Received invalid PT_SERVERINFO packet from " + sirh.ipepRemote.Address + ":" + sirh.ipepRemote.Port + ".")); - } - - // Resume listening. - sirh.ipepRemote = new IPEndPoint(IPAddress.Any, 0); - sirh.udpclient.BeginReceive(new AsyncCallback(Receive), sirh); - } - } - - public enum DownloadTypes - { - DT_TOOBIG = 0, - DT_OK = 1, - DT_DISABLED = 2 - } - - public struct AddedWad - { - public string strFilename; - public bool bImportant; - public uint uiSize; - public DownloadTypes downloadtype; - } - - public enum ServerInfoVer - { - SIV_PREME, - SIV_ME - }; - - public struct SRB2ServerInfo - { - public string strAddress; - public ushort unPort; - - public ServerInfoVer siv; - - public string strVersion; - public byte byPlayers; - public byte byMaxplayers; - public byte byGametype; - public bool bModified; - public sbyte sbyAdminplayer; - public uint uiTime; - public string strMapName; - public string strName; - - public List listFiles; - } - } -} diff --git a/tools/SRB2Updater/Settings.cs b/tools/SRB2Updater/Settings.cs deleted file mode 100644 index d72aeee51..000000000 --- a/tools/SRB2Updater/Settings.cs +++ /dev/null @@ -1,219 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections; -using System.Text; -using System.Data; -using Microsoft.Win32; -using System.Windows.Forms; -using System.IO; - -namespace SRB2Updater -{ - public class Settings - { - // Global Settings - public bool boolDisplayWindowed; - public bool boolDisplayCustomResolution; - public bool boolCloseOnStart; - public int intDisplayWidth; - public int intDisplayHeight; - public string strMSAddress; - public int intMSPort; - public Array arrWadList; - public string strParams; - - public string Params - { - get { return strParams; } - set { strParams = value; } - } - - public Array wadList - { - get { return arrWadList; } - set { arrWadList = value; } - } - - public bool CloseOnStart - { - get { return boolCloseOnStart; } - set { boolCloseOnStart = value; } - } - - public string msAddress - { - get { return strMSAddress; } - set { strMSAddress = value; } - } - - public int msPort - { - get { return intMSPort; } - set { intMSPort = value; } - } - - public bool displayWindowed - { - get { return boolDisplayWindowed; } - set { boolDisplayWindowed = value; } - } - - public bool displayCustom - { - get { return boolDisplayCustomResolution; } - set { boolDisplayCustomResolution = value; } - } - - public int displayWidth - { - get { return intDisplayWidth; } - set { intDisplayWidth = value; } - } - - public int displayHeight - { - get { return intDisplayHeight; } - set { intDisplayHeight = value; } - } - - bool boolShowDefaultWads; - public bool ShowDefaultWads - { - get { return boolShowDefaultWads; } - set { boolShowDefaultWads = value; } - } - - public void GetSettings() - { - RegistryKey rk = Registry.CurrentUser.CreateSubKey(@"Software\SonicTeamJunior\Launcher"); - RegistryKey rkDisplay = Registry.CurrentUser.CreateSubKey(@"Software\SonicTeamJunior\Launcher\Display"); - RegistryKey rkMS = Registry.CurrentUser.CreateSubKey(@"Software\SonicTeamJunior\Launcher\MasterServer"); - RegistryKey rkBinaries = rk.CreateSubKey("Binaries"); - rkBinaries.SetValue("2.0.4", Directory.GetCurrentDirectory() + "\\srb2win.exe"); - - try { boolDisplayCustomResolution = Convert.ToInt32(rkDisplay.GetValue("CustomResolution", 0)) != 0; } - catch { boolDisplayCustomResolution = false; } - try { boolDisplayWindowed = Convert.ToInt32(rkDisplay.GetValue("Windowed", 0)) != 0; } - catch { boolDisplayWindowed = false; } - try { boolShowDefaultWads = Convert.ToInt32(rkDisplay.GetValue("ShowDefaultWads", 0)) != 0; } - catch { boolShowDefaultWads = false; } - try { boolCloseOnStart = Convert.ToInt32(rkDisplay.GetValue("CloseOnStart", 0)) != 0; } - catch { boolCloseOnStart = false; } - intDisplayHeight = Convert.ToInt32(rkDisplay.GetValue("Height", "480")); - intDisplayWidth = Convert.ToInt32(rkDisplay.GetValue("Width", "640")); - intMSPort = Convert.ToInt32(rkMS.GetValue("Port", "28900")); - strMSAddress = Convert.ToString(rkMS.GetValue("Address", "ms.srb2.org")); - strParams = Convert.ToString(rk.GetValue("Params")); - - dicBinaries.Clear(); - foreach (string strName in rkBinaries.GetValueNames()) - dicBinaries[strName] = (string)rkBinaries.GetValue(strName); - - - rk.Close(); - rkDisplay.Close(); - rkMS.Close(); - rkBinaries.Close(); - } - - public void SaveSettings() - { - RegistryKey rk = Registry.CurrentUser.CreateSubKey(@"Software\SonicTeamJunior\Launcher"); - RegistryKey rkDisplay = rk.CreateSubKey("Display"); - RegistryKey rkMS = rk.CreateSubKey("MasterServer"); - rkDisplay.SetValue("CustomResolution", boolDisplayCustomResolution); - rkDisplay.SetValue("Windowed", boolDisplayWindowed); - rkDisplay.SetValue("Height", intDisplayHeight); - rkDisplay.SetValue("Width", intDisplayWidth); - rkMS.SetValue("Port", intMSPort); - rkMS.SetValue("Address", strMSAddress); - rkMS.SetValue("ShowDefaultWads", boolShowDefaultWads); - rk.SetValue("Params", strParams); - rk.SetValue("CloseOnStart", boolCloseOnStart); - - rk.DeleteSubKey("Binaries", false); - RegistryKey rkBinaries = rk.CreateSubKey("Binaries"); - rkBinaries.SetValue("2.0.4", Directory.GetCurrentDirectory() + "\\srb2win.exe"); - foreach (string strName in dicBinaries.Keys) - rkBinaries.SetValue(strName, dicBinaries[strName]); - - rk.Close(); - } - -/* public void WriteToRegistry() - { - RegistryKey rk = Registry.CurrentUser.CreateSubKey(@"Software\SRB2MSLauncher"); - - rk.SetValue("Params", strParams); - rk.SetValue("Masterserver", strMSAddress); - rk.SetValue("MSPort", unMSPort, RegistryValueKind.DWord); - rk.SetValue("ShowDefaultWads", Convert.ToInt32(bShowDefaultWads), RegistryValueKind.DWord); - - rk.DeleteSubKey("Binaries", false); - RegistryKey rkBinaries = rk.CreateSubKey("Binaries"); - foreach (string strName in dicBinaries.Keys) - rkBinaries.SetValue(strName, dicBinaries[strName]); - - rkBinaries.Close(); - rk.Close(); - } - - public void LoadFromRegistry() - { - RegistryKey rk = Registry.CurrentUser.CreateSubKey(@"Software\SRB2MSLauncher"); - RegistryKey rkBinaries = rk.CreateSubKey("Binaries"); - - strParams = (string)rk.GetValue("Params", ""); - strMSAddress = (string)rk.GetValue("Masterserver", "ms.srb2.org"); - - try { unMSPort = Convert.ToUInt16(rk.GetValue("MSPort", MS_DEFAULT_PORT)); } - catch { unMSPort = MS_DEFAULT_PORT; } - - try { bShowDefaultWads = Convert.ToInt32(rk.GetValue("ShowDefaultWads", 0)) != 0; } - catch { bShowDefaultWads = true; } - - dicBinaries.Clear(); - foreach (string strName in rkBinaries.GetValueNames()) - dicBinaries[strName] = (string)rkBinaries.GetValue(strName); - - rkBinaries.Close(); - rk.Close(); - }*/ - - - public List VersionStrings - { - get { return new List(dicBinaries.Keys); } - } - - public bool HasBinaryForVersion(string strVersion) - { - return dicBinaries.ContainsKey(strVersion) && dicBinaries[strVersion] != ""; - } - - public void AddBinariesToListView(ListView lv) - { - foreach (string strName in dicBinaries.Keys) - lv.Items.Add(new ListViewItem(new string[] { strName, dicBinaries[strName] })); - } - - public void SetBinariesFromListView(ListView lv) - { - dicBinaries.Clear(); - foreach (ListViewItem lvi in lv.Items) - dicBinaries[lvi.Text] = lvi.SubItems[1].Text; - } - - Dictionary dicBinaries = new Dictionary(); - - public void SetBinary(string strVersion, string strBinary) - { - dicBinaries[strVersion] = strBinary; - } - - public string GetBinary(string strVersion) - { - return dicBinaries[strVersion]; - } - } -} \ No newline at end of file diff --git a/tools/SRB2Updater/app.config b/tools/SRB2Updater/app.config deleted file mode 100644 index b7db28170..000000000 --- a/tools/SRB2Updater/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - From f0cd404234277c859a4e59303086f941f48d0237 Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sun, 17 Jul 2022 19:48:09 -0500 Subject: [PATCH 370/377] Remove unused djgpp patch SRB2 no longer works on DOS so this is irrelevant --- tools/djgpp/all313.dif | 812 ----------------------------------------- 1 file changed, 812 deletions(-) delete mode 100644 tools/djgpp/all313.dif diff --git a/tools/djgpp/all313.dif b/tools/djgpp/all313.dif deleted file mode 100644 index cdecf7d84..000000000 --- a/tools/djgpp/all313.dif +++ /dev/null @@ -1,812 +0,0 @@ -diff -ruN allegro.312/demo/alld/tmp.txt allegro.313/demo/alld/tmp.txt ---- allegro.312/demo/alld/tmp.txt Thu Jan 1 00:00:00 1970 -+++ allegro.313/demo/alld/tmp.txt Sat Feb 27 21:25:34 1999 -@@ -0,0 +1 @@ -+This file is needed because some unzip programs skip empty directories. -diff -ruN allegro.312/demo/alleg/tmp.txt allegro.313/demo/alleg/tmp.txt ---- allegro.312/demo/alleg/tmp.txt Thu Jan 1 00:00:00 1970 -+++ allegro.313/demo/alleg/tmp.txt Sat Feb 27 21:25:34 1999 -@@ -0,0 +1 @@ -+This file is needed because some unzip programs skip empty directories. -diff -ruN allegro.312/demo/allp/tmp.txt allegro.313/demo/allp/tmp.txt ---- allegro.312/demo/allp/tmp.txt Thu Jan 1 00:00:00 1970 -+++ allegro.313/demo/allp/tmp.txt Sat Feb 27 21:25:34 1999 -@@ -0,0 +1 @@ -+This file is needed because some unzip programs skip empty directories. -diff -ruN allegro.312/examples/alld/tmp.txt allegro.313/examples/alld/tmp.txt ---- allegro.312/examples/alld/tmp.txt Thu Jan 1 00:00:00 1970 -+++ allegro.313/examples/alld/tmp.txt Sat Feb 27 21:25:34 1999 -@@ -0,0 +1 @@ -+This file is needed because some unzip programs skip empty directories. -diff -ruN allegro.312/examples/alleg/tmp.txt allegro.313/examples/alleg/tmp.txt ---- allegro.312/examples/alleg/tmp.txt Thu Jan 1 00:00:00 1970 -+++ allegro.313/examples/alleg/tmp.txt Sat Feb 27 21:25:34 1999 -@@ -0,0 +1 @@ -+This file is needed because some unzip programs skip empty directories. -diff -ruN allegro.312/examples/allp/tmp.txt allegro.313/examples/allp/tmp.txt ---- allegro.312/examples/allp/tmp.txt Thu Jan 1 00:00:00 1970 -+++ allegro.313/examples/allp/tmp.txt Sat Feb 27 21:25:34 1999 -@@ -0,0 +1 @@ -+This file is needed because some unzip programs skip empty directories. -diff -ruN allegro.312/makefile allegro.313/makefile ---- allegro.312/makefile Sun Feb 21 00:31:48 1999 -+++ allegro.313/makefile Mon Jun 20 23:45:18 2005 -@@ -7,8 +7,10 @@ - # # - ################################################# - --# replace this definition if you are using PGCC --# PGCC=1 -+# remline this definition if need Allegro for 486 -+PGCC=1 -+ -+GCC=gcc-2 - - .PHONY: baddjgpp baddjdev badgcc badbnu badmake badtxi badpath badalleg - -@@ -22,23 +24,25 @@ - # check that the djdev package is installed - ifeq ($(wildcard $(DJDIR)/bin/djasm.exe),) - baddjdev: -- @echo Missing djgpp package! You need to install djdev201.zip (or whatever the -+ @echo Missing djgpp package! You need to install djdev203.zip (or whatever the - @echo latest version is). Download this from wherever you got djgpp, and unzip - @echo it into the root of your djgpp directory. - endif - - # check that the gcc package is installed --ifeq ($(wildcard $(DJDIR)/bin/gcc.exe),) -+ifeq ($(wildcard $(DJDIR)/bin/$(GCC).exe),) - badgcc: -- @echo Missing djgpp package! You need to install gcc2721b.zip (or whatever the -- @echo latest version is). Download this from wherever you got djgpp, and unzip -- @echo it into the root of your djgpp directory. -+ @echo Missing djgpp package! You need to install gcc2953b.zip. Download this -+ @echo from wherever you got djgpp, and unzip bin\gcc.exe , rename it as -+ @echo $(GCC).exe into the of your bin directory. - endif - -+GCC := @$(GCC) -+ - # check that the binutils package is installed - ifeq ($(wildcard $(DJDIR)/bin/ld.exe),) - badbnu: -- @echo Missing djgpp package! You need to install bnu27b.zip (or whatever the -+ @echo Missing djgpp package! You need to install bnu216b.zip (or whatever the - @echo latest version is). Download this from wherever you got djgpp, and unzip - @echo it into the root of your djgpp directory. - endif -@@ -46,7 +50,7 @@ - # check that the make package is installed - ifeq ($(wildcard $(DJDIR)/bin/make.exe),) - badmake: -- @echo Missing djgpp package! You need to install mak3761b.zip (or whatever the -+ @echo Missing djgpp package! You need to install mak3791b.zip (or whatever the - @echo latest version is). Download this from wherever you got djgpp, and unzip - @echo it into the root of your djgpp directory. - endif -@@ -54,7 +58,7 @@ - # check that the texinfo package is installed - ifeq ($(wildcard $(DJDIR)/bin/makeinfo.exe),) - badtxi: -- @echo Missing djgpp package! You need to install txi390b.zip (or whatever the -+ @echo Missing djgpp package! You need to install txi48b.zip (or whatever the - @echo latest version is). Download this from wherever you got djgpp, and unzip - @echo it into the root of your djgpp directory. If you do not need the Info - @echo documentation, run make all to ignore this error. -@@ -83,11 +87,32 @@ - endif - endif - -+# -------- check environment to see what type of library to build -------- -+ -+ifdef DEBUGMODE -+ -+# -------- build a debugging library -------- -+VERSION = alld -+ -+else -+ifdef PROFILEMODE -+ -+# -------- build a profiling library -------- -+VERSION = allp -+ -+else -+ -+# -------- build a release library -------- -+VERSION = alleg -+ -+endif -+endif -+ -+ - # set some useful paths --OBJ = obj/djgpp --DOBJ = obj\djgpp --LIB = lib/djgpp/liballeg.a --LIBDEST = $(DJDIR)/lib/liballeg.a -+LIB = lib$(VERSION).a -+OBJ = obj/djgpp/$(VERSION) -+LIBDEST = $(DJDIR)/lib/$(LIB) - INCDEST = $(DJDIR)/include/allegro.h - DOCDEST = $(DJDIR)/info/allegro.inf - INTERNAL_H = src/internal.h src/djgpp/interndj.h -@@ -113,19 +138,22 @@ - else - ifdef PROFILEMODE - # build with profiling information -+OFLAGS = -pg -O3 -ffast-math - ifdef PGCC --OFLAGS = -pg -mpentium -O6 -ffast-math -+OFLAGS := $(OFLAGS) -mcpu=pentium - else --OFLAGS = -pg -m486 -O3 -ffast-math -+OFLAGS := $(OFLAGS) -mcpu=i486 - endif - LFLAGS = -pg - -+ - else - # build a normal optimised version -+OFLAGS = -O3 -ffast-math -fomit-frame-pointer - ifdef PGCC --OFLAGS = -mpentium -O6 -ffast-math -fomit-frame-pointer -+OFLAGS := $(OFLAGS) -mcpu=pentium - else --OFLAGS = -m486 -O3 -ffast-math -fomit-frame-pointer -+OFLAGS := $(OFLAGS) -mcpu=i486 - endif - - ifdef SYMBOLMODE -@@ -179,9 +207,18 @@ - - .PHONY: all msg lib install uninstall docs clean veryclean mmxtest $(PROGRAMS) - --all: msg $(LIB) $(PROGRAMS) docs install -+all: msg lib/djgpp/$(LIB) $(PROGRAMS) docs - @echo All done. -- @echo To use Allegro, #include allegro.h and link with liballeg.a -+ifdef DEBUGMODE -+ @echo To install this version of Allegro, run make install DEBUGMODE=1 -+else -+ifdef PROFILEMODE -+ @echo To install this version of Allegro, run make install PROFILEMODE=1 -+else -+ @echo To install this version of Allegro, run make install -+endif -+endif -+ @echo To use Allegro, #include allegro.h and link with $(LIB) - @echo Example command line: gcc foobar.c -o foobar.exe -lalleg - @echo Run make compress to run DJP or UPX on the executable files - @echo Enjoy! -@@ -189,36 +226,36 @@ - msg: - @echo Compiling Allegro. Please wait... - --lib: $(LIB) -+lib: lib/djgpp/$(LIB) - - install: $(LIBDEST) $(INCDEST) $(DOCDEST) - - docs: $(DOCS) - --$(LIBDEST): $(LIB) -- copy lib\djgpp\liballeg.a $(subst /,\,$(LIBDEST)) -+$(LIBDEST): lib/djgpp/$(LIB) -+ cp lib/djgpp/$(LIB) $(LIBDEST) - - $(INCDEST): allegro.h -- copy allegro.h $(subst /,\,$(INCDEST)) -+ cp allegro.h $(INCDEST) - - $(DOCDEST): docs/allegro.inf - ifneq ($(wildcard $(DJDIR)/bin/makeinfo.exe),) -- copy docs\allegro.inf $(subst /,\,$(DOCDEST)) -+ cp docs\allegro.inf $(DOCDEST) - else - @echo makeinfo not installed: skipping copy of allegro.inf - endif - - $(OBJ)/%.o: %.c allegro.h -- gcc $(CFLAGS) -o $@ -c $< -+ $(GCC) $(CFLAGS) -o $@ -c $< - - $(OBJ)/%.o: %.S asmdefs.inc $(OBJ)/asmdef.inc -- gcc $(SFLAGS) -o $@ -c $< -+ $(GCC) $(SFLAGS) -o $@ -c $< - - $(OBJ)/%.o: %.s asmdefs.inc $(OBJ)/asmdef.inc -- gcc -x assembler-with-cpp $(SFLAGS) -o $@ -c $< -+ $(GCC) -x assembler-with-cpp $(SFLAGS) -o $@ -c $< - --*/%.exe: $(OBJ)/%.o $(LIB) -- gcc $(LFLAGS) -o $@ $< $(LIB) -+*/$(VERSION)/%.exe: $(OBJ)/%.o lib/djgpp/$(LIB) -+ $(GCC) $(LFLAGS) -o $@ $< lib/djgpp/$(LIB) - - docs/%.inf: docs/%.txi - ifneq ($(wildcard $(DJDIR)/bin/makeinfo.exe),) -@@ -252,38 +289,38 @@ - $(OBJ)/makedoc.exe -part -ascii THANKS docs/thanks._tx - - $(OBJ)/makedoc.exe: docs/makedoc.c -- gcc $(CFLAGS) $(LFLAGS) -o $@ docs/makedoc.c -+ $(GCC) $(CFLAGS) $(LFLAGS) -o $@ docs/makedoc.c - - $(OBJ)/asmdef.inc: $(OBJ)/asmdef.exe - $(OBJ)/asmdef.exe $(OBJ)/asmdef.inc - - $(OBJ)/asmdef.exe: src/asmdef.c allegro.h $(INTERNAL_H) -- gcc $(CFLAGS) $(LFLAGS) -o $@ src/asmdef.c -+ $(GCC) $(CFLAGS) $(LFLAGS) -o $@ src/asmdef.c - - mmxtest: -- @echo // no MMX > $(DOBJ)\mmx.h -- @echo .text > $(DOBJ)\mmxtest.s -- @echo emms >> $(DOBJ)\mmxtest.s -- @gcc -c $(OBJ)/mmxtest.s -o $(OBJ)/mmxtest.o -- @echo #define ALLEGRO_MMX > $(DOBJ)\mmx.h -+ @echo // no MMX > $(subst /,\,$(OBJ))\mmx.h -+ @echo .text > $(subst /,\,$(OBJ))\mmxtest.s -+ @echo emms >> $(subst /,\,$(OBJ))\mmxtest.s -+ @$(GCC) -c $(OBJ)/mmxtest.s -o $(OBJ)/mmxtest.o -+ @echo #define ALLEGRO_MMX > $(subst /,\,$(OBJ))\mmx.h - @echo Your assembler supports MMX instructions! - - $(OBJ)/mmx.h: - @echo Testing for MMX assembler support... - -$(MAKE) mmxtest - --$(OBJ)/setupdat.s $(OBJ)/setupdat.h: setup/setup.dat tools/dat2s.exe -- tools/dat2s.exe setup/setup.dat -o $(OBJ)/setupdat.s -h $(OBJ)/setupdat.h -+$(OBJ)/setupdat.s $(OBJ)/setupdat.h: setup/setup.dat tools/$(VERSION)/dat2s.exe -+ tools/$(VERSION)/dat2s.exe setup/setup.dat -o $(OBJ)/setupdat.s -h $(OBJ)/setupdat.h - - $(OBJ)/setupdat.o: $(OBJ)/setupdat.s -- gcc $(SFLAGS) -o $(OBJ)/setupdat.o -c $(OBJ)/setupdat.s -+ $(GCC) $(SFLAGS) -o $(OBJ)/setupdat.o -c $(OBJ)/setupdat.s - --setup/setup.exe: $(OBJ)/setup.o $(OBJ)/setupdat.o $(LIB) -- gcc $(LFLAGS) -o setup/setup.exe $(OBJ)/setup.o $(OBJ)/setupdat.o $(LIB) -+setup/$(VERSION)/setup.exe: $(OBJ)/setup.o $(OBJ)/setupdat.o lib/djgpp/$(LIB) -+ $(GCC) $(LFLAGS) -o setup/$(VERSION)/setup.exe $(OBJ)/setup.o $(OBJ)/setupdat.o lib/djgpp/$(LIB) - ifndef DEBUGMODE - ifndef SYMBOLMODE - ifneq ($(DJP),) -- $(DJP) setup/setup.exe -+ $(DJP) setup/$(VERSION)/setup.exe - endif - endif - endif -@@ -301,79 +338,79 @@ - endif - - $(OBJ)/plugins.h: $(wildcard tools/plugins/*.inc) -- copy tools\plugins\*.inc $(DOBJ)\plugins.h -+ cat tools/plugins/*.inc > $(OBJ)/plugins.h - --tools/dat.exe: $(OBJ)/dat.o $(DATEDIT_DEPS) $(LIB) -- gcc $(LFLAGS) -o tools/dat.exe $(OBJ)/dat.o $(DATEDIT_LINK) $(LIB) -+tools/$(VERSION)/dat.exe: $(OBJ)/dat.o $(DATEDIT_DEPS) lib/djgpp/$(LIB) -+ $(GCC) $(LFLAGS) -o tools/$(VERSION)/dat.exe $(OBJ)/dat.o $(DATEDIT_LINK) lib/djgpp/$(LIB) - --tools/dat2s.exe: $(OBJ)/dat2s.o $(DATEDIT_DEPS) $(LIB) -- gcc $(LFLAGS) -o tools/dat2s.exe $(OBJ)/dat2s.o $(DATEDIT_LINK) $(LIB) -+tools/$(VERSION)/dat2s.exe: $(OBJ)/dat2s.o $(DATEDIT_DEPS) lib/djgpp/$(LIB) -+ $(GCC) $(LFLAGS) -o tools/$(VERSION)/dat2s.exe $(OBJ)/dat2s.o $(DATEDIT_LINK) lib/djgpp/$(LIB) - --tools/grabber.exe: $(OBJ)/grabber.o $(DATEDIT_DEPS) $(LIB) -- gcc $(LFLAGS) -o tools/grabber.exe $(OBJ)/grabber.o $(DATEDIT_LINK) $(LIB) -+tools/$(VERSION)/grabber.exe: $(OBJ)/grabber.o $(DATEDIT_DEPS) lib/djgpp/$(LIB) -+ $(GCC) $(LFLAGS) -o tools/$(VERSION)/grabber.exe $(OBJ)/grabber.o $(DATEDIT_LINK) lib/djgpp/$(LIB) - --tools/pat2dat.exe: $(OBJ)/pat2dat.o $(DATEDIT_DEPS) $(LIB) -- gcc $(LFLAGS) -o tools/pat2dat.exe $(OBJ)/pat2dat.o $(DATEDIT_LINK) $(LIB) -+tools/$(VERSION)/pat2dat.exe: $(OBJ)/pat2dat.o $(DATEDIT_DEPS) lib/djgpp/$(LIB) -+ $(GCC) $(LFLAGS) -o tools/$(VERSION)/pat2dat.exe $(OBJ)/pat2dat.o $(DATEDIT_LINK) lib/djgpp/$(LIB) - --$(LIB): $(LIB_OBJS) -- ar rs $(LIB) $(LIB_OBJS) -+lib/djgpp/$(LIB): $(LIB_OBJS) -+ ar rs lib/djgpp/$(LIB) $(LIB_OBJS) - - compress: $(PROGRAMS) - ifneq ($(DJP),) -- $(DJP) demo/*.exe examples/*.exe tests/*.exe tools/*.exe setup/keyconf.exe obj/djgpp/*.exe -+ $(DJP) demo/$(VERSION)/*.exe examples/$(VERSION)/*.exe tests/$(VERSION)/*.exe tools/$(VERSION)/*.exe setup/$(VERSION)/keyconf.exe $(OBJ)*.exe - else - @echo No executable compressor found! This target requires either the - @echo DJP or UPX utilities to be installed in your djgpp bin directory. - endif - - clean: -- -rm -v obj/djgpp/*.* lib/djgpp/*.* docs/*.$(HTML) docs/*.txi docs/*.inf docs/*.rtf -+ -rm -f -v $(OBJ)/*.* lib/djgpp/*.* docs/*.$(HTML) docs/*.txi docs/*.inf docs/*.rtf - - veryclean: clean -- -rm -v allegro.txt AUTHORS CHANGES faq.txt help.txt NEWS THANKS \ -- demo/*.exe examples/*.exe setup/*.exe tests/*.exe tools/*.exe -+ -rm -f -v allegro.txt AUTHORS CHANGES faq.txt help.txt NEWS THANKS \ -+ demo/$(VERSION)/*.exe examples/$(VERSION)/*.exe setup/$(VERSION)/*.exe tests/$(VERSION)/*.exe tools/$(VERSION)/*.exe - - uninstall: -- -rm $(LIBDEST) -- -rm $(INCDEST) -- -rm $(DOCDEST) -+ -rm -f $(LIBDEST) -+ -rm -f $(INCDEST) -+ -rm -f $(DOCDEST) - @echo All gone! (sulk) - --demo: demo/demo.exe --keyconf: setup/keyconf.exe --setup: setup/setup.exe --afinfo: tests/afinfo.exe --akaitest: tests/akaitest.exe --digitest: tests/digitest.exe --mathtest: tests/mathtest.exe --miditest: tests/miditest.exe --play: tests/play.exe --playfli: tests/playfli.exe --test: tests/test.exe --vesainfo: tests/vesainfo.exe --colormap: tools/colormap.exe --dat: tools/dat.exe --dat2s: tools/dat2s.exe --exedat: tools/exedat.exe --grabber: tools/grabber.exe --pack: tools/pack.exe --pat2dat: tools/pat2dat.exe --rgbmap: tools/rgbmap.exe -- --examples: examples/ex1.exe examples/ex2.exe examples/ex3.exe \ -- examples/ex4.exe examples/ex5.exe examples/ex6.exe \ -- examples/ex7.exe examples/ex8.exe examples/ex9.exe \ -- examples/ex10.exe examples/ex11.exe examples/ex12.exe \ -- examples/ex13.exe examples/ex14.exe examples/ex15.exe \ -- examples/ex16.exe examples/ex17.exe examples/ex18.exe \ -- examples/ex19.exe examples/ex20.exe examples/ex21.exe \ -- examples/ex22.exe examples/ex23.exe examples/ex24.exe \ -- examples/ex25.exe examples/ex26.exe examples/ex27.exe \ -- examples/ex28.exe examples/ex29.exe examples/ex30.exe \ -- examples/ex31.exe examples/ex32.exe examples/ex33.exe \ -- examples/ex34.exe examples/ex35.exe examples/ex36.exe \ -- examples/ex37.exe examples/ex38.exe examples/ex39.exe \ -- examples/ex40.exe -+demo: demo/$(VERSION)/demo.exe -+keyconf: setup/$(VERSION)/keyconf.exe -+setup: setup/$(VERSION)/setup.exe -+afinfo: tests/$(VERSION)/afinfo.exe -+akaitest: tests/$(VERSION)/akaitest.exe -+digitest: tests/$(VERSION)/digitest.exe -+mathtest: tests/$(VERSION)/mathtest.exe -+miditest: tests/$(VERSION)/miditest.exe -+play: tests/$(VERSION)/play.exe -+playfli: tests/$(VERSION)/playfli.exe -+test: tests/$(VERSION)/test.exe -+vesainfo: tests/$(VERSION)/vesainfo.exe -+colormap: tools/$(VERSION)/colormap.exe -+dat: tools/$(VERSION)/dat.exe -+dat2s: tools/$(VERSION)/dat2s.exe -+exedat: tools/$(VERSION)/exedat.exe -+grabber: tools/$(VERSION)/grabber.exe -+pack: tools/$(VERSION)/pack.exe -+pat2dat: tools/$(VERSION)/pat2dat.exe -+rgbmap: tools/$(VERSION)/rgbmap.exe -+ -+examples: examples/$(VERSION)/ex1.exe examples/$(VERSION)/ex2.exe examples/$(VERSION)/ex3.exe \ -+ examples/$(VERSION)/ex4.exe examples/$(VERSION)/ex5.exe examples/$(VERSION)/ex6.exe \ -+ examples/$(VERSION)/ex7.exe examples/$(VERSION)/ex8.exe examples/$(VERSION)/ex9.exe \ -+ examples/$(VERSION)/ex10.exe examples/$(VERSION)/ex11.exe examples/$(VERSION)/ex12.exe \ -+ examples/$(VERSION)/ex13.exe examples/$(VERSION)/ex14.exe examples/$(VERSION)/ex15.exe \ -+ examples/$(VERSION)/ex16.exe examples/$(VERSION)/ex17.exe examples/$(VERSION)/ex18.exe \ -+ examples/$(VERSION)/ex19.exe examples/$(VERSION)/ex20.exe examples/$(VERSION)/ex21.exe \ -+ examples/$(VERSION)/ex22.exe examples/$(VERSION)/ex23.exe examples/$(VERSION)/ex24.exe \ -+ examples/$(VERSION)/ex25.exe examples/$(VERSION)/ex26.exe examples/$(VERSION)/ex27.exe \ -+ examples/$(VERSION)/ex28.exe examples/$(VERSION)/ex29.exe examples/$(VERSION)/ex30.exe \ -+ examples/$(VERSION)/ex31.exe examples/$(VERSION)/ex32.exe examples/$(VERSION)/ex33.exe \ -+ examples/$(VERSION)/ex34.exe examples/$(VERSION)/ex35.exe examples/$(VERSION)/ex36.exe \ -+ examples/$(VERSION)/ex37.exe examples/$(VERSION)/ex38.exe examples/$(VERSION)/ex39.exe \ -+ examples/$(VERSION)/ex40.exe - - $(OBJ)/demo.o: demo.h - $(OBJ)/adlib.o: fm_instr.h -diff -ruN allegro.312/obj/djgpp/alld/tmp.txt allegro.313/obj/djgpp/alld/tmp.txt ---- allegro.312/obj/djgpp/alld/tmp.txt Thu Jan 1 00:00:00 1970 -+++ allegro.313/obj/djgpp/alld/tmp.txt Sat Feb 27 21:25:34 1999 -@@ -0,0 +1 @@ -+This file is needed because some unzip programs skip empty directories. -diff -ruN allegro.312/obj/djgpp/alleg/tmp.txt allegro.313/obj/djgpp/alleg/tmp.txt ---- allegro.312/obj/djgpp/alleg/tmp.txt Thu Jan 1 00:00:00 1970 -+++ allegro.313/obj/djgpp/alleg/tmp.txt Sat Feb 27 21:25:34 1999 -@@ -0,0 +1 @@ -+This file is needed because some unzip programs skip empty directories. -diff -ruN allegro.312/obj/djgpp/allp/tmp.txt allegro.313/obj/djgpp/allp/tmp.txt ---- allegro.312/obj/djgpp/allp/tmp.txt Thu Jan 1 00:00:00 1970 -+++ allegro.313/obj/djgpp/allp/tmp.txt Sat Feb 27 21:25:34 1999 -@@ -0,0 +1 @@ -+This file is needed because some unzip programs skip empty directories. -diff -ruN allegro.312/obj/djgpp/tmp.txt allegro.313/obj/djgpp/tmp.txt ---- allegro.312/obj/djgpp/tmp.txt Sat Feb 27 21:25:34 1999 -+++ allegro.313/obj/djgpp/tmp.txt Thu Jan 1 00:00:00 1970 -@@ -1 +0,0 @@ --This file is needed because some unzip programs skip empty directories. -diff -ruN allegro.312/setup/alld/tmp.txt allegro.313/setup/alld/tmp.txt ---- allegro.312/setup/alld/tmp.txt Thu Jan 1 00:00:00 1970 -+++ allegro.313/setup/alld/tmp.txt Sat Feb 27 21:25:34 1999 -@@ -0,0 +1 @@ -+This file is needed because some unzip programs skip empty directories. -diff -ruN allegro.312/setup/alleg/tmp.txt allegro.313/setup/alleg/tmp.txt ---- allegro.312/setup/alleg/tmp.txt Thu Jan 1 00:00:00 1970 -+++ allegro.313/setup/alleg/tmp.txt Sat Feb 27 21:25:34 1999 -@@ -0,0 +1 @@ -+This file is needed because some unzip programs skip empty directories. -diff -ruN allegro.312/setup/allp/tmp.txt allegro.313/setup/allp/tmp.txt ---- allegro.312/setup/allp/tmp.txt Thu Jan 1 00:00:00 1970 -+++ allegro.313/setup/allp/tmp.txt Sat Feb 27 21:25:34 1999 -@@ -0,0 +1 @@ -+This file is needed because some unzip programs skip empty directories. -diff -ruN allegro.312/src/asmdefs.inc allegro.313/src/asmdefs.inc ---- allegro.312/src/asmdefs.inc Sat Feb 20 20:51:22 1999 -+++ allegro.313/src/asmdefs.inc Sun Jun 19 04:18:44 2005 -@@ -41,8 +41,8 @@ - * %eax. Registers will be unchanged, except %eax will return a pointer - * to the start of the selected scanline. - */ --#define WRITE_BANK() call BMP_WBANK(%edx) --#define READ_BANK() call BMP_RBANK(%edx) -+#define WRITE_BANK() call *BMP_WBANK(%edx) -+#define READ_BANK() call *BMP_RBANK(%edx) - - - /* Helper macro for looking up a position in the pattern bitmap. Passed -diff -ruN allegro.312/src/djgpp/gpro.c allegro.313/src/djgpp/gpro.c ---- allegro.312/src/djgpp/gpro.c Sat Feb 20 22:01:28 1999 -+++ allegro.313/src/djgpp/gpro.c Mon Jun 20 21:23:42 2005 -@@ -53,135 +53,79 @@ - */ - static int read_gpp(int pad_num) - { -- char samples[60]; -- char clock_mask, data_mask; -- int ret; -- -- asm ( -- " cmpb $0, %0 ; " -- " jne 14f ; " -- " movb $0x10, %b2 ; " -- " movb $0x20, %b3 ; " -- " jmp 15f ; " -- " 14: " -- " movb $0x40, %b2 ; " -- " movb $0x80, %b3 ; " -- -- " 15: " -- " xorl %%ebx, %%ebx ; " -- " xorl %%edi, %%edi ; " -- " movw $0x201, %%dx ; " -- -- " cli ; " -- " inb %%dx, %%al ; " -- " movb %%al, %%ah ; " -- -- " 4: " -- " xorl %%ecx, %%ecx ; " -- " 0: " -- " inb %%dx, %%al ; " -- " cmpb %%ah, %%al ; " -- " jne 1f ; " -- " incl %%ecx ; " -- " cmpl $255, %%ecx ; " -- " jl 0b ; " -- -- " 1: " -- " cmpl $255, %%ecx ; " -- " je 16f ; " -- -- " testb %%ah, %b2 ; " -- " jz 2f ; " -- " testb %%al, %b2 ; " -- " jnz 2f ; " -- -- " addl %4, %%edi ; " -- " testb %%al, %b3 ; " -- " jz 3f ; " -- " movb $1, (%%edi) ; " -- " jmp 12f ; " -- " 3: " -- " movb $0, (%%edi) ; " -- " 12: " -- " subl %4, %%edi ; " -- " incl %%edi ; " -- -- " 2: " -- " movb %%al, %%ah ; " -- " cmpl $200, %%ebx ; " -- " je 13f ; " -- " incl %%ebx ; " -- " cmpl $50, %%edi ; " -- " jl 4b ; " -- -- " 13: " -- " sti ; " -- " xorl %%ecx, %%ecx ; " -- " movl $1, %%esi ; " -- " 7: " -- " addl %4, %%esi ; " -- " movb (%%esi), %%dl ; " -- " subl %4, %%esi ; " -- " cmpb $1, %%dl ; " -- " jg 16f ; " -- " jne 6f ; " -- " incl %%ecx ; " -- " jmp 5f ; " -- " 6: " -- " xorl %%ecx, %%ecx ; " -- -- " 5: " -- " cmpl $5, %%ecx ; " -- " je 8f ; " -- " cmpl %%edi, %%esi ; " -- " je 8f ; " -- " incl %%esi ; " -- " jmp 7b ; " -- -- " 8: " -- " cmpl $5, %%ecx ; " -- " jne 16f ; " -- " addl $2, %%esi ; " -- " xorl %%eax, %%eax ; " -- " xorl %%ebx, %%ebx ; " -- " xorl %%ecx, %%ecx ; " -- " xorl %%edx, %%edx ; " -- -- " 10: " -- " incl %%ecx ; " -- " cmpl $5, %%ecx ; " -- " jne 11f ; " -- " movl $1, %%ecx ; " -- " incl %%esi ; " -- " 11: " -- " addl %4, %%esi ; " -- " movb (%%esi), %%dl ; " -- " subl %4, %%esi ; " -- " orl %%edx, %%eax ; " -- " shll $1, %%eax ; " -- " cmpl $13, %%ebx ; " -- " je 9f ; " -- " incl %%ebx ; " -- " incl %%esi ; " -- " jmp 10b ; " -- -- " 16: " -- " movl $1, %%eax ; " -- -- " 9: " -- " sti ; " -- -- : "=a" (ret) -- -- : "0" (pad_num), -- "m" (clock_mask), -- "m" (data_mask), -- "m" (samples) -+ int samples[50]; -+ int clock_mask, data_mask, data, old_data; -+ int num_samples, timeout1, timeout2, sample_pos, c; -+ -+ if (pad_num == 0) { -+ clock_mask = 0x10; -+ data_mask = 0x20; -+ } -+ else { -+ clock_mask = 0x40; -+ data_mask = 0x80; -+ } -+ -+ num_samples = 0; -+ timeout1 = 0; -+ -+ asm volatile ("cli"); -+ -+ old_data = inportb(0x201); -+ data = 0; -+ -+ while (num_samples<50) { -+ for (timeout2=0; timeout2<255; timeout2++) { -+ data = inportb(0x201); -+ if (data != old_data) -+ break; -+ } -+ -+ if (timeout2 == 255) { -+ asm volatile ("sti"); -+ return 1; -+ } -+ -+ if ((old_data & clock_mask) && (!(data & clock_mask))) { -+ samples[num_samples] = (data & data_mask) ? 1 : 0; -+ num_samples++; -+ } -+ -+ old_data = data; -+ -+ if (timeout1++ == 200) -+ break; -+ } -+ -+ asm volatile ("sti"); -+ -+ c = 0; -+ -+ for (sample_pos=1; sample_posgs), - "=m" (sregs->ss) - -- : /* no inputs */ -- -- : "%eax" /* clobbers %eax */ - ); - } - -diff -ruN allegro.312/src/gfx15.s allegro.313/src/gfx15.s ---- allegro.312/src/gfx15.s Sat Feb 20 20:50:30 1999 -+++ allegro.313/src/gfx15.s Mon Jun 20 22:46:02 2005 -@@ -367,9 +367,9 @@ - movl BMP_CT(%edx), %esi /* clip y1 */ - - vline_y1_ok: -- cmpw BMP_CB(%edx), %ecx /* test y2, bmp->cb */ -+ cmpw BMP_CB(%edx), %cx /* test y2, bmp->cb */ - jl vline_noclip -- cmpw BMP_CB(%edx), %esi /* test y1, bmp->cb */ -+ cmpw BMP_CB(%edx), %si /* test y1, bmp->cb */ - jge vline_done - movl BMP_CB(%edx), %ecx /* clip y2 */ - decl %ecx -diff -ruN allegro.312/src/gfx16.s allegro.313/src/gfx16.s ---- allegro.312/src/gfx16.s Sat Feb 20 20:50:42 1999 -+++ allegro.313/src/gfx16.s Mon Jun 20 22:47:28 2005 -@@ -417,9 +417,9 @@ - movl BMP_CT(%edx), %esi /* clip y1 */ - - vline_y1_ok: -- cmpw BMP_CB(%edx), %ecx /* test y2, bmp->cb */ -+ cmpw BMP_CB(%edx), %cx /* test y2, bmp->cb */ - jl vline_noclip -- cmpw BMP_CB(%edx), %esi /* test y1, bmp->cb */ -+ cmpw BMP_CB(%edx), %si /* test y1, bmp->cb */ - jge vline_done - movl BMP_CB(%edx), %ecx /* clip y2 */ - decl %ecx -diff -ruN allegro.312/src/gfx24.s allegro.313/src/gfx24.s ---- allegro.312/src/gfx24.s Sat Feb 20 20:46:30 1999 -+++ allegro.313/src/gfx24.s Mon Jun 20 22:48:22 2005 -@@ -265,7 +265,7 @@ - movl %eax, ARG2 /* ARG2 == 12(%ebp) */ - movl %eax, 15(%ebp) /* overwrite ARG2, ARG3, ARG4 */ - movl %eax, 18(%ebp) -- movw %eax, 21(%ebp) -+ movw %ax, 21(%ebp) - shrl $16, %eax - movb %al, 23(%ebp) - cmpl $4, %ecx -@@ -503,9 +503,9 @@ - movl BMP_CT(%edx), %esi /* clip y1 */ - - vline_y1_ok: -- cmpw BMP_CB(%edx), %ecx /* test y2, bmp->cb */ -+ cmpw BMP_CB(%edx), %cx /* test y2, bmp->cb */ - jl vline_noclip -- cmpw BMP_CB(%edx), %esi /* test y1, bmp->cb */ -+ cmpw BMP_CB(%edx), %si /* test y1, bmp->cb */ - jge vline_done - movl BMP_CB(%edx), %ecx /* clip y2 */ - decl %ecx -diff -ruN allegro.312/src/gfx32.s allegro.313/src/gfx32.s ---- allegro.312/src/gfx32.s Sat Feb 20 20:50:40 1999 -+++ allegro.313/src/gfx32.s Mon Jun 20 22:48:44 2005 -@@ -398,9 +398,9 @@ - movl BMP_CT(%edx), %esi /* clip y1 */ - - vline_y1_ok: -- cmpw BMP_CB(%edx), %ecx /* test y2, bmp->cb */ -+ cmpw BMP_CB(%edx), %cx /* test y2, bmp->cb */ - jl vline_noclip -- cmpw BMP_CB(%edx), %esi /* test y1, bmp->cb */ -+ cmpw BMP_CB(%edx), %si /* test y1, bmp->cb */ - jge vline_done - movl BMP_CB(%edx), %ecx /* clip y2 */ - decl %ecx -diff -ruN allegro.312/src/gfx8.s allegro.313/src/gfx8.s ---- allegro.312/src/gfx8.s Sat Feb 20 20:50:54 1999 -+++ allegro.313/src/gfx8.s Mon Jun 20 22:49:02 2005 -@@ -455,9 +455,9 @@ - movl BMP_CT(%edx), %esi /* clip y1 */ - - vline_y1_ok: -- cmpw BMP_CB(%edx), %ecx /* test y2, bmp->cb */ -+ cmpw BMP_CB(%edx), %cx /* test y2, bmp->cb */ - jl vline_noclip -- cmpw BMP_CB(%edx), %esi /* test y1, bmp->cb */ -+ cmpw BMP_CB(%edx), %si /* test y1, bmp->cb */ - jge vline_done - movl BMP_CB(%edx), %ecx /* clip y2 */ - decl %ecx -diff -ruN allegro.312/tests/alld/tmp.txt allegro.313/tests/alld/tmp.txt ---- allegro.312/tests/alld/tmp.txt Thu Jan 1 00:00:00 1970 -+++ allegro.313/tests/alld/tmp.txt Sat Feb 27 21:25:34 1999 -@@ -0,0 +1 @@ -+This file is needed because some unzip programs skip empty directories. -diff -ruN allegro.312/tests/alleg/tmp.txt allegro.313/tests/alleg/tmp.txt ---- allegro.312/tests/alleg/tmp.txt Thu Jan 1 00:00:00 1970 -+++ allegro.313/tests/alleg/tmp.txt Sat Feb 27 21:25:34 1999 -@@ -0,0 +1 @@ -+This file is needed because some unzip programs skip empty directories. -diff -ruN allegro.312/tests/allp/tmp.txt allegro.313/tests/allp/tmp.txt ---- allegro.312/tests/allp/tmp.txt Thu Jan 1 00:00:00 1970 -+++ allegro.313/tests/allp/tmp.txt Sat Feb 27 21:25:34 1999 -@@ -0,0 +1 @@ -+This file is needed because some unzip programs skip empty directories. -diff -ruN allegro.312/tools/alld/tmp.txt allegro.313/tools/alld/tmp.txt ---- allegro.312/tools/alld/tmp.txt Thu Jan 1 00:00:00 1970 -+++ allegro.313/tools/alld/tmp.txt Sat Feb 27 21:25:34 1999 -@@ -0,0 +1 @@ -+This file is needed because some unzip programs skip empty directories. -diff -ruN allegro.312/tools/alleg/tmp.txt allegro.313/tools/alleg/tmp.txt ---- allegro.312/tools/alleg/tmp.txt Thu Jan 1 00:00:00 1970 -+++ allegro.313/tools/alleg/tmp.txt Sat Feb 27 21:25:34 1999 -@@ -0,0 +1 @@ -+This file is needed because some unzip programs skip empty directories. -diff -ruN allegro.312/tools/allp/tmp.txt allegro.313/tools/allp/tmp.txt ---- allegro.312/tools/allp/tmp.txt Thu Jan 1 00:00:00 1970 -+++ allegro.313/tools/allp/tmp.txt Sat Feb 27 21:25:34 1999 -@@ -0,0 +1 @@ -+This file is needed because some unzip programs skip empty directories. From 7a5f1dec9e0197679232ba3ada3aa8330b9bf29d Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sun, 17 Jul 2022 19:48:49 -0500 Subject: [PATCH 371/377] Remove DJGPP GDB stub Once more, SRB2 no longer works on DOS so this is irrelevant --- tools/gdbst03/Makefile | 83 -- tools/gdbst03/announce | 27 - tools/gdbst03/include/i386-stub.h | 43 - tools/gdbst03/install | 20 - tools/gdbst03/license | 454 ------- tools/gdbst03/makefile.cfg | 67 - tools/gdbst03/readme | 171 --- tools/gdbst03/src/demo/crc_16.c | 46 - tools/gdbst03/src/demo/makefile | 42 - tools/gdbst03/src/demo/serdbg.c | 102 -- tools/gdbst03/src/include/crc.h | 20 - tools/gdbst03/src/include/i386-supp.h | 30 - tools/gdbst03/src/library/bios_layer.h | 137 --- tools/gdbst03/src/library/dzc_layer.h | 169 --- tools/gdbst03/src/library/i386-stub.c | 1555 ------------------------ tools/gdbst03/src/library/i386-supp.c | 424 ------- tools/gdbst03/src/library/makefile | 30 - tools/gdbst03/src/library/sva_layer.h | 83 -- 18 files changed, 3503 deletions(-) delete mode 100644 tools/gdbst03/Makefile delete mode 100644 tools/gdbst03/announce delete mode 100644 tools/gdbst03/include/i386-stub.h delete mode 100644 tools/gdbst03/install delete mode 100644 tools/gdbst03/license delete mode 100644 tools/gdbst03/makefile.cfg delete mode 100644 tools/gdbst03/readme delete mode 100644 tools/gdbst03/src/demo/crc_16.c delete mode 100644 tools/gdbst03/src/demo/makefile delete mode 100644 tools/gdbst03/src/demo/serdbg.c delete mode 100644 tools/gdbst03/src/include/crc.h delete mode 100644 tools/gdbst03/src/include/i386-supp.h delete mode 100644 tools/gdbst03/src/library/bios_layer.h delete mode 100644 tools/gdbst03/src/library/dzc_layer.h delete mode 100644 tools/gdbst03/src/library/i386-stub.c delete mode 100644 tools/gdbst03/src/library/i386-supp.c delete mode 100644 tools/gdbst03/src/library/makefile delete mode 100644 tools/gdbst03/src/library/sva_layer.h diff --git a/tools/gdbst03/Makefile b/tools/gdbst03/Makefile deleted file mode 100644 index 5279e5b55..000000000 --- a/tools/gdbst03/Makefile +++ /dev/null @@ -1,83 +0,0 @@ -# -# Makefile for GDB Stub for DJGPP/Mingw 0.3 source distribution -# -# Copyright 2000 by Jonathan Brogdon -# - -include Makefile.cfg - -default: - @$(ECHO) Welcome to GDB Stub for DJGPP & Mingw 0.3 source distribution! - @$(ECHO) To make the GDB stub type: - @$(ECHO) make all - Make library and demo programs - @$(ECHO) make library - Make only library - @$(ECHO) make demo - Make demo program - @$(ECHO) make install - Install library and header files - @$(ECHO) make uninstall - Uninstall library and header files - @$(ECHO) make clean - Remove .o files - @$(ECHO) make distclean - Remove ready binaries and .o files - @$(ECHO) make dep - Make dependences - -# Inform make of phony targets -.PHONY: library demo clean blankdep dep distclean install - -all: dep library demo - @$(ECHO) Library and demo program created - -./lib/libgdbst.a: - @mkdir -p lib - @make -s -C ./src/library all - -library: ./lib/libgdbst.a - @$(ECHO) Library created - -demo: ./lib/libgdbst.a - @mkdir -p demo - @make -s -C ./src/demo all - @$(ECHO) Demo program created - -clean: - @make -s -C ./src/library clean - @make -s -C ./src/demo clean - @$(ECHO) Clean complete - -blankdep: -# Create blank depend.dep files to avoid errors - @$(ECHOBLANK) > ./src/library/depend.dep - @$(ECHOBLANK) > ./src/demo/depend.dep - -# Now carry on as usual -dep: blankdep - @make -s -C ./src/library dep - @make -s -C ./src/demo dep - @$(ECHO) Created dependency files - -# Blank all the dependencies too -distclean: blankdep - @make -s -C ./src/library distclean - @make -s -C ./src/demo distclean - @$(RM) -r ./demo/ - @$(RM) -r ./lib/ - @$(ECHO) Cleaned up files - -install: library -ifdef DJGPP - @cp lib/*.a $(DJDIR)/lib - @ginstall -d $(DJDIR)/include - @cp include/*.h $(DJDIR)/include - @$(ECHO) GDB Stub Library for DJGPP installed -endif - -uninstall: -ifdef DJGPP - @$(RM) $(DJDIR)/lib/libgdb.a - @$(RM) $(DJDIR)/include/i386-stub.h - @$(ECHO) GDB Stub Library for DJGPP uninstalled -ifdef DJGPP - - - - - - - diff --git a/tools/gdbst03/announce b/tools/gdbst03/announce deleted file mode 100644 index ac976b644..000000000 --- a/tools/gdbst03/announce +++ /dev/null @@ -1,27 +0,0 @@ -GDB Stub for DJGPP 0.1 Announcement -=================================== - -GDB Stub for DJGPP Copyright 2000 by Jonathan Brogdon - -Hello. - - I'd like to announce the GDB Stub for DJGPP for DJGPP, the latest version of -a GDB stub for DJGPP targets. The GDB Stub for DJGPP conforms to the GNU GDB stub -interface as specified in the GDB User's Manual. It allows for debugging of a -DJGPP target remotely over a serial link with GDB. - - It comes with an example program for demonstrating remote debugging of -DJGPP targets, and documentation (man and HTML pages). - - The GDB Stub for DJGPP is distributed under the GNU Library General Public License -(LGPL). - - If you have any questions relating to libsocket, please mail me and I'll -be happy to help. - - Thanks, - - Jonathan Brogdon - - - June 29th 2000 diff --git a/tools/gdbst03/include/i386-stub.h b/tools/gdbst03/include/i386-stub.h deleted file mode 100644 index 092a3dfc6..000000000 --- a/tools/gdbst03/include/i386-stub.h +++ /dev/null @@ -1,43 +0,0 @@ -/**************************************************************************** - * - * i386-stub.h - * - * Description: Data definitions and constants for low level - * GDB server support. - * - * Terms of use: This software is provided for use under the terms - * and conditions of the GNU General Public License. - * 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., 59 Temple Place - * Suite 330, Boston, MA 02111-1307, USA. - * - * Credits: Created by Jonathan Brogdon - * - * History - * Engineer: Date: Notes: - * --------- ----- ------ - * Jonathan Brogdon 20000617 Genesis - * Gordon Schumacher 20020212 Updated for modularity - * - ****************************************************************************/ -#ifndef _GDBSTUB_H_ -#define _GDBSTUB_H_ - - -#ifdef __cplusplus -extern "C" { -#endif -extern int gdb_serial_init(unsigned int port, unsigned int speed); -extern void gdb_target_init(void); -extern void gdb_target_close(void); - -extern void set_debug_traps(void); -extern void restore_traps(void); -extern void breakpoint(void); -#ifdef __cplusplus -} -#endif - - -#endif /* _GDBSTUB_H_ */ diff --git a/tools/gdbst03/install b/tools/gdbst03/install deleted file mode 100644 index b92c39c04..000000000 --- a/tools/gdbst03/install +++ /dev/null @@ -1,20 +0,0 @@ -The makefile contains the information about the target products -available. - -Note: Makefile.cfg contains macros for various tools used during -the build process. Of particular note: some folks use the echo.exe -that is available from the DJGPP (or other) site(s). Others may not -have installed this, and therefore calls to echo during the build -will use the built-in DOS echo command. When attempting to echo a -blank line, the arguments to these two echo commands are different. -Therefore, makefile.cfg contains the macro ECHOBLANK. Please set -this macro according to the needs of your environment. If you change -this in makefile.cfg, it will be picked up by all other project -makefiles. - -Type 'make' to see a list of targets. When the 'install' -target is made, the libgdb.a will be copied into your $(DJDIR)/lib -directory. In addition, the i386-stub.h file will be copied into -your $(DJDIR)/include directory. The uninstall target will remove -these files. - diff --git a/tools/gdbst03/license b/tools/gdbst03/license deleted file mode 100644 index 4356f26ed..000000000 --- a/tools/gdbst03/license +++ /dev/null @@ -1,454 +0,0 @@ - -GNU LIBRARY GENERAL PUBLIC LICENSE -********************************** - - Version 2, June 1991 - - Copyright (C) 1991 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - [This is the first released version of the library GPL. It is - numbered 2 because it goes with version 2 of the ordinary GPL.] - -Preamble -======== - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Library General Public License, applies to some -specially designated Free Software Foundation software, and to any -other libraries whose authors decide to use it. You can use it for -your libraries, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it in -new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the library, or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link a program with the library, you must provide -complete object files to the recipients so that they can relink them -with the library, after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - Our method of protecting your rights has two steps: (1) copyright -the library, and (2) offer you this license which gives you legal -permission to copy, distribute and/or modify the library. - - Also, for each distributor's protection, we want to make certain -that everyone understands that there is no warranty for this free -library. If the library is modified by someone else and passed on, we -want its recipients to know that what they have is not the original -version, so that any problems introduced by others will not reflect on -the original authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that companies distributing free -software will individually obtain patent licenses, thus in effect -transforming the program into proprietary software. To prevent this, -we have made it clear that any patent must be licensed for everyone's -free use or not licensed at all. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License, which was designed for utility -programs. This license, the GNU Library General Public License, -applies to certain designated libraries. This license is quite -different from the ordinary one; be sure to read it in full, and don't -assume that anything in it is the same as in the ordinary license. - - The reason we have a separate public license for some libraries is -that they blur the distinction we usually make between modifying or -adding to a program and simply using it. Linking a program with a -library, without changing the library, is in some sense simply using -the library, and is analogous to running a utility program or -application program. However, in a textual and legal sense, the linked -executable is a combined work, a derivative of the original library, -and the ordinary General Public License treats it as such. - - Because of this blurred distinction, using the ordinary General -Public License for libraries did not effectively promote software -sharing, because most developers did not use the libraries. We -concluded that weaker conditions might promote sharing better. - - However, unrestricted linking of non-free programs would deprive the -users of those programs of all benefit from the free status of the -libraries themselves. This Library General Public License is intended -to permit developers of non-free programs to use free libraries, while -preserving your freedom as a user of such programs to change the free -libraries that are incorporated in them. (We have not seen how to -achieve this as regards changes in header files, but we have achieved -it as regards changes in the actual functions of the Library.) The -hope is that this will lead to faster development of free libraries. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, while the latter only -works together with the library. - - Note that it is possible for a library to be covered by the ordinary -General Public License rather than by this special one. - - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library which - contains a notice placed by the copyright holder or other - authorized party saying it may be distributed under the terms of - this Library General Public License (also called "this License"). - Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data - prepared so as to be conveniently linked with application programs - (which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work - which has been distributed under these terms. A "work based on the - Library" means either the Library or any derivative work under - copyright law: that is to say, a work containing the Library or a - portion of it, either verbatim or with modifications and/or - translated straightforwardly into another language. (Hereinafter, - translation is included without limitation in the term - "modification".) - - "Source code" for a work means the preferred form of the work for - making modifications to it. For a library, complete source code - means all the source code for all modules it contains, plus any - associated interface definition files, plus the scripts used to - control compilation and installation of the library. - - Activities other than copying, distribution and modification are - not covered by this License; they are outside its scope. The act - of running a program using the Library is not restricted, and - output from such a program is covered only if its contents - constitute a work based on the Library (independent of the use of - the Library in a tool for writing it). Whether that is true - depends on what the Library does and what the program that uses - the Library does. - - 1. You may copy and distribute verbatim copies of the Library's - complete source code as you receive it, in any medium, provided - that you conspicuously and appropriately publish on each copy an - appropriate copyright notice and disclaimer of warranty; keep - intact all the notices that refer to this License and to the - absence of any warranty; and distribute a copy of this License - along with the Library. - - You may charge a fee for the physical act of transferring a copy, - and you may at your option offer warranty protection in exchange - for a fee. - - 2. You may modify your copy or copies of the Library or any portion - of it, thus forming a work based on the Library, and copy and - distribute such modifications or work under the terms of Section 1 - above, provided that you also meet all of these conditions: - - a. The modified work must itself be a software library. - - b. You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c. You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d. If a facility in the modified Library refers to a function or - a table of data to be supplied by an application program that - uses the facility, other than as an argument passed when the - facility is invoked, then you must make a good faith effort - to ensure that, in the event an application does not supply - such function or table, the facility still operates, and - performs whatever part of its purpose remains meaningful. - - (For example, a function in a library to compute square roots - has a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function - must be optional: if the application does not supply it, the - square root function must still compute square roots.) - - These requirements apply to the modified work as a whole. If - identifiable sections of that work are not derived from the - Library, and can be reasonably considered independent and separate - works in themselves, then this License, and its terms, do not - apply to those sections when you distribute them as separate - works. But when you distribute the same sections as part of a - whole which is a work based on the Library, the distribution of - the whole must be on the terms of this License, whose permissions - for other licensees extend to the entire whole, and thus to each - and every part regardless of who wrote it. - - Thus, it is not the intent of this section to claim rights or - contest your rights to work written entirely by you; rather, the - intent is to exercise the right to control the distribution of - derivative or collective works based on the Library. - - In addition, mere aggregation of another work not based on the - Library with the Library (or with a work based on the Library) on - a volume of a storage or distribution medium does not bring the - other work under the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public - License instead of this License to a given copy of the Library. - To do this, you must alter all the notices that refer to this - License, so that they refer to the ordinary GNU General Public - License, version 2, instead of to this License. (If a newer - version than version 2 of the ordinary GNU General Public License - has appeared, then you can specify that version instead if you - wish.) Do not make any other change in these notices. - - Once this change is made in a given copy, it is irreversible for - that copy, so the ordinary GNU General Public License applies to - all subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of - the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or - derivative of it, under Section 2) in object code or executable - form under the terms of Sections 1 and 2 above provided that you - accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software - interchange. - - If distribution of object code is made by offering access to copy - from a designated place, then offering equivalent access to copy - the source code from the same place satisfies the requirement to - distribute the source code, even though third parties are not - compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the - Library, but is designed to work with the Library by being - compiled or linked with it, is called a "work that uses the - Library". Such a work, in isolation, is not a derivative work of - the Library, and therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library - creates an executable that is a derivative of the Library (because - it contains portions of the Library), rather than a "work that - uses the library". The executable is therefore covered by this - License. Section 6 states terms for distribution of such - executables. - - When a "work that uses the Library" uses material from a header - file that is part of the Library, the object code for the work may - be a derivative work of the Library even though the source code is - not. Whether this is true is especially significant if the work - can be linked without the Library, or if the work is itself a - library. The threshold for this to be true is not precisely - defined by law. - - If such an object file uses only numerical parameters, data - structure layouts and accessors, and small macros and small inline - functions (ten lines or less in length), then the use of the object - file is unrestricted, regardless of whether it is legally a - derivative work. (Executables containing this object code plus - portions of the Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may - distribute the object code for the work under the terms of Section - 6. Any executables containing that work also fall under Section 6, - whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also compile or - link a "work that uses the Library" with the Library to produce a - work containing portions of the Library, and distribute that work - under terms of your choice, provided that the terms permit - modification of the work for the customer's own use and reverse - engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the - Library is used in it and that the Library and its use are covered - by this License. You must supply a copy of this License. If the - work during execution displays copyright notices, you must include - the copyright notice for the Library among them, as well as a - reference directing the user to the copy of this License. Also, - you must do one of these things: - - a. Accompany the work with the complete corresponding - machine-readable source code for the Library including - whatever changes were used in the work (which must be - distributed under Sections 1 and 2 above); and, if the work - is an executable linked with the Library, with the complete - machine-readable "work that uses the Library", as object code - and/or source code, so that the user can modify the Library - and then relink to produce a modified executable containing - the modified Library. (It is understood that the user who - changes the contents of definitions files in the Library will - not necessarily be able to recompile the application to use - the modified definitions.) - - b. Accompany the work with a written offer, valid for at least - three years, to give the same user the materials specified in - Subsection 6a, above, for a charge no more than the cost of - performing this distribution. - - c. If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the - above specified materials from the same place. - - d. Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the - Library" must include any data and utility programs needed for - reproducing the executable from it. However, as a special - exception, the source code distributed need not include anything - that is normally distributed (in either source or binary form) - with the major components (compiler, kernel, and so on) of the - operating system on which the executable runs, unless that - component itself accompanies the executable. - - It may happen that this requirement contradicts the license - restrictions of other proprietary libraries that do not normally - accompany the operating system. Such a contradiction means you - cannot use both them and the Library together in an executable - that you distribute. - - 7. You may place library facilities that are a work based on the - Library side-by-side in a single library together with other - library facilities not covered by this License, and distribute - such a combined library, provided that the separate distribution - of the work based on the Library and of the other library - facilities is otherwise permitted, and provided that you do these - two things: - - a. Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b. Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same - work. - - 8. You may not copy, modify, sublicense, link with, or distribute the - Library except as expressly provided under this License. Any - attempt otherwise to copy, modify, sublicense, link with, or - distribute the Library is void, and will automatically terminate - your rights under this License. However, parties who have - received copies, or rights, from you under this License will not - have their licenses terminated so long as such parties remain in - full compliance. - - 9. You are not required to accept this License, since you have not - signed it. However, nothing else grants you permission to modify - or distribute the Library or its derivative works. These actions - are prohibited by law if you do not accept this License. - Therefore, by modifying or distributing the Library (or any work - based on the Library), you indicate your acceptance of this - License to do so, and all its terms and conditions for copying, - distributing or modifying the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the - Library), the recipient automatically receives a license from the - original licensor to copy, distribute, link with or modify the - Library subject to these terms and conditions. You may not impose - any further restrictions on the recipients' exercise of the rights - granted herein. You are not responsible for enforcing compliance - by third parties to this License. - - 11. If, as a consequence of a court judgment or allegation of patent - infringement or for any other reason (not limited to patent - issues), conditions are imposed on you (whether by court order, - agreement or otherwise) that contradict the conditions of this - License, they do not excuse you from the conditions of this - License. If you cannot distribute so as to satisfy simultaneously - your obligations under this License and any other pertinent - obligations, then as a consequence you may not distribute the - Library at all. For example, if a patent license would not permit - royalty-free redistribution of the Library by all those who - receive copies directly or indirectly through you, then the only - way you could satisfy both it and this License would be to refrain - entirely from distribution of the Library. - - If any portion of this section is held invalid or unenforceable - under any particular circumstance, the balance of the section is - intended to apply, and the section as a whole is intended to apply - in other circumstances. - - It is not the purpose of this section to induce you to infringe any - patents or other property right claims or to contest validity of - any such claims; this section has the sole purpose of protecting - the integrity of the free software distribution system which is - implemented by public license practices. Many people have made - generous contributions to the wide range of software distributed - through that system in reliance on consistent application of that - system; it is up to the author/donor to decide if he or she is - willing to distribute software through any other system and a - licensee cannot impose that choice. - - This section is intended to make thoroughly clear what is believed - to be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in - certain countries either by patents or by copyrighted interfaces, - the original copyright holder who places the Library under this - License may add an explicit geographical distribution limitation - excluding those countries, so that distribution is permitted only - in or among countries not thus excluded. In such case, this - License incorporates the limitation as if written in the body of - this License. - - 13. The Free Software Foundation may publish revised and/or new - versions of the Library General Public License from time to time. - Such new versions will be similar in spirit to the present version, - but may differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the - Library specifies a version number of this License which applies - to it and "any later version", you have the option of following - the terms and conditions either of that version or of any later - version published by the Free Software Foundation. If the Library - does not specify a license version number, you may choose any - version ever published by the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free - programs whose distribution conditions are incompatible with these, - write to the author to ask for permission. For software which is - copyrighted by the Free Software Foundation, write to the Free - Software Foundation; we sometimes make exceptions for this. Our - decision will be guided by the two goals of preserving the free - status of all derivatives of our free software and of promoting - the sharing and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO - WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE - LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT - HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT - WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT - NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE - QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE - LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY - SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN - WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY - MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE - LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, - INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR - INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF - DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU - OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY - OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - diff --git a/tools/gdbst03/makefile.cfg b/tools/gdbst03/makefile.cfg deleted file mode 100644 index 4265258a7..000000000 --- a/tools/gdbst03/makefile.cfg +++ /dev/null @@ -1,67 +0,0 @@ -# -# Makefile.cfg for GDB stub for DJGPP and Mingw -# -# libgdbst Copyright 2000 by Jonathan Brogodn -# - -# -# GNU compiler & tools' flags -# -CC = gcc -CFLAGS = -Wall -Werror -march=i486 -O2 -g - -# Archiver -AR = ar -ARFLAGS = -r - -# Stripper -STRIP = strip - -# Assembler -AS = as -ASFLAGS = - -# Linker -LD = ld -LDFLAGS = - -# Remove -RM = rm -f - -# Echo -ECHO = echo - -# Echo Blank -#ECHOBLANK = echo "" -ECHOBLANK = echo. - -# -# check for OS... badly -# - -ifndef DJDIR -ifndef DJGPP - WINDOWS=1 -endif -endif - -ifndef windir -ifndef WINDOWS - DJGPP=1 -endif -endif - -# -# Rules -# -.SUFFIXES: .c .asm .o - -.asm.o: - @$(CC) $(CFLAGS) -I$(INC_PATH) -c -o ./$@ ./$< - -.s.o: - @$(AS) $(ASFLAGS) ./$< - -.c.o : - @$(CC) $(CFLAGS) -c -I$(INC_PATH) -c -o ./$@ ./$< - diff --git a/tools/gdbst03/readme b/tools/gdbst03/readme deleted file mode 100644 index 316e61cae..000000000 --- a/tools/gdbst03/readme +++ /dev/null @@ -1,171 +0,0 @@ -GDB Stub for DJGPP 0.2 Readme File -================================== - -Copyright ---------- -GDB Stub for DJGPP is distributed under the terms of the GNU Library -General Public License (GNU LGPL) - please see the document LICENSE, -which should be found in the same directory as this file. - -Copyright (c) 2000 by Jonathan Brogdon, 2002 by Gordon Schumacher - -What It Does ------------- -The GDB stub is used to debug a DJGPP target remotely over a one of -the PC COM ports. GDB, running on a host machine, communicates with -the target using the GDB serial protocol over the serial link. For -more information on the GDB stub, see "Debugging with GDB, The GNU -Source-Level Debugger", by Richard M. Stallman and Roland H. Pesch -(http://sources.redhat.com/gdb/download/onlinedocs/gdb.html) - -How It Works ------------- - -Exceptions: - -The GDB stub needs to handle all processor exceptions. Since these -exceptions already handled by DJGPP, we cannot handle them directly. -DJGPP maps all processor exceptions to signals. Therefore, we can -install the GDB stub handler as the signal handler for those signals -that represent processor exceptions. The following table shows the -processor exception to signal mapping: - - Exception/Interrupt: Exception #: Signal: - ------------------- ----------- ------ - Divide Error 0 SIGFPE - Debug Exception 1 SIGTRAP - NMI Interrupt 2 No signal defined - Breakpoint 3 SIGTRAP - INTO-detected overflow 4 SIGFPE - BOUND Range Exceeded 5 SIGSEGV - Invalid Opcode 6 No signal defined - Coprocessor not available 7 SIGNOFP - Double Fault 8 SIGSEGV - Coprocessor Seg overrun 9 SIGSEGV - Invalid Task State Seg 10 No signal defined - Segment not present 11 SIGSEGV - Stack Fault 12 SIGSEGV - General Protection Fault 13 SIGSEGV - Page Fault 14 SIGSEGV - Intel Reserved 15 No signal defined - Coprocessor Error 16 SIGFPE - -The GDB stub handler services requests from the GDB host. These -requests are seen by the GDB stub handler as command messages from -the GDB host. These commands and command formats are defined in -"Debugging with GDB, The GNU Source-Level Debugger", by Richard M. -Stallman and Roland H. Pesch (http://sources.redhat.com/gdb/ -download/onlinedocs/gdb.html -- one of many sources). - -Serial Interface: - -Interface functions for sending and receiving characters from the -serial interface must be provided by the engineer porting the GDB -stub. The following funtions must be provided to support the -implementation. - - int getDebugChar(void); - void putDebugChar(int c); - -There are a variety of serial libraries for DJGPP. The user may -already be using one of these libraries in their application, and -installing more than one serial library often causes conflicts. -To this end, a modular function layer was written that allows any -serial library to be used with the GDB stub. Layers have been -written to support SVAsync, DZComm, and the _bios_serialcom() -function. At the time of this writing, DZComm appears to work the -best for serial debugging. - -Hard Coded Breakpoint: - -A breakpoint() function is provided to manually invoke the stub. -This function, inserts a breakpoint instruction directly in the code -to invoke the GDB stub handler. - -How You Use It --------------- -First, you need to select a serial library. In the i386-supp.c file, -there are lines of the form - - // #include "some_layer.h" - -Uncomment the line for the serial library you intend to use - or add -a new include line for a file written for some other library. -In the main() function of your target program, you should initilize -the GDB serial handlers and the GDB stub. The following functions -are provided in the GDB stub library for this purpose. - - gdb_serial_init(unsigned int port, unsigned int speed); - gdb_target_init(void); - -Where, port is the COM port number, and speed is the baud rate for -the serial link. - -After initialing the GDB serial interface and target, you should -invoke the breakpoint() function somewhere. You may choose to do -this immediately after initialization, or at a specific location in -your code where you wish to set a breakpoint. By putting the -breakpoint() function in the beginning of main(), you can use the -GDB host to set a breakpoint at any place in your code. - -Make sure that you use the '-g' option when compiling your files with -gcc. - -After the target executable is running, start up gdb on the host, -passing the target executable as an argument. - - Example: gdb demo.exe - -Now, tell gdb which serial interface to use for communicating to -the target. - - Example: (gdb) target remote COM1 - -This example uses COM1 on the host to communicate with the target. -GDB is now 'listening' on COM for a valid GDB serial packet. - -Once your GDB host finds your target, you may need to tell GDB where -to find any source files which were used to generate your program. -Use the directory command to do this. - - Example: (gdb) directory ../src/demo - -That's it. You should now be able to single step through code, set -breakpoints, set variables, examine variables, any anthing else that -you would normally use GDB to accomplish. - -What You Build --------------- -Read the INSTALL file for more information on installing the GDB stub -library. After installing the library, your code should include -i386-stub.h for function prototypes. In addition, your code should -link against the libgdb.a library. The source for a demonstration -program has been included with this distributias an example. -As an alternative, you can simply include the i386-stub and i386-supp -files and the layer header for the serial library you plan to use into -your project and link them in directly. - -For More Info -------------- -See "Debugging with GDB, The GNU Source-Level Debugger", by Richard -M. Stallman and Roland H. Pesch (http://sources.redhat.com/gdb/ -download/onlinedocs/gdb.html -- one of many sources). - -TODO ----- -Port for network operation. - -Contact Info ------------- -My contact info is below. If you have any comments, suggestions, bug -reports or problems, please mail me, and I'll see what I can do. - - Regards, - Jonathan Brogdon - - 6th June 2000 - - Modular update: - Gordon Schumacher - - 12th February 2002 \ No newline at end of file diff --git a/tools/gdbst03/src/demo/crc_16.c b/tools/gdbst03/src/demo/crc_16.c deleted file mode 100644 index ad1f53cd1..000000000 --- a/tools/gdbst03/src/demo/crc_16.c +++ /dev/null @@ -1,46 +0,0 @@ -#define POLY 0x8408 -/* -// 16 12 5 -// this is the CCITT CRC 16 polynomial X + X + X + 1. -// This works out to be 0x1021, but the way the algorithm works -// lets us use 0x8408 (the reverse of the bit pattern). The high -// bit is always assumed to be set, thus we only use 16 bits to -// represent the 17 bit value. -*/ - -#include "crc.h" - -WORD crc16(char *data_p, WORD length) -{ - unsigned char i; - unsigned int data; - unsigned int crc = 0xffff; - - if (length == 0) - return (~crc); - - do - { - for (i=0, data=(unsigned int)0xff & *data_p++; - i < 8; - i++, data >>= 1) - { - if ((crc & 0x0001) ^ (data & 0x0001)) - crc = (crc >> 1) ^ POLY; - else crc >>= 1; - } - } while (--length); - - crc = ~crc; - data = crc; - crc = (crc << 8) | ((data >> 8) & 0xff); - - return (crc); -} - - - - - - - diff --git a/tools/gdbst03/src/demo/makefile b/tools/gdbst03/src/demo/makefile deleted file mode 100644 index ab48954b2..000000000 --- a/tools/gdbst03/src/demo/makefile +++ /dev/null @@ -1,42 +0,0 @@ -# -# Makefile for GDB Stub demo -# Written by Jonathan Brogodn -# -# GDB Stub for DJGPP Copyright 2000 by Jonathan Brogdon -# - -include ../../Makefile.cfg - -CFLAGS += -g -CFLAGS += -I../../include -I../include -I. -CFLAGS += -DDEBUG_COM_PORT=1 -CFLAGS += -DDEBUG_COM_PORT_SPEED=9600 -CFLAGS += -DREMOTE_DEBUGGING - -# Objects to build -OBJS = serdbg.o crc_16.o - -all: demo - -demo: $(OBJS) -ifdef DJGPP - @$(LD) $(LDFLAGS) -Map ./$@.map -o../../demo/$@.exe $(DJDIR)/lib/crt0.o $(OBJS) -L$(DJDIR)/lib -L../../lib -lgdbst -ldzcom -lc -lgcc -endif -ifdef WINDOWS - @$(LD) $(LDFLAGS) -Map ./$@.map -o../../demo/$@.exe $(DJDIR)/lib/crt0.o $(OBJS) -L../../lib -lgdbst -lwsock32 -lc -lgcc -endif - -clean: - @$(RM) $(OBJS) - @$(RM) *.map - -distclean: clean - @$(RM) $(OBJS) - @$(RM) depend.dep - @$(RM) ../../demo/*.exe - -dep: - @$(CC) $(CFLAGS) -M *.c > depend.dep - -$(OBJS): -include depend.dep diff --git a/tools/gdbst03/src/demo/serdbg.c b/tools/gdbst03/src/demo/serdbg.c deleted file mode 100644 index 01778789c..000000000 --- a/tools/gdbst03/src/demo/serdbg.c +++ /dev/null @@ -1,102 +0,0 @@ -/*********************************************************************** - * serdbg.c - * - * Description: Pretty simple demonstration program. It accomplishes - * the following. - * - * 1. Allocate a block of memory Feel free to change - * size (memBlockSize) with debugger. - * - * 2. Writes a word pattern to the entire block. Feel - * free to change the pattern (memPatternWord) with - * debugger. - * - * 3. Computes the CRC-16 on the block. Feel free to - * check the size with the debuger. - * - * 4. Free the memory block allocated in step 1. Repeat - * step 1. If you wish to exit, set doneFlag to 0 with - * the debugger. - * - * Credits: Created by Jonathan Brogdon - * - * Terms of use: Use as you will. - * - * Global Data: None. - * Global Functions: main - * - * History - * Engineer: Date: Notes: - * --------- ----- ------ - * Jonathan Brogdon 070500 Genesis - * - ***********************************************************************/ -#include -#include -#include -#include - -#define MEM_BLOCK_SIZE 100 /* Words */ -#define MEM_PATTERN_WORD 0x55AA - -void write_mem_pattern(unsigned short*, unsigned short, unsigned short); - -/************************************************************************ - * - * main() - * - ************************************************************************/ -int main(int argc, char *argv[]) -{ - volatile int doneFlag = 0; - unsigned short crcValue = 0; - unsigned short * memBlockPtr = NULL; - short memBlockSize = MEM_BLOCK_SIZE; - short memPatternWord = MEM_PATTERN_WORD; - -#ifdef REMOTE_DEBUGGING - /* Only setup if demonstrating remote debugging */ - gdb_serial_init(DEBUG_COM_PORT,DEBUG_COM_PORT_SPEED); - gdb_target_init(); - breakpoint(); -#endif - - while(doneFlag != 1) - { - memBlockSize = MEM_BLOCK_SIZE; - memPatternWord = MEM_PATTERN_WORD; - memBlockPtr = (unsigned short *) malloc((int)memBlockSize); - - write_mem_pattern(memBlockPtr, memBlockSize, memPatternWord); - - crcValue = crc16((char *)memBlockPtr,memBlockSize); - - free(memBlockPtr); - } - - exit(0); -} - -/************************************************************************ - * - * write_mem_pattern() - * - * Description: Writes a word pattern to a block of RAM. - * - ************************************************************************/ -void write_mem_pattern(unsigned short *block, unsigned short blockSize, unsigned short patternWord) -{ - int index = 0; - - for(index = 0; index < blockSize; index++) - { - block[index] = patternWord; - } -} - - - - - - - diff --git a/tools/gdbst03/src/include/crc.h b/tools/gdbst03/src/include/crc.h deleted file mode 100644 index 937d0b794..000000000 --- a/tools/gdbst03/src/include/crc.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * CRC.H - header file for CRC functions - */ - -#ifndef _CRC_H_ -#define _CRC_H_ - -#include /* For size_t */ - -typedef unsigned char BYTE; -typedef unsigned short WORD; -typedef unsigned long DWORD; - -/* -** File: CRC-16.C -*/ - -WORD crc16(char *data_p, WORD length); - -#endif /* _CRC_H_ */ diff --git a/tools/gdbst03/src/include/i386-supp.h b/tools/gdbst03/src/include/i386-supp.h deleted file mode 100644 index e1923377c..000000000 --- a/tools/gdbst03/src/include/i386-supp.h +++ /dev/null @@ -1,30 +0,0 @@ -/**************************************************************************** - * - * i386-supp.h - * - * Description: Data definitions and constants for low level - * GDB stub support. - * - * Terms of use: This software is provided for use under the terms - * and conditions of the GNU General Public License. - * 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., 59 Temple Place - * Suite 330, Boston, MA 02111-1307, USA. - * - * Credits: Created by Jonathan Brogdon - * - * History - * Engineer: Date: Notes: - * --------- ----- ------ - * Jonathan Brogdon 20000629 Genesis - * Gordon Schumacher 20020212 Updated for modularity - * - ****************************************************************************/ -#ifndef _GDBSUPP_H_ -#define _GDBSUPP_H_ - -extern int putDebugChar(char c); -extern int getDebugChar(void); - -#endif /* _GDBSUPP_H_ */ diff --git a/tools/gdbst03/src/library/bios_layer.h b/tools/gdbst03/src/library/bios_layer.h deleted file mode 100644 index 946f40997..000000000 --- a/tools/gdbst03/src/library/bios_layer.h +++ /dev/null @@ -1,137 +0,0 @@ -//======================================================================================================= -// bios_layer.h - Serial command layer for standard BIOS calls -// It's here if you want it, but I wouldn't suggest it... -//======================================================================================================= - -//======================================================================================================= -//======================================================================================================= - -#ifndef _BIOS_LAYER_H -#define _BIOS_LAYER_H - - -//=============================================================================== -// Include files -//=============================================================================== - -#include - -//=============================================================================== -// Static variable definitions -//=============================================================================== - -unsigned comport; - -//=============================================================================== -// Inline function definitions -//=============================================================================== - -#define BIOS_SER_TIMEOUT 1000000 - -// Initialize the serial library -// Should return 0 if no error occurred -__inline int GDBStub_SerInit(int port) -{ - comport = (unsigned) port; - return 0; -} - - -// Set the serial port speed (and other configurables) -// Should return 0 if the speed is set properly -__inline int GDBStub_SerSpeed(int speed) -{ - unsigned bps; - - switch (speed) - { - case 110: - bps = _COM_110; - break; - - case 150: - bps = _COM_150; - break; - - case 300: - bps = _COM_300; - break; - - case 600: - bps = _COM_600; - break; - - case 1200: - bps = _COM_1200; - break; - - case 2400: - bps = _COM_2400; - break; - - case 4800: - bps = _COM_4800; - break; - - case 9600: - default: - bps = _COM_9600; - break; - } - - _bios_serialcom(_COM_INIT, comport, - bps | _COM_NOPARITY | _COM_CHR8 | _COM_STOP1); - return 0; -} - - -// Check to see if there's room in the buffer to send data -// Should return 0 if it is okay to send -__inline int GDBStub_SerSendOk(void) -{ - return 0; -} - - -// Send a character to the serial port -// Should return 0 if the send succeeds -__inline int GDBStub_SerSend(int c) -{ - register int ret; - register int timeout = 0; - - do - { - ret = _bios_serialcom(_COM_SEND, comport, (unsigned) c); - } while((ret != 0) && (timeout++ < BIOS_SER_TIMEOUT)); - return (timeout >= BIOS_SER_TIMEOUT); -} - - -// Check to see if there are characters waiting in the buffer -// Should return 0 if there's data waiting -__inline int GDBStub_SerRecvOk(void) -{ - return 0; -} - - -// Read a character from the serial port -// Should return the character read -__inline int GDBStub_SerRecv(void) -{ - register int data; - register int timeout = 0; - - do - { - data = _bios_serialcom(_COM_RECEIVE, comport, 0) & 0xff; - } while((data > 0xff) && (timeout++ < BIOS_SER_TIMEOUT)); - - return data; -} - - - - -#endif diff --git a/tools/gdbst03/src/library/dzc_layer.h b/tools/gdbst03/src/library/dzc_layer.h deleted file mode 100644 index cc083077f..000000000 --- a/tools/gdbst03/src/library/dzc_layer.h +++ /dev/null @@ -1,169 +0,0 @@ -//======================================================================================================= -// dzc_layer.h - Serial command layer for DZcomm -// -//======================================================================================================= - -//======================================================================================================= -//======================================================================================================= - -#ifndef _DZC_LAYER_H -#define _DZC_LAYER_H - - -//=============================================================================== -// Include files -//=============================================================================== - -#include - -//=============================================================================== -// Static variable definitions -//=============================================================================== - -comm_port *comport; - -//=============================================================================== -// Inline function definitions -//=============================================================================== - -// Initialize the serial library -// Should return 0 if no error occurred -__inline int GDBStub_SerInit(int port) -{ - int ret; - comm com; - - ret = dzcomm_init(); - if (ret != 0) - { - switch (port) - { - case 4: - com = _com4; - break; - - case 3: - com = _com3; - break; - - case 2: - com = _com2; - break; - - case 1: - default: - com = _com1; - break; - } - comport = comm_port_init(com); - } - return (ret == 0); -} - -// Set the serial port speed (and other configurables) -// Should return 0 if the speed is set properly -__inline int GDBStub_SerSpeed(int speed) -{ - baud_bits bps; - - switch (speed) - { - case 110: - bps = _110; - break; - - case 150: - bps = _150; - break; - - case 300: - bps = _300; - break; - - case 600: - bps = _600; - break; - - case 1200: - bps = _1200; - break; - - case 2400: - bps = _2400; - break; - - case 4800: - bps = _4800; - break; - - case 9600: - bps = _9600; - break; - - case 19200: - bps = _19200; - break; - - case 38400: - bps = _38400; - break; - - case 57600: - bps = _57600; - break; - - case 115200: - default: - bps = _115200; - break; - } - - comm_port_set_baud_rate(comport, bps); - comm_port_set_parity(comport, NO_PARITY); - comm_port_set_data_bits(comport, BITS_8); - comm_port_set_stop_bits(comport, STOP_1); - comm_port_set_flow_control(comport, RTS_CTS); - comm_port_install_handler(comport); - - return 0; -} - -// Check to see if there's room in the buffer to send data -// Should return 0 if it is okay to send -__inline int GDBStub_SerSendOk(void) -{ - return (comm_port_out_full(comport) == 0); -} - -// Send a character to the serial port -// Should return 0 if the send succeeds -__inline int GDBStub_SerSend(int c) -{ - return comm_port_out(comport, (unsigned char) c); -} - -// Check to see if there are characters waiting in the buffer -// Should return 0 if there's data waiting -__inline int GDBStub_SerRecvOk(void) -{ - return (comm_port_in_empty(comport) == 0); -} - -// Read a character from the serial port -// Should return the character read -__inline int GDBStub_SerRecv(void) -{ - return comm_port_test(comport); -} - - - - -#endif - -/*================================================================== - - $Log: $ - - -===============================================================*/ diff --git a/tools/gdbst03/src/library/i386-stub.c b/tools/gdbst03/src/library/i386-stub.c deleted file mode 100644 index 1ab2ceeeb..000000000 --- a/tools/gdbst03/src/library/i386-stub.c +++ /dev/null @@ -1,1555 +0,0 @@ -/**************************************************************************** - - THIS SOFTWARE IS NOT COPYRIGHTED - - HP offers the following for use in the public domain. HP makes no - warranty with regard to the software or it's performance and the - user accepts the software "AS IS" with all faults. - - HP DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD - TO THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - -****************************************************************************/ - -/**************************************************************************** - * Header: remcom.c,v 1.34 91/03/09 12:29:49 glenne Exp $ - * - * Module name: remcom.c $ - * Revision: 1.34 $ - * Date: 91/03/09 12:29:49 $ - * Contributor: Lake Stevens Instrument Division$ - * - * Description: low level support for gdb debugger. $ - * - * Considerations: only works on target hardware $ - * - * Written by: Glenn Engel $ - * ModuleState: Experimental $ - * - * NOTES: See Below $ - * - * Modified for 386 by Jim Kingdon, Cygnus Support. - * - * To enable debugger support, two things need to happen. One, a - * call to set_debug_traps() is necessary in order to allow any breakpoints - * or error conditions to be properly intercepted and reported to gdb. - * Two, a breakpoint needs to be generated to begin communication. This - * is most easily accomplished by a call to breakpoint(). Breakpoint() - * simulates a breakpoint by executing a trap #1. - * - * The external function exceptionHandler() is - * used to attach a specific handler to a specific 386 vector number. - * It should use the same privilege level it runs at. It should - * install it as an interrupt gate so that interrupts are masked - * while the handler runs. - * - * Because gdb will sometimes write to the stack area to execute function - * calls, this program cannot rely on using the supervisor stack so it - * uses it's own stack area reserved in the int array remcomStack. - * - ************* - * - * The following gdb commands are supported: - * - * command function Return value - * - * g return the value of the CPU registers hex data or ENN - * G set the value of the CPU registers OK or ENN - * - * mAA..AA,LLLL Read LLLL bytes at address AA..AA hex data or ENN - * MAA..AA,LLLL: Write LLLL bytes at address AA.AA OK or ENN - * - * c Resume at current address SNN ( signal NN) - * cAA..AA Continue at address AA..AA SNN - * - * s Step one instruction SNN - * sAA..AA Step one instruction from AA..AA SNN - * - * k kill - * - * ? What was the last sigval ? SNN (signal NN) - * - * All commands and responses are sent with a packet which includes a - * checksum. A packet consists of - * - * $#. - * - * where - * :: - * :: < two hex digits computed as modulo 256 sum of > - * - * When a packet is received, it is first acknowledged with either '+' or '-'. - * '+' indicates a successful transfer. '-' indicates a failed transfer. - * - * Example: - * - * Host: Reply: - * $m0,10#2a +$00010203040506070809101112131415#42 - * - ****************************************************************************/ - -#include -#include -#ifdef DJGPP -#include -#include -#include -#include -#endif //#ifdef DJGPP - - -/* - * - * external low-level support routines - */ - -extern void putDebugChar(); /* write a single character */ -extern int getDebugChar(); /* read and return a single char */ -#ifndef DJGPP -extern void exceptionHandler(); /* assign an exception handler */ -#endif - -/* - * BUFMAX defines the maximum number of characters in inbound/outbound buffers - * at least NUMREGBYTES*2 are needed for register packets - */ -#define BUFMAX 400 - -/* - * boolean flag. != 0 means we've been initialized - */ -static char gdb_initialized; - -/* - * debug > 0 prints ill-formed commands in valid packets & checksum errors - */ -int remote_debug; - -/* - * Hexadecimal character string. - */ -#ifndef DJGPP -static const char hexchars[]="0123456789abcdef"; -#else -static char hexchars[]="0123456789abcdef"; -#endif - -/* - * Number of registers. -*/ -#define NUMREGS 16 - -/* - * Number of bytes of registers. -*/ -#define NUMREGBYTES (NUMREGS * 4) - -/* - * i386 Registers - */ -enum regnames {EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, - PC /* also known as eip */, - PS /* also known as eflags */, - CS, SS, DS, ES, FS, GS -}; - -/* - * Register storage buffer. - */ -static int registers[NUMREGS]; - -/* - * Address of a routine to RTE to if we get a memory fault. -*/ -#ifndef DJGPP -static void (*volatile mem_fault_routine) () = NULL; -#else -static void (*mem_fault_routine)() = NULL; -#endif - -/* I/O buffers */ -static char remcomInBuffer[BUFMAX]; -static char remcomOutBuffer[BUFMAX]; - -#if !(defined(DJGPP) || defined(_WIN32)) //MF -#define STACKSIZE 10000 -int remcomStack[STACKSIZE/sizeof(int)]; -static int* stackPtr = &remcomStack[STACKSIZE/sizeof(int) - 1]; -#endif - -#ifdef DJGPP -static void lock_handler_data(void); -#endif //#ifdef DJGPP - -void _returnFromException (); - -/*************************** ASSEMBLY CODE MACROS *************************/ -/* */ - -extern void -return_to_prog (); - -/* Restore the program's registers (including the stack pointer, which - means we get the right stack and don't have to worry about popping our - return address and any stack frames and so on) and return. */ -asm(".text"); -asm(".globl _return_to_prog"); -asm("_return_to_prog:"); -asm(" movw _registers+44, %ss"); -asm(" movl _registers+16, %esp"); -asm(" movl _registers+4, %ecx"); -asm(" movl _registers+8, %edx"); -asm(" movl _registers+12, %ebx"); -asm(" movl _registers+20, %ebp"); -asm(" movl _registers+24, %esi"); -asm(" movl _registers+28, %edi"); -asm(" movw _registers+48, %ds"); -asm(" movw _registers+52, %es"); -asm(" movw _registers+56, %fs"); -asm(" movw _registers+60, %gs"); -asm(" movl _registers+36, %eax"); -asm(" pushl %eax"); /* saved eflags */ -asm(" movl _registers+40, %eax"); -asm(" pushl %eax"); /* saved cs */ -asm(" movl _registers+32, %eax"); -asm(" pushl %eax"); /* saved eip */ -asm(" movl _registers, %eax"); -/* use iret to restore pc and flags together so - that trace flag works right. */ -asm(" iret"); - -/* - * BREAKPOINT macro - */ -#ifdef _MSC_VER //MF -#define BREAKPOINT() __asm int 3; -#else -#define BREAKPOINT() asm(" int $3"); -#endif - -/* - * Store the error code here just in case the user cares. -*/ -int gdb_i386errcode; - -/* - * Store the vector number here (since GDB only gets the signal - * number through the usual means, and that's not very specific). - */ -#ifndef _WIN32 //MF -int gdb_i386vector = -1; -#endif // !_WIN32 - -#if defined(DJGPP) || defined(_WIN32) -static void handle_exception(int); -#endif - -#ifdef DJGPP - -/*********************************************************************** - * save_regs - * - * Description: Retreives the i386 registers as they were when the - * exception occurred. Registers are stored in the - * local static buffer. - * - * Inputs: None. - * Outputs: None. - * Returns: None. - * - ***********************************************************************/ -static void save_regs(void) -{ - registers[EAX] = (int) __djgpp_exception_state->__eax; - registers[ECX] = (int) __djgpp_exception_state->__ecx; - registers[EDX] = (int) __djgpp_exception_state->__edx; - registers[EBX] = (int) __djgpp_exception_state->__ebx; - registers[ESP] = (int) __djgpp_exception_state->__esp; - registers[EBP] = (int) __djgpp_exception_state->__ebp; - registers[ESI] = (int) __djgpp_exception_state->__esi; - registers[EDI] = (int) __djgpp_exception_state->__edi; - registers[PC] = (int) __djgpp_exception_state->__eip; - registers[PS] = (int) __djgpp_exception_state->__eflags; - registers[CS] = (int) __djgpp_exception_state->__cs; - registers[SS] = (int) __djgpp_exception_state->__ss; - registers[DS] = (int) __djgpp_exception_state->__ds; - registers[ES] = (int) __djgpp_exception_state->__es; - registers[FS] = (int) __djgpp_exception_state->__fs; - registers[GS] = (int) __djgpp_exception_state->__gs; -} -static void end_save_regs(void){} - -/*********************************************************************** - * set_regs - * - * Description: Restores i386 registers to the DJGPP register buffer. - * DJGPP exception handler will restore registers from - * it's buffer on exit from the handler. - * - * Inputs: None. - * Outputs: None. - * Returns: None. - * - ***********************************************************************/ -static void set_regs(void) -{ - __djgpp_exception_state->__eax = (unsigned long) registers[EAX]; - __djgpp_exception_state->__ecx = (unsigned long) registers[ECX]; - __djgpp_exception_state->__edx = (unsigned long) registers[EDX]; - __djgpp_exception_state->__ebx = (unsigned long) registers[EBX]; - __djgpp_exception_state->__esp = (unsigned long) registers[ESP]; - __djgpp_exception_state->__ebp = (unsigned long) registers[EBP]; - __djgpp_exception_state->__esi = (unsigned long) registers[ESI]; - __djgpp_exception_state->__edi = (unsigned long) registers[EDI]; - __djgpp_exception_state->__eip = (unsigned long) registers[PC]; - __djgpp_exception_state->__eflags = (unsigned long) registers[PS]; - __djgpp_exception_state->__cs = (unsigned long) registers[CS]; - __djgpp_exception_state->__ss = (unsigned long) registers[SS]; - __djgpp_exception_state->__ds = (unsigned long) registers[DS]; - __djgpp_exception_state->__es = (unsigned long) registers[ES]; - __djgpp_exception_state->__fs = (unsigned long) registers[FS]; - __djgpp_exception_state->__gs = (unsigned long) registers[GS]; -} -static void end_set_regs(void){} - -/*********************************************************************** - * sigsegv_handler - * - * Description: Handles SIGSEGV signal - * - * Inputs: None. - * Outputs: None. - * Returns: None. - * - ***********************************************************************/ -static void sigsegv_handler(int except_num){ - - /* Save general purpose registers */ - save_regs(); - - /* Dispatch memory fault handling routine if one is registered. */ - if(mem_fault_routine != 0) - { - (*mem_fault_routine)(); - mem_fault_routine = NULL; - } - else - { - /* Save error code */ - gdb_i386errcode = __djgpp_exception_state->__sigmask & 0xffff; - - /* Call the general exception handler */ - handle_exception(except_num); - } - /* Write back registers */ - set_regs(); - - /* Return from handler */ - longjmp(__djgpp_exception_state,__djgpp_exception_state->__eax); -} -static void end_sigsegv_handler(void){} - -/*********************************************************************** - * sigfpe_handler - * - * Description: Handles SIGFPE signal - * - * Inputs: None. - * Outputs: None. - * Returns: None. - * - ***********************************************************************/ -static void sigfpe_handler(int except_num){ - - /* Save general purpose registers */ - save_regs(); - - /* Call the general purpose exception handler */ - handle_exception(except_num); - - /* Write back registers */ - set_regs(); - - /* Return from handler */ - longjmp(__djgpp_exception_state,__djgpp_exception_state->__eax); -} -static void end_sigfpe_handler(void){} - -/*********************************************************************** - * sigtrap_handler - * - * Description: Handles SIGTRAP signal - * - * Inputs: None. - * Outputs: None. - * Returns: None. - * - ***********************************************************************/ -static void sigtrap_handler(int except_num) { - - /* Save general purpose registers */ - save_regs(); - - /* Call the general purpose exception handler */ - handle_exception(except_num); - - /* Write back registers */ - set_regs(); - - /* Return from handler */ - longjmp(__djgpp_exception_state,__djgpp_exception_state->__eax); -} -static void end_sigtrap_handler(int except_num){} - -/*********************************************************************** - * sigill_handler - * - * Description: Handles SIGILL signal - * - * Inputs: None. - * Outputs: None. - * Returns: None. - * - ***********************************************************************/ -static void sigill_handler(int except_num) { - - /* Save general purpose registers */ - save_regs(); - - /* Call the general purpose exception handler */ - handle_exception(except_num); - - /* Write back registers */ - set_regs(); - - /* Return from handler */ - longjmp(__djgpp_exception_state,__djgpp_exception_state->__eax); -} -static void end_sigill_handler(int except_num){} -#endif - -#ifdef _WIN32 //MF - -void win32_exception_handler(EXCEPTION_POINTERS* exc_info) -{ - PCONTEXT ctx = exc_info->ContextRecord; - - registers[EAX] = ctx->Eax; - registers[ECX] = ctx->Ecx; - registers[EDX] = ctx->Edx; - registers[EBX] = ctx->Ebx; - registers[ESP] = ctx->Esp; - registers[EBP] = ctx->Ebp; - registers[ESI] = ctx->Esi; - registers[EDI] = ctx->Edi; - registers[PC] = ctx->Eip; - registers[PS] = ctx->EFlags; - registers[CS] = ctx->SegCs; - registers[SS] = ctx->SegSs; - registers[DS] = ctx->SegDs; - registers[ES] = ctx->SegEs; - registers[FS] = ctx->SegFs; - registers[GS] = ctx->SegGs; - - handle_exception((int)(exc_info->ExceptionRecord->ExceptionCode & 0xFFFF)); - - ctx->Eax = registers[EAX]; - ctx->Ecx = registers[ECX]; - ctx->Edx = registers[EDX]; - ctx->Ebx = registers[EBX]; - ctx->Esp = registers[ESP]; - ctx->Ebp = registers[EBP]; - ctx->Esi = registers[ESI]; - ctx->Edi = registers[EDI]; - ctx->Eip = registers[PC]; - ctx->EFlags = registers[PS]; - ctx->SegCs = registers[CS]; - ctx->SegSs = registers[SS]; - ctx->SegDs = registers[DS]; - ctx->SegEs = registers[ES]; - ctx->SegFs = registers[FS]; - ctx->SegGs = registers[GS]; -} - -#endif // _WIN32 - -/*********************************************************************** - * hex - * - * Description: Convert ASCII character values, representing hex - * digits, to the integer value. - * - * Inputs: - * ch - data character - * Outputs: None. - * Returns: integer value represented by the input character. - * - ***********************************************************************/ -static int hex (char ch) -{ - if ((ch >= 'a') && (ch <= 'f')) - return (ch - 'a' + 10); - if ((ch >= '0') && (ch <= '9')) - return (ch - '0'); - if ((ch >= 'A') && (ch <= 'F')) - return (ch - 'A' + 10); - return (-1); -} -#ifdef DJGPP -static void end_hex(void) {} -#endif - -/*********************************************************************** - * getpacket - * - * Description: Retrieve GDB data packet. - * Scan for the sequence $# - * Inputs: None. - * Outputs: None. - * Returns: Beginning of packet buffer. - * - ***********************************************************************/ -static unsigned char *getpacket (void) -{ - unsigned char *buffer = &remcomInBuffer[0]; - unsigned char checksum; - unsigned char xmitcsum; - int count; - char ch; - - while (1) - { - /* wait around for the start character, ignore all other characters */ - while ((ch = getDebugChar ()) != '$') - ; - - retry: - checksum = 0; - xmitcsum = -1; - count = 0; - - /* now, read until a # or end of buffer is found */ - while (count < BUFMAX) - { - ch = getDebugChar (); - if (ch == '$') - goto retry; - if (ch == '#') - break; - checksum = checksum + ch; - buffer[count] = ch; - count = count + 1; - } - buffer[count] = 0; - - if (ch == '#') - { - ch = getDebugChar (); - xmitcsum = hex (ch) << 4; - ch = getDebugChar (); - xmitcsum += hex (ch); - - if (checksum != xmitcsum) - { - if (remote_debug) - { - fprintf (stderr, - "bad checksum. My count = 0x%x, sent=0x%x. buf=%s\n", - checksum, xmitcsum, buffer); - } - putDebugChar ('-'); /* failed checksum */ - } - else - { - putDebugChar ('+'); /* successful transfer */ - - /* if a sequence char is present, reply the sequence ID */ - if (buffer[2] == ':') - { - putDebugChar (buffer[0]); - putDebugChar (buffer[1]); - - return &buffer[3]; - } - - return &buffer[0]; - } - } - } -} -#ifdef DJGPP -static void end_getpacket(void) {} -#endif - -/*********************************************************************** - * putpacket - * - * Description: Send GDB data packet. - * - * Inputs: Buffer of data to send. - * Outputs: None. - * Returns: None. - * - ***********************************************************************/ -static void putpacket (unsigned char *buffer) -{ - unsigned char checksum; - int count; - char ch; - - /* $#. */ - do - { - putDebugChar ('$'); - checksum = 0; - count = 0; - - while ((ch = buffer[count])) - { - putDebugChar (ch); - checksum += ch; - count += 1; - } - - putDebugChar ('#'); - putDebugChar (hexchars[checksum >> 4]); - putDebugChar (hexchars[checksum % 16]); - - } - while (getDebugChar () != '+'); -} -#ifdef DJGPP -static void end_putpacket(void) {} -#endif - - -/*********************************************************************** - * debug_error - * - * Description: Log errors - * - * Inputs: - * format - Format string. - * parm - parameter string - * Outputs: None. - * Returns: None. - * - ***********************************************************************/ -static void debug_error (const char *format, char *parm) -{ - if (remote_debug) - fprintf (stderr, format, parm); -} -#ifdef DJGPP -static void end_debug_error(void) {} -#endif - -/* - * Indicate to caller of mem2hex or hex2mem that there has been an error. - */ -#ifndef DJGPP -static volatile int mem_err = 0; -#else -static int mem_err = 0; -#endif - -/*********************************************************************** - * set_mem_err - * - * Description: set memory error flag - * - * Inputs: None. - * Outputs: None. - * Returns: None. - * - ***********************************************************************/ -static void set_mem_err (void) -{ - mem_err = 1; -} -#ifdef DJGPP -static void end_set_mem_err(void) {} -#endif - -/*********************************************************************** - * get_char - * - * Description: Retreive a character from the specified address. - * These are separate functions so that they are so - * short and sweet that the compiler won't save any - * registers (if there is a fault to mem_fault, they - * won't get restored, so there better not be any saved). - * - * Inputs: addr - The address to read from. - * Outputs: None. - * Returns: data read from address. - * - ***********************************************************************/ -static int get_char (char *addr) -{ - return *addr; -} -#ifdef DJGPP -static void end_get_char(void) {} -#endif - -/*********************************************************************** - * set_char - * - * Description: Write a value to the specified address. - * These are separate functions so that they are so - * short and sweet that the compiler won't save any - * registers (if there is a fault to mem_fault, they - * won't get restored, so there better not be any saved). - * - * Inputs: - * addr - The address to read from. - * val - value to write. - * Outputs: None. - * Returns: None. - * - ***********************************************************************/ -static void set_char (char *addr, int val) -{ - *addr = val; -} -#ifdef DJGPP -static void end_set_char(void) {} -#endif - - -/*********************************************************************** - * mem2hex - * - * Description: Convert the memory pointed to by mem into hex, placing - * result in buf. Return a pointer to the last char put - * in buf (null). If MAY_FAULT is non-zero, then we should - * set mem_err in response to a fault; if zero treat a - * fault like any other fault in the stub. - * - * Inputs: - * mem - Memory address - * buf - data buffer - * count - number of bytes - * may_fault - flag indicating that the operation may cause a mem fault. - * Outputs: None. - * Returns: Pointer to last character. - * - ***********************************************************************/ -static char *mem2hex (char *mem,char *buf,int count,int may_fault) -{ - int i; - unsigned char ch; - -#ifdef _WIN32 //MF - if (IsBadReadPtr(mem, (DWORD)count)) - return mem; -#else - if (may_fault) - mem_fault_routine = set_mem_err; -#endif - for (i = 0; i < count; i++) - { - ch = get_char (mem++); - if (may_fault && mem_err) - return (buf); - *buf++ = hexchars[ch >> 4]; - *buf++ = hexchars[ch % 16]; - } - *buf = 0; -#ifndef _WIN32 //MF - if (may_fault) - mem_fault_routine = NULL; -#endif - return (buf); -} -#ifdef DJGPP -static void end_mem2hex(void) {} -#endif - -/*********************************************************************** - * hex2mem - * - * Description: Convert the hex array pointed to by buf into binary to - * be placed in mem. Return a pointer to the character - * AFTER the last byte written - * Inputs: - * buf - * mem - * count - * may_fault - * Outputs: None. - * Returns: Pointer to buffer after last byte. - * - ***********************************************************************/ -static char *hex2mem (char *buf,char *mem,int count,int may_fault) -{ - int i; - unsigned char ch; - -#ifdef _WIN32 //MF - // MinGW does not support structured exception handling, so let's - // go safe and make memory writable by default - DWORD old_protect; - - VirtualProtect(mem, (DWORD)count, PAGE_EXECUTE_READWRITE, &old_protect); -#else - if (may_fault) - mem_fault_routine = set_mem_err; -#endif - for (i = 0; i < count; i++) - { - ch = hex (*buf++) << 4; - ch = ch + hex (*buf++); - set_char (mem++, ch); - if (may_fault && mem_err) - return (mem); - } -#ifndef _WIN32 //MF - if (may_fault) - mem_fault_routine = NULL; -#endif - return (mem); -} -#ifdef DJGPP -static void end_hex2mem(void) {} -#endif - -/*********************************************************************** - * computeSignal - * - * Description: This function takes the 386 exception vector and - * attempts to translate this number into a unix - * compatible signal value. - * Inputs: - * exceptionVector - * Outputs: None. - * Returns: - * - ***********************************************************************/ -static int computeSignal (int exceptionVector) -{ - int sigval; - switch (exceptionVector) - { - case 0: - sigval = 8; - break; /* divide by zero */ - case 1: - sigval = 5; - break; /* debug exception */ - case 3: - sigval = 5; - break; /* breakpoint */ - case 4: - sigval = 16; - break; /* into instruction (overflow) */ - case 5: - sigval = 16; - break; /* bound instruction */ - case 6: - sigval = 4; - break; /* Invalid opcode */ - case 7: - sigval = 8; - break; /* coprocessor not available */ - case 8: - sigval = 7; - break; /* double fault */ - case 9: - sigval = 11; - break; /* coprocessor segment overrun */ - case 10: - sigval = 11; - break; /* Invalid TSS */ - case 11: - sigval = 11; - break; /* Segment not present */ - case 12: - sigval = 11; - break; /* stack exception */ - case 13: - sigval = 11; - break; /* general protection */ - case 14: - sigval = 11; - break; /* page fault */ - case 16: - sigval = 7; - break; /* coprocessor error */ - default: - sigval = 7; /* "software generated" */ - } - return (sigval); -} -#ifdef DJGPP -static void end_computeSignal(void) {} -#endif - -/*********************************************************************** - * hexToInt - * - * Description: Convert an ASCII string to an integer. - * - * Inputs: - * Outputs: None. - * Returns: Number of chars processed - * - ***********************************************************************/ -int hexToInt (char **ptr, int *intValue) -{ - int numChars = 0; - int hexValue; - - *intValue = 0; - - while (**ptr) - { - hexValue = hex (**ptr); - if (hexValue >= 0) - { - *intValue = (*intValue << 4) | hexValue; - numChars++; - } - else - break; - - (*ptr)++; - } - - return (numChars); -} -#ifdef DJGPP -static void end_hexToInt(void) {} -#endif - - -/*********************************************************************** - * handle_exception - * - * Description: This function does all command procesing for interfacing - * to GDB. - * Inputs: - * exceptionVector - number of the vector. - * Outputs: None. - * Returns: None. - * - ***********************************************************************/ -static void handle_exception (int exceptionVector) -{ - int sigval, stepping; - int addr, length; - char *ptr; - int newPC; - -#ifndef _WIN32 //MF - gdb_i386vector = exceptionVector; -#endif - - if (remote_debug) - { - printf ("vector=%d, sr=0x%x, pc=0x%x\n", - exceptionVector, registers[PS], registers[PC]); - } - - /* reply to host that an exception has occurred */ - sigval = computeSignal (exceptionVector); - - ptr = remcomOutBuffer; - - *ptr++ = 'T'; /* notify gdb with signo, PC, FP and SP */ - *ptr++ = hexchars[sigval >> 4]; - *ptr++ = hexchars[sigval & 0xf]; - - *ptr++ = hexchars[ESP]; - *ptr++ = ':'; - ptr = mem2hex((char *)®isters[ESP], ptr, 4, 0); /* SP */ - *ptr++ = ';'; - - *ptr++ = hexchars[EBP]; - *ptr++ = ':'; - ptr = mem2hex((char *)®isters[EBP], ptr, 4, 0); /* FP */ - *ptr++ = ';'; - - *ptr++ = hexchars[PC]; - *ptr++ = ':'; - ptr = mem2hex((char *)®isters[PC], ptr, 4, 0); /* PC */ - *ptr++ = ';'; - - *ptr = '\0'; - - putpacket (remcomOutBuffer); - - stepping = 0; - - while (1 == 1) - { - remcomOutBuffer[0] = 0; - ptr = getpacket (); - - switch (*ptr++) - { - case '?': - remcomOutBuffer[0] = 'S'; - remcomOutBuffer[1] = hexchars[sigval >> 4]; - remcomOutBuffer[2] = hexchars[sigval % 16]; - remcomOutBuffer[3] = 0; - break; - case 'd': - remote_debug = !(remote_debug); /* toggle debug flag */ - break; - case 'g': /* return the value of the CPU registers */ - mem2hex ((char *) registers, remcomOutBuffer, NUMREGBYTES, 0); - break; - case 'G': /* set the value of the CPU registers - return OK */ - hex2mem (ptr, (char *) registers, NUMREGBYTES, 0); - strcpy (remcomOutBuffer, "OK"); - break; - case 'P': /* set the value of a single CPU register - return OK */ - { - int regno; - - if (hexToInt (&ptr, ®no) && *ptr++ == '=') - if (regno >= 0 && regno < NUMREGS) - { - hex2mem (ptr, (char *) ®isters[regno], 4, 0); - strcpy (remcomOutBuffer, "OK"); - break; - } - - strcpy (remcomOutBuffer, "E01"); - break; - } - - /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */ - case 'm': - /* TRY TO READ %x,%x. IF SUCCEED, SET PTR = 0 */ - if (hexToInt (&ptr, &addr)) - if (*(ptr++) == ',') - if (hexToInt (&ptr, &length)) - { - ptr = 0; - mem_err = 0; - mem2hex ((char *) addr, remcomOutBuffer, length, 1); - if (mem_err) - { - strcpy (remcomOutBuffer, "E03"); - debug_error ("%s","memory fault"); - } - } - - if (ptr) - { - strcpy (remcomOutBuffer, "E01"); - } - break; - - /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */ - case 'M': - /* TRY TO READ '%x,%x:'. IF SUCCEED, SET PTR = 0 */ - if (hexToInt (&ptr, &addr)) - if (*(ptr++) == ',') - if (hexToInt (&ptr, &length)) - if (*(ptr++) == ':') - { - mem_err = 0; - hex2mem (ptr, (char *) addr, length, 1); - - if (mem_err) - { - strcpy (remcomOutBuffer, "E03"); - debug_error ("%s","memory fault"); - } - else - { - strcpy (remcomOutBuffer, "OK"); - } - - ptr = 0; - } - if (ptr) - { - strcpy (remcomOutBuffer, "E02"); - } - break; - - /* cAA..AA Continue at address AA..AA(optional) */ - /* sAA..AA Step one instruction from AA..AA(optional) */ - case 's': - stepping = 1; - case 'c': - /* try to read optional parameter, pc unchanged if no parm */ - if (hexToInt (&ptr, &addr)) - registers[PC] = addr; - - newPC = registers[PC]; - - /* clear the trace bit */ - registers[PS] &= 0xfffffeff; - - /* set the trace bit if we're stepping */ - if (stepping) - registers[PS] |= 0x100; - -#ifdef _WIN32 //MF - return; -#else - _returnFromException (); /* this is a jump */ - - break; - - /* kill the program */ - case 'k': /* do nothing */ -#if 0 - /* Huh? This doesn't look like "nothing". - m68k-stub.c and sparc-stub.c don't have it. */ - BREAKPOINT (); -#endif - break; -#endif - } /* switch */ - - /* reply to the request */ - putpacket (remcomOutBuffer); - } -} -#ifdef DJGPP -static void end_handle_exception(void) {} -#endif - -#ifndef DJGPP -/* GDB stores segment registers in 32-bit words (that's just the way - m-i386v.h is written). So zero the appropriate areas in registers. */ -#define SAVE_REGISTERS1() \ - asm ("movl %eax, _registers"); \ - asm ("movl %ecx, _registers+4"); \ - asm ("movl %edx, _registers+8"); \ - asm ("movl %ebx, _registers+12"); \ - asm ("movl %ebp, _registers+20"); \ - asm ("movl %esi, _registers+24"); \ - asm ("movl %edi, _registers+28"); \ - asm ("movw $0, %ax"); \ - asm ("movw %ds, _registers+48"); \ - asm ("movw %ax, _registers+50"); \ - asm ("movw %es, _registers+52"); \ - asm ("movw %ax, _registers+54"); \ - asm ("movw %fs, _registers+56"); \ - asm ("movw %ax, _registers+58"); \ - asm ("movw %gs, _registers+60"); \ - asm ("movw %ax, _registers+62"); -#define SAVE_ERRCODE() \ - asm ("popl %ebx"); \ - asm ("movl %ebx, _gdb_i386errcode"); -#define SAVE_REGISTERS2() \ - asm ("popl %ebx"); /* old eip */ \ - asm ("movl %ebx, _registers+32"); \ - asm ("popl %ebx"); /* old cs */ \ - asm ("movl %ebx, _registers+40"); \ - asm ("movw %ax, _registers+42"); \ - asm ("popl %ebx"); /* old eflags */ \ - asm ("movl %ebx, _registers+36"); \ - /* Now that we've done the pops, we can save the stack pointer."); */ \ - asm ("movw %ss, _registers+44"); \ - asm ("movw %ax, _registers+46"); \ - asm ("movl %esp, _registers+16"); - -/* See if mem_fault_routine is set, if so just IRET to that address. */ -#define CHECK_FAULT() \ - asm ("cmpl $0, _mem_fault_routine"); \ - asm ("jne mem_fault"); - -asm (".text"); -asm ("mem_fault:"); -/* OK to clobber temp registers; we're just going to end up in set_mem_err. */ -/* Pop error code from the stack and save it. */ -asm (" popl %eax"); -asm (" movl %eax, _gdb_i386errcode"); - -asm (" popl %eax"); /* eip */ -/* We don't want to return there, we want to return to the function - pointed to by mem_fault_routine instead. */ -asm (" movl _mem_fault_routine, %eax"); -asm (" popl %ecx"); /* cs (low 16 bits; junk in hi 16 bits). */ -asm (" popl %edx"); /* eflags */ - -/* Remove this stack frame; when we do the iret, we will be going to - the start of a function, so we want the stack to look just like it - would after a "call" instruction. */ -asm (" leave"); - -/* Push the stuff that iret wants. */ -asm (" pushl %edx"); /* eflags */ -asm (" pushl %ecx"); /* cs */ -asm (" pushl %eax"); /* eip */ - -/* Zero mem_fault_routine. */ -asm (" movl $0, %eax"); -asm (" movl %eax, _mem_fault_routine"); - -asm ("iret"); - - -#define CALL_HOOK() asm("call _remcomHandler"); - -/* This function is called when a i386 exception occurs. It saves - * all the cpu regs in the _registers array, munges the stack a bit, - * and invokes an exception handler (remcom_handler). - * - * stack on entry: stack on exit: - * old eflags vector number - * old cs (zero-filled to 32 bits) - * old eip - * - */ -extern void _catchException3(); -asm(".text"); -asm(".globl __catchException3"); -asm("__catchException3:"); -SAVE_REGISTERS1(); -SAVE_REGISTERS2(); -asm ("pushl $3"); -CALL_HOOK(); - -/* Same thing for exception 1. */ -extern void _catchException1(); -asm(".text"); -asm(".globl __catchException1"); -asm("__catchException1:"); -SAVE_REGISTERS1(); -SAVE_REGISTERS2(); -asm ("pushl $1"); -CALL_HOOK(); - -/* Same thing for exception 0. */ -extern void _catchException0(); -asm(".text"); -asm(".globl __catchException0"); -asm("__catchException0:"); -SAVE_REGISTERS1(); -SAVE_REGISTERS2(); -asm ("pushl $0"); -CALL_HOOK(); - -/* Same thing for exception 4. */ -extern void _catchException4(); -asm(".text"); -asm(".globl __catchException4"); -asm("__catchException4:"); -SAVE_REGISTERS1(); -SAVE_REGISTERS2(); -asm ("pushl $4"); -CALL_HOOK(); - -/* Same thing for exception 5. */ -extern void _catchException5(); -asm(".text"); -asm(".globl __catchException5"); -asm("__catchException5:"); -SAVE_REGISTERS1(); -SAVE_REGISTERS2(); -asm ("pushl $5"); -CALL_HOOK(); - -/* Same thing for exception 6. */ -extern void _catchException6(); -asm(".text"); -asm(".globl __catchException6"); -asm("__catchException6:"); -SAVE_REGISTERS1(); -SAVE_REGISTERS2(); -asm ("pushl $6"); -CALL_HOOK(); - -/* Same thing for exception 7. */ -extern void _catchException7(); -asm(".text"); -asm(".globl __catchException7"); -asm("__catchException7:"); -SAVE_REGISTERS1(); -SAVE_REGISTERS2(); -asm ("pushl $7"); -CALL_HOOK(); - -/* Same thing for exception 8. */ -extern void _catchException8(); -asm(".text"); -asm(".globl __catchException8"); -asm("__catchException8:"); -SAVE_REGISTERS1(); -SAVE_ERRCODE(); -SAVE_REGISTERS2(); -asm ("pushl $8"); -CALL_HOOK(); - -/* Same thing for exception 9. */ -extern void _catchException9(); -asm(".text"); -asm(".globl __catchException9"); -asm("__catchException9:"); -SAVE_REGISTERS1(); -SAVE_REGISTERS2(); -asm ("pushl $9"); -CALL_HOOK(); - -/* Same thing for exception 10. */ -extern void _catchException10(); -asm(".text"); -asm(".globl __catchException10"); -asm("__catchException10:"); -SAVE_REGISTERS1(); -SAVE_ERRCODE(); -SAVE_REGISTERS2(); -asm ("pushl $10"); -CALL_HOOK(); - -/* Same thing for exception 12. */ -extern void _catchException12(); -asm(".text"); -asm(".globl __catchException12"); -asm("__catchException12:"); -SAVE_REGISTERS1(); -SAVE_ERRCODE(); -SAVE_REGISTERS2(); -asm ("pushl $12"); -CALL_HOOK(); - -/* Same thing for exception 16. */ -extern void _catchException16(); -asm(".text"); -asm(".globl __catchException16"); -asm("__catchException16:"); -SAVE_REGISTERS1(); -SAVE_REGISTERS2(); -asm ("pushl $16"); -CALL_HOOK(); - -/* For 13, 11, and 14 we have to deal with the CHECK_FAULT stuff. */ - -/* Same thing for exception 13. */ -extern void _catchException13 (); -asm (".text"); -asm (".globl __catchException13"); -asm ("__catchException13:"); -CHECK_FAULT(); -SAVE_REGISTERS1(); -SAVE_ERRCODE(); -SAVE_REGISTERS2(); -asm ("pushl $13"); -CALL_HOOK(); - -/* Same thing for exception 11. */ -extern void _catchException11 (); -asm (".text"); -asm (".globl __catchException11"); -asm ("__catchException11:"); -CHECK_FAULT(); -SAVE_REGISTERS1(); -SAVE_ERRCODE(); -SAVE_REGISTERS2(); -asm ("pushl $11"); -CALL_HOOK(); - -/* Same thing for exception 14. */ -extern void _catchException14 (); -asm (".text"); -asm (".globl __catchException14"); -asm ("__catchException14:"); -CHECK_FAULT(); -SAVE_REGISTERS1(); -SAVE_ERRCODE(); -SAVE_REGISTERS2(); -asm ("pushl $14"); -CALL_HOOK(); - -/* - * remcomHandler is a front end for handle_exception. It moves the - * stack pointer into an area reserved for debugger use. - */ -asm("_remcomHandler:"); -asm(" popl %eax"); /* pop off return address */ -asm(" popl %eax"); /* get the exception number */ -asm(" movl _stackPtr, %esp"); /* move to remcom stack area */ -asm(" pushl %eax"); /* push exception onto stack */ -asm(" call _handle_exception"); /* this never returns */ -#endif - -void _returnFromException () -{ -#ifndef DJGPP - return_to_prog (); -#else -/* Return from handler */ - longjmp(__djgpp_exception_state,__djgpp_exception_state->__eax); -#endif -} - -/* this function is used to set up exception handlers for tracing and - breakpoints */ -#ifndef DJGPP -void -set_debug_traps (void) -{ -#ifndef _WIN32 //MF - stackPtr = &remcomStack[STACKSIZE / sizeof (int) - 1]; - - exceptionHandler (0, _catchException0); - exceptionHandler (1, _catchException1); - exceptionHandler (3, _catchException3); - exceptionHandler (4, _catchException4); - exceptionHandler (5, _catchException5); - exceptionHandler (6, _catchException6); - exceptionHandler (7, _catchException7); - exceptionHandler (8, _catchException8); - exceptionHandler (9, _catchException9); - exceptionHandler (10, _catchException10); - exceptionHandler (11, _catchException11); - exceptionHandler (12, _catchException12); - exceptionHandler (13, _catchException13); - exceptionHandler (14, _catchException14); - exceptionHandler (16, _catchException16); -#endif // _WIN32 - - gdb_initialized = 1; -} -#endif //#ifndef DJGPP - - -// DJGPP stuff -#ifdef DJGPP -/*********************************************************************** - * restore_traps - * - * Description: This function restores all used signal handlers to - * defaults. - * - * Inputs: None. - * Outputs: None. - * Returns: None. - * - ***********************************************************************/ -void restore_traps(void) -{ - /* Restore default signal handlers */ - signal(SIGSEGV,SIG_DFL); - signal(SIGTRAP,SIG_DFL); - signal(SIGFPE,SIG_DFL); - signal(SIGTRAP,SIG_DFL); - signal(SIGILL,SIG_DFL); - - /* Clear init flag */ - gdb_initialized = 0; -} - -/*********************************************************************** - * lock_handler_data - * - * Description: This function locks all data that is used by the signal - * handlers. - * - * Inputs: None. - * Outputs: None. - * Returns: None. - * - ***********************************************************************/ -static void lock_handler_data(void) -{ - _go32_dpmi_lock_data(&gdb_initialized,sizeof(gdb_initialized)); - _go32_dpmi_lock_data(&remote_debug,sizeof(remote_debug)); - _go32_dpmi_lock_data(hexchars,sizeof(hexchars)); - _go32_dpmi_lock_data(registers,sizeof(registers)); - _go32_dpmi_lock_data(&gdb_i386errcode,sizeof(gdb_i386errcode)); - _go32_dpmi_lock_data(&gdb_i386vector,sizeof(gdb_i386vector)); - - _go32_dpmi_lock_data(remcomInBuffer,sizeof(remcomInBuffer)); - _go32_dpmi_lock_data(remcomOutBuffer,sizeof(remcomOutBuffer)); - - _go32_dpmi_lock_code(getpacket,(unsigned long)end_getpacket- - (unsigned long)getpacket); - _go32_dpmi_lock_code(putpacket,(unsigned long)end_putpacket- - (unsigned long)putpacket); - _go32_dpmi_lock_code(debug_error,(unsigned long)end_debug_error- - (unsigned long)debug_error); - - _go32_dpmi_lock_data(&mem_fault_routine,sizeof(mem_fault_routine)); - _go32_dpmi_lock_data(&mem_err,sizeof(mem_err)); - - _go32_dpmi_lock_code(set_mem_err,(unsigned long)end_set_mem_err-(unsigned long)set_mem_err); - _go32_dpmi_lock_code(get_char,(unsigned long)end_get_char-(unsigned long)get_char); - _go32_dpmi_lock_code(set_char,(unsigned long)end_set_char-(unsigned long)set_char); - _go32_dpmi_lock_code(mem2hex,(unsigned long)end_hex-(unsigned long)hex); - _go32_dpmi_lock_code(mem2hex,(unsigned long)end_mem2hex-(unsigned long)mem2hex); - _go32_dpmi_lock_code(hex2mem,(unsigned long)end_hex2mem-(unsigned long)hex2mem); - _go32_dpmi_lock_code(computeSignal,(unsigned long)end_computeSignal- - (unsigned long)computeSignal); - _go32_dpmi_lock_code(hexToInt,(unsigned long)end_hexToInt-(unsigned long)hexToInt); - _go32_dpmi_lock_code(handle_exception,(unsigned long)end_handle_exception- - (unsigned long)handle_exception); - - _go32_dpmi_lock_code(sigsegv_handler, - (unsigned long)end_sigsegv_handler-(unsigned long)sigsegv_handler); - - _go32_dpmi_lock_code(sigfpe_handler, - (unsigned long)end_sigfpe_handler-(unsigned long)sigfpe_handler); - - _go32_dpmi_lock_code(sigtrap_handler, - (unsigned long)end_sigtrap_handler-(unsigned long)sigtrap_handler); - - _go32_dpmi_lock_code(sigill_handler, - (unsigned long)end_sigill_handler-(unsigned long)sigill_handler); - - _go32_dpmi_lock_code(save_regs, - (unsigned long)end_save_regs-(unsigned long)save_regs); - - _go32_dpmi_lock_code(set_regs, - (unsigned long)end_set_regs-(unsigned long)set_regs); - -} - -/*********************************************************************** - * set_debug_traps - * - * Description: This function installs signal handlers. - * - * Inputs: None. - * Outputs: None. - * Returns: None. - * - ***********************************************************************/ -void set_debug_traps(void) -{ - /* Lock any data that may be used by the trap handlers */ - lock_handler_data(); - - /* Install signal handlers here */ - signal(SIGSEGV,sigsegv_handler); - signal(SIGFPE,sigfpe_handler); - signal(SIGTRAP,sigtrap_handler); - signal(SIGILL,sigill_handler); - - /* Set init flag */ - gdb_initialized = 1; - -} -#endif //#ifdef DJGPP - -/*********************************************************************** - * breakpoint - * - * Description: This function will generate a breakpoint exception. - * It is used at the beginning of a program to sync up - * with a debugger and can be used otherwise as a quick - * means to stop program execution and "break" into the - * debugger. - * - * Inputs: None. - * Outputs: None. - * Returns: None. - * - ***********************************************************************/ -void breakpoint () -{ - if (gdb_initialized) - BREAKPOINT (); -} - diff --git a/tools/gdbst03/src/library/i386-supp.c b/tools/gdbst03/src/library/i386-supp.c deleted file mode 100644 index baf465b4e..000000000 --- a/tools/gdbst03/src/library/i386-supp.c +++ /dev/null @@ -1,424 +0,0 @@ -/*********************************************************************** - * i386-supp.c - * - * Description: Support functions for the i386 GDB target stub. - * - * Credits: Created by Jonathan Brogdon - * - * Terms of use: This software is provided for use under the terms - * and conditions of the GNU General Public License. - * 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., 59 Temple Place - * Suite 330, Boston, MA 02111-1307, USA. - * - * Global Data: None. - * Global Functions: - * gdb_serial_init - * gdb_target_init - * gdb_target_close - * putDebugChar - * getDebugChar - * - * History - * Engineer: Date: Notes: - * --------- ----- ------ - * Jonathan Brogdon 20000617 Genesis - * Gordon Schumacher 20020212 Updated for modularity - * - ***********************************************************************/ - - -#ifdef DJGPP -#include -#endif - -#ifdef _WIN32 -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#define DEBUGBUFFERSIZE 1024 -HANDLE ser_port = (HANDLE)(-1); - -//#include "utility/utility.h" -#ifdef _MSC_VER -#ifndef DEBUG_SERIAL -#pragma comment(lib, "wsock32") -#endif -#endif -#endif - -#include -#include - -#ifdef DJGPP -//#include "bios_layer.h" // Include this for BIOS calls - NOT RECOMMENDED! -//#include "sva_layer.h" // Include this for SVAsync usage -#include "dzc_layer.h" // Include this for DZComm usage - - -#endif -#define SER_TIMEOUT 1000000 - -#ifdef _WIN32 -static LPTOP_LEVEL_EXCEPTION_FILTER s_prev_exc_handler = 0; - - -#define I386_EXCEPTION_CNT 17 - -LONG WINAPI exc_protection_handler(EXCEPTION_POINTERS* exc_info) -{ - int exc_nr = exc_info->ExceptionRecord->ExceptionCode & 0xFFFF; - - if (exc_nr < I386_EXCEPTION_CNT) { - //LOG(FmtString(TEXT("exc_protection_handler: Exception %x"), exc_nr)); - -#if 0 - if (exc_nr==11 || exc_nr==13 || exc_nr==14) { - if (mem_fault_routine) - mem_fault_routine(); - } -#endif - - ++exc_info->ContextRecord->Eip; - } - - return EXCEPTION_CONTINUE_EXECUTION; -} - -LONG WINAPI exc_handler(EXCEPTION_POINTERS* exc_info) -{ - int exc_nr = exc_info->ExceptionRecord->ExceptionCode & 0xFFFF; - - if (exc_nr < I386_EXCEPTION_CNT) { - //LOG(FmtString("Exception %x", exc_nr)); - //LOG(FmtString("EIP=%08X EFLAGS=%08X", exc_info->ContextRecord->Eip, exc_info->ContextRecord->EFlags)); - - // step over initial breakpoint - if (s_initial_breakpoint) { - s_initial_breakpoint = 0; - ++exc_info->ContextRecord->Eip; - } - - SetUnhandledExceptionFilter(exc_protection_handler); - - win32_exception_handler(exc_info); - //LOG(FmtString("EIP=%08X EFLAGS=%08X", exc_info->ContextRecord->Eip, exc_info->ContextRecord->EFlags)); - - SetUnhandledExceptionFilter(exc_handler); - - return EXCEPTION_CONTINUE_EXECUTION; - } - - return EXCEPTION_CONTINUE_SEARCH; -} - -void disable_debugging() -{ - if (s_prev_exc_handler) { - SetUnhandledExceptionFilter(s_prev_exc_handler); - s_prev_exc_handler = 0; - } -} -#endif - -#if !(defined(DJGPP) || defined(_WIN32)) -void exceptionHandler(int exc_nr, void* exc_addr) -{ - if (exc_nr>=0 && exc_nr SER_TIMEOUT) - { - if(WriteFile( ser_port, buffer, 1, &dwLength, NULL )) - return 1; - else if(timeout > SER_TIMEOUT) - return 0; - } - else timeout++; - goto retrywrite; -#endif -} - -/*********************************************************************** - * getDebugChar - * - * Description: gets a character from the debug COM port. - * - * Inputs: None. - * Outputs: None. - * Returns: character data from the serial support. - * - ***********************************************************************/ -int getDebugChar(void) -{ - register int timeout = 0; -#ifdef DJGPP - register int ret = -1; - - while ((GDBStub_SerRecvOk() == 0) && (timeout < SER_TIMEOUT)) - timeout++; - if (timeout < SER_TIMEOUT) - ret = GDBStub_SerRecv(); - - return ret; -#elif defined(_WIN32) - DWORD buffer[DEBUGBUFFERSIZE]; - COMSTAT ComStat ; - DWORD dwErrorFlags; - DWORD dwLength; - - if(ser_port == (HANDLE)-1) - return -1; - - retryread: - ClearCommError( ser_port, &dwErrorFlags, &ComStat ) ; - dwLength = min( DEBUGBUFFERSIZE, ComStat.cbInQue ) ; - - if (dwLength > 0 || timeout > SER_TIMEOUT) - { - if(ReadFile( ser_port, buffer, 1, &dwLength, NULL )) - return buffer[0]; - else if(timeout > SER_TIMEOUT) - return -1; - } - else timeout++; - goto retryread; -#endif -} - -#if 0 -static SOCKET s_rem_fd = INVALID_SOCKET; - -int init_gdb_connect() -{ -#ifdef _WIN32 - WORD wVersionRequested; - WSADATA wsa_data; -#endif - SOCKADDR_IN srv_addr; - SOCKADDR_IN rem_addr; - SOCKET srv_socket; - int rem_len; - - memset(&srv_addr,0,sizeof(srv_addr)); - s_prev_exc_handler = SetUnhandledExceptionFilter(exc_handler); - -#ifdef _WIN32 - wVersionRequested= MAKEWORD( 2, 2 ); - if (WSAStartup(wVersionRequested, &wsa_data)) { - fprintf(stderr, "WSAStartup() failed"); - return 0; - } -#endif - - srv_addr.sin_family = AF_INET; - srv_addr.sin_addr.s_addr = htonl(INADDR_ANY); - srv_addr.sin_port = htons(9999); - - srv_socket = socket(PF_INET, SOCK_STREAM, 0); - if (srv_socket == INVALID_SOCKET) { - perror("socket()"); - return 0; - } - - if (bind(srv_socket, (struct sockaddr*) &srv_addr, sizeof(srv_addr)) == -1) { - perror("bind()"); - return 0; - } - - if (listen(srv_socket, 4) == -1) { - perror("listen()"); - return 0; - } - - rem_len = sizeof(rem_addr); - - for(;;) { - s_rem_fd = accept(srv_socket, (struct sockaddr*)&rem_addr, &rem_len); - - if (s_rem_fd == INVALID_SOCKET) { - if (errno == EINTR) - continue; - - perror("accept()"); - return 0; - } - - break; - } - - return 1; -} - - -int getDebugChar() -{ - char buffer[DEBUGBUFFERSIZE]; - int r; - - if (s_rem_fd == INVALID_SOCKET) - return EOF; - - r = recv(s_rem_fd, buffer, 1, 0); - if (r == -1) { - perror("recv()"); - //LOG(TEXT("debugger connection broken")); - s_rem_fd = INVALID_SOCKET; - return EOF; - } - - if (!r) - return EOF; - - return buffer[0]; -} - -void putDebugChar(int c) -{ - if (s_rem_fd == INVALID_SOCKET) { - const char buffer[] = {c}; - - if (!send(s_rem_fd, buffer, 1, 0)) { - perror("send()"); - //LOG(TEXT("debugger connection broken")); - exit(-1); - } - } -} -#endif diff --git a/tools/gdbst03/src/library/makefile b/tools/gdbst03/src/library/makefile deleted file mode 100644 index 05e1e9030..000000000 --- a/tools/gdbst03/src/library/makefile +++ /dev/null @@ -1,30 +0,0 @@ -# -# Makefile for GDB Stub for DJGPP -# -# GDB Stub for DJGPP Copyright 2000 by Jonathan Brogdon -# - -include ../../Makefile.cfg - -CFLAGS += -I../../include -I../include - -LOBJS = i386-stub.o i386-supp.o - -all: library - -library: $(LOBJS) - @$(RM) ../../lib/libgdbst.a - @$(AR) rcs ../../lib/libgdbst.a $(LOBJS) - -dep: - @$(CC) $(CFLAGS) -M *.c > depend.dep - -clean: - @$(RM) $(LOBJS) - -distclean: clean - @$(RM) ../../lib/libgdbst.a - @$(RM) depend.dep - -$(OBJS) $(LOBJS): -include depend.dep diff --git a/tools/gdbst03/src/library/sva_layer.h b/tools/gdbst03/src/library/sva_layer.h deleted file mode 100644 index 4cdd1628b..000000000 --- a/tools/gdbst03/src/library/sva_layer.h +++ /dev/null @@ -1,83 +0,0 @@ -//======================================================================================================= -// sva_layer.h - Serial command layer for SVAsync -// -//======================================================================================================= - -//======================================================================================================= -//======================================================================================================= - -#ifndef _SVA_LAYER_H -#define _SVA_LAYER_H - - -//=============================================================================== -// Include files -//=============================================================================== - -#include "svasync.h" - -//=============================================================================== -// Inline function definitions -//=============================================================================== - -// Initialize the serial library -// Should return 0 if no error occurred -__inline int GDBStub_SerInit(int port) -{ - int ret, init; - - ret = init = SVAsyncInit(port - 1); - if (ret == 0) - ret = SVAsyncFifoInit(); - if (init == 0) - atexit(SVAsyncStop); - return ret; -} - - -// Set the serial port speed (and other configurables) -// Should return 0 if the speed is set properly -__inline int GDBStub_SerSpeed(int speed) -{ - SVAsyncSet(speed, BITS_8 | NO_PARITY | STOP_1); - SVAsyncHand(DTR | RTS); - return 0; -} - - -// Check to see if there's room in the buffer to send data -// Should return 0 if it is okay to send -__inline int GDBStub_SerSendOk(void) -{ - return !SVAsyncOutStat(); -} - - -// Send a character to the serial port -// Should return 0 if the send succeeds -__inline int GDBStub_SerSend(int c) -{ - SVAsyncOut((char) c); - return 0; -} - - -// Check to see if there are characters waiting in the buffer -// Should return 0 if there's data waiting -__inline int GDBStub_SerRecvOk(void) -{ - return SVAsyncInStat(); -} - - -// Read a character from the serial port -// Should return the character read -__inline int GDBStub_SerRecv(void) -{ - return SVAsyncIn(); -} - - - - -#endif From 405c2101c2c9a76b755e59563c052f7f2ccfe1a0 Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sun, 17 Jul 2022 19:49:58 -0500 Subject: [PATCH 372/377] Remove lumpmod tool Superceded by far superior tools --- tools/lumpmod/Makefile | 16 - tools/lumpmod/lump.c | 473 ---------------------- tools/lumpmod/lump.h | 62 --- tools/lumpmod/lumpmod.c | 785 ------------------------------------- tools/lumpmod/lumpmod.html | 82 ---- 5 files changed, 1418 deletions(-) delete mode 100644 tools/lumpmod/Makefile delete mode 100644 tools/lumpmod/lump.c delete mode 100644 tools/lumpmod/lump.h delete mode 100644 tools/lumpmod/lumpmod.c delete mode 100644 tools/lumpmod/lumpmod.html diff --git a/tools/lumpmod/Makefile b/tools/lumpmod/Makefile deleted file mode 100644 index a01f80278..000000000 --- a/tools/lumpmod/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -# Makfile for SRB2 Lumpmod -# by Alam Arias et al. - -SRC=lumpmod.c lump.c -OBJ=$(SRC:.c=.o)# replaces the .c from SRC with .o -EXE=lumpmod - -.PHONY : all # .PHONY ignores files named all -all: $(EXE) # all is dependent on $(BIN) to be complete - -$(EXE): $(OBJ) # $(EXE) is dependent on all of the files in $(OBJ) to exist - $(CC) $(OBJ) $(LDFLAGS) -o $@ - -.PHONY : clean # .PHONY ignores files named clean -clean: - -$(RM) $(OBJ) $(EXE) diff --git a/tools/lumpmod/lump.c b/tools/lumpmod/lump.c deleted file mode 100644 index ed2ff2f9d..000000000 --- a/tools/lumpmod/lump.c +++ /dev/null @@ -1,473 +0,0 @@ -/* - LumpMod v0.2.1, a command-line utility for working with lumps in wad - files. - Copyright (C) 2003 Thunder Palace Entertainment. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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., 675 Mass Ave, Cambridge, MA 02139, USA. - - lump.c: Provides functions for dealing with lumps -*/ - -#include -#include -#include -#include -#include "lump.h" - -/* Read contents of a wad file and store them in memory. - * fpoint is the file to read, opened with "rb" mode. - * A pointer to a new wadfile struct will be returned, or NULL on error. - */ -struct wadfile *read_wadfile(FILE *fpoint) { - struct wadfile *wfptr; - struct lumplist *curlump; - long diroffset, filelen; - unsigned long count; - - /* Allocate memory for wadfile struct */ - wfptr = malloc(sizeof(struct wadfile)); - if(wfptr == NULL) return NULL; - - /* Read first four characters (PWAD or IWAD) */ - if(fread(wfptr->id, 4, 1, fpoint) < 1) { - free(wfptr); - return NULL; - } - - /* Read number of lumps */ - if(fread(&(wfptr->numlumps), 4, 1, fpoint) < 1) { - free(wfptr); - return NULL; - } - - /* If number of lumps is zero, nothing more needs to be done */ - if(wfptr->numlumps == 0) { - wfptr->head = NULL; - return wfptr; - } - - /* Read offset of directory */ - if(fread(&diroffset, 4, 1, fpoint) < 1) { - free(wfptr); - return NULL; - } - - /* Verify that the directory as long as it needs to be */ - fseek(fpoint, 0, SEEK_END); - filelen = ftell(fpoint); - if((filelen - diroffset) / DIRENTRYLEN < wfptr->numlumps) { - free(wfptr); - return NULL; - } - - /* Allocate memory for head lumplist item and set head pointer */ - curlump = malloc(sizeof(struct lumplist)); - if(curlump == NULL) { - free(wfptr); - return NULL; - } - wfptr->head = curlump; - curlump->cl = NULL; - - /* Read directory entries and lumps */ - for(count = 0; count < wfptr->numlumps; count++) { - long lumpdataoffset; - - /* Advance to a new list item */ - curlump->next = malloc(sizeof(struct lumplist)); - if(curlump->next == NULL) { - free_wadfile(wfptr); - return NULL; - } - curlump = curlump->next; - curlump->next = NULL; - - /* Allocate memory for the lump info */ - curlump->cl = malloc(sizeof(struct lump)); - if(curlump->cl == NULL) { - free_wadfile(wfptr); - return NULL; - } - - /* Seek to the proper position in the file */ - if(fseek(fpoint, diroffset + (count * DIRENTRYLEN), SEEK_SET) != 0) { - free_wadfile(wfptr); - return NULL; - } - - /* Read offset of lump data */ - if(fread(&lumpdataoffset, 4, 1, fpoint) < 1) { - free_wadfile(wfptr); - return NULL; - } - - /* Read size of lump in bytes */ - if(fread(&(curlump->cl->len), 4, 1, fpoint) < 1) { - free_wadfile(wfptr); - return NULL; - } - - /* Read lump name */ - if(fread(curlump->cl->name, 8, 1, fpoint) < 1) { - free_wadfile(wfptr); - return NULL; - } - - /* Read actual lump data, unless lump size is 0 */ - if(curlump->cl->len > 0) { - if(fseek(fpoint, lumpdataoffset, SEEK_SET) != 0) { - free_wadfile(wfptr); - return NULL; - } - - /* Allocate memory for data */ - curlump->cl->data = malloc(curlump->cl->len); - if(curlump->cl->data == NULL) { - free_wadfile(wfptr); - return NULL; - } - - /* Fill the data buffer */ - if(fread(curlump->cl->data, curlump->cl->len, 1, fpoint) < 1) { - free_wadfile(wfptr); - return NULL; - } - } else curlump->cl->data = NULL; - } /* End of directory reading loop */ - - return wfptr; -} - -/* Free a wadfile from memory as well as all related structures. - */ -void free_wadfile(struct wadfile *wfptr) { - struct lumplist *curlump, *nextlump; - - if(wfptr == NULL) return; - curlump = wfptr->head; - - /* Free items in the lump list */ - while(curlump != NULL) { - - /* Free the actual lump and its data, if necessary */ - if(curlump->cl != NULL) { - if(curlump->cl->data != NULL) free(curlump->cl->data); - free(curlump->cl); - } - - /* Advance to next lump and free this one */ - nextlump = curlump->next; - free(curlump); - curlump = nextlump; - } - - free(wfptr); -} - -/* Write complete wadfile to a file stream, opened with "wb" mode. - * fpoint is the stream to write to. - * wfptr is a pointer to the wadfile structure to use. - * Return zero on success, nonzero on failure. - */ -int write_wadfile(FILE *fpoint, struct wadfile *wfptr) { - struct lumplist *curlump; - long lumpdataoffset, diroffset; - - if(wfptr == NULL) return 1; - - /* Write four-character ID ("PWAD" or "IWAD") */ - if(fwrite(wfptr->id, 4, 1, fpoint) < 1) return 2; - - /* Write number of lumps */ - if(fwrite(&(wfptr->numlumps), 4, 1, fpoint) < 1) return 3; - - /* Offset of directory is not known yet. For now, write number of lumps - * again, just to fill the space. - */ - if(fwrite(&(wfptr->numlumps), 4, 1, fpoint) < 1) return 4; - - /* Loop through lump list, writing lump data */ - for(curlump = wfptr->head; curlump != NULL; curlump = curlump->next) { - - /* Don't write anything for the head of the lump list or for lumps of - zero length */ - if(curlump->cl == NULL || curlump->cl->data == NULL) continue; - - /* Write the data */ - if(fwrite(curlump->cl->data, curlump->cl->len, 1, fpoint) < 1) - return 5; - } - - /* Current position is where directory will start */ - diroffset = ftell(fpoint); - - /* Offset for the first lump's data is always 12 */ - lumpdataoffset = 12; - - /* Loop through lump list again, this time writing directory entries */ - for(curlump = wfptr->head; curlump != NULL; curlump = curlump->next) { - - /* Don't write anything for the head of the lump list */ - if(curlump->cl == NULL) continue; - - /* Write offset for lump data */ - if(fwrite(&lumpdataoffset, 4, 1, fpoint) < 1) return 6; - - /* Write size of lump data */ - if(fwrite(&(curlump->cl->len), 4, 1, fpoint) < 1) return 7; - - /* Write lump name */ - if(fwrite(curlump->cl->name, 8, 1, fpoint) < 1) return 8; - - /* Increment lumpdataoffset variable as appropriate */ - lumpdataoffset += curlump->cl->len; - } - - /* Go back to header and write the proper directory offset */ - fseek(fpoint, 8, SEEK_SET); - if(fwrite(&diroffset, 4, 1, fpoint) < 1) return 9; - - return 0; -} - -/* Get the name of a lump, as a null-terminated string. - * item is a pointer to the lump (not lumplist) whose name will be obtained. - * Return NULL on error. - */ -char *get_lump_name(struct lump *item) { - char convname[9], *retname; - - if(item == NULL) return NULL; - memcpy(convname, item->name, 8); - convname[8] = '\0'; - - retname = malloc(strlen(convname) + 1); - if(retname != NULL) strcpy(retname, convname); - return retname; -} - -/* Find the lump after start and before end having a certain name. - * Return a pointer to the list item for that lump, or return NULL if no lump - * by that name is found or lumpname is too long. - * lumpname is a null-terminated string. - * If end parameter is NULL, search to the end of the entire list. - */ -struct lumplist *find_previous_lump(struct lumplist *start, struct lumplist - *end, char *lumpname) { - struct lumplist *curlump, *lastlump; - char *curname; - int found = 0; - - /* Verify that parameters are valid */ - if(start==NULL || start==end || lumpname==NULL || strlen(lumpname) > 8) - return NULL; - - /* Loop through the list from start parameter */ - lastlump = start; - for(curlump = start->next; curlump != end && curlump != NULL; - curlump = curlump->next) { - - /* Skip header lump */ - if(curlump->cl == NULL) continue; - - /* Find name of this lump */ - curname = get_lump_name(curlump->cl); - if(curname == NULL) continue; - - /* Compare names to see if this is the lump we want */ - if(strcmp(curname, lumpname) == 0) { - found = 1; - break; - } - - /* Free memory allocated to curname */ - free(curname); - - lastlump = curlump; - } - - if(found) return lastlump; - return NULL; -} - -/* Remove a lump from the list, free it, and free its data. - * before is the lump immediately preceding the lump to be removed. - * wfptr is a pointer to the wadfile structure to which the removed lump - * belongs, so that numlumps can be decreased. - */ -void remove_next_lump(struct wadfile *wfptr, struct lumplist *before) { - struct lumplist *removed; - - /* Verify that parameters are valid */ - if(before == NULL || before->next == NULL || wfptr == NULL) return; - - /* Update linked list to omit removed lump */ - removed = before->next; - before->next = removed->next; - - /* Free lump info and data if necessary */ - if(removed->cl != NULL) { - if(removed->cl->data != NULL) free(removed->cl->data); - free(removed->cl); - } - - free(removed); - - /* Decrement numlumps */ - wfptr->numlumps--; -} - -/* Add a lump. - * The lump will follow prev in the list and be named name, with a data size - * of len. - * A copy will be made of the data. - * Return zero on success or nonzero on failure. - */ -int add_lump(struct wadfile *wfptr, struct lumplist *prev, char *name, long - len, unsigned char *data) { - struct lump *newlump; - struct lumplist *newlumplist; - unsigned char *copydata; - - /* Verify that parameters are valid */ - if(wfptr == NULL || prev == NULL || name == NULL || strlen(name) > 8) - return 1; - - /* Allocate space for newlump and newlumplist */ - newlump = malloc(sizeof(struct lump)); - newlumplist = malloc(sizeof(struct lumplist)); - if(newlump == NULL || newlumplist == NULL) return 2; - - /* Copy lump data and set up newlump */ - if(len == 0 || data == NULL) { - newlump->len = 0; - newlump->data = NULL; - } else { - newlump->len = len; - copydata = malloc(len); - if(copydata == NULL) return 3; - memcpy(copydata, data, len); - newlump->data = copydata; - } - - /* Set name of newlump */ - memset(newlump->name, '\0', 8); - if(strlen(name) == 8) memcpy(newlump->name, name, 8); - else strcpy(newlump->name, name); - - /* Set up newlumplist and alter prev appropriately */ - newlumplist->cl = newlump; - newlumplist->next = prev->next; - prev->next = newlumplist; - - /* Increment numlumps */ - wfptr->numlumps++; - - return 0; -} - -/* Rename a lump. - * renamed is a pointer to the lump (not lumplist) that needs renaming. - * newname is a null-terminated string with the new name. - * Return zero on success or nonzero on failure. - */ -int rename_lump(struct lump *renamed, char *newname) { - - /* Verify that parameters are valid. */ - if(newname == NULL || renamed == NULL || strlen(newname) > 8) return 1; - - /* Do the renaming. */ - memset(renamed->name, '\0', 8); - if(strlen(newname) == 8) memcpy(renamed->name, newname, 8); - else strcpy(renamed->name, newname); - - return 0; -} - -/* Find the last lump in a wadfile structure. - * Return this lump or NULL on failure. - */ -struct lumplist *find_last_lump(struct wadfile *wfptr) { - struct lumplist *curlump; - - if(wfptr == NULL || wfptr->head == NULL) return NULL; - curlump = wfptr->head; - - while(curlump->next != NULL) curlump = curlump->next; - return curlump; -} - -/* Find the last lump between start and end. - * Return this lump or NULL on failure. - */ -struct lumplist *find_last_lump_between(struct lumplist *start, struct - lumplist *end) { - struct lumplist *curlump; - - if(start == NULL) return NULL; - curlump = start; - - while(curlump->next != end) { - curlump = curlump->next; - if(curlump == NULL) break; - } - - return curlump; -} - -/* Find the next section lump. A section lump is MAPxx (0 <= x <= 9), ExMy - * (0 <= x <= 9, 0 <= y <= 9), or any lump whose name ends in _START or _END. - * Return NULL if there are no section lumps after start. - */ -struct lumplist *find_next_section_lump(struct lumplist *start) { - struct lumplist *curlump, *found = NULL; - char *curname; - - /* Verify that parameter is valid */ - if(start == NULL || start->next == NULL) return NULL; - - /* Loop through the list from start parameter */ - for(curlump = start->next; curlump != NULL && found == NULL; - curlump = curlump->next) { - - /* Skip header lump */ - if(curlump->cl == NULL) continue; - - /* Find name of this lump */ - curname = get_lump_name(curlump->cl); - if(curname == NULL) continue; - - /* Check to see if this is a section lump */ - if(strlen(curname) == 5 && strncmp("MAP", curname, 3) == 0 && - isdigit(curname[3]) && isdigit(curname[4])) - found = curlump; - else if(strlen(curname) == 4 && curname[0] == 'E' && curname[2] == - 'M' && isdigit(curname[1]) && isdigit(curname[3])) - found = curlump; - else if(strlen(curname) == 7 && strcmp("_START", &curname[1]) == 0) - found = curlump; - else if(strlen(curname) == 8 && strcmp("_START", &curname[2]) == 0) - found = curlump; - else if(strlen(curname) == 5 && strcmp("_END", &curname[1]) == 0) - found = curlump; - else if(strlen(curname) == 6 && strcmp("_END", &curname[2]) == 0) - found = curlump; - - /* Free memory allocated to curname */ - free(curname); - } - - return found; -} diff --git a/tools/lumpmod/lump.h b/tools/lumpmod/lump.h deleted file mode 100644 index 88e478716..000000000 --- a/tools/lumpmod/lump.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - LumpMod v0.2.1, a command-line utility for working with lumps in wad - files. - Copyright (C) 2003 Thunder Palace Entertainment. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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., 675 Mass Ave, Cambridge, MA 02139, USA. - - lump.h: Defines constants, structures, and functions used in lump.c -*/ - -#ifndef __LUMP_H -#define __LUMP_H - -/* Entries in the wadfile directory are 16 bytes */ -#define DIRENTRYLEN 16 - -/* Lumps and associated info */ -struct lump { - long len; - unsigned char *data; - char name[8]; -}; - -/* Linked list of lumps */ -struct lumplist { - struct lump *cl; /* actual content of the lump */ - struct lumplist *next; -}; - -/* Structure to contain all wadfile data */ -struct wadfile { - char id[4]; /* IWAD or PWAD */ - long numlumps; /* 32-bit integer */ - struct lumplist *head; /* points to first entry */ -}; - -/* Function declarations */ -struct wadfile *read_wadfile(FILE *); -void free_wadfile(struct wadfile *); -int write_wadfile(FILE *, struct wadfile *); -char *get_lump_name(struct lump *); -struct lumplist *find_previous_lump(struct lumplist *, struct lumplist *, char *); -void remove_next_lump(struct wadfile *, struct lumplist *); -int add_lump(struct wadfile *, struct lumplist *, char *, long, unsigned char *); -int rename_lump(struct lump *, char *); -struct lumplist *find_last_lump(struct wadfile *); -struct lumplist *find_last_lump_between(struct lumplist *, struct lumplist *); -struct lumplist *find_next_section_lump(struct lumplist *); - -#endif diff --git a/tools/lumpmod/lumpmod.c b/tools/lumpmod/lumpmod.c deleted file mode 100644 index e9042615e..000000000 --- a/tools/lumpmod/lumpmod.c +++ /dev/null @@ -1,785 +0,0 @@ -/* - LumpMod v0.2.1, a command-line utility for working with lumps in wad - files. - Copyright (C) 2003 Thunder Palace Entertainment. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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., 675 Mass Ave, Cambridge, MA 02139, USA. - - lumpmod.c: Provides program functionality; depends on lump.c and lump.h -*/ - -#include -#include -#include -#include "lump.h" - -int main(int argc, char *argv[]) { - enum commands { C_ADD, C_ADDSECT, C_DELETE, C_DELSECT, C_EXTRACT, C_LIST, - C_RENAME, C_UPDATE } cmd; - struct wadfile *wfptr; - struct lumplist *startitem, *enditem = NULL; - FILE *fpoint; - char *progname, **params; - char *startname = NULL, *endname = NULL; - int numargs, numparams, insection = 0; - - progname = argv[0]; - numargs = argc - 1; - - /* Verify that there are enough arguments */ - if(numargs < 2) { - fprintf(stderr, "%s: not enough arguments\n", progname); - return EXIT_FAILURE; - } - - /* Identify the command used */ - if(strcmp(argv[2], "add" ) == 0) cmd = C_ADD; - else if(strcmp(argv[2], "addsect") == 0) cmd = C_ADDSECT; - else if(strcmp(argv[2], "delete" ) == 0) cmd = C_DELETE; - else if(strcmp(argv[2], "delsect") == 0) cmd = C_DELSECT; - else if(strcmp(argv[2], "extract") == 0) cmd = C_EXTRACT; - else if(strcmp(argv[2], "list" ) == 0) cmd = C_LIST; - else if(strcmp(argv[2], "rename" ) == 0) cmd = C_RENAME; - else if(strcmp(argv[2], "update" ) == 0) cmd = C_UPDATE; - else { - fprintf(stderr, "%s: invalid command %s\n", progname, argv[2]); - return EXIT_FAILURE; - } - - /* Check for -s option */ - if(numargs >= 4 && strcmp(argv[3], "-s") == 0) { - if(cmd == C_ADDSECT || cmd == C_DELSECT) { - fprintf(stderr, "%s: no option -s for command %s\n", progname, argv[2]); - return EXIT_FAILURE; - } - insection = 1; - params = &argv[5]; - numparams = numargs - 4; - - /* Assume a map name if length > 2 */ - if(strlen(argv[4]) > 2) startname = argv[4]; - else { - startname = malloc(strlen(argv[4]) + 7); - endname = malloc(strlen(argv[4]) + 5); - if(startname == NULL || endname == NULL) { - fprintf(stderr, "%s: out of memory\n", progname); - return EXIT_FAILURE; - } - sprintf(startname, "%s_START", argv[4]); - sprintf(endname, "%s_END", argv[4]); - } - } else { - params = &argv[3]; - numparams = numargs - 2; - } /* end of check for -s option */ - - /* Load the wadfile into memory, since all commands require this */ - fpoint = fopen(argv[1], "rb"); - if(fpoint == NULL) { - fprintf(stderr, "%s: unable to open file %s\n", progname, argv[1]); - return EXIT_FAILURE; - } - wfptr = read_wadfile(fpoint); - fclose(fpoint); - if(wfptr == NULL) { - fprintf(stderr, "%s: %s is not a valid wadfile\n", progname, argv[1]); - return EXIT_FAILURE; - } - - /* Find startitem and enditem, using startname and endname */ - if(startname == NULL) startitem = wfptr->head; - else { - startitem = find_previous_lump(wfptr->head, NULL, startname); - if(startitem == NULL) { - fprintf(stderr, "%s: can't find lump %s in %s", progname, - startname, argv[1]); - return EXIT_FAILURE; - } - startitem = startitem->next; - if(endname == NULL) { - if(startitem->next != NULL) { - char *itemname; - - enditem = startitem->next; - itemname = get_lump_name(enditem->cl); - while( strcmp(itemname, "THINGS" ) == 0 || - strcmp(itemname, "LINEDEFS") == 0 || - strcmp(itemname, "SIDEDEFS") == 0 || - strcmp(itemname, "VERTEXES") == 0 || - strcmp(itemname, "SEGS" ) == 0 || - strcmp(itemname, "SSECTORS") == 0 || - strcmp(itemname, "NODES" ) == 0 || - strcmp(itemname, "SECTORS" ) == 0 || - strcmp(itemname, "REJECT" ) == 0 || - strcmp(itemname, "BLOCKMAP") == 0) { - enditem = enditem->next; - if(enditem == NULL) break; - free(itemname); - itemname = get_lump_name(enditem->cl); - } - free(itemname); - if(enditem != NULL) enditem = enditem->next; - } else enditem = NULL; - } else { - enditem = find_previous_lump(startitem, NULL, endname); - if(enditem == NULL) { - fprintf(stderr, "%s: can't find lump %s in %s", progname, - endname, argv[1]); - return EXIT_FAILURE; - } - enditem = enditem->next; - } - } /* end of finding startitem and enditem */ - - /* Do stuff specific to each command */ - switch(cmd) { - case C_ADD: { - struct lumplist *startitem2, *before, *existing; - int overwrite = 1, firstentry = 0, canduplicate = 0; - char *startname2 = NULL; - - /* Parse options: -a, -b, -d, -n */ - while(numparams > 2) { - if(params[0][0] != '-') break; - if(strcmp(params[0], "-n") == 0) overwrite = 0; - else if(strcmp(params[0], "-d") == 0) canduplicate = 1; - else if(strcmp(params[0], "-b") == 0) firstentry = 1; - else if(strcmp(params[0], "-a") == 0) { - params = ¶ms[1]; - numparams--; - startname2 = params[0]; - } else { - fprintf(stderr, "%s: no option %s for command %s", - progname, params[0], argv[2]); - return EXIT_FAILURE; - } - params = ¶ms[1]; - numparams--; - } - - if(numparams < 2) { - fprintf(stderr, "%s: not enough parameters for %s", progname, - argv[2]); - return EXIT_FAILURE; - } - - /* Find the lump after which to add */ - if(firstentry) before = startitem; - else if(startname2 != NULL) { - before = find_previous_lump(startitem, enditem, startname2); - if(before == NULL) { - fprintf(stderr, "%s: can't find lump %s in %s", progname, - startname2, argv[1]); - return EXIT_FAILURE; - } - before = before->next; - } else { - if(insection) { - before = find_last_lump_between(startitem, enditem); - if(before == NULL) before = startitem; - } else before = find_last_lump(wfptr); - } - startitem2 = before; - - /* Add LUMPNAME FILENAME pairs */ - printf("Adding lumps in %s...\n", argv[1]); - for(;;) { - long newlumpsize; - unsigned char *newlumpdata; - - /* Check whether the lump already exists, unless -d is used */ - if(canduplicate) existing = NULL; - else existing = find_previous_lump(startitem, enditem, params[0]); - if(existing != NULL) existing = existing->next; - if(existing != NULL && overwrite == 0) { - printf("Lump %s already exists. Taking no action.\n", params[0]); - numparams -= 2; - if(numparams < 2) break; - params = ¶ms[2]; - continue; - } - - /* Read the file with new lump data */ - fpoint = fopen(params[1], "rb"); - if(fpoint == NULL) { - fprintf(stderr, "%s: can't open file %s\n", progname, - params[1]); - return EXIT_FAILURE; - } - - /* Find size of lump data */ - fseek(fpoint, 0, SEEK_END); - newlumpsize = ftell(fpoint); - fseek(fpoint, 0, SEEK_SET); - - /* Copy lump data to memory */ - if(newlumpsize == 0) newlumpdata = NULL; - else { - newlumpdata = malloc(newlumpsize); - if(newlumpdata == NULL) { - fprintf(stderr, "%s: out of memory\n", progname); - return EXIT_FAILURE; - } - if(fread(newlumpdata, newlumpsize, 1, fpoint) < 1) { - fprintf(stderr, "%s: unable to read file %s\n", - progname, params[1]); - return EXIT_FAILURE; - } - } - - /* Close the file */ - fclose(fpoint); - - /* Add or update lump */ - if(existing == NULL) { - if(add_lump(wfptr, before, params[0], newlumpsize, - newlumpdata) != 0) { - fprintf(stderr, "%s: unable to add lump %s\n", - progname, params[0]); - return EXIT_FAILURE; - } - printf("Lump %s added.\n", params[0]); - - /* Other lumps will be added after the new one */ - before = before->next; - } else { - existing->cl->len = newlumpsize; - free(existing->cl->data); - existing->cl->data = malloc(newlumpsize); - if(existing->cl->data == NULL) { - fprintf(stderr, "%s: out of memory\n", progname); - return EXIT_FAILURE; - } - memcpy(existing->cl->data, newlumpdata, newlumpsize); - printf("Lump %s updated.\n", params[0]); - } - - /* Advance to the next pair, if there is a next pair */ - numparams -= 2; - if(numparams < 2) break; - params = ¶ms[2]; - } /* end of adding LUMPNAME FILENAME pairs */ - - /* Save the modified wadfile */ - fpoint = fopen(argv[1], "wb"); - if(fpoint == NULL) { - fprintf(stderr, "%s: unable to open file %s for writing\n", - progname, argv[1]); - return EXIT_FAILURE; - } - if(write_wadfile(fpoint, wfptr) != 0) { - fprintf(stderr, "%s: unable to write wadfile to disk\n", - progname); - return EXIT_FAILURE; - } - fclose(fpoint); - printf("File %s successfully updated.\n", argv[1]); - } /* end of C_ADD */ - break; - - case C_UPDATE: { - struct lumplist *existing; - - /* Parse options (none) */ - if(numparams > 2 && params[0][0] == '-') { - fprintf(stderr, "%s: no option %s for command %s", - progname, params[0], argv[2]); - return EXIT_FAILURE; - } - - if(numparams < 2) { - fprintf(stderr, "%s: not enough parameters for %s", progname, - argv[2]); - return EXIT_FAILURE; - } - - /* Update LUMPNAME FILENAME pairs */ - printf("Updating lumps in %s...\n", argv[1]); - for(;;) { - long newlumpsize; - unsigned char *newlumpdata; - - /* Check whether the lump already exists */ - existing = find_previous_lump(startitem, enditem, params[0]); - if(existing == NULL) { - printf("Lump %s does not exist. Taking no action.\n", - params[0]); - numparams -= 2; - if(numparams < 2) break; - params = ¶ms[2]; - continue; - } - existing = existing->next; - - /* Read the file with new lump data */ - fpoint = fopen(params[1], "rb"); - if(fpoint == NULL) { - fprintf(stderr, "%s: can't open file %s\n", progname, - params[1]); - return EXIT_FAILURE; - } - - /* Find size of lump data */ - fseek(fpoint, 0, SEEK_END); - newlumpsize = ftell(fpoint); - fseek(fpoint, 0, SEEK_SET); - - /* Copy lump data to memory */ - if(newlumpsize == 0) newlumpdata = NULL; - else { - newlumpdata = malloc(newlumpsize); - if(newlumpdata == NULL) { - fprintf(stderr, "%s: out of memory\n", progname); - return EXIT_FAILURE; - } - if(fread(newlumpdata, newlumpsize, 1, fpoint) < 1) { - fprintf(stderr, "%s: unable to read file %s\n", - progname, params[1]); - return EXIT_FAILURE; - } - } - - /* Close the file */ - fclose(fpoint); - - /* Update lump */ - existing->cl->len = newlumpsize; - free(existing->cl->data); - existing->cl->data = malloc(newlumpsize); - if(existing->cl->data == NULL) { - fprintf(stderr, "%s: out of memory\n", progname); - return EXIT_FAILURE; - } - memcpy(existing->cl->data, newlumpdata, newlumpsize); - printf("Lump %s updated.\n", params[0]); - - /* Advance to the next pair, if there is a next pair */ - numparams -= 2; - if(numparams < 2) break; - params = ¶ms[2]; - } /* end of updating LUMPNAME FILENAME pairs */ - - /* Save the modified wadfile */ - fpoint = fopen(argv[1], "wb"); - if(fpoint == NULL) { - fprintf(stderr, "%s: unable to open file %s for writing\n", - progname, argv[1]); - return EXIT_FAILURE; - } - if(write_wadfile(fpoint, wfptr) != 0) { - fprintf(stderr, "%s: unable to write wadfile to disk\n", - progname); - return EXIT_FAILURE; - } - fclose(fpoint); - printf("File %s successfully updated.\n", argv[1]); - } /* end of C_UPDATE */ - break; - - case C_DELETE: { - struct lumplist *before; - - /* Parse options (none) */ - if(numparams > 1 && params[0][0] == '-') { - fprintf(stderr, "%s: no option %s for command %s", - progname, params[0], argv[2]); - return EXIT_FAILURE; - } - - if(numparams < 1) { - fprintf(stderr, "%s: not enough parameters for %s", progname, - argv[2]); - return EXIT_FAILURE; - } - - /* Delete LUMPNAME lumps */ - printf("Deleting lumps in %s...\n", argv[1]); - for(;;) { - - /* Find the lump to delete */ - before = find_previous_lump(startitem, enditem, params[0]); - if(before == NULL) { - printf("Lump %s does not exist. Taking no action.\n", - params[0]); - numparams--; - if(numparams < 1) break; - params = ¶ms[1]; - continue; - } - - /* Delete it */ - remove_next_lump(wfptr, before); - printf("Lump %s deleted.\n", params[0]); - - /* Advance to the next item to delete, if there is one */ - numparams--; - if(numparams < 1) break; - params = ¶ms[1]; - } /* end of deleting LUMPNAME lumps */ - - /* Save the modified wadfile */ - fpoint = fopen(argv[1], "wb"); - if(fpoint == NULL) { - fprintf(stderr, "%s: unable to open file %s for writing\n", - progname, argv[1]); - return EXIT_FAILURE; - } - if(write_wadfile(fpoint, wfptr) != 0) { - fprintf(stderr, "%s: unable to write wadfile to disk\n", - progname); - return EXIT_FAILURE; - } - fclose(fpoint); - printf("File %s successfully updated.\n", argv[1]); - } /* end of C_DELETE */ - break; - - case C_RENAME: { - struct lumplist *renamed; - - /* Parse options (none) */ - if(numparams > 2 && params[0][0] == '-') { - fprintf(stderr, "%s: no option %s for command %s", - progname, params[0], argv[2]); - return EXIT_FAILURE; - } - - if(numparams < 2) { - fprintf(stderr, "%s: not enough parameters for %s", progname, - argv[2]); - return EXIT_FAILURE; - } - - /* Rename OLDNAME NEWNAME pairs */ - printf("Renaming lumps in %s...\n", argv[1]); - for(;;) { - - /* Find the lump to rename */ - renamed = find_previous_lump(startitem, enditem, params[0]); - if(renamed == NULL) { - printf("Lump %s does not exist. Taking no action.\n", - params[0]); - numparams -= 2; - if(numparams < 2) break; - params = ¶ms[2]; - continue; - } - renamed = renamed->next; - - /* Rename lump */ - memset(renamed->cl->name, '\0', 8); - if(strlen(params[1]) >= 8) memcpy(renamed->cl->name, - params[1], 8); - else strcpy(renamed->cl->name, params[1]); - - printf("Lump %s renamed to %s.\n", params[0], params[1]); - - /* Advance to the next pair, if there is a next pair */ - numparams -= 2; - if(numparams < 2) break; - params = ¶ms[2]; - } /* end of renaming OLDNAME NEWNAME pairs */ - - /* Save the modified wadfile */ - fpoint = fopen(argv[1], "wb"); - if(fpoint == NULL) { - fprintf(stderr, "%s: unable to open file %s for writing\n", - progname, argv[1]); - return EXIT_FAILURE; - } - if(write_wadfile(fpoint, wfptr) != 0) { - fprintf(stderr, "%s: unable to write wadfile to disk\n", - progname); - return EXIT_FAILURE; - } - fclose(fpoint); - printf("File %s successfully updated.\n", argv[1]); - } /* end of C_RENAME */ - break; - - case C_EXTRACT: { - struct lumplist *extracted; - - /* Parse options (none) */ - if(numparams > 2 && params[0][0] == '-') { - fprintf(stderr, "%s: no option %s for command %s", - progname, params[0], argv[2]); - return EXIT_FAILURE; - } - - if(numparams < 2) { - fprintf(stderr, "%s: not enough parameters for %s", progname, - argv[2]); - return EXIT_FAILURE; - } - - /* Extract LUMPNAME FILENAME pairs */ - printf("Extracting lumps from %s...\n", argv[1]); - for(;;) { - - /* Find the lump to extract */ - extracted = find_previous_lump(startitem, enditem, params[0]); - if(extracted == NULL) { - printf("Lump %s does not exist. Taking no action.\n", - params[0]); - numparams -= 2; - if(numparams < 2) break; - params = ¶ms[2]; - continue; - } - extracted = extracted->next; - - /* Open the file to extract to */ - fpoint = fopen(params[1], "wb"); - if(fpoint == NULL) { - fprintf(stderr, "%s: can't open file %s for writing\n", - progname, params[1]); - return EXIT_FAILURE; - } - - /* Extract lump */ - if(fwrite(extracted->cl->data, extracted->cl->len, 1, fpoint) - < 1) { - fprintf(stderr, "%s: unable to write lump %s to disk\n", - progname, params[0]); - return EXIT_FAILURE; - } - - /* Close the file */ - fclose(fpoint); - printf("Lump %s saved as %s.\n", params[0], params[1]); - - /* Advance to the next pair, if there is a next pair */ - numparams -= 2; - if(numparams < 2) break; - params = ¶ms[2]; - } /* end of extracting LUMPNAME FILENAME pairs */ - - printf("Finished extracting lumps from file %s.\n", argv[1]); - } /* end of C_EXTRACT */ - break; - - case C_LIST: { - struct lumplist *curlump; - int verbose = 0, i = 0; - - /* Parse options: -v */ - while(numparams > 0) { - if(params[0][0] != '-') break; - if(strcmp(params[0], "-v") == 0) verbose = 1; - else { - fprintf(stderr, "%s: no option %s for command %s", - progname, params[0], argv[2]); - return EXIT_FAILURE; - } - params = ¶ms[1]; - numparams--; - } - - /* Loop through the lump list, printing lump info */ - for(curlump = startitem->next; curlump != enditem; curlump = - curlump->next) { - i++; - if(verbose) printf("%5i %-8s %7li\n", i, - get_lump_name(curlump->cl), curlump->cl->len); - else printf("%s\n", get_lump_name(curlump->cl)); - } - } /* end of C_LIST */ - break; - - case C_DELSECT: { - - /* Parse options (none) */ - if(numparams > 1 && params[0][0] == '-') { - fprintf(stderr, "%s: no option %s for command %s", - progname, params[0], argv[2]); - return EXIT_FAILURE; - } - - if(numparams < 1) { - fprintf(stderr, "%s: not enough parameters for %s", progname, - argv[2]); - return EXIT_FAILURE; - } - - /* Delete sections */ - printf("Deleting sections in %s...\n", argv[1]); - for(;;) { - struct lumplist *curlump; - - /* Assume a map name if length > 2 */ - if(strlen(params[0]) > 2) startname = params[0]; - else { - startname = malloc(strlen(params[0]) + 7); - endname = malloc(strlen(params[0]) + 5); - if(startname == NULL || endname == NULL) { - fprintf(stderr, "%s: out of memory\n", progname); - return EXIT_FAILURE; - } - sprintf(startname, "%s_START", params[0]); - sprintf(endname, "%s_END", params[0]); - } - - /* Find startitem and enditem, using startname and endname */ - startitem = find_previous_lump(wfptr->head, NULL, startname); - if(startitem == NULL) { - fprintf(stderr, "%s: can't find lump %s in %s", progname, - startname, argv[1]); - return EXIT_FAILURE; - } - if(endname == NULL && startitem->next != NULL) { - char *itemname; - - enditem = startitem->next; - itemname = get_lump_name(enditem->cl); - do { - enditem = enditem->next; - if(enditem == NULL) break; - free(itemname); - itemname = get_lump_name(enditem->cl); - } while(strcmp(itemname, "THINGS" ) == 0 || - strcmp(itemname, "LINEDEFS") == 0 || - strcmp(itemname, "SIDEDEFS") == 0 || - strcmp(itemname, "VERTEXES") == 0 || - strcmp(itemname, "SEGS" ) == 0 || - strcmp(itemname, "SSECTORS") == 0 || - strcmp(itemname, "NODES" ) == 0 || - strcmp(itemname, "SECTORS" ) == 0 || - strcmp(itemname, "REJECT" ) == 0 || - strcmp(itemname, "BLOCKMAP") == 0); - free(itemname); - } - else { - enditem = find_previous_lump(startitem, NULL, endname); - if(enditem == NULL) { - fprintf(stderr, "%s: can't find lump %s in %s", - progname, endname, argv[1]); - return EXIT_FAILURE; - } - enditem = enditem->next->next; - } /* end of finding startitem and enditem */ - - /* Loop through the section lumps, deleting them */ - curlump = startitem; - while(curlump->next != enditem) - remove_next_lump(wfptr, curlump); - printf("Deleted section %s.\n", params[0]); - - /* Move to next parameter, if it exists */ - numparams--; - if(numparams < 1) break; - params = ¶ms[1]; - } /* end of deleting sections */ - - /* Save the modified wadfile */ - fpoint = fopen(argv[1], "wb"); - if(fpoint == NULL) { - fprintf(stderr, "%s: unable to open file %s for writing\n", - progname, argv[1]); - return EXIT_FAILURE; - } - if(write_wadfile(fpoint, wfptr) != 0) { - fprintf(stderr, "%s: unable to write wadfile to disk\n", - progname); - return EXIT_FAILURE; - } - fclose(fpoint); - printf("File %s successfully updated.\n", argv[1]); - } /* end of C_DELSECT */ - break; - - case C_ADDSECT: { - - /* Parse options (none) */ - if(numparams > 1 && params[0][0] == '-') { - fprintf(stderr, "%s: no option %s for command %s", - progname, params[0], argv[2]); - return EXIT_FAILURE; - } - - if(numparams < 1) { - fprintf(stderr, "%s: not enough parameters for %s", progname, - argv[2]); - return EXIT_FAILURE; - } - - /* Add sections */ - printf("Adding sections in %s...\n", argv[1]); - for(;;) { - struct lumplist *curlump; - - /* Assume a map name if length > 2 */ - if(strlen(params[0]) > 2) startname = params[0]; - else { - startname = malloc(strlen(params[0]) + 7); - endname = malloc(strlen(params[0]) + 5); - if(startname == NULL || endname == NULL) { - fprintf(stderr, "%s: out of memory\n", progname); - return EXIT_FAILURE; - } - sprintf(startname, "%s_START", params[0]); - sprintf(endname, "%s_END", params[0]); - } - - /* Add section, unless it already exists */ - if(find_previous_lump(wfptr->head, NULL, startname) == NULL) { - struct lumplist *last; - - last = find_last_lump(wfptr); - if(add_lump(wfptr, last, startname, 0, NULL) != 0) { - fprintf(stderr, "%s: unable to add lump %s\n", - progname, startname); - return EXIT_FAILURE; - } - - if(endname != NULL) { - last = last->next; - if(add_lump(wfptr, last, endname, 0, NULL) != 0) { - fprintf(stderr, "%s: unable to add lump %s\n", - progname, endname); - return EXIT_FAILURE; - } - } - - printf("Added section %s.\n", params[0]); - } else - printf("Section %s already exists. Taking no action.\n", - params[0]); - - /* Move to next parameter, if it exists */ - numparams--; - if(numparams < 1) break; - params = ¶ms[1]; - } /* end of adding sections */ - - /* Save the modified wadfile */ - fpoint = fopen(argv[1], "wb"); - if(fpoint == NULL) { - fprintf(stderr, "%s: unable to open file %s for writing\n", - progname, argv[1]); - return EXIT_FAILURE; - } - if(write_wadfile(fpoint, wfptr) != 0) { - fprintf(stderr, "%s: unable to write wadfile to disk\n", - progname); - return EXIT_FAILURE; - } - fclose(fpoint); - printf("File %s successfully updated.\n", argv[1]); - } /* end of C_ADDSECT */ - } /* end of command-specific stuff */ - - return EXIT_SUCCESS; -} diff --git a/tools/lumpmod/lumpmod.html b/tools/lumpmod/lumpmod.html deleted file mode 100644 index 082784178..000000000 --- a/tools/lumpmod/lumpmod.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - -LumpMod v0.2.1 Documentation -

LumpMod v0.2.1

-

LumpMod is a small command-line utility for working with lumps in wad -files in the format used by DOOM and DOOM 2. It can add, delete, extract, -rename, list, and update individual lumps. It can also add sections -(XX_START and XX_END, for instance) and delete entire sections.

-

Usage

-

lumpmod [wadfile] [command] [-s section] [parameters]

-

Sections are MAPxx (xx = 01-99, where that map exists in the file), ExMy -(x, y = 1-9, where that map exists in the file), and anything else will be -the section between WHATEVER_START and WHATEVER_END. Sections that do not -exist in the wad file cannot be used. The section part can be left out to -work with the whole file. Any section specified here while using the addsect -or delsect commands will cause an error.

-

Note that the []... parameters in the command listings can be repeated. -For example, you can use lumpmod clowns.wad add CLOWNS clowns.lmp to -add a CLOWNS lump, or lumpmod clowns.wad add CLOWN1 clown1.lmp CLOWN2 -clown2.lmp to add two clown-related lumps.

-

Note also that lump names and commands are case sensitive. There is an -update command, but no UPDATE command.

-

Commands

-

add [-a lumpname] [-b] [-d] [-n] [LUMPNAME FILENAME]...

-

Add a lump to the end of the wad, or after the lump specified with the -a -option. If the lump already exists, it will be overwritten (with its position -unchanged) unless the -n option is specified, in which case no action will be -taken, or the -d option is specified, in which case an additional lump with -the same name will be added. If the lump specified in the -a option does not -exist, an error will occur. The -b option will add the lump at the beginning, -overriding the -a option.

-

addsect [SECTNAME]...

-

Add a section. The name must be one or two characters long. If section -name is HX, zero-length entries HX_START and HX_END will be added to the end -of the wad file. If this section already exists, no action will be taken.

-

delete [LUMPNAME]...

-

Remove LUMPNAME from the wad.

-

delsect [SECTNAME]...

-

Delete a section and anything inside it. If the section doesn't exist, no -action will be taken.

-

extract [LUMPNAME FILENAME]...

-

Save the contents of LUMPNAME to the file named FILENAME. (Wad file will -not be changed in any way.)

-

list [-v]

-

List all lumps in the wad, in the order they appear in the directory. -With the -v option, include numbers and lump lengths.

-

rename [OLDNAME NEWNAME]...

-

Rename a lump in the wad.

-

update [LUMPNAME FILENAME]...

-

Update LUMPNAME with the contents of FILENAME. If no lump named LUMPNAME -exists in the wad, no action will be taken.

-

Changes

-

Version 0.2.1 adds the -d option to the add command.

-

Version 0.2 contains a fix to a bug involving empty sections. The initial -public release was version 0.1.

-

Bugs

-

LumpMod currently chokes on completely empty wad files (i.e., those that -contain absolutely no lumps). Let me know if you find any other bugs.

-

Author

-
-

Thanks

-

Thanks to Matthew S. Fell for writing "The Unofficial DOOM -Specs," which were very helpful in making this program.

-

License

-

Copyright © 2003 Thunder Palace Entertainment.

-

This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version.

-

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., 675 Mass Ave, Cambridge, MA 02139, USA.

- From af1485075b4ee850f0c6fa930d78aa74c64a2a43 Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sun, 17 Jul 2022 19:50:58 -0500 Subject: [PATCH 373/377] Remove old SDL 1.2 patches SRB2 no longer works with 1.2 or Dreamcast so these are irrelevant --- tools/SDL-1.2.14-gc/README | 1 - tools/SDL-1.2.14-gc/SDL-1.2.14-gc.patch | 641 ------- tools/SDL1.2.7_CE/SDL-1.27_CE.diff | 2260 ----------------------- tools/SDL1.2.7_CE/VisualCEv2.zip | Bin 273151 -> 0 bytes 4 files changed, 2902 deletions(-) delete mode 100644 tools/SDL-1.2.14-gc/README delete mode 100644 tools/SDL-1.2.14-gc/SDL-1.2.14-gc.patch delete mode 100644 tools/SDL1.2.7_CE/SDL-1.27_CE.diff delete mode 100644 tools/SDL1.2.7_CE/VisualCEv2.zip diff --git a/tools/SDL-1.2.14-gc/README b/tools/SDL-1.2.14-gc/README deleted file mode 100644 index 8ce488fa9..000000000 --- a/tools/SDL-1.2.14-gc/README +++ /dev/null @@ -1 +0,0 @@ -Once patched, run autogen.sh, configure with "./configure --without-x --disable-video-x11 --disable-video-fbcon --disable-video-aalib --disable-video-directfb --disable-video-opengl --enable-video-gc" and then compile. diff --git a/tools/SDL-1.2.14-gc/SDL-1.2.14-gc.patch b/tools/SDL-1.2.14-gc/SDL-1.2.14-gc.patch deleted file mode 100644 index 5b2b2cfa0..000000000 --- a/tools/SDL-1.2.14-gc/SDL-1.2.14-gc.patch +++ /dev/null @@ -1,641 +0,0 @@ -From 8e6ada7bc33e3cc4e1c17821ea171bf0815a505d Mon Sep 17 00:00:00 2001 -From: Alam Arias -Date: Tue, 1 Dec 2009 19:31:57 -0500 -Subject: [PATCH] SDL GC hack - ---- - configure.in | 17 ++ - include/SDL_config.h.in | 1 + - src/video/fbcon/SDL_fbgc.c | 471 +++++++++++++++++++++++++++++++++++++++++ - src/video/fbcon/SDL_fbgc.h | 35 +++ - src/video/fbcon/SDL_fbvideo.c | 10 + - src/video/fbcon/SDL_fbvideo.h | 11 + - 6 files changed, 545 insertions(+), 0 deletions(-) - create mode 100644 src/video/fbcon/SDL_fbgc.c - create mode 100644 src/video/fbcon/SDL_fbgc.h - -diff --git a/configure.in b/configure.in -index a7e9b18..a8961ba 100644 ---- a/configure.in -+++ b/configure.in -@@ -1227,6 +1227,22 @@ AC_HELP_STRING([--enable-video-fbcon], [use framebuffer console video driver [[d - fi - } - -+dnl See if we're running on Linux for the Nintendo GameCube/Wii -+dnl FIXME, perform a real test here... -+CheckGC() -+{ -+ AC_ARG_ENABLE(video-gc, -+AC_HELP_STRING([--enable-video-gc], [enable GameCube video support in FB [[default=no]]]), -+ , enable_video_gc=no) -+ if test x$enable_video = xyes -a x$enable_video_gc = xyes -a x$video_fbcon = xyes; then -+ video_gc=yes -+ AC_MSG_RESULT($video_gc) -+ if test x$video_gc = xyes; then -+ AC_DEFINE(SDL_VIDEO_DRIVER_GC) -+ fi -+ fi -+} -+ - dnl Find DirectFB - CheckDirectFB() - { -@@ -2322,6 +2338,7 @@ case "$host" in - CheckX11 - CheckNANOX - CheckFBCON -+ CheckGC - CheckDirectFB - CheckPS2GS - CheckPS3 -diff --git a/include/SDL_config.h.in b/include/SDL_config.h.in -index 58593ca..e523e9b 100644 ---- a/include/SDL_config.h.in -+++ b/include/SDL_config.h.in -@@ -262,6 +262,7 @@ - #undef SDL_VIDEO_DRIVER_DUMMY - #undef SDL_VIDEO_DRIVER_FBCON - #undef SDL_VIDEO_DRIVER_GAPI -+#undef SDL_VIDEO_DRIVER_GC - #undef SDL_VIDEO_DRIVER_GEM - #undef SDL_VIDEO_DRIVER_GGI - #undef SDL_VIDEO_DRIVER_IPOD -diff --git a/src/video/fbcon/SDL_fbgc.c b/src/video/fbcon/SDL_fbgc.c -new file mode 100644 -index 0000000..b3b72bb ---- /dev/null -+++ b/src/video/fbcon/SDL_fbgc.c -@@ -0,0 +1,471 @@ -+/* -+ SDL - Simple DirectMedia Layer -+ Copyright (C) 1997-2009 Sam Lantinga -+ -+ This library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ This library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with this library; if not, write to the Free Software -+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ -+ Sam Lantinga -+ slouken@libsdl.org -+*/ -+#include "SDL_config.h" -+ -+#ifdef SDL_VIDEO_DRIVER_GC -+#include -+#include "SDL_video.h" -+#include "../SDL_blit.h" -+#include "SDL_fbgc.h" -+ -+static Uint32 r_Yr[256]; -+static Uint32 g_Yg_[256]; -+static Uint32 b_Yb[256]; -+static Uint32 r_Ur[256]; -+static Uint32 g_Ug_[256]; -+static Uint32 b_Ub[256]; -+/* static Uint32 r_Vr[256]; // space and cache optimisation */ -+#define r_Vr b_Ub -+static Uint32 g_Vg_[256]; -+static Uint32 b_Vb[256]; -+ -+static Uint8 RGB16toY[1 << 16]; -+static Uint8 RGB16toU[1 << 16]; -+static Uint8 RGB16toV[1 << 16]; -+ -+#ifndef FBIOFLIPHACK -+#define FBIOFLIPHACK 0x4623 /* gc-linux */ -+#endif -+ -+#ifndef GC_BLACK -+#define GC_BLACK 0x00800080 -+#endif -+ -+#ifdef GC_DEBUG -+# define GC_DPRINTF(fmt, args...) \ -+ fprintf(stderr,"DDD|%s: " fmt, __FUNCTION__ , ## args) -+#else -+# define GC_DPRINTF(fmt, args...) -+#endif -+ -+SDL_bool GC_Test(_THIS) -+{ -+ int fliptest; -+ if (ioctl(console_fd, FBIOFLIPHACK, &fliptest)) -+ return SDL_TRUE; -+ return SDL_FALSE; -+} -+ -+SDL_bool GC_Available(void) -+{ -+ if (access("/sys/bus/of_platform/drivers/gcn-vifb", 0) == 0) -+ return SDL_TRUE; -+ -+ return SDL_FALSE; -+} -+ -+/* -+ * -+ * Color space handling. -+ */ -+ -+#define RGB2YUV_SHIFT 16 -+#define RGB2YUV_LUMA 16 -+#define RGB2YUV_CHROMA 128 -+ -+#define Yr ((int)( 0.299*(1< y) ? y : z)) -+ -+static void GC_InitRGB2YUVTables(void) -+{ -+ unsigned int i; -+ unsigned int r, g, b; -+ -+ for (i = 0; i < 256; i++) { -+ r_Yr[i] = Yr * i; -+ g_Yg_[i] = Yg * i + (RGB2YUV_LUMA << RGB2YUV_SHIFT); -+ b_Yb[i] = Yb * i; -+ r_Ur[i] = Ur * i; -+ g_Ug_[i] = Ug * i + (RGB2YUV_CHROMA << RGB2YUV_SHIFT); -+ b_Ub[i] = Ub * i; -+ r_Vr[i] = Vr * i; -+ g_Vg_[i] = Vg * i + (RGB2YUV_CHROMA << RGB2YUV_SHIFT); -+ b_Vb[i] = Vb * i; -+ } -+ -+ for (i = 0; i < 1 << 16; i++) { -+ /* RGB565 */ -+ r = ((i >> 8) & 0xf8); -+ g = ((i >> 3) & 0xfc); -+ b = ((i << 3) & 0xf8); -+ /* extend to 8bit */ -+ r |= (r >> 5); -+ g |= (g >> 6); -+ b |= (b >> 5); -+ -+ RGB16toY[i] = -+ clamp(16, 235, -+ (r_Yr[r] + g_Yg_[g] + b_Yb[b]) >> RGB2YUV_SHIFT); -+ RGB16toU[i] = -+ clamp(16, 240, -+ (r_Ur[r] + g_Ug_[g] + b_Ub[b]) >> RGB2YUV_SHIFT); -+ RGB16toV[i] = -+ clamp(16, 240, -+ (r_Vr[r] + g_Vg_[g] + b_Vb[b]) >> RGB2YUV_SHIFT); -+ } -+} -+ -+static inline Uint32 rgbrgb16toyuy2(Uint16 rgb1, Uint16 rgb2) -+{ -+ register int Y1, Cb, Y2, Cr; -+ Uint16 rgb; -+ -+ /* fast path, thanks to bohdy */ -+ if (!(rgb1 | rgb2)) { -+ return GC_BLACK; /* black, black */ -+ } -+ -+ if (rgb1 == rgb2) { -+ /* fast path, thanks to isobel */ -+ Y1 = Y2 = RGB16toY[rgb1]; -+ Cb = RGB16toU[rgb1]; -+ Cr = RGB16toV[rgb1]; -+ } else { -+ Y1 = RGB16toY[rgb1]; -+ Y2 = RGB16toY[rgb2]; -+ -+ /* RGB565 average */ -+ rgb = ((rgb1 >> 1) & 0xFBEF) + ((rgb2 >> 1) & 0xFBEF) + -+ ((rgb1 & rgb2) & 0x0821); -+ -+ Cb = RGB16toU[rgb]; -+ Cr = RGB16toV[rgb]; -+ } -+ -+ return (((char)Y1) << 24) | (((char)Cb) << 16) | (((char)Y2) << 8) -+ | (((char)Cr) << 0); -+} -+ -+/* -+ * -+ * Blitters. -+ */ -+static void GC_UpdateRectRGB16(_THIS, SDL_Rect * rect, int pitch) -+{ -+ int width, height, left, i, mod, mod32; -+ Uint8 *src, *dst; -+ Uint32 *src32, *dst32; -+ Uint16 *rgb; -+ -+ /* XXX case width < 2 needs special treatment */ -+ -+ /* in pixel units */ -+ left = rect->x & ~1; /* 2 pixel align */ -+ width = (rect->w + 1) & ~1; /* 2 pixel align in excess */ -+ height = rect->h; -+ -+ /* in bytes, src and dest are 16bpp */ -+ src = shadow_mem + (rect->y * pitch) + left * 2; -+ dst = flip_address[back_page] + page_offset + -+ (rect->y * pitch) + left * 2; -+ mod = pitch - width * 2; -+ -+ src32 = (Uint32 *) src; -+ dst32 = (Uint32 *) dst; -+ mod32 = mod / 4; -+ -+ while (height--) { -+ i = width / 2; -+ -+ while (i--) { -+ rgb = (Uint16 *) src32; -+ *dst32++ = rgbrgb16toyuy2(rgb[0], rgb[1]); -+ src32++; -+ } -+ src32 += mod32; -+ dst32 += mod32; -+ } -+} -+ -+void GC_Init(_THIS, SDL_PixelFormat *vformat) -+{ -+ GC_InitRGB2YUVTables(); -+ -+ /* 16 bits per pixel */ -+ vformat->BitsPerPixel = 16; -+ vformat->BytesPerPixel = 2; -+ /* RGB565 */ -+ vformat->Rmask = 0x0000f800; -+ vformat->Gmask = 0x000007e0; -+ vformat->Bmask = 0x0000001f; -+ -+ shadow_fb = 1; -+} -+ -+/* -+ * -+ * Video mode handling. -+ */ -+ -+/* only 640x480 16bpp is currently supported */ -+const static SDL_Rect RECT_640x480 = { 0, 0, 640, 480 }; -+const static SDL_Rect *vid_modes[] = { -+ &RECT_640x480, -+ NULL -+}; -+ -+static SDL_Rect **GC_ListModes(_THIS, SDL_PixelFormat * format, Uint32 flags) -+{ -+ switch (format->BitsPerPixel) { -+ case 16: -+ return (SDL_Rect **) vid_modes; -+ default: -+ return NULL; -+ } -+} -+ -+SDL_Surface *GC_SetVideoMode(_THIS, SDL_Surface * current, -+ int width, int height, int bpp, Uint32 flags) -+{ -+ struct fb_fix_screeninfo finfo; -+ struct fb_var_screeninfo vinfo; -+ int i; -+ Uint32 Rmask; -+ Uint32 Gmask; -+ Uint32 Bmask; -+ Uint32 *p, *q; -+ Uint32 yres; -+ -+ GC_DPRINTF("Setting %dx%d %dbpp %smode\n", width, height, bpp, -+ (flags & SDL_DOUBLEBUF)?"(doublebuf) ":""); -+ -+ /* Set the terminal into graphics mode */ -+ if (FB_EnterGraphicsMode(this) < 0) { -+ return (NULL); -+ } -+ -+ /* Restore the original palette */ -+ //FB_RestorePalette(this); -+ -+ /* Set the video mode and get the final screen format */ -+ if (ioctl(console_fd, FBIOGET_VSCREENINFO, &vinfo) < 0) { -+ SDL_SetError("Couldn't get console screen info"); -+ return (NULL); -+ } -+ -+ yres = vinfo.yres; -+ -+ /* hack to center 640x480 resolution on PAL cubes */ -+ if (vinfo.xres == 640 && vinfo.yres == 576) { -+ page_offset = ((576 - 480) / 2) * 640 * ((bpp + 7) / 8); -+ } else { -+ page_offset = 0; -+ } -+ -+ /* clear all video memory */ -+ p = (Uint32 *)mapped_mem; -+ q = (Uint32 *)(mapped_mem + mapped_memlen); -+ while (p < q) -+ *p++ = GC_BLACK; -+ -+ if ((vinfo.xres != width) || (vinfo.yres != height) || -+ (vinfo.bits_per_pixel != bpp)) { -+ vinfo.activate = FB_ACTIVATE_NOW; -+ vinfo.accel_flags = 0; -+ vinfo.bits_per_pixel = bpp; -+ vinfo.xres = width; -+ vinfo.xres_virtual = width; -+ /* do not modify yres*, we use a fake 640x480 mode in PAL */ -+ //vinfo.yres = height; -+ //vinfo.yres_virtual = 2*height; -+ vinfo.xoffset = 0; -+ vinfo.yoffset = 0; -+ vinfo.red.length = vinfo.red.offset = 0; -+ vinfo.green.length = vinfo.green.offset = 0; -+ vinfo.blue.length = vinfo.blue.offset = 0; -+ vinfo.transp.length = vinfo.transp.offset = 0; -+ -+ if (ioctl(console_fd, FBIOPUT_VSCREENINFO, &vinfo) < 0) { -+ SDL_SetError("Couldn't set console screen info"); -+ return (NULL); -+ } -+ } else { -+ int maxheight; -+ -+ /* Figure out how much video memory is available */ -+ maxheight = 2*yres; -+ if (vinfo.yres_virtual > maxheight) { -+ vinfo.yres_virtual = maxheight; -+ } -+ } -+ cache_vinfo = vinfo; -+ -+ Rmask = 0; -+ for (i = 0; i < vinfo.red.length; ++i) { -+ Rmask <<= 1; -+ Rmask |= (0x00000001 << vinfo.red.offset); -+ } -+ Gmask = 0; -+ for (i = 0; i < vinfo.green.length; ++i) { -+ Gmask <<= 1; -+ Gmask |= (0x00000001 << vinfo.green.offset); -+ } -+ Bmask = 0; -+ for (i = 0; i < vinfo.blue.length; ++i) { -+ Bmask <<= 1; -+ Bmask |= (0x00000001 << vinfo.blue.offset); -+ } -+ if (!SDL_ReallocFormat(current, bpp, Rmask, Gmask, Bmask, 0)) { -+ return (NULL); -+ } -+ -+ /* Get the fixed information about the console hardware. -+ This is necessary since finfo.line_length changes. -+ */ -+ if (ioctl(console_fd, FBIOGET_FSCREENINFO, &finfo) < 0) { -+ SDL_SetError("Couldn't get console hardware info"); -+ return (NULL); -+ } -+ -+ /* Save hardware palette, if needed */ -+ //FB_SavePalette(this, &finfo, &vinfo); -+ -+ /* Set up the new mode framebuffer */ -+ current->flags = SDL_FULLSCREEN; -+ current->w = width; -+ current->h = height; -+ current->pitch = width * ((bpp + 7) / 8); -+ current->pixels = shadow_mem; -+ -+ flip_address[0] = mapped_mem; -+ flip_address[1] = mapped_mem + current->pitch * yres; -+ -+ back_page = 1; -+ if (flags & SDL_DOUBLEBUF) { -+ current->flags |= SDL_DOUBLEBUF; -+ flip_pending = 1; -+ } else { -+ flip_pending = 0; -+ /* make page 0 both the visible and back page */ -+ back_page = ioctl(console_fd, FBIOFLIPHACK, &back_page); -+ if (back_page < 0) -+ back_page = 0; -+ } -+ -+ /* Set the update rectangle function */ -+ switch (bpp) { -+ case 16: -+ GC_DPRINTF("Using 16bpp blitter\n"); -+ this->hidden->UpdateRect = GC_UpdateRectRGB16; -+ break; -+ default: -+ GC_DPRINTF("Using NO blitter\n"); -+ this->hidden->UpdateRect = NULL; -+ break; -+ } -+ -+ /* Handle OpenGL support */ -+#ifdef HAVE_OPENGL -+ if (flags & SDL_OPENGL) { -+ if (GC_GL_CreateWindow(this, width, height) == 0) { -+ current->flags |= (SDL_OPENGL | SDL_FULLSCREEN); -+ } else { -+ current = NULL; -+ } -+ } -+#endif /* HAVE_OPENGL */ -+ -+ /* We're done */ -+ return (current); -+} -+ -+static int GC_FlipHWSurface(_THIS, SDL_Surface * surface) -+{ -+ if (flip_pending) { -+ /* SDL_UpdateRect was not called */ -+ SDL_UpdateRect(this->screen, 0, 0, 0, 0); -+ } -+ -+ /* flip video page as soon as possible */ -+ ioctl(console_fd, FBIOFLIPHACK, NULL); -+ flip_pending = 1; -+ -+ return (0); -+} -+ -+static void GC_WaitForFlipCompletion(_THIS) -+{ -+ int visible_page; -+ int result; -+ -+ if (flip_pending) { -+ flip_pending = 0; -+ back_page ^= 1; -+ visible_page = back_page; -+ while (visible_page == back_page) { -+ /* wait until back_page is not visible */ -+ result = ioctl(console_fd, FBIOFLIPHACK, &back_page); -+ if (result < 0) { -+ if ((errno == EINTR) || (errno == EAGAIN)) -+ continue; -+ return; /* ioctl unsupported ... */ -+ } -+ visible_page = result; -+ } -+ /* -+ * At this point the back_page is not visible. We can safely -+ * write to it without tearing. -+ */ -+ } -+} -+ -+static void GC_UpdateRects(_THIS, int numrects, SDL_Rect * rects) -+{ -+ SDL_Surface *screen; -+ int pitch; -+ -+ /* external yuy2 fb is 16bpp */ -+ -+ screen = this->screen; -+ pitch = screen->pitch; /* this is the pitch of the shadow buffer */ -+ -+ if (this->hidden->UpdateRect) { -+ GC_WaitForFlipCompletion(this); -+ while (numrects--) { -+ if (rects->w <= 0 || rects->h <= 0) -+ continue; -+ this->hidden->UpdateRect(this, rects, pitch); -+ rects++; -+ } -+ } -+} -+ -+void GC_CreateDevice(SDL_VideoDevice *this) -+{ -+ this->ListModes = GC_ListModes; -+ this->SetVideoMode = GC_SetVideoMode; -+ this->FlipHWSurface = GC_FlipHWSurface; -+ this->UpdateRects = GC_UpdateRects; -+} -+ -+#endif -diff --git a/src/video/fbcon/SDL_fbgc.h b/src/video/fbcon/SDL_fbgc.h -new file mode 100644 -index 0000000..534a73e ---- /dev/null -+++ b/src/video/fbcon/SDL_fbgc.h -@@ -0,0 +1,35 @@ -+/* -+ SDL - Simple DirectMedia Layer -+ Copyright (C) 1997-2009 Sam Lantinga -+ -+ This library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ This library 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 -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with this library; if not, write to the Free Software -+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ -+ Sam Lantinga -+ slouken@libsdl.org -+*/ -+#include "SDL_config.h" -+ -+ -+#ifdef SDL_VIDEO_DRIVER_GC -+/* Gamecube/Wii hardware setup for the SDL framebuffer console driver */ -+ -+#include "SDL_fbvideo.h" -+ -+extern SDL_bool GC_Available(void); -+extern void GC_CreateDevice(SDL_VideoDevice *this); -+ -+extern SDL_bool GC_Test(_THIS); -+extern void GC_Init(_THIS, SDL_PixelFormat *vformat); -+#endif -diff --git a/src/video/fbcon/SDL_fbvideo.c b/src/video/fbcon/SDL_fbvideo.c -index 81a89da..328790e 100644 ---- a/src/video/fbcon/SDL_fbvideo.c -+++ b/src/video/fbcon/SDL_fbvideo.c -@@ -272,6 +272,11 @@ static SDL_VideoDevice *FB_CreateDevice(int devindex) - - this->free = FB_DeleteDevice; - -+#ifdef SDL_VIDEO_DRIVER_GC -+ if (GC_Available(this)) -+ GC_CreateDevice(this); -+#endif -+ - return this; - } - -@@ -784,6 +789,11 @@ static int FB_VideoInit(_THIS, SDL_PixelFormat *vformat) - } - } - -+#ifdef SDL_VIDEO_DRIVER_GC -+ if (GC_Test(this)) -+ GC_Init(this, vformat); -+#endif -+ - if (shadow_fb) { - shadow_mem = (char *)SDL_malloc(mapped_memlen); - if (shadow_mem == NULL) { -diff --git a/src/video/fbcon/SDL_fbvideo.h b/src/video/fbcon/SDL_fbvideo.h -index 03b9e94..74d1460 100644 ---- a/src/video/fbcon/SDL_fbvideo.h -+++ b/src/video/fbcon/SDL_fbvideo.h -@@ -106,6 +106,12 @@ struct SDL_PrivateVideoData { - - void (*wait_vbl)(_THIS); - void (*wait_idle)(_THIS); -+#ifdef SDL_VIDEO_DRIVER_GC -+ void (*UpdateRect) (_THIS, SDL_Rect * rect, int pitch); -+ int back_page; -+ int page_offset; -+ int flip_pending; -+#endif - }; - /* Old variable names */ - #define console_fd (this->hidden->console_fd) -@@ -147,6 +153,11 @@ struct SDL_PrivateVideoData { - #define screen_palette (this->hidden->screen_palette) - #define wait_vbl (this->hidden->wait_vbl) - #define wait_idle (this->hidden->wait_idle) -+#ifdef SDL_VIDEO_DRIVER_GC -+#define back_page (this->hidden->back_page) -+#define page_offset (this->hidden->page_offset) -+#define flip_pending (this->hidden->flip_pending) -+#endif - - /* Accelerator types that are supported by the driver, but are not - necessarily in the kernel headers on the system we compile on. --- -1.6.5 - diff --git a/tools/SDL1.2.7_CE/SDL-1.27_CE.diff b/tools/SDL1.2.7_CE/SDL-1.27_CE.diff deleted file mode 100644 index 196329b84..000000000 --- a/tools/SDL1.2.7_CE/SDL-1.27_CE.diff +++ /dev/null @@ -1,2260 +0,0 @@ -diff -ruN SDL-1.2.7-orig/src/audio/windib/SDL_dibaudio.c SDL-1.2.7/src/audio/windib/SDL_dibaudio.c ---- SDL-1.2.7-orig/src/audio/windib/SDL_dibaudio.c Wed Feb 18 09:22:00 2004 -+++ SDL-1.2.7/src/audio/windib/SDL_dibaudio.c Thu Nov 18 12:07:29 2004 -@@ -146,8 +146,16 @@ - - /* Set high priority for the audio thread */ - static void DIB_ThreadInit(_THIS) --{ -- SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); -+{ -+#ifdef _WIN32_WCE -+#ifdef SH3 -+ SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL); -+#else -+ SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL); -+#endif -+#else -+ SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); -+#endif - } - - void DIB_WaitAudio(_THIS) -diff -ruN SDL-1.2.7-orig/src/cpuinfo/SDL_cpuinfo.c SDL-1.2.7/src/cpuinfo/SDL_cpuinfo.c ---- SDL-1.2.7-orig/src/cpuinfo/SDL_cpuinfo.c Tue Feb 10 07:31:36 2004 -+++ SDL-1.2.7/src/cpuinfo/SDL_cpuinfo.c Fri Nov 19 20:53:01 2004 -@@ -38,6 +38,10 @@ - - #ifdef MACOSX - #include /* For AltiVec check */ -+#endif -+ -+#if defined(_MSC_VER) && (defined(ARM) || defined(MIPS) || defined(SHx)) -+#undef _MSC_VER - #endif - - #define CPU_HAS_RDTSC 0x00000001 -diff -ruN SDL-1.2.7-orig/src/joystick/win32/SDL_mmjoystick.c SDL-1.2.7/src/joystick/win32/SDL_mmjoystick.c ---- SDL-1.2.7-orig/src/joystick/win32/SDL_mmjoystick.c Wed Feb 18 09:22:02 2004 -+++ SDL-1.2.7/src/joystick/win32/SDL_mmjoystick.c Fri Nov 19 20:47:22 2004 -@@ -37,6 +37,7 @@ - - #include - #include -+#include - - #define MAX_JOYSTICKS 16 - #define MAX_AXES 6 /* each joystick can have up to 6 axes */ -@@ -51,6 +52,7 @@ - /* array to hold joystick ID values */ - static UINT SYS_JoystickID[MAX_JOYSTICKS]; - static JOYCAPS SYS_Joystick[MAX_JOYSTICKS]; -+static char *SYS_JoystickName[MAX_JOYSTICKS]; - - /* The private structure used to keep track of a joystick */ - struct joystick_hwdata -@@ -69,6 +71,78 @@ - /* Convert a win32 Multimedia API return code to a text message */ - static void SetMMerror(char *function, int code); - -+static char *GetJoystickName(int index, const char *szRegKey) -+{ -+ /* added 7/24/2004 by Eckhard Stolberg */ -+ /* -+ see if there is a joystick for the current -+ index (1-16) listed in the registry -+ */ -+ char *name = NULL; -+ HKEY hKey; -+ DWORD regsize; -+ LONG regresult; -+ unsigned char regkey[256]; -+ unsigned char regvalue[256]; -+ unsigned char regname[256]; -+ -+ sprintf(regkey, "%s\\%s\\%s", -+ REGSTR_PATH_JOYCONFIG, -+ szRegKey, -+ REGSTR_KEY_JOYCURR); -+ regresult = RegOpenKeyExA(HKEY_LOCAL_MACHINE, -+ (LPTSTR) ®key, 0, KEY_READ, &hKey); -+ if (regresult == ERROR_SUCCESS) -+ { -+ /* -+ find the registry key name for the -+ joystick's properties -+ */ -+ regsize = sizeof(regname); -+ sprintf(regvalue, -+ "Joystick%d%s", index+1, -+ REGSTR_VAL_JOYOEMNAME); -+ regresult = RegQueryValueExA(hKey, -+ regvalue, 0, 0, (LPBYTE) ®name, -+ (LPDWORD) ®size); -+ RegCloseKey(hKey); -+ if (regresult == ERROR_SUCCESS) -+ { -+ /* open that registry key */ -+ sprintf(regkey, "%s\\%s", -+ REGSTR_PATH_JOYOEM, regname); -+ regresult = RegOpenKeyExA(HKEY_LOCAL_MACHINE, -+ regkey, 0, KEY_READ, &hKey); -+ if (regresult == ERROR_SUCCESS) -+ { -+ /* find the size for the OEM name text */ -+ regsize = sizeof(regvalue); -+ regresult = -+ RegQueryValueExA(hKey, -+ REGSTR_VAL_JOYOEMNAME, -+ 0, 0, NULL, -+ (LPDWORD) ®size); -+ if (regresult == ERROR_SUCCESS) -+ { -+ /* -+ allocate enough memory -+ for the OEM name text ... -+ */ -+ name = (char *) malloc(regsize); -+ /* ... and read it from the registry */ -+ regresult = -+ RegQueryValueExA(hKey, -+ REGSTR_VAL_JOYOEMNAME, 0, 0, -+ (LPBYTE) name, -+ (LPDWORD) ®size); -+ RegCloseKey(hKey); -+ } -+ } -+ } -+ } -+ return(name); -+} -+ - - /* Function to scan the system for joysticks. - * This function should set SDL_numjoysticks to the number of available -@@ -94,6 +168,7 @@ - - for ( i = 0; i < MAX_JOYSTICKS; i++ ) { - SYS_JoystickID[i] = JOYSTICKID1 + i; -+ SYS_JoystickName[i] = NULL; - } - - -@@ -110,6 +185,7 @@ - if ( result == JOYERR_NOERROR ) { - SYS_JoystickID[numdevs] = SYS_JoystickID[i]; - SYS_Joystick[numdevs] = joycaps; -+ SYS_JoystickName[numdevs] = GetJoystickName(numdevs, joycaps.szRegKey); - numdevs++; - } - } -@@ -120,8 +196,11 @@ - /* Function to get the device-dependent name of a joystick */ - const char *SDL_SYS_JoystickName(int index) - { -- /***-> test for invalid index ? */ -+ if ( SYS_JoystickName[index] != NULL ) { -+ return(SYS_JoystickName[index]); -+ } else { - return(SYS_Joystick[index].szPname); -+ } - } - - /* Function to open a joystick for use. -@@ -292,7 +371,12 @@ - /* Function to perform any system-specific joystick related cleanup */ - void SDL_SYS_JoystickQuit(void) - { -- return; -+ int i; -+ for (i = 0; i < MAX_JOYSTICKS; i++) { -+ if ( SYS_JoystickName[i] != NULL ) { -+ free(SYS_JoystickName[i]); -+ } -+ } - } - - -diff -ruN SDL-1.2.7-orig/src/video/SDL_sysvideo.h SDL-1.2.7/src/video/SDL_sysvideo.h ---- SDL-1.2.7-orig/src/video/SDL_sysvideo.h Wed Feb 18 09:22:04 2004 -+++ SDL-1.2.7/src/video/SDL_sysvideo.h Thu Nov 18 12:08:48 2004 -@@ -361,6 +361,9 @@ - #endif - #ifdef ENABLE_WINDIB - extern VideoBootStrap WINDIB_bootstrap; -+#endif -+#ifdef ENABLE_WINGAPI -+extern VideoBootStrap WINGAPI_bootstrap; - #endif - #ifdef ENABLE_DIRECTX - extern VideoBootStrap DIRECTX_bootstrap; -diff -ruN SDL-1.2.7-orig/src/video/SDL_video.c SDL-1.2.7/src/video/SDL_video.c ---- SDL-1.2.7-orig/src/video/SDL_video.c Wed Feb 18 09:22:04 2004 -+++ SDL-1.2.7/src/video/SDL_video.c Thu Nov 18 12:11:01 2004 -@@ -80,6 +80,9 @@ - #endif - #ifdef ENABLE_DIRECTX - &DIRECTX_bootstrap, -+#endif -+#ifdef ENABLE_WINGAPI -+ &WINGAPI_bootstrap, - #endif - #ifdef ENABLE_WINDIB - &WINDIB_bootstrap, -diff -ruN SDL-1.2.7-orig/src/video/wincommon/SDL_sysevents.c SDL-1.2.7/src/video/wincommon/SDL_sysevents.c ---- SDL-1.2.7-orig/src/video/wincommon/SDL_sysevents.c Wed Feb 18 09:22:10 2004 -+++ SDL-1.2.7/src/video/wincommon/SDL_sysevents.c Thu Nov 18 12:28:03 2004 -@@ -40,6 +40,9 @@ - #include "SDL_lowvideo.h" - #include "SDL_syswm_c.h" - #include "SDL_main.h" -+#ifdef _WIN32_CE -+#include "SDL_dibvideo.h" -+#endif - - #ifdef WMMSG_DEBUG - #include "wmmsg.h" -@@ -173,6 +176,39 @@ - SDL_SetModState(state); - #endif /* !NO_GETKEYBOARDSTATE */ - } -+ -+#ifdef _WIN32_CE -+void transform(SDL_RotateAttr rotate, char ozone, Sint16 *x, Sint16 *y) { -+ Sint16 rotatedX; -+ Sint16 rotatedY; -+ -+ if (ozone) { -+ *x = *x * 2; -+ *y = *y * 2; -+ } -+ -+ switch(rotate) { -+ case SDL_ROTATE_NONE: -+ break; -+ case SDL_ROTATE_LEFT: -+ if (!SDL_VideoSurface) -+ break; -+ rotatedX = SDL_VideoSurface->w - *y; -+ rotatedY = *x; -+ *x = rotatedX; -+ *y = rotatedY; -+ break; -+ case SDL_ROTATE_RIGHT: -+ if (!SDL_VideoSurface) -+ break; -+ rotatedX = *y; -+ rotatedY = SDL_VideoSurface->h - *x; -+ *x = rotatedX; -+ *y = rotatedY; -+ break; -+ } -+} -+#endif - - /* The main Win32 event handler - DJM: This is no longer static as (DX5/DIB)_CreateWindow needs it -@@ -273,7 +309,11 @@ - SetCursorPos(center.x, center.y); - posted = SDL_PrivateMouseMotion(0, 1, x, y); - } -- } else { -+ } else { -+#ifdef _WIN32_CE -+ if (SDL_VideoSurface) -+ transform(rotation, ozoneHack, &x, &y); -+#endif - posted = SDL_PrivateMouseMotion(0, 0, x, y); - } - } -@@ -361,8 +401,16 @@ - x = 0; y = 0; - } else { - x = (Sint16)LOWORD(lParam); -- y = (Sint16)HIWORD(lParam); -- } -+ y = (Sint16)HIWORD(lParam); -+#ifdef _WIN32_CE -+ if (SDL_VideoSurface) -+ transform(rotation, ozoneHack, &x, &y); -+#endif -+ } -+#ifdef _WIN32_WCE -+ /* Since stylus movements are not continuous */ -+ posted = SDL_PrivateMouseMotion(0, 0, x, y); -+#endif - posted = SDL_PrivateMouseButton( - state, button, x, y); - } -diff -ruN SDL-1.2.7-orig/src/video/wincommon/SDL_sysmouse.c SDL-1.2.7/src/video/wincommon/SDL_sysmouse.c ---- SDL-1.2.7-orig/src/video/wincommon/SDL_sysmouse.c Sat Aug 30 13:13:12 2003 -+++ SDL-1.2.7/src/video/wincommon/SDL_sysmouse.c Thu Nov 18 12:29:20 2004 -@@ -250,12 +250,16 @@ - - /* Check to see if we need to enter or leave mouse relative mode */ - void WIN_CheckMouseMode(_THIS) --{ -+{ -+#ifdef _WIN32_WCE -+ mouse_relative = 0; -+#else - /* If the mouse is hidden and input is grabbed, we use relative mode */ - if ( !(SDL_cursorstate & CURSOR_VISIBLE) && - (this->input_grab != SDL_GRAB_OFF) ) { - mouse_relative = 1; - } else { - mouse_relative = 0; -- } -+ } -+#endif - } -diff -ruN SDL-1.2.7-orig/src/video/windib/SDL_dibevents.c SDL-1.2.7/src/video/windib/SDL_dibevents.c ---- SDL-1.2.7-orig/src/video/windib/SDL_dibevents.c Wed Feb 18 09:22:10 2004 -+++ SDL-1.2.7/src/video/windib/SDL_dibevents.c Thu Nov 18 13:12:28 2004 -@@ -58,6 +58,29 @@ - /* DJM: If the user setup the window for us, we want to save his window proc, - and give him a chance to handle some messages. */ - static WNDPROC userWindowProc = NULL; -+ -+#ifdef _WIN32_WCE -+ -+WPARAM rotateKey(WPARAM key, SDL_RotateAttr direction) { -+ if (direction != SDL_ROTATE_LEFT) -+ return key; -+ -+ switch (key) { -+ case 0x26: /* up */ -+ return 0x27; -+ case 0x27: /* right */ -+ return 0x28; -+ case 0x28: /* down */ -+ return 0x25; -+ case 0x25: /* left */ -+ return 0x26; -+ } -+ -+ return key; -+} -+ -+#endif -+ - - /* The main Win32 event handler */ - LONG -@@ -69,6 +92,16 @@ - case WM_SYSKEYDOWN: - case WM_KEYDOWN: { - SDL_keysym keysym; -+ -+#ifdef _WIN32_WCE -+ // Drop GAPI artefacts -+ if (wParam == 0x84 || wParam == 0x5B) -+ return 0; -+ -+ // Rotate key if necessary -+ if (rotation != SDL_ROTATE_NONE) -+ wParam = rotateKey(wParam, rotation); -+#endif - - /* Ignore repeated keys */ - if ( lParam&REPEATED_KEYMASK ) { -@@ -129,6 +162,16 @@ - case WM_KEYUP: { - SDL_keysym keysym; - -+#ifdef _WIN32_WCE -+ // Drop GAPI artefacts -+ if (wParam == 0x84 || wParam == 0x5B) -+ return 0; -+ -+ // Rotate key if necessary -+ if (rotation != SDL_ROTATE_NONE) -+ wParam = rotateKey(wParam, rotation); -+#endif -+ - switch (wParam) { - case VK_CONTROL: - if ( lParam&EXTENDED_KEYMASK ) -@@ -333,7 +376,16 @@ - VK_keymap[VK_APPS] = SDLK_MENU; - - prev_shiftstates[0] = FALSE; -- prev_shiftstates[1] = FALSE; -+ prev_shiftstates[1] = FALSE; -+ -+#ifdef _WIN32_WCE -+ /* Hardcode the 4 magic keys to F1 F2 F3 F4 - the actual location of the keys varies ... */ -+ VK_keymap[0xC1] = SDLK_F1; -+ VK_keymap[0xC2] = SDLK_F2; -+ VK_keymap[0xC3] = SDLK_F3; -+ VK_keymap[0xC4] = SDLK_F4; -+#endif -+ - } - - static SDL_keysym *TranslateKey(UINT vkey, UINT scancode, SDL_keysym *keysym, int pressed) -@@ -364,9 +416,15 @@ - { - #ifndef CS_BYTEALIGNCLIENT - #define CS_BYTEALIGNCLIENT 0 -+#endif -+#ifdef _WIN32_CE -+ SDL_RegisterApp("SDL_app", CS_BYTEALIGNCLIENT | CS_HREDRAW | CS_VREDRAW, 0); -+#else -+ SDL_RegisterApp("SDL_app", CS_BYTEALIGNCLIENT, 0); - #endif -- SDL_RegisterApp("SDL_app", CS_BYTEALIGNCLIENT, 0); -- if ( SDL_windowid ) { -+ if ( SDL_windowid ) { -+// FIXME -+#ifndef _WIN32_WCE - SDL_Window = (HWND)strtol(SDL_windowid, NULL, 0); - - /* DJM: we want all event's for the user specified -@@ -375,11 +433,19 @@ - if (SDL_Window) { - userWindowProc = (WNDPROC)GetWindowLong(SDL_Window, GWL_WNDPROC); - SetWindowLong(SDL_Window, GWL_WNDPROC, (LONG)WinMessage); -- } -- } else { -+ } -+ #endif -+ } else { -+#ifdef _WIN32_WCE -+ -+ SDL_Window = CreateWindow(SDL_Appname, SDL_Appname, (WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX), -+ 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), -+ NULL, NULL, SDL_Instance, NULL); -+#else - SDL_Window = CreateWindow(SDL_Appname, SDL_Appname, - (WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX), -- CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, NULL, NULL, SDL_Instance, NULL); -+ CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, NULL, NULL, SDL_Instance, NULL); -+#endif - if ( SDL_Window == NULL ) { - SDL_SetError("Couldn't create window"); - return(-1); -diff -ruN SDL-1.2.7-orig/src/video/windib/SDL_dibvideo.c SDL-1.2.7/src/video/windib/SDL_dibvideo.c ---- SDL-1.2.7-orig/src/video/windib/SDL_dibvideo.c Wed Feb 18 09:22:10 2004 -+++ SDL-1.2.7/src/video/windib/SDL_dibvideo.c Mon Aug 8 18:27:52 2005 -@@ -29,15 +29,26 @@ - #include - #include - #include --#if defined(WIN32_PLATFORM_PSPC) -+#if (defined (UNDER_CE) && (UNDER_CE >= 420)) - #include // Add Pocket PC includes - #pragma comment( lib, "aygshell" ) // Link Pocket PC library - #endif -+ -+#ifdef _MSC_VER -+#pragma warning(disable: 4244) -+#define inline __inline -+#endif -+ - - /* Not yet in the mingw32 cross-compile headers */ - #ifndef CDS_FULLSCREEN - #define CDS_FULLSCREEN 4 - #endif -+ -+#ifndef WS_THICKFRAME -+#define WS_THICKFRAME 0 -+#endif -+ - - #include "SDL.h" - #include "SDL_mutex.h" -@@ -55,7 +66,18 @@ - #ifdef _WIN32_WCE - #define NO_GETDIBITS - #define NO_CHANGEDISPLAYSETTINGS --#define NO_GAMMA_SUPPORT -+#define NO_GAMMA_SUPPORT -+ -+/* uncomment this line if you target WinCE 3.x platform: */ -+//#define NO_SETDIBCOLORTABLE -+ -+/* these 2 variables are used to suport paletted DIBs on WinCE 3.x that -+ does not implement SetDIBColorTable, and when SetDIBColorTable is not working. -+ Slow. DIB is recreated every time. -+*/ -+static BITMAPINFO *last_bitmapinfo; -+static void** last_bits; -+ - #endif - #ifndef WS_MAXIMIZE - #define WS_MAXIMIZE 0 -@@ -96,6 +118,13 @@ - - /* helper fn */ - static int DIB_SussScreenDepth(); -+ -+#ifdef _WIN32_WCE -+void DIB_ShowTaskBar(BOOL taskBarShown); -+#ifdef ENABLE_WINGAPI -+extern void GAPI_GrabHardwareKeys(BOOL grab); -+#endif -+#endif - - /* DIB driver bootstrap functions */ - -@@ -352,6 +381,9 @@ - - /* Fill in some window manager capabilities */ - this->info.wm_available = 1; -+ -+ /* Rotation information */ -+ rotation = SDL_ROTATE_NONE; - - /* We're done! */ - return(0); -@@ -370,7 +402,43 @@ - } - #endif - } -- -+ -+#ifdef _WIN32_WCE -+ -+void DIB_ShowTaskBar(BOOL taskBarShown) { -+#if (UNDER_CE < 420) -+ // Hide taskbar, WinCE 2.x style - from EasyCE -+ HKEY hKey=0; -+ DWORD dwValue = 0; -+ unsigned long lSize = sizeof( DWORD ); -+ DWORD dwType = REG_DWORD; -+ HWND hWnd; -+ -+ RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("\\software\\microsoft\\shell"), 0, KEY_ALL_ACCESS, &hKey ); -+ RegQueryValueEx( hKey, TEXT("TBOpt"), 0, &dwType, (BYTE*)&dwValue, &lSize ); -+ if (taskBarShown) -+ dwValue &= 0xFFFFFFFF - 8; // reset bit to show taskbar -+ else -+ dwValue |= 8; // set bit to hide taskbar -+ RegSetValueEx( hKey, TEXT("TBOpt"), 0, REG_DWORD, (BYTE*)&dwValue, lSize ); -+ hWnd = FindWindow( TEXT("HHTaskBar"), NULL ); -+ SendMessage(hWnd, WM_COMMAND, 0x03EA, 0 ); -+ SetForegroundWindow(SDL_Window); -+#else -+ if (taskBarShown) -+ SHFullScreen(SDL_Window, SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON | SHFS_SHOWSTARTICON); -+ else -+ SHFullScreen(SDL_Window, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON); -+#endif -+ if (FindWindow(TEXT("HHTaskBar"), NULL)) { // is it valid for HPC ? -+ if (taskBarShown) -+ ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_SHOWNORMAL); -+ else -+ ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_HIDE); -+ } -+} -+ -+#endif - - /* - Helper fn to work out which screen depth windows is currently using. -@@ -444,7 +512,8 @@ - - - /* Various screen update functions available */ --static void DIB_NormalUpdate(_THIS, int numrects, SDL_Rect *rects); -+static void DIB_NormalUpdate(_THIS, int numrects, SDL_Rect *rects); -+static void DIB_RotatedUpdate(_THIS, int numrects, SDL_Rect *rects); - - SDL_Surface *DIB_SetVideoMode(_THIS, SDL_Surface *current, - int width, int height, int bpp, Uint32 flags) -@@ -463,12 +532,20 @@ - HDC hdc; - RECT bounds; - int x, y; -- Uint32 Rmask, Gmask, Bmask; -- -+ Uint32 Rmask, Gmask, Bmask; -+#ifdef _WIN32_CE -+ int screenWidth, screenHeight; -+#endif -+#ifdef UNDER_CE -+ int i; -+#endif -+ -+#ifdef HAVE_OPENGL - /* Clean up any GL context that may be hanging around */ - if ( current->flags & SDL_OPENGL ) { - WIN_GL_ShutDown(this); -- } -+ } -+#endif - - /* Recalculate the bitmasks if necessary */ - if ( bpp == current->format->BitsPerPixel ) { -@@ -517,20 +594,16 @@ - video->h = height; - video->pitch = SDL_CalculatePitch(video); - --#ifdef WIN32_PLATFORM_PSPC -+#ifdef _WIN32_CE - /* Stuff to hide that $#!^%#$ WinCE taskbar in fullscreen... */ - if ( flags & SDL_FULLSCREEN ) { - if ( !(prev_flags & SDL_FULLSCREEN) ) { -- SHFullScreen(SDL_Window, SHFS_HIDETASKBAR); -- SHFullScreen(SDL_Window, SHFS_HIDESIPBUTTON); -- ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_HIDE); -+ DIB_ShowTaskBar(FALSE); - } - video->flags |= SDL_FULLSCREEN; - } else { - if ( prev_flags & SDL_FULLSCREEN ) { -- SHFullScreen(SDL_Window, SHFS_SHOWTASKBAR); -- SHFullScreen(SDL_Window, SHFS_SHOWSIPBUTTON); -- ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_SHOWNORMAL); -+ DIB_ShowTaskBar(TRUE); - } - } - #endif -@@ -640,28 +713,82 @@ - ((Uint32*)binfo->bmiColors)[0] = video->format->Rmask; - ((Uint32*)binfo->bmiColors)[1] = video->format->Gmask; - ((Uint32*)binfo->bmiColors)[2] = video->format->Bmask; -- } else { -+ } else { -+#ifdef UNDER_CE -+ binfo->bmiHeader.biCompression = BI_RGB; /* 332 */ -+ if ( video->format->palette ) { -+ binfo->bmiHeader.biClrUsed = video->format->palette->ncolors; -+ for(i=0; iformat->palette->ncolors; i++) -+ { -+ binfo->bmiColors[i].rgbRed=i&(7<<5); -+ binfo->bmiColors[i].rgbGreen=(i&(7<<2))<<3; -+ binfo->bmiColors[i].rgbBlue=(i&3)<<5; -+ binfo->bmiColors[i].rgbReserved=0; -+ } -+ } -+#else - binfo->bmiHeader.biCompression = BI_RGB; /* BI_BITFIELDS for 565 vs 555 */ - if ( video->format->palette ) { - memset(binfo->bmiColors, 0, - video->format->palette->ncolors*sizeof(RGBQUAD)); -- } -+ } -+#endif - } - - /* Create the offscreen bitmap buffer */ -- hdc = GetDC(SDL_Window); -+ hdc = GetDC(SDL_Window); -+#ifdef _WIN32_CE -+ /* See if we need to rotate the buffer (WinCE specific) */ -+ screenWidth = GetDeviceCaps(hdc, HORZRES); -+ screenHeight = GetDeviceCaps(hdc, VERTRES); -+ rotation = SDL_ROTATE_NONE; -+ work_pixels = NULL; -+ if (rotation_pixels) { -+ free(rotation_pixels); -+ rotation_pixels = NULL; -+ } -+ -+ if ((flags & SDL_FULLSCREEN) && (width>height) && (width > screenWidth) ) { -+ /* OK, we rotate the screen */ -+ video->pixels = malloc(video->h * video->pitch); -+ rotation_pixels = video->pixels; -+ if (video->pixels) -+ rotation = SDL_ROTATE_LEFT; -+ OutputDebugString(TEXT("will rotate\r\n")); -+ } -+ screen_bmp = CreateDIBSection(hdc, binfo, DIB_RGB_COLORS, -+ (rotation == SDL_ROTATE_NONE ? (void **)(&video->pixels) : (void**)&work_pixels), NULL, 0); -+#else - screen_bmp = CreateDIBSection(hdc, binfo, DIB_RGB_COLORS, -- (void **)(&video->pixels), NULL, 0); -- ReleaseDC(SDL_Window, hdc); -- free(binfo); -+ (void **)(&video->pixels), NULL, 0); -+#endif -+ ReleaseDC(SDL_Window, hdc); -+#ifdef UNDER_CE -+/* keep bitmapinfo for palette in 8-bit modes for devices that don't have SetDIBColorTable */ -+ last_bits = (rotation == SDL_ROTATE_NONE ? (void **)(&video->pixels) : (void**)&work_pixels); -+ if(last_bitmapinfo) -+ free(last_bitmapinfo); -+ if(is16bitmode) -+ { -+ last_bitmapinfo = 0; -+ free(binfo); -+ } else -+ last_bitmapinfo = binfo; -+#else -+ free(binfo); -+#endif - if ( screen_bmp == NULL ) { - if ( video != current ) { - SDL_FreeSurface(video); - } - SDL_SetError("Couldn't create DIB section"); - return(NULL); -- } -- this->UpdateRects = DIB_NormalUpdate; -+ } -+#ifdef _WIN32_CE -+ this->UpdateRects = (work_pixels ? DIB_RotatedUpdate : DIB_NormalUpdate); -+#else -+ this->UpdateRects = DIB_NormalUpdate; -+#endif - - /* Set video surface flags */ - if ( bpp <= 8 ) { -@@ -695,7 +822,15 @@ - bounds.left = SDL_windowX; - bounds.top = SDL_windowY; - bounds.right = SDL_windowX+video->w; -- bounds.bottom = SDL_windowY+video->h; -+ bounds.bottom = SDL_windowY+video->h; -+#ifdef UNDER_CE -+ if(rotation != SDL_ROTATE_NONE) -+ { -+ int t=bounds.right; -+ bounds.right = bounds.bottom; -+ bounds.bottom=t; -+ } -+#endif - AdjustWindowRectEx(&bounds, GetWindowLong(SDL_Window, GWL_STYLE), FALSE, 0); - width = bounds.right-bounds.left; - height = bounds.bottom-bounds.top; -@@ -709,8 +844,10 @@ - x = (GetSystemMetrics(SM_CXSCREEN)-width)/2; - y = (GetSystemMetrics(SM_CYSCREEN)-height)/2; - } else { -- x = y = -1; -- swp_flags |= SWP_NOMOVE; -+ x = y = -1; -+#ifndef UNDER_CE -+ swp_flags |= SWP_NOMOVE; -+#endif - } - if ( y < 0 ) { /* Cover up title bar for more client area */ - y -= GetSystemMetrics(SM_CYCAPTION)/2; -@@ -719,19 +856,44 @@ - top = HWND_TOPMOST; - } else { - top = HWND_NOTOPMOST; -- } -- SetWindowPos(SDL_Window, top, x, y, width, height, swp_flags); -+ } -+#ifdef _WIN32_CE -+ if (flags & SDL_FULLSCREEN) { -+/* When WinCE program switches resolution from larger to smaller we should move its window so it would be visible in fullscreen */ -+// SetWindowPos(SDL_Window, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); -+ DIB_ShowTaskBar(FALSE); -+ if(x>0) x=0; // remove space from the left side of a screen in 320x200 mode -+ if(y>0) y=0; -+ SetWindowPos(SDL_Window, HWND_TOPMOST, x, y, width, height, SWP_NOCOPYBITS); -+ ShowWindow(SDL_Window, SW_SHOW); -+ } -+ else -+ SetWindowPos(SDL_Window, top, x, y, width, height, swp_flags); -+#else -+ SetWindowPos(SDL_Window, top, x, y, width, height, swp_flags); -+#endif - SDL_resizing = 0; - SetForegroundWindow(SDL_Window); - } - - /* Set up for OpenGL */ -- if ( flags & SDL_OPENGL ) { -+ if ( flags & SDL_OPENGL ) { -+#ifdef HAVE_OPENGL - if ( WIN_GL_SetupWindow(this) < 0 ) { - return(NULL); - } -- video->flags |= SDL_OPENGL; -- } -+ video->flags |= SDL_OPENGL; -+#else -+ return NULL; -+#endif -+ } -+ -+#ifdef ENABLE_WINGAPI -+ /* Grab hardware keys if necessary */ -+ if ( flags & SDL_FULLSCREEN ) { -+ GAPI_GrabHardwareKeys(TRUE); -+ } -+#endif - - /* We're live! */ - return(video); -@@ -754,22 +916,169 @@ - { - return; - } -+ -+#ifdef _WIN32_CE -+ -+static inline void rotateBlit(unsigned short *src, unsigned short *dest, SDL_Rect *rect, int pitch) { -+ int i=rect->w, j=rect->h; -+ src+=i; -+ -+ for (;i--;) { -+ register unsigned short *S=src--; -+// I use loop unrolling to spedup things a little -+ int cnt = j; -+ if(cnt&1) -+ { -+ *(dest++) = *S; -+ S+=pitch; -+ } -+ cnt>>=1; -+ if(cnt&1) -+ { -+ *(dest++) = *S; -+ S+=pitch; -+ *(dest++) = *S; -+ S+=pitch; -+ } -+ cnt>>=1; -+ for (; cnt--; ) { -+ *(dest++) = *S; -+ S+=pitch; -+ *(dest++) = *S; -+ S+=pitch; -+ *(dest++) = *S; -+ S+=pitch; -+ *(dest++) = *S; -+ S+=pitch; -+ } -+ } -+/* tiny optimization -+ int i, j; -+ src+=rect->w; -+ -+ for (i=0; iw; i++) { -+ register unsigned short *S=src--; -+ for (j=0; jh; j++) { -+ *(dest++) = *S; -+ S+=pitch; -+ } -+ } -+*/ -+/* original unoptimized version -+ int i, j; -+ -+ for (i=0; iw; i++) { -+ for (j=0; jh; j++) { -+ dest[i * rect->h + j] = src[pitch * j + (rect->w - i)]; -+ } -+ } -+*/ -+} -+ -+static inline void rotateBlit8(unsigned char *src, unsigned char *dest, SDL_Rect *rect, int pitch) { -+ int i=rect->w, j=rect->h; -+ src+=i; -+ -+ for (;i--;) { -+ register unsigned char *S=src--; -+// I use loop unrolling to spedup things a little -+ int cnt = j; -+ if(cnt&1) -+ { -+ *(dest++) = *S; -+ S+=pitch; -+ } -+ cnt>>=1; -+ if(cnt&1) -+ { -+ *(dest++) = *S; -+ S+=pitch; -+ *(dest++) = *S; -+ S+=pitch; -+ } -+ cnt>>=1; -+ for (; cnt--; ) { -+ *(dest++) = *S; -+ S+=pitch; -+ *(dest++) = *S; -+ S+=pitch; -+ *(dest++) = *S; -+ S+=pitch; -+ *(dest++) = *S; -+ S+=pitch; -+ } -+ } -+} -+ -+static void DIB_RotatedUpdate(_THIS, int numrects, SDL_Rect *rects) -+{ -+ HDC hdc, mdc; -+ HBITMAP hb, old; -+ int i; -+ -+ hdc = GetDC(SDL_Window); -+ if ( screen_pal ) { -+ SelectPalette(hdc, screen_pal, FALSE); -+ } -+ mdc = CreateCompatibleDC(hdc); -+ /*SelectObject(mdc, screen_bmp);*/ -+ if(this->screen->format->BytesPerPixel == 2) { -+ for ( i=0; iscreen->pixels; -+ rotateBlit(src + (this->screen->w * rects[i].y) + rects[i].x, work_pixels, &rects[i], this->screen->w); -+ hb = CreateBitmap(rects[i].h, rects[i].w, 1, 16, work_pixels); -+ old = (HBITMAP)SelectObject(mdc, hb); -+ BitBlt(hdc, rects[i].y, this->screen->w - (rects[i].x + rects[i].w), rects[i].h, rects[i].w, -+ mdc, 0, 0, SRCCOPY); -+ SelectObject(mdc, old); -+ DeleteObject(hb); -+ } -+ } else { -+ if ( screen_pal ) { -+ SelectPalette(mdc, screen_pal, FALSE); -+ } -+ for ( i=0; iscreen->pixels; -+ rotateBlit8(src + (this->screen->w * rects[i].y) + rects[i].x, work_pixels, &rects[i], this->screen->w); -+ hb = CreateBitmap(rects[i].h, rects[i].w, 1, 8, work_pixels); -+ old = (HBITMAP)SelectObject(mdc, hb); -+ BitBlt(hdc, rects[i].y, this->screen->w - (rects[i].x + rects[i].w), rects[i].h, rects[i].w, -+ mdc, 0, 0, SRCCOPY); -+ SelectObject(mdc, old); -+ DeleteObject(hb); -+ } -+ } -+ DeleteDC(mdc); -+ ReleaseDC(SDL_Window, hdc); -+} -+#endif -+ - - static void DIB_NormalUpdate(_THIS, int numrects, SDL_Rect *rects) - { - HDC hdc, mdc; -- int i; -+ int i; -+#ifdef _WIN32_CE -+ HBITMAP old; -+#endif - - hdc = GetDC(SDL_Window); - if ( screen_pal ) { - SelectPalette(hdc, screen_pal, FALSE); - } -- mdc = CreateCompatibleDC(hdc); -- SelectObject(mdc, screen_bmp); -+ mdc = CreateCompatibleDC(hdc); -+#ifdef _WIN32_CE -+ old = (HBITMAP)SelectObject(mdc, screen_bmp); -+#else -+ SelectObject(mdc, screen_bmp); -+#endif - for ( i=0; ibmiHeader.biClrUsed=256; -+ for ( i=firstcolor; ibmiColors[i]=pal[i]; -+ screen_bmp = CreateDIBSection(hdc, last_bitmapinfo, DIB_RGB_COLORS, -+ last_bits, NULL, 0); -+ } -+#else - SelectObject(mdc, screen_bmp); -- SetDIBColorTable(mdc, firstcolor, ncolors, pal); -+ SetDIBColorTable(mdc, firstcolor, ncolors, pal); -+#endif -+#ifndef UNDER_CE - BitBlt(hdc, 0, 0, this->screen->w, this->screen->h, -- mdc, 0, 0, SRCCOPY); -+ mdc, 0, 0, SRCCOPY); -+#else -+ { -+ SDL_Rect rect; -+ rect.x=0; rect.y=0; -+ rect.w=this->screen->w; rect.h=this->screen->h; -+// Fixme: screen flickers: (this->UpdateRects)(this, 1, &rect) ; -+ } -+#endif - DeleteDC(mdc); --#endif - ReleaseDC(SDL_Window, hdc); - return(1); - } -@@ -937,27 +1270,27 @@ - - void DIB_VideoQuit(_THIS) - { -- /* Destroy the window and everything associated with it */ -+ /* Destroy the window and everything associated with it */ -+#ifdef _WIN32_CE -+ DIB_ShowTaskBar(TRUE); -+#ifdef ENABLE_WINGAPI -+ GAPI_GrabHardwareKeys(FALSE); -+#endif -+#endif - if ( SDL_Window ) { - /* Delete the screen bitmap (also frees screen->pixels) */ - if ( this->screen ) { --#ifdef WIN32_PLATFORM_PSPC -- if ( this->screen->flags & SDL_FULLSCREEN ) { -- /* Unhide taskbar, etc. */ -- SHFullScreen(SDL_Window, SHFS_SHOWTASKBAR); -- SHFullScreen(SDL_Window, SHFS_SHOWSIPBUTTON); -- ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_SHOWNORMAL); -- } --#endif - #ifndef NO_CHANGEDISPLAYSETTINGS - if ( this->screen->flags & SDL_FULLSCREEN ) { - ChangeDisplaySettings(NULL, 0); - ShowWindow(SDL_Window, SW_HIDE); - } --#endif -+#endif -+#ifdef HAVE_OPENGL - if ( this->screen->flags & SDL_OPENGL ) { - WIN_GL_ShutDown(this); -- } -+ } -+#endif - this->screen->pixels = NULL; - } - if ( screen_bmp ) { -diff -ruN SDL-1.2.7-orig/src/video/windib/SDL_dibvideo.h SDL-1.2.7/src/video/windib/SDL_dibvideo.h ---- SDL-1.2.7-orig/src/video/windib/SDL_dibvideo.h Wed Feb 18 09:22:10 2004 -+++ SDL-1.2.7/src/video/windib/SDL_dibvideo.h Thu Nov 18 13:13:42 2004 -@@ -29,11 +29,26 @@ - #define _SDL_dibvideo_h - - #include -+ -+//#ifdef _WIN32_CE -+/* Rotation direction */ -+typedef enum { -+ SDL_ROTATE_NONE, -+ SDL_ROTATE_LEFT, -+ SDL_ROTATE_RIGHT -+} SDL_RotateAttr; -+//#endif - - /* Private display data */ - struct SDL_PrivateVideoData { - HBITMAP screen_bmp; -- HPALETTE screen_pal; -+ HPALETTE screen_pal; -+//#ifdef _WIN32_CE -+ void *work_pixels; /* if the display needs to be rotated, memory allocated by the API */ -+ void *rotation_pixels; /* if the display needs to be rotated, memory allocated by the code */ -+ SDL_RotateAttr rotation; -+ char ozoneHack; /* force stylus translation if running without Hi Res flag */ -+//#endif - - #define NUM_MODELISTS 4 /* 8, 16, 24, and 32 bits-per-pixel */ - int SDL_nummodes[NUM_MODELISTS]; -@@ -43,6 +58,12 @@ - #define screen_bmp (this->hidden->screen_bmp) - #define screen_pal (this->hidden->screen_pal) - #define SDL_nummodes (this->hidden->SDL_nummodes) --#define SDL_modelist (this->hidden->SDL_modelist) -+#define SDL_modelist (this->hidden->SDL_modelist) -+//#ifdef _WIN32_CE -+#define work_pixels (this->hidden->work_pixels) -+#define rotation (this->hidden->rotation) -+#define rotation_pixels (this->hidden->rotation_pixels) -+#define ozoneHack (this->hidden->ozoneHack) -+//#endif - - #endif /* _SDL_dibvideo_h */ -diff -ruN SDL-1.2.7-orig/src/video/wingapi/SDL_gapivideo.c SDL-1.2.7/src/video/wingapi/SDL_gapivideo.c ---- SDL-1.2.7-orig/src/video/wingapi/SDL_gapivideo.c Wed Dec 31 19:00:00 1969 -+++ SDL-1.2.7/src/video/wingapi/SDL_gapivideo.c Thu Nov 18 13:43:27 2004 -@@ -0,0 +1,956 @@ -+/* -+ SDL - Simple DirectMedia Layer -+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga -+ -+ This library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Library General Public -+ License as published by the Free Software Foundation; either -+ version 2 of the License, or (at your option) any later version. -+ -+ This library 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 -+ Library General Public License for more details. -+ -+ You should have received a copy of the GNU Library General Public -+ License along with this library; if not, write to the Free -+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ -+ Sam Lantinga -+ slouken@libsdl.org -+*/ -+ -+#ifdef SAVE_RCSID -+static char rcsid = -+ "@(#) $Id: SDL_gapivideo.c,v 1.5 2004/02/29 21:54:11 lemure Exp $"; -+#endif -+ -+/* Dummy SDL video driver implementation; this is just enough to make an -+ * SDL-based application THINK it's got a working video driver, for -+ * applications that call SDL_Init(SDL_INIT_VIDEO) when they don't need it, -+ * and also for use as a collection of stubs when porting SDL to a new -+ * platform for which you haven't yet written a valid video driver. -+ * -+ * This is also a great way to determine bottlenecks: if you think that SDL -+ * is a performance problem for a given platform, enable this driver, and -+ * then see if your application runs faster without video overhead. -+ * -+ * Initial work by Ryan C. Gordon (icculus@linuxgames.com). A good portion -+ * of this was cut-and-pasted from Stephane Peter's work in the AAlib -+ * SDL video driver. Renamed to "DUMMY" by Sam Lantinga. -+ */ -+ -+#include -+#include -+#include -+#include -+ -+/* Not yet in the mingw32 cross-compile headers */ -+#ifndef CDS_FULLSCREEN -+#define CDS_FULLSCREEN 4 -+#endif -+ -+#ifndef WS_THICKFRAME -+#define WS_THICKFRAME 0 -+#endif -+ -+#include "SDL.h" -+#include "SDL_mutex.h" -+#include "SDL_syswm.h" -+#include "SDL_sysvideo.h" -+#include "SDL_sysevents.h" -+#include "SDL_events_c.h" -+#include "SDL_pixels_c.h" -+#include "SDL_syswm_c.h" -+#include "SDL_sysmouse_c.h" -+#include "SDL_dibevents_c.h" -+#include "SDL_gapivideo.h" -+ -+#if defined(WIN32_PLATFORM_PSPC) -+#include // Add Pocket PC includes -+#pragma comment( lib, "aygshell" ) // Link Pocket PC library -+#endif -+ -+#ifdef _WIN32_WCE -+extern void DIB_ShowTaskBar(BOOL taskBarShown); -+#endif -+ -+ -+/* Initialization/Query functions */ -+static int GAPI_VideoInit(_THIS, SDL_PixelFormat *vformat); -+static SDL_Rect **GAPI_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags); -+static SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags); -+static int GAPI_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors); -+static void GAPI_VideoQuit(_THIS); -+ -+ -+/* Hardware surface functions */ -+static int GAPI_AllocHWSurface(_THIS, SDL_Surface *surface); -+static int GAPI_LockHWSurface(_THIS, SDL_Surface *surface); -+static void GAPI_UnlockHWSurface(_THIS, SDL_Surface *surface); -+static void GAPI_FreeHWSurface(_THIS, SDL_Surface *surface); -+ -+/* Windows message handling functions, will not be processed */ -+static void GAPI_RealizePalette(_THIS); -+static void GAPI_PaletteChanged(_THIS, HWND window); -+static void GAPI_WinPAINT(_THIS, HDC hdc); -+ -+static void GAPI_UpdateRects(_THIS, int numrects, SDL_Rect *rects); -+/*static void GAPI_UpdateRectsMono(_THIS, int numrects, SDL_Rect *rects);*/ -+ -+static int GAPI_Available(void); -+static SDL_VideoDevice *GAPI_CreateDevice(int devindex); -+ -+void GAPI_GrabHardwareKeys(BOOL grab); -+ -+VideoBootStrap WINGAPI_bootstrap = { -+ "wingapi", "WinCE GAPI", -+ GAPI_Available, GAPI_CreateDevice -+}; -+ -+/* 2003 SE GAPI emulation */ -+ -+#define GETRAWFRAMEBUFFER 0x00020001 -+ -+#define FORMAT_565 1 -+#define FORMAT_555 2 -+#define FORMAT_OTHER 3 -+ -+static void* _OzoneFrameBuffer = NULL; -+static struct GXDisplayProperties _OzoneDisplayProperties; -+static char _OzoneAvailable = 0; -+ -+typedef struct _RawFrameBufferInfo -+{ -+ WORD wFormat; -+ WORD wBPP; -+ VOID *pFramePointer; -+ int cxStride; -+ int cyStride; -+ int cxPixels; -+ int cyPixels; -+} RawFrameBufferInfo; -+ -+ -+struct GXDisplayProperties Ozone_GetDisplayProperties(void) { -+ return _OzoneDisplayProperties; -+} -+ -+int Ozone_OpenDisplay(HWND window, unsigned long flag) { -+ return 1; -+} -+ -+int Ozone_CloseDisplay(void) { -+ return 1; -+} -+ -+void* Ozone_BeginDraw(void) { -+ return _OzoneFrameBuffer; -+} -+ -+int Ozone_EndDraw(void) { -+ return 1; -+} -+ -+int Ozone_Suspend(void) { -+ return 1; -+} -+ -+int Ozone_Resume(void) { -+ return 1; -+} -+ -+static HINSTANCE checkOzone(tGXDisplayProperties *gxGetDisplayProperties, tGXOpenDisplay *gxOpenDisplay, -+ tGXVoidFunction *gxCloseDisplay, tGXBeginDraw *gxBeginDraw, -+ tGXVoidFunction *gxEndDraw, tGXVoidFunction *gxSuspend, tGXVoidFunction *gxResume) { -+#ifdef ARM -+ -+ int result; -+ RawFrameBufferInfo frameBufferInfo; -+ HDC hdc = GetDC(NULL); -+ result = ExtEscape(hdc, GETRAWFRAMEBUFFER, 0, NULL, sizeof(RawFrameBufferInfo), (char *)&frameBufferInfo); -+ ReleaseDC(NULL, hdc); -+ if (result < 0) -+ return NULL; -+ OutputDebugString(TEXT("Running on Ozone\r\n")); -+ _OzoneAvailable = 1; -+ -+ // Initializing global parameters -+ _OzoneFrameBuffer = frameBufferInfo.pFramePointer; -+ _OzoneDisplayProperties.cBPP = frameBufferInfo.wBPP; -+ _OzoneDisplayProperties.cbxPitch = frameBufferInfo.cxStride; -+ _OzoneDisplayProperties.cbyPitch = frameBufferInfo.cyStride; -+ _OzoneDisplayProperties.cxWidth = frameBufferInfo.cxPixels; -+ _OzoneDisplayProperties.cyHeight = frameBufferInfo.cyPixels; -+ if (frameBufferInfo.wFormat == FORMAT_565) -+ _OzoneDisplayProperties.ffFormat = kfDirect565; -+ else -+ if (frameBufferInfo.wFormat == FORMAT_555) -+ _OzoneDisplayProperties.ffFormat = kfDirect555; -+ else { -+ OutputDebugString(TEXT("Ozone unknown screen format")); -+ return NULL; -+ } -+ -+ if (gxGetDisplayProperties) -+ *gxGetDisplayProperties = Ozone_GetDisplayProperties; -+ if (gxOpenDisplay) -+ *gxOpenDisplay = Ozone_OpenDisplay; -+ if (gxCloseDisplay) -+ *gxCloseDisplay = Ozone_CloseDisplay; -+ if (gxBeginDraw) -+ *gxBeginDraw = Ozone_BeginDraw; -+ if (gxEndDraw) -+ *gxEndDraw = Ozone_EndDraw; -+ if (gxSuspend) -+ *gxSuspend = Ozone_Suspend; -+ if (gxResume) -+ *gxResume = Ozone_Resume; -+ -+ return (HINSTANCE)1; -+ -+#else -+ -+ return NULL; -+ -+#endif -+} -+ -+int getScreenWidth() { -+ return (_OzoneFrameBuffer ? _OzoneDisplayProperties.cxWidth : GetSystemMetrics(SM_CXSCREEN)); -+} -+ -+int getScreenHeight() { -+ return (_OzoneFrameBuffer ? _OzoneDisplayProperties.cyHeight : GetSystemMetrics(SM_CYSCREEN)); -+} -+ -+ -+/* Check GAPI library */ -+ -+#define IMPORT(Handle,Variable,Type,Function, Store) \ -+ Variable = GetProcAddress(Handle, TEXT(Function)); \ -+ if (!Variable) { \ -+ FreeLibrary(Handle); \ -+ return NULL; \ -+ } \ -+ if (Store) \ -+ *Store = (Type)Variable; -+ -+static HINSTANCE checkGAPI(tGXDisplayProperties *gxGetDisplayProperties, tGXOpenDisplay *gxOpenDisplay, -+ tGXVoidFunction *gxCloseDisplay, tGXBeginDraw *gxBeginDraw, -+ tGXVoidFunction *gxEndDraw, tGXVoidFunction *gxSuspend, tGXVoidFunction *gxResume, -+ BOOL bypassOzone) { -+ HMODULE gapiLibrary; -+ FARPROC proc; -+ HINSTANCE result; -+ // FIXME paletted ! -+ tGXDisplayProperties temp_gxGetDisplayProperties; -+ -+ // Workaround for Windows Mobile 2003 SE -+ _OzoneFrameBuffer = NULL; -+ if (!bypassOzone) { -+ result = checkOzone(gxGetDisplayProperties, gxOpenDisplay, gxCloseDisplay, gxBeginDraw, gxEndDraw, gxSuspend, gxResume); -+ if (result) -+ return result; -+ } -+ -+ gapiLibrary = LoadLibrary(TEXT("gx.dll")); -+ if (!gapiLibrary) -+ return NULL; -+ -+ IMPORT(gapiLibrary, proc, tGXDisplayProperties, "?GXGetDisplayProperties@@YA?AUGXDisplayProperties@@XZ", gxGetDisplayProperties) -+ IMPORT(gapiLibrary, proc, tGXOpenDisplay, "?GXOpenDisplay@@YAHPAUHWND__@@K@Z", gxOpenDisplay) -+ IMPORT(gapiLibrary, proc, tGXVoidFunction, "?GXCloseDisplay@@YAHXZ", gxCloseDisplay) -+ IMPORT(gapiLibrary, proc, tGXBeginDraw, "?GXBeginDraw@@YAPAXXZ", gxBeginDraw) -+ IMPORT(gapiLibrary, proc, tGXVoidFunction, "?GXEndDraw@@YAHXZ", gxEndDraw) -+ IMPORT(gapiLibrary, proc, tGXVoidFunction, "?GXSuspend@@YAHXZ", gxSuspend) -+ IMPORT(gapiLibrary, proc, tGXVoidFunction, "?GXResume@@YAHXZ", gxResume) -+ -+ // FIXME paletted ! for the moment we just bail out -+ if (!gxGetDisplayProperties) { -+ IMPORT(gapiLibrary, proc, tGXDisplayProperties, "?GXGetDisplayProperties@@YA?AUGXDisplayProperties@@XZ", &temp_gxGetDisplayProperties) -+ if (temp_gxGetDisplayProperties().ffFormat & kfPalette) { -+ FreeLibrary(gapiLibrary); -+ return NULL; -+ } -+ FreeLibrary(gapiLibrary); -+ gapiLibrary = (HINSTANCE)1; -+ } -+ -+ return gapiLibrary; -+} -+ -+ -+/* GAPI driver bootstrap functions */ -+ -+static int GAPI_Available(void) -+{ -+ /* Check if the GAPI library is available */ -+ -+ if (!checkGAPI(NULL, NULL, NULL, NULL, NULL, NULL, NULL, FALSE)) { -+ OutputDebugString(TEXT("GAPI driver not available\r\n")); -+ return 0; -+ } -+ else { -+ OutputDebugString(TEXT("GAPI driver available\r\n")); -+ return 1; -+ } -+} -+ -+static void GAPI_DeleteDevice(SDL_VideoDevice *device) -+{ -+ if (device && device->hidden && device->hidden->gapiFuncs.dynamicGXCloseDisplay) -+ device->hidden->gapiFuncs.dynamicGXCloseDisplay(); -+ -+ if (device && device->hidden) -+ free(device->hidden); -+ if (device) -+ free(device); -+ -+} -+ -+static SDL_VideoDevice *GAPI_CreateDevice(int devindex) -+{ -+ SDL_VideoDevice *device; -+ -+ /* Initialize all variables that we clean on shutdown */ -+ device = (SDL_VideoDevice *)malloc(sizeof(SDL_VideoDevice)); -+ if ( device ) { -+ memset(device, 0, (sizeof *device)); -+ device->hidden = (struct SDL_PrivateVideoData *) -+ malloc((sizeof *device->hidden)); -+ } -+ if ( (device == NULL) || (device->hidden == NULL) ) { -+ SDL_OutOfMemory(); -+ if ( device ) { -+ free(device); -+ } -+ return(0); -+ } -+ memset(device->hidden, 0, (sizeof *device->hidden)); -+ -+ /* Set GAPI pointers */ -+ -+ checkGAPI(&device->hidden->gapiFuncs.dynamicGXGetDisplayProperties, -+ &device->hidden->gapiFuncs.dynamicGXOpenDisplay, -+ &device->hidden->gapiFuncs.dynamicGXCloseDisplay, -+ &device->hidden->gapiFuncs.dynamicGXBeginDraw, -+ &device->hidden->gapiFuncs.dynamicGXEndDraw, -+ &device->hidden->gapiFuncs.dynamicGXSuspend, -+ &device->hidden->gapiFuncs.dynamicGXResume, -+ FALSE); -+ device->hidden->displayProps = device->hidden->gapiFuncs.dynamicGXGetDisplayProperties(); -+ -+ /* Set the function pointers */ -+ -+ device->VideoInit = GAPI_VideoInit; -+ device->ListModes = GAPI_ListModes; -+ device->SetVideoMode = GAPI_SetVideoMode; -+ device->UpdateMouse = WIN_UpdateMouse; -+ device->SetColors = GAPI_SetColors; -+ device->UpdateRects = NULL; -+ device->VideoQuit = GAPI_VideoQuit; -+ device->AllocHWSurface = GAPI_AllocHWSurface; -+ device->CheckHWBlit = NULL; -+ device->FillHWRect = NULL; -+ device->SetHWColorKey = NULL; -+ device->SetHWAlpha = NULL; -+ device->LockHWSurface = GAPI_LockHWSurface; -+ device->UnlockHWSurface = GAPI_UnlockHWSurface; -+ device->FlipHWSurface = NULL; -+ device->FreeHWSurface = GAPI_FreeHWSurface; -+ device->SetCaption = WIN_SetWMCaption; -+ device->SetIcon = WIN_SetWMIcon; -+ device->IconifyWindow = WIN_IconifyWindow; -+ device->GrabInput = WIN_GrabInput; -+ device->GetWMInfo = WIN_GetWMInfo; -+ device->FreeWMCursor = WIN_FreeWMCursor; -+ device->CreateWMCursor = WIN_CreateWMCursor; -+ device->ShowWMCursor = WIN_ShowWMCursor; -+ device->WarpWMCursor = WIN_WarpWMCursor; -+ device->CheckMouseMode = WIN_CheckMouseMode; -+ device->InitOSKeymap = DIB_InitOSKeymap; -+ device->PumpEvents = DIB_PumpEvents; -+ -+ device->SetColors = GAPI_SetColors; -+ -+ /* Set up the windows message handling functions */ -+ WIN_RealizePalette = GAPI_RealizePalette; -+ WIN_PaletteChanged = GAPI_PaletteChanged; -+ WIN_WinPAINT = GAPI_WinPAINT; -+ HandleMessage = DIB_HandleMessage; -+ -+ device->free = GAPI_DeleteDevice; -+ -+ -+ /* -+ device->VideoInit = GAPI_VideoInit; -+ device->ListModes = GAPI_ListModes; -+ device->SetVideoMode = GAPI_SetVideoMode; -+ device->CreateYUVOverlay = NULL; -+ device->SetColors = DUMMY_SetColors; -+ device->UpdateRects = DUMMY_UpdateRects; -+ device->VideoQuit = DUMMY_VideoQuit; -+ device->AllocHWSurface = DUMMY_AllocHWSurface; -+ device->CheckHWBlit = NULL; -+ device->FillHWRect = NULL; -+ device->SetHWColorKey = NULL; -+ device->SetHWAlpha = NULL; -+ device->LockHWSurface = DUMMY_LockHWSurface; -+ device->UnlockHWSurface = DUMMY_UnlockHWSurface; -+ device->FlipHWSurface = NULL; -+ device->FreeHWSurface = DUMMY_FreeHWSurface; -+ device->SetCaption = NULL; -+ device->SetIcon = NULL; -+ device->IconifyWindow = NULL; -+ device->GrabInput = NULL; -+ device->GetWMInfo = NULL; -+ device->InitOSKeymap = DUMMY_InitOSKeymap; -+ device->PumpEvents = DUMMY_PumpEvents; -+ -+ device->free = DUMMY_DeleteDevice; -+ */ -+ -+ return device; -+} -+ -+ -+int GAPI_VideoInit(_THIS, SDL_PixelFormat *vformat) -+{ -+ -+ /* Create the window */ -+ if ( DIB_CreateWindow(this) < 0 ) { -+ return(-1); -+ } -+ -+ vformat->BitsPerPixel = (unsigned char)displayProperties.cBPP; -+ -+ // Get color mask -+ if (displayProperties.ffFormat & kfDirect565) { -+ vformat->BitsPerPixel = 16; -+ vformat->Rmask = 0x0000f800; -+ vformat->Gmask = 0x000007e0; -+ vformat->Bmask = 0x0000001f; -+ videoMode = GAPI_DIRECT_565; -+ } -+ else -+ if (displayProperties.ffFormat & kfDirect555) { -+ vformat->BitsPerPixel = 16; -+ vformat->Rmask = 0x00007c00; -+ vformat->Gmask = 0x000003e0; -+ vformat->Bmask = 0x0000001f; -+ videoMode = GAPI_DIRECT_555; -+ } -+ else -+ if ((displayProperties.ffFormat & kfDirect) && (displayProperties.cBPP <= 8)) { -+ // We'll perform the conversion -+ vformat->BitsPerPixel = 24; -+ vformat->Rmask = 0x00ff0000; -+ vformat->Gmask = 0x0000ff00; -+ vformat->Bmask = 0x000000ff; -+ if (displayProperties.ffFormat & kfDirectInverted) -+ invert = (1 << displayProperties.cBPP) - 1; -+ colorscale = displayProperties.cBPP < 8 ? 8 - displayProperties.cBPP : 0; -+ videoMode = GAPI_MONO; -+ } -+ else -+ if (displayProperties.ffFormat & kfPalette) { -+ videoMode = GAPI_PALETTE; -+ } -+ -+ /* Set UpdateRect callback */ -+ // FIXME -+ /* -+ if (videoMode != GAPI_MONO) -+ this->UpdateRects = GAPI_UpdateRects; -+ else -+ this->UpdateRects = GAPI_UpdateRectsMono; -+ */ -+ -+ this->UpdateRects = GAPI_UpdateRects; -+ -+ /* We're done! */ -+ return(0); -+} -+ -+SDL_Rect **GAPI_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags) -+{ -+ return (SDL_Rect **) -1; -+} -+ -+SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current, -+ int width, int height, int bpp, Uint32 flags) -+{ -+ SDL_Surface *video; -+ Uint32 Rmask, Gmask, Bmask; -+ Uint32 prev_flags; -+ DWORD style; -+ const DWORD directstyle = -+ (WS_POPUP); -+ const DWORD windowstyle = -+ (WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX); -+ const DWORD resizestyle = -+ (WS_THICKFRAME|WS_MAXIMIZEBOX); -+ int screenWidth, screenHeight; -+ BOOL was_visible; -+ -+ /* We negociate legacy GAPI if we want a screen that fits in QVGA */ -+ if (_OzoneAvailable && _OzoneFrameBuffer && (width <= GetSystemMetrics(SM_CXSCREEN) || width <= GetSystemMetrics(SM_CYSCREEN)) && -+ (height <= GetSystemMetrics(SM_CXSCREEN) || height <= GetSystemMetrics(SM_CYSCREEN))) { -+ OutputDebugString(TEXT("Ozone workaround, switching back to GAPI\r\n")); -+ ozoneHack = 0; -+ checkGAPI(&this->hidden->gapiFuncs.dynamicGXGetDisplayProperties, -+ &this->hidden->gapiFuncs.dynamicGXOpenDisplay, -+ &this->hidden->gapiFuncs.dynamicGXCloseDisplay, -+ &this->hidden->gapiFuncs.dynamicGXBeginDraw, -+ &this->hidden->gapiFuncs.dynamicGXEndDraw, -+ &this->hidden->gapiFuncs.dynamicGXSuspend, -+ &this->hidden->gapiFuncs.dynamicGXResume, -+ TRUE); -+ this->hidden->displayProps = this->hidden->gapiFuncs.dynamicGXGetDisplayProperties(); -+ } -+ /* Otherwise we'll use the new system call */ -+ if (_OzoneAvailable && !_OzoneFrameBuffer && (width > GetSystemMetrics(SM_CXSCREEN) && width > GetSystemMetrics(SM_CYSCREEN)) && -+ (height > GetSystemMetrics(SM_CXSCREEN) && height > GetSystemMetrics(SM_CYSCREEN))) { -+ OutputDebugString(TEXT("Ozone workaround, switching back to true Ozone\r\n")); -+ checkGAPI(&this->hidden->gapiFuncs.dynamicGXGetDisplayProperties, -+ &this->hidden->gapiFuncs.dynamicGXOpenDisplay, -+ &this->hidden->gapiFuncs.dynamicGXCloseDisplay, -+ &this->hidden->gapiFuncs.dynamicGXBeginDraw, -+ &this->hidden->gapiFuncs.dynamicGXEndDraw, -+ &this->hidden->gapiFuncs.dynamicGXSuspend, -+ &this->hidden->gapiFuncs.dynamicGXResume, -+ FALSE); -+ this->hidden->displayProps = this->hidden->gapiFuncs.dynamicGXGetDisplayProperties(); -+ } -+ /* Which will need a tiny input hack if the original code does not have the "Hi Res" aware ressource property set */ -+ ozoneHack = 0; -+ if (_OzoneFrameBuffer && (GetSystemMetrics(SM_CXSCREEN) != (signed) _OzoneDisplayProperties.cxWidth || -+ GetSystemMetrics(SM_CYSCREEN) != (signed) _OzoneDisplayProperties.cyHeight)) { -+ OutputDebugString(TEXT("Running true Ozone with stylus hack\r\n")); -+ ozoneHack = 1; -+ } -+ -+ /* See whether or not we should center the window */ -+ was_visible = IsWindowVisible(SDL_Window); -+ -+ /* Recalculate bitmasks if necessary */ -+ if (bpp == current->format->BitsPerPixel) { -+ video = current; -+ } -+ else { -+ switch(bpp) { -+ case 8: -+ Rmask = 0; -+ Gmask = 0; -+ Bmask = 0; -+ break; -+ case 15: -+ case 16: -+ /* Default is 565 unless the display is specifically 555 */ -+ if (displayProperties.ffFormat & kfDirect555) { -+ Rmask = 0x00007c00; -+ Gmask = 0x000003e0; -+ Bmask = 0x0000001f; -+ } -+ else { -+ Rmask = 0x0000f800; -+ Gmask = 0x000007e0; -+ Bmask = 0x0000001f; -+ } -+ break; -+ case 24: -+ case 32: -+ Rmask = 0x00ff0000; -+ Gmask = 0x0000ff00; -+ Bmask = 0x000000ff; -+ break; -+ default: -+ SDL_SetError("Unsupported Bits Per Pixel format requested"); -+ return NULL; -+ } -+ video = SDL_CreateRGBSurface(SDL_SWSURFACE, -+ 0, 0, bpp, Rmask, Gmask, Bmask, 0); -+ if ( video == NULL ) { -+ SDL_OutOfMemory(); -+ return(NULL); -+ } -+ } -+ -+ /* Fill in part of the video surface */ -+ prev_flags = video->flags; -+ video->flags = 0; /* Clear flags */ -+ video->w = width; -+ video->h = height; -+ video->pitch = SDL_CalculatePitch(video); -+ mainSurfaceWidth = width; -+ mainSurfaceHeight = height; -+ -+//#ifdef WIN32_PLATFORM_PSPC -+ /* Hide taskbar */ -+ if ( flags & SDL_FULLSCREEN ) { -+ if ( !(prev_flags & SDL_FULLSCREEN) ) { -+ //SHFullScreen(SDL_Window, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON); -+ //ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_HIDE); -+ DIB_ShowTaskBar(FALSE); -+ } -+ video->flags |= SDL_FULLSCREEN; -+ } else { -+ if ( prev_flags & SDL_FULLSCREEN ) { -+ //SHFullScreen(SDL_Window, SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON | SHFS_SHOWSTARTICON); -+ //ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_SHOWNORMAL); -+ DIB_ShowTaskBar(TRUE); -+ } -+ } -+//#endif -+ -+ /* Reset the palette and create a new one if necessary */ -+ if (screenPal != NULL) { -+ DeleteObject(screenPal); -+ screenPal = NULL; -+ } -+ -+ /* See if we need to create a translation palette */ -+ if (convertPalette != NULL) { -+ free(convertPalette); -+ } -+ if (bpp == 8) { -+ OutputDebugString(TEXT("creating palette\r\n")); -+ convertPalette = (unsigned short*)malloc(256 * sizeof(unsigned short)); -+ } -+ -+ if (displayProperties.ffFormat & kfPalette) { -+ /* Will only be able to support 256 colors in this mode */ -+ // FIXME -+ //screenPal = GAPI_CreatePalette(); -+ } -+ -+ /* Set Window style */ -+ style = GetWindowLong(SDL_Window, GWL_STYLE); -+ if ( (video->flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) { -+ style &= ~windowstyle; -+ style |= directstyle; -+ } else { -+ if ( flags & SDL_NOFRAME ) { -+ style &= ~windowstyle; -+ style |= directstyle; -+ video->flags |= SDL_NOFRAME; -+ } else { -+ style &= ~directstyle; -+ style |= windowstyle; -+ if ( flags & SDL_RESIZABLE ) { -+ style |= resizestyle; -+ video->flags |= SDL_RESIZABLE; -+ } -+ } -+#if WS_MAXIMIZE -+ if (IsZoomed(SDL_Window)) style |= WS_MAXIMIZE; -+#endif -+ } -+ -+ if (!SDL_windowid) -+ SetWindowLong(SDL_Window, GWL_STYLE, style); -+ -+ /* Allocate bitmap */ -+ if (gapiBuffer) { -+ free(gapiBuffer); -+ gapiBuffer = NULL; -+ } -+ gapiBuffer = malloc(video->h * video->pitch); -+ video->pixels = gapiBuffer; -+ -+ /* See if we will rotate */ -+ rotation = SDL_ROTATE_NONE; -+ screenWidth = getScreenWidth(); -+ screenHeight = getScreenHeight(); -+ if ((flags & SDL_FULLSCREEN) && -+ (width > screenWidth && width <= screenHeight) -+ ) -+ { -+ rotation = SDL_ROTATE_LEFT; -+ } -+ /* Compute the different drawing properties */ -+ switch(rotation) { -+ case SDL_ROTATE_NONE: -+ dstPixelstep = displayProperties.cbxPitch; -+ dstLinestep = displayProperties.cbyPitch; -+ startOffset = 0; -+ break; -+ case SDL_ROTATE_LEFT: -+ dstPixelstep = -displayProperties.cbyPitch; -+ dstLinestep = displayProperties.cbxPitch; -+ startOffset = displayProperties.cbyPitch * (displayProperties.cyHeight - 1); -+ break; -+ case SDL_ROTATE_RIGHT: -+ dstPixelstep = displayProperties.cbyPitch; -+ dstLinestep = -displayProperties.cbxPitch; -+ startOffset = displayProperties.cbxPitch * (displayProperties.cxWidth - 1); -+ break; -+ } -+ /* Compute padding */ -+ padWidth = 0; -+ padHeight = 0; -+ if (rotation == SDL_ROTATE_NONE) { -+ if (getScreenWidth() > width) -+ padWidth = (getScreenWidth() - width) / 2; -+ if (getScreenHeight() > height) -+ padHeight = (getScreenHeight() - height) / 2; -+ } -+ else { -+ if (getScreenWidth() > height) -+ padWidth = (getScreenWidth() - height) / 2; -+ if (getScreenHeight() > width) -+ padHeight = (getScreenHeight() - width) / 2; -+ } -+ srcLinestep = video->pitch; -+ srcPixelstep = (bpp == 15 ? 2 : bpp / 8); -+ -+ MoveWindow(SDL_Window, 0, 0, getScreenWidth(), getScreenHeight(), FALSE); -+ ShowWindow(SDL_Window, SW_SHOW); -+ -+ /* Resize the window */ -+ //if ( SDL_windowid == NULL ) { -+ if (0) { -+ HWND top; -+ UINT swp_flags; -+ RECT bounds; -+ int x,y; -+ -+ SDL_resizing = 1; -+ bounds.left = 0; -+ bounds.top = 0; -+ bounds.right = video->w; -+ bounds.bottom = video->h; -+ AdjustWindowRectEx(&bounds, GetWindowLong(SDL_Window, GWL_STYLE), FALSE, 0); -+ width = bounds.right-bounds.left; -+ height = bounds.bottom-bounds.top; -+ x = (getScreenWidth()-width)/2; -+ y = (getScreenHeight()-height)/2; -+ if ( y < 0 ) { /* Cover up title bar for more client area */ -+ y -= GetSystemMetrics(SM_CYCAPTION)/2; -+ } -+ swp_flags = (SWP_FRAMECHANGED | SWP_SHOWWINDOW); -+ if ( was_visible && !(flags & SDL_FULLSCREEN) ) { -+ swp_flags |= SWP_NOMOVE; -+ } -+ if ( flags & SDL_FULLSCREEN ) { -+ top = HWND_TOPMOST; -+ } else { -+ top = HWND_NOTOPMOST; -+ } -+ -+ if (flags & SDL_FULLSCREEN) { -+ SetWindowPos(SDL_Window, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); -+ ShowWindow(SDL_Window, SW_SHOW); -+ } -+ else -+ SetWindowPos(SDL_Window, top, x, y, width, height, swp_flags); -+ -+ SDL_resizing = 0; -+ SetForegroundWindow(SDL_Window); -+ } -+ -+ /* Open GAPI display */ -+ GXOpenDisplay(SDL_Window, (flags & SDL_FULLSCREEN ? GX_FULLSCREEN : 0)); -+ -+ /* Grab hardware keys if necessary */ -+ if (flags & SDL_FULLSCREEN) -+ GAPI_GrabHardwareKeys(TRUE); -+ -+ /* Blank screen */ -+ memset(GXBeginDraw(), 0, getScreenWidth() * getScreenHeight() * 2); -+ GXEndDraw(); -+ -+ /* We're done */ -+ return(video); -+} -+ -+/* We don't actually allow hardware surfaces other than the main one */ -+static int GAPI_AllocHWSurface(_THIS, SDL_Surface *surface) -+{ -+ return(-1); -+} -+static void GAPI_FreeHWSurface(_THIS, SDL_Surface *surface) -+{ -+ return; -+} -+ -+/* We need to wait for vertical retrace on page flipped displays */ -+static int GAPI_LockHWSurface(_THIS, SDL_Surface *surface) -+{ -+ return(0); -+} -+ -+static void GAPI_UnlockHWSurface(_THIS, SDL_Surface *surface) -+{ -+ return; -+} -+ -+static void updateLine(_THIS, unsigned char *srcPointer, unsigned char *destPointer, int width) { -+ // FIXME, we assume everything is in the correct format, either 16 bits 565 or 555, or 8 bits -+ int i; -+ for (i=0; i= 8) \ -+ { \ -+ bitshift = 0; \ -+ bitmask = (1<>= displayProperties.cBPP; -+ -+ -+static void GAPI_UpdateRectsMono(_THIS, int numrects, SDL_Rect *rects) -+{ -+ int i; -+ unsigned char *screenBuffer; -+ -+ screenBuffer = GXBeginDraw(); -+ -+ for (i=0; i>3)) -+ -+#define COLORCONV555(r,g,b) (((r&0xf8)<<(10-3))|((g&0xf8)<<(5-2))|((b&0xf8)>>3)) -+ -+int GAPI_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors) -+{ -+ int i; -+ /* Convert colors to appropriate 565 or 555 mapping */ -+ for (i=0; ipixels) */ -+ if ( this->screen ) { -+//#ifdef WIN32_PLATFORM_PSPC -+ if ( this->screen->flags & SDL_FULLSCREEN ) { -+ /* Unhide taskbar, etc. */ -+ //SHFullScreen(SDL_Window, SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON | SHFS_SHOWSTARTICON); -+ //ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_SHOWNORMAL); -+ DIB_ShowTaskBar(TRUE); -+ GAPI_GrabHardwareKeys(FALSE); -+ } -+//#endif -+ -+ if (this->screen->pixels != NULL) -+ { -+ free(this->screen->pixels); -+ this->screen->pixels = NULL; -+ } -+ -+ if (GXCloseDisplay) -+ GXCloseDisplay(); -+ } -+ } -+} -+ -+void GAPI_GrabHardwareKeys(BOOL grab) { -+ HINSTANCE GAPI_handle; -+ tGXVoidFunction GAPIActionInput; -+ -+ GAPI_handle = LoadLibrary(TEXT("gx.dll")); -+ if (!GAPI_handle) -+ return; -+ GAPIActionInput = (tGXVoidFunction)GetProcAddress(GAPI_handle, (grab ? TEXT("?GXOpenInput@@YAHXZ") : TEXT("?GXCloseInput@@YAHXZ"))); -+ if (GAPIActionInput) { -+ GAPIActionInput(); -+ } -+ FreeLibrary(GAPI_handle); -+} -diff -ruN SDL-1.2.7-orig/src/video/wingapi/SDL_gapivideo.h SDL-1.2.7/src/video/wingapi/SDL_gapivideo.h ---- SDL-1.2.7-orig/src/video/wingapi/SDL_gapivideo.h Wed Dec 31 19:00:00 1969 -+++ SDL-1.2.7/src/video/wingapi/SDL_gapivideo.h Sun May 30 17:57:48 2004 -@@ -0,0 +1,192 @@ -+/* -+ SDL - Simple DirectMedia Layer -+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga -+ -+ This library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Library General Public -+ License as published by the Free Software Foundation; either -+ version 2 of the License, or (at your option) any later version. -+ -+ This library 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 -+ Library General Public License for more details. -+ -+ You should have received a copy of the GNU Library General Public -+ License along with this library; if not, write to the Free -+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ -+ Sam Lantinga -+ slouken@libsdl.org -+*/ -+ -+#ifdef SAVE_RCSID -+static char rcsid = -+ "@(#) $Id: SDL_gapivideo.h,v 1.1 2004/02/02 23:25:35 lemure Exp $"; -+#endif -+ -+#ifndef _SDL_gapivideo_h -+#define _SDL_gapivideo_h -+ -+#include -+ -+/* -------------------------------------------------------------------------------------------- */ -+ -+/* From gx.h, since it's not really C compliant */ -+ -+struct GXDisplayProperties { -+ DWORD cxWidth; -+ DWORD cyHeight; // notice lack of 'th' in the word height. -+ long cbxPitch; // number of bytes to move right one x pixel - can be negative. -+ long cbyPitch; // number of bytes to move down one y pixel - can be negative. -+ long cBPP; // # of bits in each pixel -+ DWORD ffFormat; // format flags. -+}; -+ -+struct GXKeyList { -+ short vkUp; // key for up -+ POINT ptUp; // x,y position of key/button. Not on screen but in screen coordinates. -+ short vkDown; -+ POINT ptDown; -+ short vkLeft; -+ POINT ptLeft; -+ short vkRight; -+ POINT ptRight; -+ short vkA; -+ POINT ptA; -+ short vkB; -+ POINT ptB; -+ short vkC; -+ POINT ptC; -+ short vkStart; -+ POINT ptStart; -+}; -+ -+#define kfLandscape 0x8 // Screen is rotated 270 degrees -+#define kfPalette 0x10 // Pixel values are indexes into a palette -+#define kfDirect 0x20 // Pixel values contain actual level information -+#define kfDirect555 0x40 // 5 bits each for red, green and blue values in a pixel. -+#define kfDirect565 0x80 // 5 red bits, 6 green bits and 5 blue bits per pixel -+#define kfDirect888 0x100 // 8 bits each for red, green and blue values in a pixel. -+#define kfDirect444 0x200 // 4 red, 4 green, 4 blue -+#define kfDirectInverted 0x400 -+ -+#define GX_FULLSCREEN 0x01 // for OpenDisplay() -+ -+/* -------------------------------------------------------------------------------------------- */ -+ -+/* Rotation direction */ -+typedef enum { -+ SDL_ROTATE_NONE, -+ SDL_ROTATE_LEFT, -+ SDL_ROTATE_RIGHT -+} SDL_RotateAttr; -+ -+/* GAPI video mode */ -+typedef enum { -+ GAPI_NONE = 0, -+ GAPI_DIRECT_565, -+ GAPI_DIRECT_555, -+ GAPI_MONO, -+ GAPI_PALETTE -+} SDL_GAPIVideoMode; -+ -+ -+/* Hidden "this" pointer for the video functions */ -+#define _THIS SDL_VideoDevice *this -+ -+/* GAPI functions definitions */ -+ -+typedef struct GXDisplayProperties (*tGXDisplayProperties)(void); -+typedef int (*tGXOpenDisplay)(HWND, unsigned long); -+typedef void* (*tGXBeginDraw)(void); -+typedef int (*tGXVoidFunction)(void); -+ -+/* Private display data */ -+ -+struct GAPI_funcs { -+ tGXDisplayProperties dynamicGXGetDisplayProperties; -+ tGXOpenDisplay dynamicGXOpenDisplay; -+ tGXVoidFunction dynamicGXCloseDisplay; -+ tGXBeginDraw dynamicGXBeginDraw; -+ tGXVoidFunction dynamicGXEndDraw; -+ tGXVoidFunction dynamicGXSuspend; -+ tGXVoidFunction dynamicGXResume; -+}; -+ -+struct GAPI_properties { -+ unsigned char invert; -+ int colorscale; -+ int dstPixelstep; -+ int dstLinestep; -+ int startOffset; -+ SDL_GAPIVideoMode videoMode; -+}; -+ -+#define MAX_CLR 0x100 -+ -+struct palette_properties { -+ unsigned char *palRed; -+ unsigned char *palGreen; -+ unsigned char *palBlue; -+ unsigned short *pal; -+}; -+ -+ -+struct SDL_PrivateVideoData { -+ /* --- --- begin with DIB private structure to allow DIB events code sharing */ -+ HBITMAP screen_bmp; -+ HPALETTE screen_pal; -+ void *work_pixels; /* if the display needs to be rotated, memory allocated by the API */ -+ void *rotation_pixels; /* if the display needs to be rotated, memory allocated by the code */ -+ SDL_RotateAttr rotation; -+ char ozoneHack; /* force stylus translation if running without Hi Res flag */ -+ -+#define NUM_MODELISTS 4 /* 8, 16, 24, and 32 bits-per-pixel */ -+ int SDL_nummodes[NUM_MODELISTS]; -+ SDL_Rect **SDL_modelist[NUM_MODELISTS]; -+ -+ /* --- --- */ -+ -+ int w, h; -+ void *gapiBuffer; -+ HPALETTE screenPal; -+ struct GAPI_funcs gapiFuncs; -+ struct GAPI_properties gapiProperties; -+ struct GXDisplayProperties displayProps; -+ int srcLinestep; -+ int srcPixelstep; -+ -+ int padWidth; -+ int padHeight; -+ -+ unsigned short *convertPalette; -+}; -+ -+#define gapiBuffer (this->hidden->gapiBuffer) -+#define mainSurfaceWidth (this->hidden->w) -+#define mainSurfaceHeight (this->hidden->h) -+#define rotation (this->hidden->rotation) -+#define ozoneHack (this->hidden->ozoneHack) -+#define displayProperties (this->hidden->displayProps) -+#define screenPal (this->hidden->screenPal) -+#define GXGetDisplayProperties (this->hidden->gapiFuncs.dynamicGXGetDisplayProperties) -+#define GXOpenDisplay (this->hidden->gapiFuncs.dynamicGXOpenDisplay) -+#define GXCloseDisplay (this->hidden->gapiFuncs.dynamicGXCloseDisplay) -+#define GXBeginDraw (this->hidden->gapiFuncs.dynamicGXBeginDraw) -+#define GXEndDraw (this->hidden->gapiFuncs.dynamicGXEndDraw) -+#define GXSuspend (this->hidden->gapiFuncs.dynamicGXSuspend) -+#define GXResume (this->hidden->gapiFuncs.dynamicGXResume) -+#define invert (this->hidden->gapiProperties.invert) -+#define colorscale (this->hidden->gapiProperties.colorscale) -+#define videoMode (this->hidden->gapiProperties.videoMode) -+#define srcPixelstep (this->hidden->srcPixelstep) -+#define srcLinestep (this->hidden->srcLinestep) -+#define dstPixelstep (this->hidden->gapiProperties.dstPixelstep) -+#define dstLinestep (this->hidden->gapiProperties.dstLinestep) -+#define startOffset (this->hidden->gapiProperties.startOffset) -+#define padWidth (this->hidden->padWidth) -+#define padHeight (this->hidden->padHeight) -+#define convertPalette (this->hidden->convertPalette) -+ -+#endif /* _SDL_gapivideo_h */ diff --git a/tools/SDL1.2.7_CE/VisualCEv2.zip b/tools/SDL1.2.7_CE/VisualCEv2.zip deleted file mode 100644 index 816382e3b9ed7cb863f90be6334aa4b57535c6bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273151 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ⅈ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 DIX9?z From 292b8d14700fd9ebf4eed49311fdc11a72c7fd7d Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sun, 17 Jul 2022 19:52:41 -0500 Subject: [PATCH 374/377] Remove unmaintained SOCEdit Written in VB6. Superceded by better tools and also probably not even buildable anymore. --- tools/SOCEdit/Global.bas | 96 -- tools/SOCEdit/SOCEdit.vbp | 53 - tools/SOCEdit/Things.frm | 1895 -------------------------- tools/SOCEdit/Things.frx | Bin 1094 -> 0 bytes tools/SOCEdit/frmCharacterEdit.frm | 320 ----- tools/SOCEdit/frmCharacterEdit.frx | Bin 1215 -> 0 bytes tools/SOCEdit/frmCutsceneEdit.frm | 1365 ------------------- tools/SOCEdit/frmCutsceneEdit.frx | Bin 1098 -> 0 bytes tools/SOCEdit/frmEmblemEdit.frm | 384 ------ tools/SOCEdit/frmEmblemEdit.frx | Bin 1090 -> 0 bytes tools/SOCEdit/frmHUDEdit.frm | 315 ----- tools/SOCEdit/frmHUDEdit.frx | Bin 1090 -> 0 bytes tools/SOCEdit/frmHelp.frm | 213 --- tools/SOCEdit/frmHelp.frx | Bin 2795 -> 0 bytes tools/SOCEdit/frmHub.frm | 429 ------ tools/SOCEdit/frmHub.frx | Bin 50308 -> 0 bytes tools/SOCEdit/frmLevelHeader.frm | 839 ------------ tools/SOCEdit/frmLevelHeader.frx | Bin 1204 -> 0 bytes tools/SOCEdit/frmMaincfg.frm | 644 --------- tools/SOCEdit/frmMaincfg.frx | Bin 1090 -> 0 bytes tools/SOCEdit/frmSoundEdit.frm | 485 ------- tools/SOCEdit/frmSoundEdit.frx | Bin 1094 -> 0 bytes tools/SOCEdit/frmStateEdit.frm | 940 ------------- tools/SOCEdit/frmStateEdit.frx | Bin 1254 -> 0 bytes tools/SOCEdit/frmUnlockablesEdit.frm | 391 ------ tools/SOCEdit/frmUnlockablesEdit.frx | Bin 1399 -> 0 bytes tools/SOCEdit/icon1.ico | Bin 1078 -> 0 bytes 27 files changed, 8369 deletions(-) delete mode 100644 tools/SOCEdit/Global.bas delete mode 100644 tools/SOCEdit/SOCEdit.vbp delete mode 100644 tools/SOCEdit/Things.frm delete mode 100644 tools/SOCEdit/Things.frx delete mode 100644 tools/SOCEdit/frmCharacterEdit.frm delete mode 100644 tools/SOCEdit/frmCharacterEdit.frx delete mode 100644 tools/SOCEdit/frmCutsceneEdit.frm delete mode 100644 tools/SOCEdit/frmCutsceneEdit.frx delete mode 100644 tools/SOCEdit/frmEmblemEdit.frm delete mode 100644 tools/SOCEdit/frmEmblemEdit.frx delete mode 100644 tools/SOCEdit/frmHUDEdit.frm delete mode 100644 tools/SOCEdit/frmHUDEdit.frx delete mode 100644 tools/SOCEdit/frmHelp.frm delete mode 100644 tools/SOCEdit/frmHelp.frx delete mode 100644 tools/SOCEdit/frmHub.frm delete mode 100644 tools/SOCEdit/frmHub.frx delete mode 100644 tools/SOCEdit/frmLevelHeader.frm delete mode 100644 tools/SOCEdit/frmLevelHeader.frx delete mode 100644 tools/SOCEdit/frmMaincfg.frm delete mode 100644 tools/SOCEdit/frmMaincfg.frx delete mode 100644 tools/SOCEdit/frmSoundEdit.frm delete mode 100644 tools/SOCEdit/frmSoundEdit.frx delete mode 100644 tools/SOCEdit/frmStateEdit.frm delete mode 100644 tools/SOCEdit/frmStateEdit.frx delete mode 100644 tools/SOCEdit/frmUnlockablesEdit.frm delete mode 100644 tools/SOCEdit/frmUnlockablesEdit.frx delete mode 100644 tools/SOCEdit/icon1.ico diff --git a/tools/SOCEdit/Global.bas b/tools/SOCEdit/Global.bas deleted file mode 100644 index 77bf3df2b..000000000 --- a/tools/SOCEdit/Global.bas +++ /dev/null @@ -1,96 +0,0 @@ -Attribute VB_Name = "Module1" -Option Explicit -Public SOCFile As String -Public SOCTemp As String -Public SourcePath As String - -Public Function FirstToken(ByVal line As String) - Dim index As Integer - - index = InStr(line, " ") - 1 - - If index < 1 Then - index = Len(line) - End If - - FirstToken = TrimComplete(Left(line, index)) -End Function - -Public Function SecondToken(ByVal line As String) - Dim startclip As Integer - Dim endclip As Integer - - startclip = InStr(line, " ") - - startclip = startclip + 1 - - SecondToken = TrimComplete(Mid(line, startclip, Len(line))) -End Function - -Public Function SecondTokenEqual(ByVal line As String) - Dim startclip As Integer - Dim endclip As Integer - - startclip = InStr(line, "=") - - startclip = startclip + 2 - - line = Mid(line, startclip, Len(line)) - - SecondTokenEqual = TrimComplete(line) -End Function - -Public Function TrimComplete(ByVal sValue As String) As String - Dim sAns As String - Dim sWkg As String - Dim sChar As String - Dim lLen As Long - Dim lCtr As Long - - sAns = sValue - lLen = Len(sValue) - - If lLen > 0 Then - 'Ltrim - For lCtr = 1 To lLen - sChar = Mid(sAns, lCtr, 1) - If Asc(sChar) > 32 Then Exit For - Next - - sAns = Mid(sAns, lCtr) - lLen = Len(sAns) - - 'Rtrim - If lLen > 0 Then - For lCtr = lLen To 1 Step -1 - sChar = Mid(sAns, lCtr, 1) - If Asc(sChar) > 32 Then Exit For - Next - End If - sAns = Left$(sAns, lCtr) - End If - - TrimComplete = sAns -End Function - -Public Function RTrimComplete(ByVal sValue As String) As String - Dim sAns As String - Dim sWkg As String - Dim sChar As String - Dim lLen As Long - Dim lCtr As Long - - sAns = sValue - lLen = Len(sValue) - - 'Rtrim - If lLen > 0 Then - For lCtr = lLen To 1 Step -1 - sChar = Mid(sAns, lCtr, 1) - If Asc(sChar) > 32 Then Exit For - Next - End If - sAns = Left$(sAns, lCtr) - - RTrimComplete = sAns -End Function diff --git a/tools/SOCEdit/SOCEdit.vbp b/tools/SOCEdit/SOCEdit.vbp deleted file mode 100644 index 90af0095a..000000000 --- a/tools/SOCEdit/SOCEdit.vbp +++ /dev/null @@ -1,53 +0,0 @@ -Type=Exe -Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\WINNT\system32\stdole2.tlb#OLE Automation -Reference=*\G{420B2830-E718-11CF-893D-00A0C9054228}#1.0#0#..\..\..\WINNT\system32\scrrun.dll#Microsoft Scripting Runtime -Form=Things.frm -Module=Module1; Global.bas -Form=frmStateEdit.frm -Form=frmLevelHeader.frm -Form=frmHub.frm -Form=frmMaincfg.frm -Form=frmUnlockablesEdit.frm -Form=frmEmblemEdit.frm -Form=frmSoundEdit.frm -Form=frmCharacterEdit.frm -Form=frmCutsceneEdit.frm -Form=frmHelp.frm -Form=frmHUDEdit.frm -IconForm="frmThingEdit" -Startup="frmHub" -HelpFile="" -Title="SOC Editor" -ExeName32="SOCEdit.exe" -Path32="..\..\..\srb2demo2\SOCEdit" -Command32="" -Name="SOCEditor" -HelpContextID="0" -CompatibleMode="0" -MajorVer=0 -MinorVer=7 -RevisionVer=7 -AutoIncrementVer=0 -ServerSupportFiles=0 -VersionComments="http://www.srb2.org/" -VersionCompanyName="Sonic Team Junior" -VersionFileDescription="For SRB2 v1.09.4" -CompilationType=0 -OptimizationType=0 -FavorPentiumPro(tm)=0 -CodeViewDebugInfo=0 -NoAliasing=0 -BoundsCheck=0 -OverflowCheck=0 -FlPointCheck=0 -FDIVCheck=0 -UnroundedFP=0 -StartMode=0 -Unattended=0 -Retained=0 -ThreadPerObject=0 -MaxNumberOfThreads=1 -DebugStartupOption=0 - -[MS Transaction Server] -AutoRefresh=1 diff --git a/tools/SOCEdit/Things.frm b/tools/SOCEdit/Things.frm deleted file mode 100644 index f95b6afb7..000000000 --- a/tools/SOCEdit/Things.frm +++ /dev/null @@ -1,1895 +0,0 @@ -VERSION 5.00 -Begin VB.Form frmThingEdit - Caption = "Thing Edit" - ClientHeight = 5745 - ClientLeft = 60 - ClientTop = 345 - ClientWidth = 11880 - Icon = "Things.frx":0000 - LinkTopic = "Form1" - MaxButton = 0 'False - ScaleHeight = 5745 - ScaleWidth = 11880 - StartUpPosition = 3 'Windows Default - Begin VB.CommandButton cmdCopy - Caption = "&Copy Thing" - Height = 615 - Left = 6600 - TabIndex = 77 - Top = 4920 - Width = 975 - End - Begin VB.CommandButton cmdLoadDefault - Caption = "&Load Code Default" - Height = 615 - Left = 4440 - Style = 1 'Graphical - TabIndex = 76 - Top = 4920 - Width = 975 - End - Begin VB.CommandButton cmdDelete - Caption = "&Delete Thing from SOC" - Height = 615 - Left = 3240 - Style = 1 'Graphical - TabIndex = 74 - Top = 4920 - Width = 1095 - End - Begin VB.CommandButton cmdSave - Caption = "&Save" - Height = 615 - Left = 5520 - TabIndex = 73 - Top = 4920 - Width = 975 - End - Begin VB.Frame frmFlags - Caption = "Flags" - Height = 3735 - Left = 7680 - TabIndex = 45 - Top = 1920 - Width = 4095 - Begin VB.CheckBox chkFlags - Caption = "MF_FIRE" - Height = 255 - Index = 26 - Left = 2040 - TabIndex = 72 - Tag = "4194304" - ToolTipText = "Fire object. Doesn't harm if you have red shield." - Top = 2160 - Width = 1695 - End - Begin VB.CheckBox chkFlags - Caption = "MF_NOCLIPTHING" - Height = 255 - Index = 25 - Left = 2040 - TabIndex = 71 - Tag = "1073741824" - ToolTipText = "Don't be blocked by things (partial clipping)" - Top = 3120 - Width = 1815 - End - Begin VB.CheckBox chkFlags - Caption = "MF_SCENERY" - Height = 255 - Index = 24 - Left = 2040 - TabIndex = 70 - Tag = "33554432" - ToolTipText = "Scenery (uses scenery thinker). Uses less CPU than a standard object, but generally can't move, etc." - Top = 2880 - Width = 1455 - End - Begin VB.CheckBox chkFlags - Caption = "MF_ENEMY" - Height = 255 - Index = 23 - Left = 2040 - TabIndex = 69 - Tag = "16777216" - ToolTipText = "This mobj is an enemy!" - Top = 2640 - Width = 1335 - End - Begin VB.CheckBox chkFlags - Caption = "MF_COUNTITEM" - Height = 255 - Index = 22 - Left = 2040 - TabIndex = 68 - Tag = "8388608" - ToolTipText = "On picking up, count this item object towards intermission item total." - Top = 2400 - Width = 1695 - End - Begin VB.CheckBox chkFlags - Caption = "MF_NOTHINK" - Height = 255 - Index = 21 - Left = 2040 - TabIndex = 67 - Tag = "2097152" - ToolTipText = "Don't run this thing's thinker." - Top = 1920 - Width = 1695 - End - Begin VB.CheckBox chkFlags - Caption = "MF_MONITOR" - Height = 255 - Index = 20 - Left = 2040 - TabIndex = 66 - Tag = "1048576" - ToolTipText = "Item box" - Top = 1680 - Width = 1575 - End - Begin VB.CheckBox chkFlags - Caption = "MF_HIRES" - Height = 255 - Index = 19 - Left = 2040 - TabIndex = 65 - Tag = "524288" - ToolTipText = "Object uses a high-resolution sprite" - Top = 1440 - Width = 1215 - End - Begin VB.CheckBox chkFlags - Caption = "MF_BOUNCE" - Height = 255 - Index = 18 - Left = 2040 - TabIndex = 64 - Tag = "262144" - ToolTipText = "Bounce off walls and things." - Top = 1200 - Width = 1335 - End - Begin VB.CheckBox chkFlags - Caption = "MF_SPRING" - Height = 255 - Index = 17 - Left = 2040 - TabIndex = 63 - Tag = "131072" - ToolTipText = "Item is a spring." - Top = 960 - Width = 1575 - End - Begin VB.CheckBox chkFlags - Caption = "MF_MISSILE" - Height = 255 - Index = 16 - Left = 2040 - TabIndex = 62 - Tag = "65536" - ToolTipText = "Any kind of projectile currently flying through the air, waiting to hit something" - Top = 720 - Width = 1335 - End - Begin VB.CheckBox chkFlags - Caption = "MF_BOXICON" - Height = 255 - Index = 15 - Left = 2040 - TabIndex = 61 - Tag = "32768" - ToolTipText = "Monitor powerup icon. These rise a bit." - Top = 480 - Width = 1815 - End - Begin VB.CheckBox chkFlags - Caption = "MF_FLOAT" - Height = 255 - Index = 14 - Left = 2040 - TabIndex = 60 - Tag = "16384" - ToolTipText = "Allow moves to any height, no gravity. For active floaters." - Top = 240 - Width = 1215 - End - Begin VB.CheckBox chkFlags - Caption = "MF_SPECIALFLAGS" - Height = 255 - Index = 13 - Left = 120 - TabIndex = 59 - Tag = "8192" - ToolTipText = "This object does not adhere to regular flag/z properties for object placing." - Top = 3360 - Width = 1815 - End - Begin VB.CheckBox chkFlags - Caption = "MF_NOCLIP" - Height = 255 - Index = 12 - Left = 120 - TabIndex = 58 - Tag = "4096" - ToolTipText = "Don't clip against objects, walls, etc." - Top = 3120 - Width = 1335 - End - Begin VB.CheckBox chkFlags - Caption = "MF_SLIDEME" - Height = 255 - Index = 11 - Left = 120 - TabIndex = 57 - Tag = "2048" - ToolTipText = "Slide this object when it hits a wall." - Top = 2880 - Width = 1335 - End - Begin VB.CheckBox chkFlags - Caption = "MF_AMBIENT" - Height = 255 - Index = 10 - Left = 120 - TabIndex = 56 - Tag = "1024" - ToolTipText = "This object is an ambient sound." - Top = 2640 - Width = 1695 - End - Begin VB.CheckBox chkFlags - Caption = "MF_NOGRAVITY" - Height = 255 - Index = 9 - Left = 120 - TabIndex = 55 - Tag = "512" - ToolTipText = "Don't apply gravity" - Top = 2400 - Width = 1695 - End - Begin VB.CheckBox chkFlags - Caption = "MF_SPAWNCEILING" - Height = 255 - Index = 8 - Left = 120 - TabIndex = 54 - Tag = "256" - ToolTipText = "On level spawning (initial position), hang from ceiling instead of stand on floor." - Top = 2160 - Width = 1935 - End - Begin VB.CheckBox chkFlags - Caption = "MF_BOSS" - Height = 255 - Index = 7 - Left = 120 - TabIndex = 53 - Tag = "128" - ToolTipText = "Object is a boss." - Top = 1920 - Width = 1575 - End - Begin VB.CheckBox chkFlags - Caption = "MF_PUSHABLE" - Height = 255 - Index = 6 - Left = 120 - TabIndex = 52 - Tag = "64" - ToolTipText = "You can push this object. It can activate switches and things by pushing it on top." - Top = 1680 - Width = 1575 - End - Begin VB.CheckBox chkFlags - Caption = "MF_AMBUSH" - Height = 255 - Index = 5 - Left = 120 - TabIndex = 51 - Tag = "32" - ToolTipText = "Special attributes" - Top = 1440 - Width = 1455 - End - Begin VB.CheckBox chkFlags - Caption = "MF_NOBLOCKMAP" - Height = 255 - Index = 4 - Left = 120 - TabIndex = 50 - Tag = "16" - ToolTipText = "Don't use the blocklinks (inert but displayable)" - Top = 1200 - Width = 1815 - End - Begin VB.CheckBox chkFlags - Caption = "MF_NOSECTOR" - Height = 255 - Index = 3 - Left = 120 - TabIndex = 49 - Tag = "8" - ToolTipText = "Don't use the sector links (invisible but touchable)." - Top = 960 - Width = 1575 - End - Begin VB.CheckBox chkFlags - Caption = "MF_SHOOTABLE" - Height = 255 - Index = 2 - Left = 120 - TabIndex = 48 - Tag = "4" - ToolTipText = "Can be hit." - Top = 720 - Width = 1695 - End - Begin VB.CheckBox chkFlags - Caption = "MF_SOLID" - Height = 255 - Index = 1 - Left = 120 - TabIndex = 47 - Tag = "2" - ToolTipText = "Blocks." - Top = 480 - Width = 1335 - End - Begin VB.CheckBox chkFlags - Caption = "MF_SPECIAL" - Height = 255 - Index = 0 - Left = 120 - TabIndex = 46 - Tag = "1" - ToolTipText = "Call P_TouchSpecialThing when touched." - Top = 240 - Width = 1455 - End - End - Begin VB.ComboBox cmbRaisestate - Height = 315 - Left = 4320 - TabIndex = 43 - Text = "cmbRaisestate" - Top = 4440 - Width = 3300 - End - Begin VB.ComboBox cmbActivesound - Height = 315 - Left = 4320 - TabIndex = 41 - Text = "cmbActivesound" - Top = 4080 - Width = 3300 - End - Begin VB.TextBox txtDamage - Height = 285 - Left = 10680 - TabIndex = 39 - Text = "0" - Top = 1200 - Width = 1095 - End - Begin VB.TextBox txtMass - Height = 285 - Left = 10680 - TabIndex = 37 - Text = "0" - Top = 840 - Width = 1095 - End - Begin VB.TextBox txtHeight - Height = 285 - Left = 10680 - TabIndex = 35 - Text = "0" - Top = 480 - Width = 1095 - End - Begin VB.TextBox txtRadius - Height = 285 - Left = 10680 - TabIndex = 33 - Text = "0" - Top = 120 - Width = 1095 - End - Begin VB.TextBox txtSpeed - Height = 285 - Left = 8760 - TabIndex = 31 - Text = "0" - Top = 1560 - Width = 1095 - End - Begin VB.ComboBox cmbDeathsound - Height = 315 - Left = 4320 - TabIndex = 29 - Text = "cmbDeathsound" - Top = 3720 - Width = 3300 - End - Begin VB.ComboBox cmbXdeathstate - Height = 315 - Left = 4320 - TabIndex = 27 - Text = "cmbXdeathstate" - Top = 3360 - Width = 3300 - End - Begin VB.ComboBox cmbDeathstate - Height = 315 - Left = 4320 - TabIndex = 25 - Text = "cmbDeathstate" - Top = 3000 - Width = 3300 - End - Begin VB.ComboBox cmbMissilestate - Height = 315 - Left = 4320 - TabIndex = 23 - Text = "cmbMissilestate" - Top = 2640 - Width = 3300 - End - Begin VB.ComboBox cmbMeleestate - Height = 315 - Left = 4320 - TabIndex = 21 - Text = "cmbMeleestate" - Top = 2280 - Width = 3300 - End - Begin VB.ComboBox cmbPainsound - Height = 315 - Left = 4320 - TabIndex = 19 - Text = "cmbPainsound" - Top = 1920 - Width = 3300 - End - Begin VB.TextBox txtPainchance - Height = 285 - Left = 8760 - TabIndex = 17 - Text = "0" - Top = 1200 - Width = 1095 - End - Begin VB.ComboBox cmbPainstate - Height = 315 - Left = 4320 - TabIndex = 15 - Text = "cmbPainstate" - Top = 1560 - Width = 3300 - End - Begin VB.ComboBox cmbAttacksound - Height = 315 - Left = 4320 - TabIndex = 13 - Text = "cmbAttacksound" - Top = 1200 - Width = 3300 - End - Begin VB.TextBox txtReactiontime - Height = 285 - Left = 8760 - TabIndex = 11 - Text = "0" - Top = 840 - Width = 1095 - End - Begin VB.ComboBox cmbSeesound - Height = 315 - Left = 4320 - TabIndex = 9 - Text = "cmbSeesound" - Top = 840 - Width = 3300 - End - Begin VB.ComboBox cmbSeestate - Height = 315 - Left = 4320 - TabIndex = 7 - Text = "cmbSeestate" - Top = 480 - Width = 3300 - End - Begin VB.TextBox txtSpawnhealth - Height = 285 - Left = 8760 - TabIndex = 6 - Text = "0" - Top = 480 - Width = 1095 - End - Begin VB.ComboBox cmbSpawnstate - Height = 315 - Left = 4320 - TabIndex = 3 - Text = "cmbSpawnstate" - Top = 120 - Width = 3300 - End - Begin VB.TextBox txtDoomednum - Height = 285 - Left = 8760 - TabIndex = 1 - Text = "0" - Top = 120 - Width = 1095 - End - Begin VB.ListBox lstThings - Height = 5520 - ItemData = "Things.frx":0442 - Left = 120 - List = "Things.frx":0444 - TabIndex = 0 - Top = 120 - Width = 3015 - End - Begin VB.Label lblStatusInfo - Alignment = 2 'Center - Caption = "Idle" - BeginProperty Font - Name = "MS Sans Serif" - Size = 8.25 - Charset = 0 - Weight = 700 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 375 - Left = 9960 - TabIndex = 75 - Top = 1560 - Width = 1815 - End - Begin VB.Label lblRaisestate - Alignment = 1 'Right Justify - Caption = "Raisestate:" - Height = 255 - Left = 3360 - TabIndex = 44 - Top = 4440 - Width = 855 - End - Begin VB.Label lblActivesound - Alignment = 1 'Right Justify - Caption = "Activesound:" - Height = 255 - Left = 3240 - TabIndex = 42 - Top = 4080 - Width = 975 - End - Begin VB.Label lblDamage - Alignment = 1 'Right Justify - Caption = "Damage:" - Height = 255 - Left = 9840 - TabIndex = 40 - Top = 1200 - Width = 735 - End - Begin VB.Label lblMass - Alignment = 1 'Right Justify - Caption = "Mass:" - Height = 255 - Left = 9960 - TabIndex = 38 - Top = 840 - Width = 615 - End - Begin VB.Label lblHeight - Alignment = 1 'Right Justify - Caption = "Height:" - Height = 255 - Left = 9960 - TabIndex = 36 - Top = 480 - Width = 615 - End - Begin VB.Label lblRadius - Alignment = 1 'Right Justify - Caption = "Radius:" - Height = 255 - Left = 9960 - TabIndex = 34 - Top = 120 - Width = 615 - End - Begin VB.Label lblSpeed - Alignment = 1 'Right Justify - Caption = "Speed:" - Height = 255 - Left = 7680 - TabIndex = 32 - Top = 1560 - Width = 975 - End - Begin VB.Label lblDeathsound - Alignment = 1 'Right Justify - Caption = "Deathsound:" - Height = 255 - Left = 3240 - TabIndex = 30 - Top = 3720 - Width = 975 - End - Begin VB.Label lblXdeathstate - Alignment = 1 'Right Justify - Caption = "Xdeathstate:" - Height = 255 - Left = 3240 - TabIndex = 28 - Top = 3360 - Width = 975 - End - Begin VB.Label lblDeathstate - Alignment = 1 'Right Justify - Caption = "Deathstate:" - Height = 255 - Left = 3240 - TabIndex = 26 - Top = 3000 - Width = 975 - End - Begin VB.Label lblMissilestate - Alignment = 1 'Right Justify - Caption = "Missilestate:" - Height = 255 - Left = 3240 - TabIndex = 24 - Top = 2640 - Width = 975 - End - Begin VB.Label lblMeleestate - Alignment = 1 'Right Justify - Caption = "Meleestate:" - Height = 255 - Left = 3240 - TabIndex = 22 - Top = 2280 - Width = 975 - End - Begin VB.Label lblPainsound - Alignment = 1 'Right Justify - Caption = "Painsound:" - Height = 255 - Left = 3240 - TabIndex = 20 - Top = 1920 - Width = 975 - End - Begin VB.Label lblPainchance - Alignment = 1 'Right Justify - Caption = "Painchance:" - Height = 255 - Left = 7680 - TabIndex = 18 - Top = 1200 - Width = 975 - End - Begin VB.Label lblPainstate - Alignment = 1 'Right Justify - Caption = "Painstate:" - Height = 255 - Left = 3240 - TabIndex = 16 - Top = 1560 - Width = 975 - End - Begin VB.Label lblAttacksound - Alignment = 1 'Right Justify - Caption = "Attacksound:" - Height = 255 - Left = 3240 - TabIndex = 14 - Top = 1200 - Width = 975 - End - Begin VB.Label lblReactiontime - Alignment = 1 'Right Justify - Caption = "Reactiontime:" - Height = 255 - Left = 7680 - TabIndex = 12 - Top = 840 - Width = 975 - End - Begin VB.Label lblSeesound - Alignment = 1 'Right Justify - Caption = "Seesound:" - Height = 255 - Left = 3240 - TabIndex = 10 - Top = 840 - Width = 975 - End - Begin VB.Label lblSeestate - Alignment = 1 'Right Justify - Caption = "Seestate:" - Height = 255 - Left = 3240 - TabIndex = 8 - Top = 480 - Width = 975 - End - Begin VB.Label lblSpawnhealth - Alignment = 1 'Right Justify - Caption = "Spawnhealth:" - Height = 255 - Left = 7680 - TabIndex = 5 - Top = 480 - Width = 975 - End - Begin VB.Label lblSpawnstate - Alignment = 1 'Right Justify - Caption = "Spawnstate:" - Height = 255 - Left = 3240 - TabIndex = 4 - Top = 120 - Width = 975 - End - Begin VB.Label lblDoomednum - Alignment = 1 'Right Justify - Caption = "Thing Map #:" - Height = 255 - Left = 7680 - TabIndex = 2 - Top = 120 - Width = 975 - End -End -Attribute VB_Name = "frmThingEdit" -Attribute VB_GlobalNameSpace = False -Attribute VB_Creatable = False -Attribute VB_PredeclaredId = True -Attribute VB_Exposed = False -Option Explicit - -Private Sub cmdCopy_Click() - Dim Response As String - - Response$ = InputBox("Copy state to #:", "Copy State") - - If Response = "" Then Exit Sub - - Response = TrimComplete(Response) - - Call WriteThing(False, Val(Response)) - - MsgBox "Thing copied to #" & Val(Response) -End Sub - -Private Sub cmdDelete_Click() - Call WriteThing(True, lstThings.ListIndex) -End Sub - -Private Sub cmdLoadDefault_Click() - Call ClearForm - If InStr(lstThings.List(lstThings.ListIndex), "MT_FREESLOT") = 0 Then - LoadObjectInfo (lstThings.ListIndex) - Else - MsgBox "Free slots do not have a code default." - End If -End Sub - -Private Sub cmdSave_Click() - Call WriteThing(False, lstThings.ListIndex) -End Sub - -Private Sub Form_Load() - Call Reload -End Sub - -Private Sub ClearForm() - Dim i As Integer - cmbSpawnstate.Text = "" - cmbSeestate.Text = "" - cmbSeesound.Text = "" - cmbAttacksound.Text = "" - cmbPainstate.Text = "" - cmbPainsound.Text = "" - cmbMeleestate.Text = "" - cmbMissilestate.Text = "" - cmbDeathstate.Text = "" - cmbXdeathstate.Text = "" - cmbDeathsound.Text = "" - cmbActivesound.Text = "" - cmbRaisestate.Text = "" - txtDoomednum.Text = "" - txtSpawnhealth.Text = "" - txtReactiontime.Text = "" - txtPainchance.Text = "" - txtSpeed.Text = "" - txtRadius.Text = "" - txtHeight.Text = "" - txtMass.Text = "" - txtDamage.Text = "" - - For i = 0 To 26 - chkFlags(i).Value = 0 - Next -End Sub - -Private Sub Reload() - lblStatusInfo.Caption = "Loading Sounds Info..." - DoEvents - LoadSounds - lblStatusInfo.Caption = "Loading Things Info..." - DoEvents - LoadThings - lblStatusInfo.Caption = "Loading States Info..." - DoEvents - LoadStates - lblStatusInfo.Caption = "Idle" - lstThings.ListIndex = 0 -End Sub - -Private Sub LoadSounds() - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim number As Integer - Dim startclip As Integer, endclip As Integer - Dim addstring As String - Dim i As Integer, numfreeslots As Integer - - ChDir SourcePath - Set ts = myFSO.OpenTextFile("sounds.h", ForReading, False) - - Do While InStr(ts.ReadLine, "List of sounds (don't modify this comment!)") = 0 - Loop - - ts.SkipLine ' typedef enum - ts.SkipLine ' { - - line = ts.ReadLine - number = 0 - - cmbSeesound.Clear - cmbAttacksound.Clear - cmbPainsound.Clear - cmbDeathsound.Clear - cmbActivesound.Clear - - Do While InStr(line, "sfx_freeslot0") = 0 - startclip = InStr(line, "sfx_") - If InStr(line, "sfx_") <> 0 Then - endclip = InStr(line, ",") - line = Mid(line, startclip, endclip - startclip) - addstring = number & " - " & line - cmbSeesound.AddItem addstring - cmbAttacksound.AddItem addstring - cmbPainsound.AddItem addstring - cmbDeathsound.AddItem addstring - cmbActivesound.AddItem addstring - number = number + 1 - End If - line = ts.ReadLine - Loop - - ts.Close - Set myFSO = Nothing - - 'Populate the free slots! - numfreeslots = 800 - - For i = 1 To numfreeslots - If i < 10 Then - addstring = number & " - " & "sfx_fre00" & i & " (free slot)" - ElseIf i < 100 Then - addstring = number & " - " & "sfx_fre0" & i & " (free slot)" - Else - addstring = number & " - " & "sfx_fre" & i & " (free slot)" - End If - cmbSeesound.AddItem addstring - cmbAttacksound.AddItem addstring - cmbPainsound.AddItem addstring - cmbDeathsound.AddItem addstring - cmbActivesound.AddItem addstring - number = number + 1 - Next -End Sub -Private Sub LoadStates() - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim number As Integer - Dim startclip As Integer, endclip As Integer - Dim addstring As String - Dim i As Integer - Dim numfreeslots As Integer - - ChDir SourcePath - Set ts = myFSO.OpenTextFile("info.h", ForReading, False) - - Do While InStr(ts.ReadLine, "Object states (don't modify this comment!)") = 0 - Loop - - ts.SkipLine ' typedef enum - ts.SkipLine ' { - - line = ts.ReadLine - number = 0 - - cmbSpawnstate.Clear - cmbSeestate.Clear - cmbPainstate.Clear - cmbMeleestate.Clear - cmbMissilestate.Clear - cmbDeathstate.Clear - cmbXdeathstate.Clear - cmbRaisestate.Clear - - Do While InStr(line, "S_FIRSTFREESLOT") = 0 - startclip = InStr(line, "S_") - If InStr(line, "S_") <> 0 Then - endclip = InStr(line, ",") - line = Mid(line, startclip, endclip - startclip) - addstring = number & " - " & line - cmbSpawnstate.AddItem addstring - cmbSeestate.AddItem addstring - cmbPainstate.AddItem addstring - cmbMeleestate.AddItem addstring - cmbMissilestate.AddItem addstring - cmbDeathstate.AddItem addstring - cmbXdeathstate.AddItem addstring - cmbRaisestate.AddItem addstring - number = number + 1 - End If - line = ts.ReadLine - Loop - - ts.Close - - 'Populate the free slots! - Set ts = myFSO.OpenTextFile("info.h", ForReading, False) - - line = ts.ReadLine - Do While InStr(line, "#define NUMMOBJFREESLOTS") = 0 - line = ts.ReadLine - Loop - - startclip = InStr(line, "SLOTS ") + 6 - numfreeslots = Val(Mid(line, startclip, Len(line) - startclip + 1)) * 6 - - For i = 1 To numfreeslots - addstring = number & " - " & "S_FREESLOT" & i - cmbSpawnstate.AddItem addstring - cmbSeestate.AddItem addstring - cmbPainstate.AddItem addstring - cmbMeleestate.AddItem addstring - cmbMissilestate.AddItem addstring - cmbDeathstate.AddItem addstring - cmbXdeathstate.AddItem addstring - cmbRaisestate.AddItem addstring - number = number + 1 - Next - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub LoadThings() - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim number As Integer - Dim startclip As Integer, endclip As Integer - Dim numfreeslots As Integer, i As Integer - - ChDir SourcePath - Set ts = myFSO.OpenTextFile("info.h", ForReading, False) - - Do While InStr(ts.ReadLine, "Little flag for SOC editor (don't change this comment!)") = 0 - Loop - - ts.SkipLine ' typedef enum - ts.SkipLine ' { - - line = ts.ReadLine - number = 0 - - lstThings.Clear - - Do While InStr(line, "MT_FIRSTFREESLOT") = 0 - startclip = InStr(line, "MT_") - If InStr(line, "MT_") <> 0 Then - endclip = InStr(line, ",") - line = Mid(line, startclip, endclip - startclip) - lstThings.AddItem number & " - " & line - number = number + 1 - End If - line = ts.ReadLine - Loop - - ts.Close - - 'Populate the free slots! - Set ts = myFSO.OpenTextFile("info.h", ForReading, False) - - line = ts.ReadLine - Do While InStr(line, "#define NUMMOBJFREESLOTS") = 0 - line = ts.ReadLine - Loop - - startclip = InStr(line, "SLOTS ") + 6 - numfreeslots = Val(Mid(line, startclip, Len(line) - startclip + 1)) - - For i = 1 To numfreeslots - lstThings.AddItem number & " - " & "MT_FREESLOT" & i - number = number + 1 - Next - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub LoadObjectInfo(ThingNum As Integer) - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim number As Integer - Dim startclip As Integer, endclip As Integer - - ChDir SourcePath - Set ts = myFSO.OpenTextFile("info.c", ForReading, False) - - Do While InStr(ts.ReadLine, "mobjinfo[NUMMOBJTYPES] =") = 0 - Loop - - number = 0 - - Do While number <> ThingNum - Do While InStr(ts.ReadLine, "}") = 0 - Loop - number = number + 1 - Loop - - Do While InStr(line, "doomednum") = 0 - line = ts.ReadLine - Loop - - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - 'Check for *FRACUNIT values - endclip = InStr(line, "*FRACUNIT") - If endclip <> 0 Then - line = Left(line, endclip - 1) - line = Val(line) * 65536 - End If - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - line = FindThingNum(line) & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - line = FindPowerNum(line) & " - " & line - End If - txtDoomednum.Text = line - - line = ts.ReadLine - Do While InStr(line, "spawnstate") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - Call FindComboIndex(cmbSpawnstate, line) - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - number = FindThingNum(line) - cmbSpawnstate.Text = number & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - number = FindPowerNum(line) - cmbSpawnstate.Text = number & " - " & line - End If - - line = ts.ReadLine - Do While InStr(line, "spawnhealth") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - 'Check for *FRACUNIT values - endclip = InStr(line, "*FRACUNIT") - If endclip <> 0 Then - line = Left(line, endclip - 1) - line = Val(line) * 65536 - End If - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - line = FindThingNum(line) & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - line = FindPowerNum(line) & " - " & line - End If - txtSpawnhealth.Text = line - - line = ts.ReadLine - Do While InStr(line, "seestate") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - Call FindComboIndex(cmbSeestate, line) - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - number = FindThingNum(line) - cmbSeestate.Text = number & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - number = FindPowerNum(line) - cmbSeestate.Text = number & " - " & line - End If - - line = ts.ReadLine - Do While InStr(line, "seesound") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - Call FindComboIndex(cmbSeesound, line) - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - number = FindThingNum(line) - cmbSeesound.Text = number & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - number = FindPowerNum(line) - cmbSeesound.Text = number & " - " & line - End If - - line = ts.ReadLine - Do While InStr(line, "reactiontime") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - 'Check for *FRACUNIT values - endclip = InStr(line, "*FRACUNIT") - If endclip <> 0 Then - line = Left(line, endclip - 1) - line = Val(line) * 65536 - End If - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - line = FindThingNum(line) & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - line = FindPowerNum(line) & " - " & line - End If - txtReactiontime.Text = line - - line = ts.ReadLine - Do While InStr(line, "attacksound") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - Call FindComboIndex(cmbAttacksound, line) - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - number = FindThingNum(line) - cmbAttacksound.Text = number & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - number = FindPowerNum(line) - cmbAttacksound.Text = number & " - " & line - End If - - line = ts.ReadLine - Do While InStr(line, "painstate") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - Call FindComboIndex(cmbPainstate, line) - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - number = FindThingNum(line) - cmbPainstate.Text = number & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - number = FindPowerNum(line) - cmbPainstate.Text = number & " - " & line - End If - - line = ts.ReadLine - Do While InStr(line, "painchance") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - 'Check for *FRACUNIT values - endclip = InStr(line, "*FRACUNIT") - If endclip <> 0 Then - line = Left(line, endclip - 1) - line = Val(line) * 65536 - End If - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - line = FindThingNum(line) & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - line = FindPowerNum(line) & " - " & line - End If - txtPainchance.Text = line - - line = ts.ReadLine - Do While InStr(line, "painsound") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - Call FindComboIndex(cmbPainsound, line) - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - number = FindThingNum(line) - cmbPainsound.Text = number & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - number = FindPowerNum(line) - cmbPainsound.Text = number & " - " & line - End If - - line = ts.ReadLine - Do While InStr(line, "meleestate") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - Call FindComboIndex(cmbMeleestate, line) - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - number = FindThingNum(line) - cmbMeleestate.Text = number & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - number = FindPowerNum(line) - cmbMeleestate.Text = number & " - " & line - End If - - line = ts.ReadLine - Do While InStr(line, "missilestate") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - Call FindComboIndex(cmbMissilestate, line) - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - number = FindThingNum(line) - cmbMissilestate.Text = number & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - number = FindPowerNum(line) - cmbMissilestate.Text = number & " - " & line - End If - - line = ts.ReadLine - Do While InStr(line, "deathstate") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - Call FindComboIndex(cmbDeathstate, line) - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - number = FindThingNum(line) - cmbDeathstate.Text = number & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - number = FindPowerNum(line) - cmbDeathstate.Text = number & " - " & line - End If - - line = ts.ReadLine - Do While InStr(line, "xdeathstate") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - Call FindComboIndex(cmbXdeathstate, line) - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - number = FindThingNum(line) - cmbXdeathstate.Text = number & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - number = FindPowerNum(line) - cmbXdeathstate.Text = number & " - " & line - End If - - line = ts.ReadLine - Do While InStr(line, "deathsound") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - Call FindComboIndex(cmbDeathsound, line) - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - number = FindThingNum(line) - cmbDeathsound.Text = number & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - number = FindPowerNum(line) - cmbDeathsound.Text = number & " - " & line - End If - - - line = ts.ReadLine - Do While InStr(line, "speed") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - 'Check for *FRACUNIT values - endclip = InStr(line, "*FRACUNIT") - If endclip <> 0 Then - line = Left(line, endclip - 1) - line = Val(line) * 65536 - End If - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - line = FindThingNum(line) & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - line = FindPowerNum(line) & " - " & line - End If - txtSpeed.Text = line - - line = ts.ReadLine - Do While InStr(line, "radius") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - 'Check for *FRACUNIT values - endclip = InStr(line, "*FRACUNIT") - If endclip <> 0 Then - line = Left(line, endclip - 1) - line = Val(line) * 65536 - End If - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - line = FindThingNum(line) & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - line = FindPowerNum(line) & " - " & line - End If - txtRadius.Text = line - - line = ts.ReadLine - Do While InStr(line, "height") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - 'Check for *FRACUNIT values - endclip = InStr(line, "*FRACUNIT") - If endclip <> 0 Then - line = Left(line, endclip - 1) - line = Val(line) * 65536 - End If - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - line = FindThingNum(line) & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - line = FindPowerNum(line) & " - " & line - End If - txtHeight.Text = line - - line = ts.ReadLine 'Display order offset (add support, please!) - - line = ts.ReadLine - Do While InStr(line, "mass") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - 'Check for *FRACUNIT values - endclip = InStr(line, "*FRACUNIT") - If endclip <> 0 Then - line = Left(line, endclip - 1) - line = Val(line) * 65536 - End If - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - line = FindThingNum(line) & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - line = FindPowerNum(line) & " - " & line - End If - txtMass.Text = line - - line = ts.ReadLine - Do While InStr(line, "damage") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - 'Check for *FRACUNIT values - endclip = InStr(line, "*FRACUNIT") - If endclip <> 0 Then - line = Left(line, endclip - 1) - line = Val(line) * 65536 - End If - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - line = FindThingNum(line) & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - line = FindPowerNum(line) & " - " & line - End If - txtDamage.Text = line - - line = ts.ReadLine - Do While InStr(line, "activesound") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - Call FindComboIndex(cmbActivesound, line) - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - number = FindThingNum(line) - cmbActivesound.Text = number & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - number = FindPowerNum(line) - cmbActivesound.Text = number & " - " & line - End If - - line = ts.ReadLine - Do While InStr(line, "flags") = 0 - Loop - endclip = InStr(line, ",") - line = Left(line, endclip - 1) - line = TrimComplete(line) - ProcessFlags (line) - - line = ts.ReadLine - Do While InStr(line, "raisestate") = 0 - Loop - endclip = InStr(line, "//") - line = Left(line, endclip - 1) - line = TrimComplete(line) - Call FindComboIndex(cmbRaisestate, line) - 'Check for crazy-odd MT_ usage - endclip = InStr(line, "MT_") - If endclip <> 0 Then - number = FindThingNum(line) - cmbRaisestate.Text = number & " - " & line - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(line, "pw_") - If endclip <> 0 Then - number = FindPowerNum(line) - cmbRaisestate.Text = number & " - " & line - End If - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub ProcessFlags(flags As String) - Dim FlagList(32) As String - Dim endpoint As Integer - Dim ListCount As Integer - Dim FlagString As String - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim j As Integer, i As Integer - Dim number As Long - Dim startclip As Integer, endclip As Integer - - For j = 0 To 26 - chkFlags(j).Value = 0 - Next j - - FlagString = flags - - flags = flags & "||" - - ListCount = 0 - - Do While Len(flags) > 3 - endpoint = InStr(flags, "|") - FlagString = Left(flags, endpoint - 1) - flags = Right(flags, Len(flags) - endpoint) - FlagList(ListCount) = FlagString - ListCount = ListCount + 1 - Loop - - ChDir SourcePath - - For i = 0 To ListCount - 1 - Set ts = myFSO.OpenTextFile("p_mobj.h", ForReading, False) - - line = ts.ReadLine - - Do While Not ts.AtEndOfStream - line = ts.ReadLine - If InStr(line, FlagList(i)) Then - If InStr(line, "//") = 0 Or (InStr(line, "//") > InStr(line, FlagList(i))) Then - Exit Do - End If - End If - Loop - - If InStr(line, FlagList(i)) Then - startclip = InStr(line, "0x") - endclip = InStr(line, ",") - line = Mid(line, startclip + 2, endclip - 1) - line = "&H" & line - TrimComplete (line) - line = Left(line, Len(line) - 1) - number = CLng(line) - - For j = 0 To 26 - If chkFlags(j).Tag = number Then - chkFlags(j).Value = 1 - End If - Next j - End If - ts.Close - Next i - - Set myFSO = Nothing -End Sub - -Private Sub FindComboIndex(ByRef Box As ComboBox, line As String) - Dim i As Integer - - For i = 0 To Box.ListCount - If InStr(Box.List(i), line) Then - Box.ListIndex = i - Exit For - End If - Next -End Sub - -Private Sub lstThings_Click() - lblStatusInfo.Caption = "Loading thing info..." - DoEvents - Call ClearForm - If InStr(lstThings.List(lstThings.ListIndex), "MT_FREESLOT") = 0 Then - LoadObjectInfo (lstThings.ListIndex) - End If - LoadSOCObjectInfo (lstThings.ListIndex) - lblStatusInfo.Caption = "Idle" -End Sub - -Private Sub LoadSOCObjectInfo(ThingNum As Integer) - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim word As String - Dim word2 As String - Dim j As Integer - Dim temp As Long - - Set ts = myFSO.OpenTextFile(SOCFile, ForReading, False) - -SOCLoad: - Do While Not ts.AtEndOfStream - line = ts.ReadLine - - If Left(line, 1) = "#" Then GoTo SOCLoad - - If Left(line, 1) = vbCrLf Then GoTo SOCLoad - - If Len(line) < 1 Then GoTo SOCLoad - - word = FirstToken(line) - word2 = SecondToken(line) - - If UCase(word) = "THING" And Val(word2) = ThingNum Then - Do While Len(line) > 0 And Not ts.AtEndOfStream - line = ts.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondTokenEqual(line)) - - If word = "MAPTHINGNUM" Then - txtDoomednum.Text = Val(word2) - ElseIf word = "SPAWNSTATE" Then - cmbSpawnstate.ListIndex = Val(word2) - ElseIf word = "SPAWNHEALTH" Then - txtSpawnhealth.Text = Val(word2) - ElseIf word = "SEESTATE" Then - cmbSeestate.ListIndex = Val(word2) - ElseIf word = "SEESOUND" Then - cmbSeesound.ListIndex = Val(word2) - ElseIf word = "REACTIONTIME" Then - txtReactiontime.Text = Val(word2) - ElseIf word = "ATTACKSOUND" Then - cmbAttacksound.ListIndex = Val(word2) - ElseIf word = "PAINSTATE" Then - cmbPainstate.ListIndex = Val(word2) - ElseIf word = "PAINCHANCE" Then - txtPainchance.Text = Val(word2) - ElseIf word = "PAINSOUND" Then - cmbPainsound.ListIndex = Val(word2) - ElseIf word = "MELEESTATE" Then - cmbMeleestate.ListIndex = Val(word2) - ElseIf word = "MISSILESTATE" Then - cmbMissilestate.ListIndex = Val(word2) - ElseIf word = "DEATHSTATE" Then - cmbDeathstate.ListIndex = Val(word2) - ElseIf word = "DEATHSOUND" Then - cmbDeathsound.ListIndex = Val(word2) - ElseIf word = "XDEATHSTATE" Then - cmbXdeathstate.ListIndex = Val(word2) - ElseIf word = "SPEED" Then - txtSpeed.Text = Val(word2) - ElseIf word = "RADIUS" Then - txtRadius.Text = Val(word2) - ElseIf word = "HEIGHT" Then - txtHeight.Text = Val(word2) - ElseIf word = "MASS" Then - txtMass.Text = Val(word2) - ElseIf word = "DAMAGE" Then - txtDamage.Text = Val(word2) - ElseIf word = "ACTIVESOUND" Then - cmbActivesound.ListIndex = Val(word2) - ElseIf word = "FLAGS" Then - For j = 0 To 26 - temp = Val(word2) - If temp And chkFlags(j).Tag Then - chkFlags(j).Value = 1 - Else - chkFlags(j).Value = 0 - End If - Next j - ElseIf word = "RAISESTATE" Then - cmbRaisestate.ListIndex = Val(word2) - ElseIf Len(line) > 0 And Left(line, 1) <> "#" Then - MsgBox "Error in SOC!" & vbCrLf & "Unknown line: " & line - End If - Loop - Exit Do - End If - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Function FindThingNum(ThingName As String) As Integer - Dim i As Integer - Dim temp As String - Dim startpoint As Integer - Dim endpoint As Integer - - For i = 0 To lstThings.ListCount - 1 - temp = lstThings.List(i) - startpoint = InStr(temp, "-") + 2 - endpoint = Len(temp) - startpoint + 1 - temp = Mid(temp, startpoint, endpoint) - If temp = ThingName Then - FindThingNum = Val(lstThings.List(i)) - Exit For - End If - Next -End Function - -Private Function FindPowerNum(PowerName As String) As Integer - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim number As Integer - Dim startclip As Integer - - ChDir SourcePath - Set ts = myFSO.OpenTextFile("d_player.h", ForReading, False) - - Do While InStr(ts.ReadLine, "Player powers. (don't edit this comment)") = 0 - Loop - - ts.SkipLine ' typedef enum - ts.SkipLine ' { - - line = ts.ReadLine - number = 0 - - Do While InStr(line, "NUMPOWERS") = 0 - startclip = InStr(line, PowerName) - If startclip <> 0 Then - FindPowerNum = number - Exit Do - End If - number = number + 1 - line = ts.ReadLine - Loop - - ts.Close - Set myFSO = Nothing -End Function - -Private Sub WriteThing(Remove As Boolean, num As Integer) - Dim myFSOSource As New Scripting.FileSystemObject - Dim tsSource As TextStream - Dim myFSOTarget As New Scripting.FileSystemObject - Dim tsTarget As TextStream - Dim line As String - Dim word As String - Dim word2 As String - Dim flags As Long - Dim thingfound As Boolean - Dim i As Integer - - thingfound = False - - Set tsSource = myFSOSource.OpenTextFile(SOCFile, ForReading, False) - Set tsTarget = myFSOTarget.OpenTextFile(SOCTemp, ForWriting, True) - - Do While Not tsSource.AtEndOfStream - line = tsSource.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondToken(line)) - - 'If the current thing exists in the SOC, delete it. - If word = "THING" And Val(word2) = num Then - thingfound = True - Do While Len(TrimComplete(tsSource.ReadLine)) > 0 And Not (tsSource.AtEndOfStream) - Loop - Else - tsTarget.WriteLine line - End If - Loop - - tsSource.Close - Set myFSOSource = Nothing - - If Remove = False Then - If line <> "" Then tsTarget.WriteLine "" - tsTarget.WriteLine "Thing " & num - txtDoomednum.Text = TrimComplete(txtDoomednum.Text) - cmbSpawnstate.Text = TrimComplete(cmbSpawnstate.Text) - txtSpawnhealth.Text = TrimComplete(txtSpawnhealth.Text) - cmbSeestate.Text = TrimComplete(cmbSeestate.Text) - cmbSeesound.Text = TrimComplete(cmbSeesound.Text) - txtReactiontime.Text = TrimComplete(txtReactiontime.Text) - cmbAttacksound.Text = TrimComplete(cmbAttacksound.Text) - cmbPainstate.Text = TrimComplete(cmbPainstate.Text) - txtPainchance.Text = TrimComplete(txtPainchance.Text) - cmbPainsound.Text = TrimComplete(cmbPainsound.Text) - cmbMeleestate.Text = TrimComplete(cmbMeleestate.Text) - cmbMissilestate.Text = TrimComplete(cmbMissilestate.Text) - cmbDeathstate.Text = TrimComplete(cmbDeathstate.Text) - cmbDeathsound.Text = TrimComplete(cmbDeathsound.Text) - cmbXdeathstate.Text = TrimComplete(cmbXdeathstate.Text) - txtSpeed.Text = TrimComplete(txtSpeed.Text) - txtRadius.Text = TrimComplete(txtRadius.Text) - txtHeight.Text = TrimComplete(txtHeight.Text) - txtMass.Text = TrimComplete(txtMass.Text) - txtDamage.Text = TrimComplete(txtDamage.Text) - cmbActivesound.Text = TrimComplete(cmbActivesound.Text) - cmbRaisestate.Text = TrimComplete(cmbRaisestate.Text) - flags = 0 - ' Only 31 bits can be used, because VB is stupid. - For i = 0 To 26 - If chkFlags(i).Value = 1 Then flags = flags + Val(chkFlags(i).Tag) - Next - If txtDoomednum.Text <> "" Then tsTarget.WriteLine "MAPTHINGNUM = " & Val(txtDoomednum.Text) - If cmbSpawnstate.Text <> "" Then tsTarget.WriteLine "SPAWNSTATE = " & Val(cmbSpawnstate.Text) - If txtSpawnhealth.Text <> "" Then tsTarget.WriteLine "SPAWNHEALTH = " & Val(txtSpawnhealth.Text) - If cmbSeestate.Text <> "" Then tsTarget.WriteLine "SEESTATE = " & Val(cmbSeestate.Text) - If cmbSeesound.Text <> "" Then tsTarget.WriteLine "SEESOUND = " & Val(cmbSeesound.Text) - If txtReactiontime.Text <> "" Then tsTarget.WriteLine "REACTIONTIME = " & Val(txtReactiontime.Text) - If cmbAttacksound.Text <> "" Then tsTarget.WriteLine "ATTACKSOUND = " & Val(cmbAttacksound.Text) - If cmbPainstate.Text <> "" Then tsTarget.WriteLine "PAINSTATE = " & Val(cmbPainstate.Text) - If txtPainchance.Text <> "" Then tsTarget.WriteLine "PAINCHANCE = " & Val(txtPainchance.Text) - If cmbPainsound.Text <> "" Then tsTarget.WriteLine "PAINSOUND = " & Val(cmbPainsound.Text) - If cmbMeleestate.Text <> "" Then tsTarget.WriteLine "MELEESTATE = " & Val(cmbMeleestate.Text) - If cmbMissilestate.Text <> "" Then tsTarget.WriteLine "MISSILESTATE = " & Val(cmbMissilestate.Text) - If cmbDeathstate.Text <> "" Then tsTarget.WriteLine "DEATHSTATE = " & Val(cmbDeathstate.Text) - If cmbDeathsound.Text <> "" Then tsTarget.WriteLine "DEATHSOUND = " & Val(cmbDeathsound.Text) - If cmbXdeathstate.Text <> "" Then tsTarget.WriteLine "XDEATHSTATE = " & Val(cmbXdeathstate.Text) - If txtSpeed.Text <> "" Then tsTarget.WriteLine "SPEED = " & Val(txtSpeed.Text) - If txtRadius.Text <> "" Then tsTarget.WriteLine "RADIUS = " & Val(txtRadius.Text) - If txtHeight.Text <> "" Then tsTarget.WriteLine "HEIGHT = " & Val(txtHeight.Text) - If txtMass.Text <> "" Then tsTarget.WriteLine "MASS = " & Val(txtMass.Text) - If txtDamage.Text <> "" Then tsTarget.WriteLine "DAMAGE = " & Val(txtDamage.Text) - If cmbActivesound.Text <> "" Then tsTarget.WriteLine "ACTIVESOUND = " & Val(cmbActivesound.Text) - If cmbRaisestate.Text <> "" Then tsTarget.WriteLine "RAISESTATE = " & Val(cmbRaisestate.Text) - tsTarget.WriteLine "FLAGS = " & flags - End If - - tsTarget.Close - Set myFSOTarget = Nothing - - FileCopy SOCTemp, SOCFile - - Kill SOCTemp - - If Remove = True Then - If thingfound = True Then - MsgBox "Thing removed from SOC." - Else - MsgBox "Thing not found in SOC." - End If - Else - MsgBox "Thing Saved." - End If -End Sub diff --git a/tools/SOCEdit/Things.frx b/tools/SOCEdit/Things.frx deleted file mode 100644 index 980538679b05296de823a191f94f0564401fd92d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1094 zcmb7@F>V_%5Jf*NBa1YVwlZ8bguo>ysh?txuZQfIDs5wrO4i z6*PoZbDb3pJ26%}!93CsvY^`WP1>}|>9DztMak1cXxm#`(d4~p*ajNqy`3iUC?{@w zk>z&KapGBSftY{e`dG>l*oZIJCqF&Mdu1C_%Q9`eP_z0w&U+O3IkerVp)Afj=GI^;PI13#+b=1~t1f0E7pc}Wk)}X-++Pbw1Kfzmn>#=L@&JNC8U8D=Z#Q>cKg{gzHsA$VpHILP?E1XJKRi4=PKKV2h9~a- z_PMKVL+P}Q{b%>Tf|?Cv=9mqAWj%%^EMe0%El9`u#W1sWx0l24n6_f2k#EOV*`7&5 gC9V0s*L>%u?60IH&hkb2gXUL8h5Zfg!85S&7jZm2vH$=8 diff --git a/tools/SOCEdit/frmCharacterEdit.frm b/tools/SOCEdit/frmCharacterEdit.frm deleted file mode 100644 index 415fcbb0f..000000000 --- a/tools/SOCEdit/frmCharacterEdit.frm +++ /dev/null @@ -1,320 +0,0 @@ -VERSION 5.00 -Begin VB.Form frmCharacterEdit - Caption = "Character Edit" - ClientHeight = 3345 - ClientLeft = 60 - ClientTop = 345 - ClientWidth = 4680 - Icon = "frmCharacterEdit.frx":0000 - LinkTopic = "Form1" - MaxButton = 0 'False - ScaleHeight = 3345 - ScaleWidth = 4680 - Begin VB.CommandButton cmdExample - Caption = "Show Me An &Example" - Height = 495 - Left = 1320 - Style = 1 'Graphical - TabIndex = 14 - Top = 2400 - Width = 975 - End - Begin VB.CheckBox chkEnabled - Caption = "Enable this player selection." - Height = 495 - Left = 1080 - TabIndex = 13 - Top = 1560 - Width = 1455 - End - Begin VB.CommandButton cmdDelete - Caption = "&Delete from SOC" - Height = 495 - Left = 120 - Style = 1 'Graphical - TabIndex = 12 - Top = 2760 - Width = 855 - End - Begin VB.CommandButton cmdSave - Caption = "&Save" - Height = 495 - Left = 120 - TabIndex = 11 - Top = 2160 - Width = 855 - End - Begin VB.TextBox txtSkinname - Height = 285 - Left = 3240 - TabIndex = 9 - Top = 1200 - Width = 1335 - End - Begin VB.TextBox txtPicname - Height = 285 - Left = 3240 - MaxLength = 8 - TabIndex = 7 - Top = 840 - Width = 1095 - End - Begin VB.TextBox txtMenuposition - Height = 285 - Left = 3240 - MaxLength = 3 - TabIndex = 5 - Top = 480 - Width = 495 - End - Begin VB.TextBox txtPlayername - Height = 285 - Left = 3240 - MaxLength = 64 - TabIndex = 3 - Top = 120 - Width = 1335 - End - Begin VB.TextBox txtPlayertext - Height = 1455 - Left = 2640 - MultiLine = -1 'True - TabIndex = 1 - Top = 1800 - Width = 1935 - End - Begin VB.ListBox lstPlayers - Height = 1815 - ItemData = "frmCharacterEdit.frx":0442 - Left = 120 - List = "frmCharacterEdit.frx":0461 - TabIndex = 0 - Top = 240 - Width = 855 - End - Begin VB.Label lblSkinname - Caption = "Name of player (skin) to use:" - Height = 255 - Left = 1080 - TabIndex = 10 - Top = 1200 - Width = 2055 - End - Begin VB.Label lblPicname - Alignment = 1 'Right Justify - Caption = "Picture to display:" - Height = 255 - Left = 1560 - TabIndex = 8 - Top = 840 - Width = 1575 - End - Begin VB.Label lblMenuposition - Alignment = 1 'Right Justify - Caption = "Vertical menu position:" - Height = 255 - Left = 1320 - TabIndex = 6 - Top = 480 - Width = 1815 - End - Begin VB.Label lblPlayername - Alignment = 1 'Right Justify - Caption = "Displayed name of player:" - Height = 255 - Left = 1320 - TabIndex = 4 - Top = 120 - Width = 1815 - End - Begin VB.Label lblPlayertext - Caption = "Short Description:" - Height = 255 - Left = 2640 - TabIndex = 2 - Top = 1560 - Width = 1455 - End -End -Attribute VB_Name = "frmCharacterEdit" -Attribute VB_GlobalNameSpace = False -Attribute VB_Creatable = False -Attribute VB_PredeclaredId = True -Attribute VB_Exposed = False -Option Explicit - -Private Sub cmdDelete_Click() - Call WriteCharacter(True) -End Sub - -Private Sub cmdExample_Click() - txtPlayername.Text = "SONIC" - txtMenuposition.Text = "20" - txtPicname.Text = "SONCCHAR" - txtSkinname.Text = "SONIC" - chkEnabled.Value = 1 - txtPlayertext.Text = " Fastest" & vbCrLf & " Speed Thok" & vbCrLf & " Not a good pick" & vbCrLf & "for starters, but when" & vbCrLf & "controlled properly," & vbCrLf & "Sonic is the most" & vbCrLf & "powerful of the three." -End Sub - -Private Sub cmdSave_Click() - Call WriteCharacter(False) -End Sub - -Private Sub ClearForm() - txtPlayername.Text = "" - txtMenuposition.Text = "" - txtPicname.Text = "" - txtSkinname.Text = "" - chkEnabled.Value = 0 - txtPlayertext.Text = "" -End Sub - -Private Sub ReadSOCPlayer(num As Integer) - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim word As String - Dim word2 As String - - Set ts = myFSO.OpenTextFile(SOCFile, ForReading, False) - -SOCLoad: - Do While Not ts.AtEndOfStream - line = ts.ReadLine - - If Left(line, 1) = "#" Then GoTo SOCLoad - - If Left(line, 1) = vbCrLf Then GoTo SOCLoad - - If Len(line) < 1 Then GoTo SOCLoad - - word = FirstToken(line) - word2 = SecondToken(line) - - If UCase(word) = "CHARACTER" And Val(word2) = num Then - Do While Len(line) > 0 And Not ts.AtEndOfStream - line = ts.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondTokenEqual(line)) - - If word = "PLAYERTEXT" Then - Dim startclip As Integer, endclip As Integer - startclip = InStr(line, "=") - - startclip = startclip + 2 - - line = Mid(line, startclip, Len(line)) - - txtPlayertext.Text = line & vbCrLf - - Do While InStr(line, "#") = 0 And Not ts.AtEndOfStream - line = ts.ReadLine & vbCrLf - txtPlayertext.Text = txtPlayertext.Text & line - Loop - - txtPlayertext.Text = RTrimComplete(txtPlayertext.Text) - If Right(txtPlayertext.Text, 1) = "#" Then - txtPlayertext.Text = Left(txtPlayertext.Text, Len(txtPlayertext.Text) - 1) - End If - ElseIf word = "PLAYERNAME" Then - txtPlayername.Text = word2 - ElseIf word = "MENUPOSITION" Then - txtMenuposition.Text = Val(word2) - ElseIf word = "PICNAME" Then - txtPicname.Text = word2 - ElseIf word = "STATUS" Then - If Val(word2) = 32 Then - chkEnabled.Value = 1 - Else - chkEnabled.Value = 0 - End If - ElseIf word = "SKINNAME" Then - txtSkinname.Text = word2 - ElseIf Len(line) > 0 And Left(line, 1) <> "#" Then - MsgBox "Error in SOC!" & vbCrLf & "Unknown line: " & line - End If - Loop - Exit Do - End If - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub lstPlayers_Click() - Call ClearForm - Call ReadSOCPlayer(lstPlayers.ListIndex) -End Sub - -Private Sub WriteCharacter(Remove As Boolean) - Dim myFSOSource As New Scripting.FileSystemObject - Dim tsSource As TextStream - Dim myFSOTarget As New Scripting.FileSystemObject - Dim tsTarget As TextStream - Dim line As String - Dim word As String - Dim word2 As String - Dim charfound As Boolean - - charfound = False - - Set tsSource = myFSOSource.OpenTextFile(SOCFile, ForReading, False) - Set tsTarget = myFSOTarget.OpenTextFile(SOCTemp, ForWriting, True) - - Do While Not tsSource.AtEndOfStream - line = tsSource.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondToken(line)) - - 'If the current character exists in the SOC, delete it. - If word = "CHARACTER" And Val(word2) = lstPlayers.ListIndex Then - charfound = True - Do While Len(TrimComplete(tsSource.ReadLine)) > 0 And Not (tsSource.AtEndOfStream) - Loop - Else - tsTarget.WriteLine line - End If - Loop - - tsSource.Close - Set myFSOSource = Nothing - - If Remove = False Then - If line <> "" Then tsTarget.WriteLine "" - - tsTarget.WriteLine "CHARACTER " & lstPlayers.ListIndex - txtPlayername.Text = TrimComplete(txtPlayername.Text) - txtMenuposition.Text = TrimComplete(txtMenuposition.Text) - txtPicname.Text = TrimComplete(txtPicname.Text) - txtSkinname.Text = TrimComplete(txtSkinname.Text) - If txtPlayername.Text <> "" Then tsTarget.WriteLine "PLAYERNAME = " & txtPlayername.Text - If txtMenuposition.Text <> "" Then tsTarget.WriteLine "MENUPOSITION = " & Val(txtMenuposition.Text) - If txtPicname.Text <> "" Then tsTarget.WriteLine "PICNAME = " & txtPicname.Text - If txtSkinname.Text <> "" Then tsTarget.WriteLine "SKINNAME = " & txtSkinname.Text - If chkEnabled.Value = 1 Then - tsTarget.WriteLine "STATUS = 32" - Else - tsTarget.WriteLine "STATUS = 0" - End If - If txtPlayertext.Text <> "" Then tsTarget.WriteLine "PLAYERTEXT = " & txtPlayertext.Text & "#" - End If - - tsTarget.Close - Set myFSOTarget = Nothing - - FileCopy SOCTemp, SOCFile - - Kill SOCTemp - - If Remove = True Then - If charfound = True Then - MsgBox "Player choice removed from SOC." - Else - MsgBox "Player choice not found in SOC." - End If - Else - MsgBox "Character Saved." - End If -End Sub - diff --git a/tools/SOCEdit/frmCharacterEdit.frx b/tools/SOCEdit/frmCharacterEdit.frx deleted file mode 100644 index 5e767f4abcf8678dcf707d1b13737541a8a4a58d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1215 zcmb7@v2xQu5QhJY8H5{bRhd*##iR@b0u|01z$;Kdl_JA1<8fs%6tqdHDz74*fJeX` zbf~jEqxkstBp+um1t49Jse0U z#0qc$oWeAfX!nm&;#OI9h9|D-y2e_R`kNv~td76Oche-gMA5LSy9aU8| zoyI^0^?o_M>J?LVVl20Ud7$3+f^5sz-KJTe_UoHalzzJRRdr)4n!GU$+dzZ7v9IZP zkP|n4-OKGmM;-6w76|#@T*Fk3z(#nvrt`b!Xs2u=YMG{uCu&yzgYzCqehy7}15LT9 z)8+r-d`7Yy?(THbJJS*Da4VzVu<2?*QJK8Z1RVRCooZ@ZY5<(QlcyUux>Bpwwc5Cq z^B=+YhN%lav{pMQ@6T?_(b+fP4eC+8BKB@}TQ}{*&Tb9vfc5zp6kyxuHU9ol(&J?4 z>0o%`{%@bV+%}Yss?dLS{!6G?PiBr;(^uAGSi%yvJEm*Wp?)FEtnKObVR%SevAWTp zj;*pemfB2O@qe%Q&rR7}NDG|Bo%99Gryd#hGx!RAf}sY~=k#CqP!G6XU%r{WeP5hL Y?{V~=MDHwmPowuNdgsx59=#X80L21WnE(I) diff --git a/tools/SOCEdit/frmCutsceneEdit.frm b/tools/SOCEdit/frmCutsceneEdit.frm deleted file mode 100644 index 7fb18feed..000000000 --- a/tools/SOCEdit/frmCutsceneEdit.frm +++ /dev/null @@ -1,1365 +0,0 @@ -VERSION 5.00 -Begin VB.Form frmCutsceneEdit - Caption = "Cutscene Edit" - ClientHeight = 6495 - ClientLeft = 60 - ClientTop = 345 - ClientWidth = 10410 - Icon = "frmCutsceneEdit.frx":0000 - LinkTopic = "Form1" - MaxButton = 0 'False - ScaleHeight = 6495 - ScaleWidth = 10410 - StartUpPosition = 3 'Windows Default - Begin VB.TextBox txtNumScenes - Height = 285 - Left = 3480 - MaxLength = 3 - TabIndex = 97 - Top = 240 - Width = 615 - End - Begin VB.ListBox lstScene - Height = 450 - ItemData = "frmCutsceneEdit.frx":0442 - Left = 3360 - List = "frmCutsceneEdit.frx":0444 - TabIndex = 94 - Top = 600 - Width = 735 - End - Begin VB.ComboBox cmbMusicslot - Height = 315 - Left = 8760 - TabIndex = 93 - Top = 1680 - Width = 1575 - End - Begin VB.Frame frmPic1 - Caption = "Picture 8:" - Height = 1335 - Index = 7 - Left = 7440 - TabIndex = 80 - Top = 5040 - Width = 2895 - Begin VB.TextBox txtPicycoord - Height = 285 - Index = 7 - Left = 600 - MaxLength = 3 - TabIndex = 85 - Top = 960 - Width = 495 - End - Begin VB.TextBox txtPicXcoord - Height = 285 - Index = 7 - Left = 600 - MaxLength = 3 - TabIndex = 84 - Top = 600 - Width = 495 - End - Begin VB.TextBox txtPicduration - Height = 285 - Index = 7 - Left = 2040 - MaxLength = 5 - TabIndex = 83 - Top = 600 - Width = 735 - End - Begin VB.TextBox txtPicname - Height = 285 - Index = 7 - Left = 1320 - TabIndex = 82 - Top = 240 - Width = 1455 - End - Begin VB.CheckBox chkPichires - Caption = "High-Resolution" - Height = 255 - Index = 7 - Left = 1320 - TabIndex = 81 - Top = 960 - Width = 1455 - End - Begin VB.Label lblPicycoord - Alignment = 1 'Right Justify - Caption = "Y:" - Height = 255 - Index = 7 - Left = 240 - TabIndex = 89 - Top = 960 - Width = 255 - End - Begin VB.Label lblPicxcoord - Alignment = 1 'Right Justify - Caption = "X:" - Height = 255 - Index = 7 - Left = 240 - TabIndex = 88 - Top = 600 - Width = 255 - End - Begin VB.Label lblPicduration - Alignment = 1 'Right Justify - Caption = "Duration:" - Height = 255 - Index = 7 - Left = 1200 - TabIndex = 87 - Top = 600 - Width = 735 - End - Begin VB.Label lblPicname - Alignment = 1 'Right Justify - Caption = "Picture Name:" - Height = 255 - Index = 7 - Left = 120 - TabIndex = 86 - Top = 240 - Width = 1095 - End - End - Begin VB.Frame frmPic1 - Caption = "Picture 7:" - Height = 1335 - Index = 6 - Left = 4440 - TabIndex = 70 - Top = 5040 - Width = 2895 - Begin VB.TextBox txtPicycoord - Height = 285 - Index = 6 - Left = 600 - MaxLength = 3 - TabIndex = 75 - Top = 960 - Width = 495 - End - Begin VB.TextBox txtPicXcoord - Height = 285 - Index = 6 - Left = 600 - MaxLength = 3 - TabIndex = 74 - Top = 600 - Width = 495 - End - Begin VB.TextBox txtPicduration - Height = 285 - Index = 6 - Left = 2040 - MaxLength = 5 - TabIndex = 73 - Top = 600 - Width = 735 - End - Begin VB.TextBox txtPicname - Height = 285 - Index = 6 - Left = 1320 - TabIndex = 72 - Top = 240 - Width = 1455 - End - Begin VB.CheckBox chkPichires - Caption = "High-Resolution" - Height = 255 - Index = 6 - Left = 1320 - TabIndex = 71 - Top = 960 - Width = 1455 - End - Begin VB.Label lblPicycoord - Alignment = 1 'Right Justify - Caption = "Y:" - Height = 255 - Index = 6 - Left = 240 - TabIndex = 79 - Top = 960 - Width = 255 - End - Begin VB.Label lblPicxcoord - Alignment = 1 'Right Justify - Caption = "X:" - Height = 255 - Index = 6 - Left = 240 - TabIndex = 78 - Top = 600 - Width = 255 - End - Begin VB.Label lblPicduration - Alignment = 1 'Right Justify - Caption = "Duration:" - Height = 255 - Index = 6 - Left = 1200 - TabIndex = 77 - Top = 600 - Width = 735 - End - Begin VB.Label lblPicname - Alignment = 1 'Right Justify - Caption = "Picture Name:" - Height = 255 - Index = 6 - Left = 120 - TabIndex = 76 - Top = 240 - Width = 1095 - End - End - Begin VB.Frame frmPic1 - Caption = "Picture 6:" - Height = 1335 - Index = 5 - Left = 7440 - TabIndex = 60 - Top = 3600 - Width = 2895 - Begin VB.TextBox txtPicycoord - Height = 285 - Index = 5 - Left = 600 - MaxLength = 3 - TabIndex = 65 - Top = 960 - Width = 495 - End - Begin VB.TextBox txtPicXcoord - Height = 285 - Index = 5 - Left = 600 - MaxLength = 3 - TabIndex = 64 - Top = 600 - Width = 495 - End - Begin VB.TextBox txtPicduration - Height = 285 - Index = 5 - Left = 2040 - MaxLength = 5 - TabIndex = 63 - Top = 600 - Width = 735 - End - Begin VB.TextBox txtPicname - Height = 285 - Index = 5 - Left = 1320 - TabIndex = 62 - Top = 240 - Width = 1455 - End - Begin VB.CheckBox chkPichires - Caption = "High-Resolution" - Height = 255 - Index = 5 - Left = 1320 - TabIndex = 61 - Top = 960 - Width = 1455 - End - Begin VB.Label lblPicycoord - Alignment = 1 'Right Justify - Caption = "Y:" - Height = 255 - Index = 5 - Left = 240 - TabIndex = 69 - Top = 960 - Width = 255 - End - Begin VB.Label lblPicxcoord - Alignment = 1 'Right Justify - Caption = "X:" - Height = 255 - Index = 5 - Left = 240 - TabIndex = 68 - Top = 600 - Width = 255 - End - Begin VB.Label lblPicduration - Alignment = 1 'Right Justify - Caption = "Duration:" - Height = 255 - Index = 5 - Left = 1200 - TabIndex = 67 - Top = 600 - Width = 735 - End - Begin VB.Label lblPicname - Alignment = 1 'Right Justify - Caption = "Picture Name:" - Height = 255 - Index = 5 - Left = 120 - TabIndex = 66 - Top = 240 - Width = 1095 - End - End - Begin VB.Frame frmPic1 - Caption = "Picture 5:" - Height = 1335 - Index = 4 - Left = 4440 - TabIndex = 50 - Top = 3600 - Width = 2895 - Begin VB.TextBox txtPicycoord - Height = 285 - Index = 4 - Left = 600 - MaxLength = 3 - TabIndex = 55 - Top = 960 - Width = 495 - End - Begin VB.TextBox txtPicXcoord - Height = 285 - Index = 4 - Left = 600 - MaxLength = 3 - TabIndex = 54 - Top = 600 - Width = 495 - End - Begin VB.TextBox txtPicduration - Height = 285 - Index = 4 - Left = 2040 - MaxLength = 5 - TabIndex = 53 - Top = 600 - Width = 735 - End - Begin VB.TextBox txtPicname - Height = 285 - Index = 4 - Left = 1320 - TabIndex = 52 - Top = 240 - Width = 1455 - End - Begin VB.CheckBox chkPichires - Caption = "High-Resolution" - Height = 255 - Index = 4 - Left = 1320 - TabIndex = 51 - Top = 960 - Width = 1455 - End - Begin VB.Label lblPicycoord - Alignment = 1 'Right Justify - Caption = "Y:" - Height = 255 - Index = 4 - Left = 240 - TabIndex = 59 - Top = 960 - Width = 255 - End - Begin VB.Label lblPicxcoord - Alignment = 1 'Right Justify - Caption = "X:" - Height = 255 - Index = 4 - Left = 240 - TabIndex = 58 - Top = 600 - Width = 255 - End - Begin VB.Label lblPicduration - Alignment = 1 'Right Justify - Caption = "Duration:" - Height = 255 - Index = 4 - Left = 1200 - TabIndex = 57 - Top = 600 - Width = 735 - End - Begin VB.Label lblPicname - Alignment = 1 'Right Justify - Caption = "Picture Name:" - Height = 255 - Index = 4 - Left = 120 - TabIndex = 56 - Top = 240 - Width = 1095 - End - End - Begin VB.Frame frmPic1 - Caption = "Picture 4:" - Height = 1335 - Index = 3 - Left = 1440 - TabIndex = 40 - Top = 3600 - Width = 2895 - Begin VB.CheckBox chkPichires - Caption = "High-Resolution" - Height = 255 - Index = 3 - Left = 1320 - TabIndex = 45 - Top = 960 - Width = 1455 - End - Begin VB.TextBox txtPicname - Height = 285 - Index = 3 - Left = 1320 - TabIndex = 44 - Top = 240 - Width = 1455 - End - Begin VB.TextBox txtPicduration - Height = 285 - Index = 3 - Left = 2040 - MaxLength = 5 - TabIndex = 43 - Top = 600 - Width = 735 - End - Begin VB.TextBox txtPicXcoord - Height = 285 - Index = 3 - Left = 600 - MaxLength = 3 - TabIndex = 42 - Top = 600 - Width = 495 - End - Begin VB.TextBox txtPicycoord - Height = 285 - Index = 3 - Left = 600 - MaxLength = 3 - TabIndex = 41 - Top = 960 - Width = 495 - End - Begin VB.Label lblPicname - Alignment = 1 'Right Justify - Caption = "Picture Name:" - Height = 255 - Index = 3 - Left = 120 - TabIndex = 49 - Top = 240 - Width = 1095 - End - Begin VB.Label lblPicduration - Alignment = 1 'Right Justify - Caption = "Duration:" - Height = 255 - Index = 3 - Left = 1200 - TabIndex = 48 - Top = 600 - Width = 735 - End - Begin VB.Label lblPicxcoord - Alignment = 1 'Right Justify - Caption = "X:" - Height = 255 - Index = 3 - Left = 240 - TabIndex = 47 - Top = 600 - Width = 255 - End - Begin VB.Label lblPicycoord - Alignment = 1 'Right Justify - Caption = "Y:" - Height = 255 - Index = 3 - Left = 240 - TabIndex = 46 - Top = 960 - Width = 255 - End - End - Begin VB.Frame frmPic1 - Caption = "Picture 3:" - Height = 1335 - Index = 2 - Left = 7440 - TabIndex = 30 - Top = 2160 - Width = 2895 - Begin VB.CheckBox chkPichires - Caption = "High-Resolution" - Height = 255 - Index = 2 - Left = 1320 - TabIndex = 35 - Top = 960 - Width = 1455 - End - Begin VB.TextBox txtPicname - Height = 285 - Index = 2 - Left = 1320 - TabIndex = 34 - Top = 240 - Width = 1455 - End - Begin VB.TextBox txtPicduration - Height = 285 - Index = 2 - Left = 2040 - MaxLength = 5 - TabIndex = 33 - Top = 600 - Width = 735 - End - Begin VB.TextBox txtPicXcoord - Height = 285 - Index = 2 - Left = 600 - MaxLength = 3 - TabIndex = 32 - Top = 600 - Width = 495 - End - Begin VB.TextBox txtPicycoord - Height = 285 - Index = 2 - Left = 600 - MaxLength = 3 - TabIndex = 31 - Top = 960 - Width = 495 - End - Begin VB.Label lblPicname - Alignment = 1 'Right Justify - Caption = "Picture Name:" - Height = 255 - Index = 2 - Left = 120 - TabIndex = 39 - Top = 240 - Width = 1095 - End - Begin VB.Label lblPicduration - Alignment = 1 'Right Justify - Caption = "Duration:" - Height = 255 - Index = 2 - Left = 1200 - TabIndex = 38 - Top = 600 - Width = 735 - End - Begin VB.Label lblPicxcoord - Alignment = 1 'Right Justify - Caption = "X:" - Height = 255 - Index = 2 - Left = 240 - TabIndex = 37 - Top = 600 - Width = 255 - End - Begin VB.Label lblPicycoord - Alignment = 1 'Right Justify - Caption = "Y:" - Height = 255 - Index = 2 - Left = 240 - TabIndex = 36 - Top = 960 - Width = 255 - End - End - Begin VB.Frame frmPic1 - Caption = "Picture 2:" - Height = 1335 - Index = 1 - Left = 4440 - TabIndex = 20 - Top = 2160 - Width = 2895 - Begin VB.CheckBox chkPichires - Caption = "High-Resolution" - Height = 255 - Index = 1 - Left = 1320 - TabIndex = 25 - Top = 960 - Width = 1455 - End - Begin VB.TextBox txtPicname - Height = 285 - Index = 1 - Left = 1320 - TabIndex = 24 - Top = 240 - Width = 1455 - End - Begin VB.TextBox txtPicduration - Height = 285 - Index = 1 - Left = 2040 - MaxLength = 5 - TabIndex = 23 - Top = 600 - Width = 735 - End - Begin VB.TextBox txtPicXcoord - Height = 285 - Index = 1 - Left = 600 - MaxLength = 3 - TabIndex = 22 - Top = 600 - Width = 495 - End - Begin VB.TextBox txtPicycoord - Height = 285 - Index = 1 - Left = 600 - MaxLength = 3 - TabIndex = 21 - Top = 960 - Width = 495 - End - Begin VB.Label lblPicname - Alignment = 1 'Right Justify - Caption = "Picture Name:" - Height = 255 - Index = 1 - Left = 120 - TabIndex = 29 - Top = 240 - Width = 1095 - End - Begin VB.Label lblPicduration - Alignment = 1 'Right Justify - Caption = "Duration:" - Height = 255 - Index = 1 - Left = 1200 - TabIndex = 28 - Top = 600 - Width = 735 - End - Begin VB.Label lblPicxcoord - Alignment = 1 'Right Justify - Caption = "X:" - Height = 255 - Index = 1 - Left = 240 - TabIndex = 27 - Top = 600 - Width = 255 - End - Begin VB.Label lblPicycoord - Alignment = 1 'Right Justify - Caption = "Y:" - Height = 255 - Index = 1 - Left = 240 - TabIndex = 26 - Top = 960 - Width = 255 - End - End - Begin VB.TextBox txtTextypos - Height = 285 - Left = 3120 - MaxLength = 3 - TabIndex = 19 - Top = 5880 - Width = 615 - End - Begin VB.TextBox txtTextxpos - Height = 285 - Left = 3120 - MaxLength = 3 - TabIndex = 18 - Top = 5520 - Width = 615 - End - Begin VB.Frame frmPic1 - Caption = "Picture 1:" - Height = 1335 - Index = 0 - Left = 1440 - TabIndex = 6 - Top = 2160 - Width = 2895 - Begin VB.TextBox txtPicycoord - Height = 285 - Index = 0 - Left = 600 - MaxLength = 3 - TabIndex = 14 - Top = 960 - Width = 495 - End - Begin VB.TextBox txtPicXcoord - Height = 285 - Index = 0 - Left = 600 - MaxLength = 3 - TabIndex = 12 - Top = 600 - Width = 495 - End - Begin VB.TextBox txtPicduration - Height = 285 - Index = 0 - Left = 2040 - MaxLength = 5 - TabIndex = 11 - Top = 600 - Width = 735 - End - Begin VB.TextBox txtPicname - Height = 285 - Index = 0 - Left = 1320 - TabIndex = 8 - Top = 240 - Width = 1455 - End - Begin VB.CheckBox chkPichires - Caption = "High-Resolution" - Height = 255 - Index = 0 - Left = 1320 - TabIndex = 7 - Top = 960 - Width = 1455 - End - Begin VB.Label lblPicycoord - Alignment = 1 'Right Justify - Caption = "Y:" - Height = 255 - Index = 0 - Left = 240 - TabIndex = 15 - Top = 960 - Width = 255 - End - Begin VB.Label lblPicxcoord - Alignment = 1 'Right Justify - Caption = "X:" - Height = 255 - Index = 0 - Left = 240 - TabIndex = 13 - Top = 600 - Width = 255 - End - Begin VB.Label lblPicduration - Alignment = 1 'Right Justify - Caption = "Duration:" - Height = 255 - Index = 0 - Left = 1200 - TabIndex = 10 - Top = 600 - Width = 735 - End - Begin VB.Label lblPicname - Alignment = 1 'Right Justify - Caption = "Picture Name:" - Height = 255 - Index = 0 - Left = 120 - TabIndex = 9 - Top = 240 - Width = 1095 - End - End - Begin VB.TextBox txtNumberofpics - Height = 285 - Left = 3840 - MaxLength = 1 - TabIndex = 5 - Top = 1800 - Width = 375 - End - Begin VB.TextBox txtScenetext - Height = 1815 - Left = 4440 - MultiLine = -1 'True - TabIndex = 3 - Top = 240 - Width = 3135 - End - Begin VB.CommandButton cmdSave - Caption = "&Save Scene" - Height = 495 - Left = 3360 - Style = 1 'Graphical - TabIndex = 1 - Top = 1200 - Width = 855 - End - Begin VB.ListBox lstCutscenes - Height = 6300 - ItemData = "frmCutsceneEdit.frx":0446 - Left = 120 - List = "frmCutsceneEdit.frx":0448 - TabIndex = 0 - Top = 120 - Width = 1215 - End - Begin VB.Label Label3 - Caption = "Note: The cutscene editor is not fully functional. Only use it to get an idea of the proper syntax to use." - BeginProperty Font - Name = "MS Sans Serif" - Size = 9.75 - Charset = 0 - Weight = 700 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 1335 - Left = 7680 - TabIndex = 98 - Top = 240 - Width = 2655 - End - Begin VB.Label Label2 - Caption = "For Scene Text:" - BeginProperty Font - Name = "MS Sans Serif" - Size = 8.25 - Charset = 0 - Weight = 400 - Underline = -1 'True - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Left = 1560 - TabIndex = 96 - Top = 5160 - Width = 1695 - End - Begin VB.Label Label1 - Caption = "Enter all time durations in game tics (35 = 1 second)" - BeginProperty Font - Name = "MS Sans Serif" - Size = 8.25 - Charset = 0 - Weight = 700 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 855 - Left = 1560 - TabIndex = 95 - Top = 960 - Width = 1335 - End - Begin VB.Label lblMusicslot - Alignment = 1 'Right Justify - Caption = "Music to play:" - Height = 255 - Left = 7680 - TabIndex = 92 - Top = 1680 - Width = 975 - End - Begin VB.Label lblCurrentScene - Alignment = 1 'Right Justify - Caption = "Current Scene:" - Height = 255 - Left = 1920 - TabIndex = 91 - Top = 720 - Width = 1215 - End - Begin VB.Label lblNumScenes - Alignment = 1 'Right Justify - Caption = "Number of Scenes in this Cutscene:" - Height = 375 - Left = 1440 - TabIndex = 90 - Top = 120 - Width = 1935 - End - Begin VB.Label lblTextypos - Alignment = 1 'Right Justify - Caption = "Text Y Position:" - Height = 255 - Left = 1800 - TabIndex = 17 - Top = 5880 - Width = 1215 - End - Begin VB.Label lblTextxpos - Alignment = 1 'Right Justify - Caption = "Text X Position:" - Height = 255 - Left = 1800 - TabIndex = 16 - Top = 5520 - Width = 1215 - End - Begin VB.Label lblNumberofpics - Alignment = 1 'Right Justify - Caption = "Number of Pictures (max 8):" - Height = 255 - Left = 1560 - TabIndex = 4 - Top = 1800 - Width = 2175 - End - Begin VB.Label lblScenetext - Caption = "Scene Text:" - Height = 255 - Left = 4440 - TabIndex = 2 - Top = 0 - Width = 1215 - End -End -Attribute VB_Name = "frmCutsceneEdit" -Attribute VB_GlobalNameSpace = False -Attribute VB_Creatable = False -Attribute VB_PredeclaredId = True -Attribute VB_Exposed = False -Option Explicit - -Private Sub cmdSave_Click() - Call WriteScene(False) -End Sub - -Private Sub lstScene_Click() - Call ClearForm - Call LoadSOCCutscene(Val(lstCutscenes.List(lstCutscenes.ListIndex)), Val(lstScene.List(lstScene.ListIndex))) -End Sub - -Private Sub LoadMusic() - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim number As Integer - Dim startclip As Integer, endclip As Integer - Dim addstring As String - - ChDir SourcePath - Set ts = myFSO.OpenTextFile("sounds.h", ForReading, False) - - Do While InStr(ts.ReadLine, "Music list (don't edit this comment!)") = 0 - Loop - - ts.SkipLine ' typedef enum - ts.SkipLine ' { - - line = ts.ReadLine - number = 0 - - cmbMusicslot.Clear - - Do While InStr(line, "NUMMUSIC") = 0 - startclip = InStr(line, "mus_") - If InStr(line, "mus_") <> 0 Then - endclip = InStr(line, ",") - line = Mid(line, startclip, endclip - startclip) - addstring = number & " - " & line - cmbMusicslot.AddItem addstring - number = number + 1 - End If - line = ts.ReadLine - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub cmdReload_Click() - Call Reload -End Sub - -Private Sub Form_Load() - Call Reload -End Sub - -Private Sub Reload() - ClearForm - Call ReadCutsceneSOCNumbers - Call LoadMusic - If lstCutscenes.ListCount > 0 Then - lstCutscenes.ListIndex = 0 - End If -End Sub - -Private Sub LoadSOCCutscene(CutNum As Integer, SceneNum As Integer) - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim word As String - Dim word2 As String - Dim ind As Integer - - Set ts = myFSO.OpenTextFile(SOCFile, ForReading, False) - -SOCLoad: - Do While Not ts.AtEndOfStream - line = ts.ReadLine - - If Left(line, 1) = "#" Then GoTo SOCLoad - - If Left(line, 1) = vbCrLf Then GoTo SOCLoad - - If Len(line) < 1 Then GoTo SOCLoad - - word = FirstToken(line) - word2 = SecondToken(line) - - ' WOW! This looks fun, don't it?! - If UCase(word) = "CUTSCENE" And Val(word2) = CutNum Then - Do While Len(line) > 0 And Not ts.AtEndOfStream - line = ts.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondToken(line)) - - If word = "NUMSCENES" Then - txtNumScenes.Text = Val(word2) - ElseIf UCase(word) = "SCENE" And Val(word2) = SceneNum Then - Do While Len(line) > 0 And Not ts.AtEndOfStream - line = ts.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondTokenEqual(line)) - - If word = "SCENETEXT" Then - Dim startclip As Integer, endclip As Integer - startclip = InStr(line, "=") - - startclip = startclip + 2 - - line = Mid(line, startclip, Len(line)) - - txtScenetext.Text = line & vbCrLf - - Do While InStr(line, "#") = 0 And Not ts.AtEndOfStream - line = ts.ReadLine & vbCrLf - txtScenetext.Text = txtScenetext.Text & line - Loop - - txtScenetext.Text = RTrimComplete(txtScenetext.Text) - If Right(txtScenetext.Text, 1) = "#" Then - txtScenetext.Text = Left(txtScenetext.Text, Len(txtScenetext.Text) - 1) - End If - ElseIf word = "PIC1NAME" Or word = "PIC2NAME" Or word = "PIC3NAME" Or word = "PIC4NAME" Or word = "PIC5NAME" Or word = "PIC6NAME" Or word = "PIC7NAME" Or word = "PIC8NAME" Then - ind = Val(Mid(word, 4, 1)) - 1 - txtPicname(ind).Text = word2 - ElseIf word = "PIC1HIRES" Or word = "PIC2HIRES" Or word = "PIC3HIRES" Or word = "PIC4HIRES" Or word = "PIC5HIRES" Or word = "PIC6HIRES" Or word = "PIC7HIRES" Or word = "PIC8HIRES" Then - ind = Val(Mid(word, 4, 1)) - 1 - chkPichires(ind).Value = Val(word2) - ElseIf word = "PIC1DURATION" Or word = "PIC2DURATION" Or word = "PIC3DURATION" Or word = "PIC4DURATION" Or word = "PIC5DURATION" Or word = "PIC6DURATION" Or word = "PIC7DURATION" Or word = "PIC8DURATION" Then - ind = Val(Mid(word, 4, 1)) - 1 - txtPicduration(ind).Text = Val(word2) - ElseIf word = "PIC1XCOORD" Or word = "PIC2XCOORD" Or word = "PIC3XCOORD" Or word = "PIC4XCOORD" Or word = "PIC5XCOORD" Or word = "PIC6XCOORD" Or word = "PIC7XCOORD" Or word = "PIC8XCOORD" Then - ind = Val(Mid(word, 4, 1)) - 1 - txtPicXcoord(ind).Text = Val(word2) - ElseIf word = "PIC1YCOORD" Or word = "PIC2YCOORD" Or word = "PIC3YCOORD" Or word = "PIC4YCOORD" Or word = "PIC5YCOORD" Or word = "PIC6YCOORD" Or word = "PIC7YCOORD" Or word = "PIC8YCOORD" Then - ind = Val(Mid(word, 4, 1)) - 1 - txtPicycoord(ind).Text = Val(word2) - ElseIf word = "TEXTXPOS" Then - txtTextxpos.Text = Val(word2) - ElseIf word = "TEXTYPOS" Then - txtTextypos.Text = Val(word2) - ElseIf word = "MUSICSLOT" Then - cmbMusicslot.ListIndex = Val(word2) - ElseIf word = "NUMBEROFPICS" Then - txtNumberofpics.Text = Val(word2) - ElseIf word = "SCENE" Then 'End of scene data - line = "" - ElseIf Len(line) > 0 And Left(line, 1) <> "#" Then - MsgBox "Error in SOC!" & vbCrLf & "Unknown line: " & line - End If - Loop - End If - Loop - Exit Do - End If - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub ReadCutsceneSOCNumbers() - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim word As String - Dim word2 As String - - Set ts = myFSO.OpenTextFile(SOCFile, ForReading, False) - - lstCutscenes.Clear - -CutsceneLoad: - Do While Not ts.AtEndOfStream - line = ts.ReadLine - - If Left(line, 1) = "#" Then GoTo CutsceneLoad - - If Left(line, 1) = vbCrLf Then GoTo CutsceneLoad - - If Len(line) < 1 Then GoTo CutsceneLoad - - word = FirstToken(line) - word2 = SecondToken(line) - - If UCase(word) = "CUTSCENE" Then - lstCutscenes.AddItem (Val(word2)) - End If - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub ClearForm() - Dim i As Integer - - For i = 0 To 7 - chkPichires(i).Value = 0 - txtPicXcoord(i).Text = "" - txtPicycoord(i).Text = "" - txtPicname(i).Text = "" - txtPicduration(i).Text = "" - Next - - txtScenetext.Text = "" - txtNumberofpics.Text = "" - txtTextxpos.Text = "" - txtTextypos.Text = "" - cmbMusicslot.Text = "" -End Sub - -Private Sub lstCutscenes_Click() - Dim i As Integer - - LoadNumScenes (Val(lstCutscenes.List(lstCutscenes.ListIndex))) - - lstScene.Clear - For i = 1 To Val(txtNumScenes.Text) - lstScene.AddItem i - Next - - If Val(txtNumScenes) > 0 Then - lstScene.ListIndex = lstScene.ListCount - 1 - lstScene.ListIndex = 0 - End If -End Sub - -Private Sub LoadNumScenes(CutNum As Integer) - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim word As String - Dim word2 As String - Dim ind As Integer - - Set ts = myFSO.OpenTextFile(SOCFile, ForReading, False) - -SOCLoad: - Do While Not ts.AtEndOfStream - line = ts.ReadLine - - If Left(line, 1) = "#" Then GoTo SOCLoad - - If Left(line, 1) = vbCrLf Then GoTo SOCLoad - - If Len(line) < 1 Then GoTo SOCLoad - - word = FirstToken(line) - word2 = SecondToken(line) - - ' WOW! This looks fun, don't it?! - If UCase(word) = "CUTSCENE" And Val(word2) = CutNum Then - Do While Len(line) > 0 And Not ts.AtEndOfStream - line = ts.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondToken(line)) - - If word = "NUMSCENES" Then - txtNumScenes.Text = Val(word2) - End If - Loop - Exit Do - End If - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub WriteScene(Remove As Boolean) - Dim myFSOSource As New Scripting.FileSystemObject - Dim tsSource As TextStream - Dim myFSOTarget As New Scripting.FileSystemObject - Dim tsTarget As TextStream - Dim line As String - Dim word As String - Dim word2 As String - Dim flags As Long - Dim i As Integer - Dim CutsceneNum As Integer - Dim InCutScene As Boolean - Dim scenefound As Boolean - Dim nevercheckagain As Boolean - - ' This whole sub is a mess, but it works, - ' so I'd better not touch it... - scenefound = False - nevercheckagain = False - - InCutScene = False - CutsceneNum = Val(lstCutscenes.List(lstCutscenes.ListIndex)) - - Set tsSource = myFSOSource.OpenTextFile(SOCFile, ForReading, False) - Set tsTarget = myFSOTarget.OpenTextFile(SOCTemp, ForWriting, True) - - Do While Not tsSource.AtEndOfStream - line = tsSource.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondToken(line)) - - If nevercheckagain = False And word = "CUTSCENE" And Val(word2) = CutsceneNum Then - InCutScene = True - tsTarget.WriteLine "CUTSCENE " & Val(lstCutscenes.List(lstCutscenes.ListIndex)) - tsTarget.WriteLine "NUMSCENES " & Val(txtNumScenes.Text) - line = tsSource.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondToken(line)) - If word = "NUMSCENES" Then - line = tsSource.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondToken(line)) - End If - End If - - 'If the current scene exists in the SOC, delete it. - If nevercheckagain = False And InCutScene = True And word = "SCENE" And Val(word2) = Val(lstScene.List(lstScene.ListIndex)) Then - scenefound = True - line = tsSource.ReadLine - Do While (Left(UCase(line), 6) <> "SCENE " And Len(TrimComplete(line)) > 0) And Not (tsSource.AtEndOfStream) - line = tsSource.ReadLine - Loop - If Remove = False Then - tsTarget.WriteLine "SCENE " & Val(lstScene.List(lstScene.ListIndex)) - txtNumberofpics.Text = TrimComplete(txtNumberofpics.Text) - txtTextxpos.Text = TrimComplete(txtTextxpos.Text) - txtTextypos.Text = TrimComplete(txtTextypos.Text) - cmbMusicslot.Text = TrimComplete(cmbMusicslot.Text) - - For i = 0 To 7 - txtPicname(i).Text = TrimComplete(txtPicname(i).Text) - txtPicXcoord(i).Text = TrimComplete(txtPicXcoord(i).Text) - txtPicycoord(i).Text = TrimComplete(txtPicycoord(i).Text) - txtPicduration(i).Text = TrimComplete(txtPicduration(i).Text) - Next - - If txtNumberofpics.Text <> "" Then tsTarget.WriteLine "NUMBEROFPICS = " & Val(txtNumberofpics.Text) - If txtTextxpos.Text <> "" Then tsTarget.WriteLine "TEXTXPOS = " & Val(txtTextxpos.Text) - If txtTextypos.Text <> "" Then tsTarget.WriteLine "TEXTYPOS = " & Val(txtTextypos.Text) - If cmbMusicslot.Text <> "" Then tsTarget.WriteLine "MUSICSLOT = " & Val(cmbMusicslot.Text) - - For i = 0 To 7 - If txtPicname(i).Text <> "" Then tsTarget.WriteLine "PIC" & (i + 1) & "NAME = " & txtPicname(i).Text - - If chkPichires(i).Value = 1 Then tsTarget.WriteLine "PIC" & (i + 1) & "HIRES = 1" - - If txtPicXcoord(i).Text <> "" Then tsTarget.WriteLine "PIC" & (i + 1) & "XCOORD = " & Val(txtPicXcoord(i).Text) - If txtPicycoord(i).Text <> "" Then tsTarget.WriteLine "PIC" & (i + 1) & "YCOORD = " & Val(txtPicycoord(i).Text) - If txtPicduration(i).Text <> "" Then tsTarget.WriteLine "PIC" & (i + 1) & "DURATION = " & Val(txtPicduration(i).Text) - Next - If txtScenetext.Text <> "" Then tsTarget.WriteLine "SCENETEXT = " & txtScenetext.Text & "#" - End If - InCutScene = False - nevercheckagain = True - End If - tsTarget.WriteLine line - Loop - - tsSource.Close - Set myFSOSource = Nothing - - If Remove = False And scenefound = False Then - If line <> "" Then tsTarget.WriteLine "" - - tsTarget.WriteLine "CUTSCENE " & Val(lstCutscenes.List(lstCutscenes.ListIndex)) - tsTarget.WriteLine "NUMSCENES " & Val(txtNumScenes.Text) - tsTarget.WriteLine "SCENE " & Val(lstScene.List(lstScene.ListIndex)) - txtNumberofpics.Text = TrimComplete(txtNumberofpics.Text) - txtScenetext.Text = TrimComplete(txtScenetext.Text) - txtTextxpos.Text = TrimComplete(txtTextxpos.Text) - txtTextypos.Text = TrimComplete(txtTextypos.Text) - cmbMusicslot.Text = TrimComplete(cmbMusicslot.Text) - - For i = 0 To 7 - txtPicname(i).Text = TrimComplete(txtPicname(i).Text) - txtPicXcoord(i).Text = TrimComplete(txtPicXcoord(i).Text) - txtPicycoord(i).Text = TrimComplete(txtPicycoord(i).Text) - txtPicduration(i).Text = TrimComplete(txtPicduration(i).Text) - Next - - If txtNumberofpics.Text <> "" Then tsTarget.WriteLine "NUMBEROFPICS = " & Val(txtNumberofpics.Text) - If txtScenetext.Text <> "" Then tsTarget.WriteLine "SCENETEXT = " & txtScenetext.Text & "#" - If txtTextxpos.Text <> "" Then tsTarget.WriteLine "TEXTXPOS = " & Val(txtTextxpos.Text) - If txtTextypos.Text <> "" Then tsTarget.WriteLine "TEXTYPOS = " & Val(txtTextypos.Text) - If cmbMusicslot.Text <> "" Then tsTarget.WriteLine "MUSICSLOT = " & Val(cmbMusicslot.Text) - - For i = 0 To 7 - If txtPicname(i).Text <> "" Then tsTarget.WriteLine "PIC" & (i + 1) & "NAME = " & txtPicname(i).Text - - If chkPichires(i).Value = 1 Then tsTarget.WriteLine "PIC" & (i + 1) & "HIRES = 1" - - If txtPicXcoord(i).Text <> "" Then tsTarget.WriteLine "PIC" & (i + 1) & "XCOORD = " & Val(txtPicXcoord(i).Text) - If txtPicycoord(i).Text <> "" Then tsTarget.WriteLine "PIC" & (i + 1) & "YCOORD = " & Val(txtPicycoord(i).Text) - If txtPicduration(i).Text <> "" Then tsTarget.WriteLine "PIC" & (i + 1) & "DURATION = " & Val(txtPicduration(i).Text) - Next - End If - - tsTarget.Close - Set myFSOTarget = Nothing - - FileCopy SOCTemp, SOCFile - - Kill SOCTemp - - If Remove = True Then - If scenefound = True Then - MsgBox "Scene removed from SOC." - Else - MsgBox "Scene not found in SOC." - End If - Else - MsgBox "Scene Saved." - End If -End Sub diff --git a/tools/SOCEdit/frmCutsceneEdit.frx b/tools/SOCEdit/frmCutsceneEdit.frx deleted file mode 100644 index 6f844e6431ce040d0f52f774e59f1b79b7f8e03d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1098 zcmb7@v2NQi5QcxoMTIW0H3gaCsmNZSW1TnXTXgD>p@5Ld3^H_eMooDY|8C8rb3=QDHl`$T$=oy`)zbkgZWx+FFS zSHLMwlSg}ec!|HfPlhM1x~{`oBE-K!Fc0vvkUfqMSJ!0%TAvjGXnoc^2i$qvwoUUK zsGuQin(M4+*omPQ(_wcXi;|~@(6;xsqRD&HunjcIdpk|yQBK_W zD$DJl)5Npf0x|!>^{$j7un}LbPkwq%56U*BmSx&_p=R}0ocAd5OK8b^Xvs}oF8>eb z7{zk9hto+POh<6Qt&CyMrrQZcW%61Ja1lCo>Zq;P1UP%AKsWAntwDnuw0BzV#hSGT(`_Jxw12r4SEHOL!%6be-Si+`jT9Jw|wWO?60IX&iYAuM01x>VZVbP;13wbUuY9OvH$=8 diff --git a/tools/SOCEdit/frmEmblemEdit.frm b/tools/SOCEdit/frmEmblemEdit.frm deleted file mode 100644 index f94255b9c..000000000 --- a/tools/SOCEdit/frmEmblemEdit.frm +++ /dev/null @@ -1,384 +0,0 @@ -VERSION 5.00 -Begin VB.Form frmEmblemEdit - Caption = "Emblem Edit" - ClientHeight = 2865 - ClientLeft = 60 - ClientTop = 345 - ClientWidth = 5160 - Icon = "frmEmblemEdit.frx":0000 - LinkTopic = "Form1" - MaxButton = 0 'False - ScaleHeight = 2865 - ScaleWidth = 5160 - StartUpPosition = 3 'Windows Default - Begin VB.CommandButton cmdDelete - Caption = "&Delete Last Emblem" - Height = 735 - Left = 1560 - Style = 1 'Graphical - TabIndex = 17 - Top = 600 - Width = 855 - End - Begin VB.CommandButton cmdAdd - Caption = "&Add" - Height = 375 - Left = 1560 - TabIndex = 16 - Top = 120 - Width = 855 - End - Begin VB.CommandButton cmdSave - Caption = "&Save Emblem" - Height = 495 - Left = 4200 - Style = 1 'Graphical - TabIndex = 13 - Top = 2280 - Width = 855 - End - Begin VB.CommandButton cmdReload - Caption = "&Reload" - Height = 495 - Left = 3120 - TabIndex = 12 - Top = 2280 - Width = 975 - End - Begin VB.TextBox txtPlayernum - Height = 285 - Left = 4320 - MaxLength = 3 - TabIndex = 9 - Top = 1800 - Width = 735 - End - Begin VB.TextBox txtMapnum - Height = 285 - Left = 4320 - MaxLength = 4 - TabIndex = 7 - Top = 1320 - Width = 735 - End - Begin VB.TextBox txtZ - Height = 285 - Left = 4320 - MaxLength = 5 - TabIndex = 3 - Top = 960 - Width = 735 - End - Begin VB.TextBox txtY - Height = 285 - Left = 4320 - MaxLength = 5 - TabIndex = 2 - Top = 600 - Width = 735 - End - Begin VB.TextBox txtX - Height = 285 - Left = 4320 - MaxLength = 5 - TabIndex = 1 - Top = 240 - Width = 735 - End - Begin VB.ListBox lstEmblems - Height = 2400 - Left = 120 - TabIndex = 0 - Top = 120 - Width = 1335 - End - Begin VB.Label Label1 - Caption = "Emblem #s must be linear, sorry!" - Height = 495 - Left = 1560 - TabIndex = 18 - Top = 2400 - Width = 1455 - End - Begin VB.Label lblNumEmblems - Caption = "# of Emblems:" - Height = 255 - Left = 120 - TabIndex = 15 - Top = 2520 - Width = 1335 - End - Begin VB.Label lblNote2 - Caption = "Don't forget to set Game Data file and # of Emblems in Global Game Settings!" - Height = 855 - Left = 1560 - TabIndex = 14 - Top = 1440 - Width = 1575 - End - Begin VB.Label lblNote - Appearance = 0 'Flat - BorderStyle = 1 'Fixed Single - Caption = "Note: Enter map coordinates, not game coordinates. (I.e., 128, not 8388608)" - ForeColor = &H80000008& - Height = 1095 - Left = 2640 - TabIndex = 11 - Top = 120 - Width = 1335 - End - Begin VB.Label lblPlayernum - Caption = "Player # (255 for all players):" - Height = 495 - Left = 3240 - TabIndex = 10 - Top = 1680 - Width = 1095 - End - Begin VB.Label lblMapnum - Alignment = 1 'Right Justify - Caption = "Map #:" - Height = 255 - Left = 3600 - TabIndex = 8 - Top = 1320 - Width = 615 - End - Begin VB.Label lblZ - Alignment = 1 'Right Justify - Caption = "Z:" - Height = 255 - Left = 3960 - TabIndex = 6 - Top = 960 - Width = 255 - End - Begin VB.Label lblY - Alignment = 1 'Right Justify - Caption = "Y:" - Height = 255 - Left = 3960 - TabIndex = 5 - Top = 600 - Width = 255 - End - Begin VB.Label lblX - Alignment = 1 'Right Justify - Caption = "X:" - Height = 255 - Left = 3960 - TabIndex = 4 - Top = 240 - Width = 255 - End -End -Attribute VB_Name = "frmEmblemEdit" -Attribute VB_GlobalNameSpace = False -Attribute VB_Creatable = False -Attribute VB_PredeclaredId = True -Attribute VB_Exposed = False -Option Explicit - -Private Sub cmdAdd_Click() - lstEmblems.AddItem "Emblem " & lstEmblems.ListCount + 1 - lstEmblems.ListIndex = lstEmblems.ListCount - 1 - lblNumEmblems.Caption = "# of Emblems: " & lstEmblems.ListCount - txtX.Text = 0 - txtY.Text = 0 - txtZ.Text = 0 - txtPlayernum.Text = 255 - txtMapnum.Text = 1 -End Sub - -Private Sub cmdDelete_Click() - Call WriteEmblem(True) - lstEmblems.RemoveItem lstEmblems.ListCount - 1 - lstEmblems.ListIndex = lstEmblems.ListCount - 1 - lblNumEmblems.Caption = "# of Emblems: " & lstEmblems.ListCount -End Sub - -Private Sub cmdReload_Click() - Call Reload -End Sub - -Private Sub Reload() - lstEmblems.Clear - txtX.Text = "" - txtY.Text = "" - txtZ.Text = "" - txtMapnum.Text = "" - txtPlayernum.Text = "" - lblNumEmblems.Caption = "# of Emblems: " & lstEmblems.ListCount - Call ReadSOCEmblems -End Sub - -Private Sub cmdSave_Click() - If lstEmblems.ListCount <= 0 Then - MsgBox "You have no emblems to save!" - Else - Call WriteEmblem(False) - End If -End Sub - -Private Sub Form_Load() - Call Reload -End Sub - -Private Sub ReadSOCEmblems() - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim word As String - Dim word2 As String - - Set ts = myFSO.OpenTextFile(SOCFile, ForReading, False) - - lstEmblems.Clear - -EmblemLoad: - Do While Not ts.AtEndOfStream - line = ts.ReadLine - - If Left(line, 1) = "#" Then GoTo EmblemLoad - - If Left(line, 1) = vbCrLf Then GoTo EmblemLoad - - If Len(line) < 1 Then GoTo EmblemLoad - - word = FirstToken(line) - word2 = SecondToken(line) - - If UCase(word) = "EMBLEM" Then - lstEmblems.AddItem ("Emblem " & Val(word2)) - End If - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub ReadSOCEmblemNum(num As Integer) - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim word As String - Dim word2 As String - - Set ts = myFSO.OpenTextFile(SOCFile, ForReading, False) - -EmblemLoad: - Do While Not ts.AtEndOfStream - line = ts.ReadLine - - If Left(line, 1) = "#" Then GoTo EmblemLoad - - If Left(line, 1) = vbCrLf Then GoTo EmblemLoad - - If Len(line) < 1 Then GoTo EmblemLoad - - word = UCase(FirstToken(line)) - word2 = UCase(SecondToken(line)) - - If word = "EMBLEM" Then - If Val(word2) = num Then - Do While Len(line) > 0 And Not ts.AtEndOfStream - line = ts.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondTokenEqual(line)) - - If word = "X" Then - txtX.Text = Val(word2) - ElseIf word = "Y" Then - txtY.Text = Val(word2) - ElseIf word = "Z" Then - txtZ.Text = Val(word2) - ElseIf word = "PLAYERNUM" Then - txtPlayernum.Text = Val(word2) - ElseIf word = "MAPNUM" Then - txtMapnum.Text = Val(word2) - ElseIf Len(line) > 0 And Left(line, 1) <> "#" Then - MsgBox "Error in SOC with Emblem " & num & vbCrLf & "Unknown line: " & line - End If - Loop - Exit Do - End If - End If - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub lstEmblems_Click() - Dim i As Integer - - i = InStr(lstEmblems.List(lstEmblems.ListIndex), " ") + 1 - - i = Mid(lstEmblems.List(lstEmblems.ListIndex), i, Len(lstEmblems.List(lstEmblems.ListIndex)) - i + 1) - i = Val(i) - Call ReadSOCEmblemNum(i) -End Sub - -Private Sub WriteEmblem(Remove As Boolean) - Dim myFSOSource As New Scripting.FileSystemObject - Dim tsSource As TextStream - Dim myFSOTarget As New Scripting.FileSystemObject - Dim tsTarget As TextStream - Dim line As String - Dim word As String - Dim word2 As String - Dim i As Integer - - Set tsSource = myFSOSource.OpenTextFile(SOCFile, ForReading, False) - Set tsTarget = myFSOTarget.OpenTextFile(SOCTemp, ForWriting, True) - - Do While Not tsSource.AtEndOfStream - line = tsSource.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondToken(line)) - i = InStr(lstEmblems.List(lstEmblems.ListIndex), " ") + 1 - - i = Mid(lstEmblems.List(lstEmblems.ListIndex), i, Len(lstEmblems.List(lstEmblems.ListIndex)) - i + 1) - i = Val(i) - - 'If the current emblem exists in the SOC, delete it. - If word = "EMBLEM" And Val(word2) = i Then - Do While Len(TrimComplete(tsSource.ReadLine)) > 0 And Not (tsSource.AtEndOfStream) - Loop - Else - tsTarget.WriteLine line - End If - Loop - - tsSource.Close - Set myFSOSource = Nothing - - If Remove = False Then - If line <> "" Then tsTarget.WriteLine "" - - tsTarget.WriteLine UCase(lstEmblems.List(lstEmblems.ListIndex)) - txtX.Text = TrimComplete(txtX.Text) - txtY.Text = TrimComplete(txtY.Text) - txtZ.Text = TrimComplete(txtZ.Text) - txtMapnum.Text = TrimComplete(txtMapnum.Text) - txtPlayernum.Text = TrimComplete(txtPlayernum.Text) - If txtX.Text <> "" Then tsTarget.WriteLine "X = " & Val(txtX.Text) - If txtY.Text <> "" Then tsTarget.WriteLine "Y = " & Val(txtY.Text) - If txtZ.Text <> "" Then tsTarget.WriteLine "Z = " & Val(txtZ.Text) - If txtMapnum.Text <> "" Then tsTarget.WriteLine "MAPNUM = " & Val(txtMapnum.Text) - If txtPlayernum.Text <> "" Then tsTarget.WriteLine "PLAYERNUM = " & Val(txtPlayernum.Text) - End If - - tsTarget.Close - Set myFSOTarget = Nothing - - FileCopy SOCTemp, SOCFile - - Kill SOCTemp - - If Remove = True Then - MsgBox "Emblem deleted." - Else - MsgBox "Emblem Saved." - End If -End Sub diff --git a/tools/SOCEdit/frmEmblemEdit.frx b/tools/SOCEdit/frmEmblemEdit.frx deleted file mode 100644 index 2ae3673307b7e47781b379ec9ae8ac569ee3fda5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1090 zcmb7@F>V_%5Jf*NBa1YVwlZ8bguo>ysh?txuZQfIDs5wrO4i z6*PoZbDb3pJ26%}!93CsvY^`WP1>}|>9DztMak1cXxm#`(d4~p*ajNqy`3iUC?{@w zk>z&KapGBSftY{e`dG>l*oZIJCqF&Mdu1C_%Q9`eP_z0w&U+O3IkerVp)Afj=GI^;PI13#+b=1~t1f0E7pc}Wk)}X-++Pbw1Kfzmn>#=L@&JNC8U8D=Z#Q>cKg{gzHsA$VpHILP?E1XJKRi4=PKKV2h9~a- z_PMKVL+P}Q{b%>Tf|?Cv=9mqAWj%%^EMe0%El9`u#W1sWx0l24n6_f2k#EOV*`7&5 fC9V0s*L>%u?60IH&hkb2gXUL8h5Zfg!87;^dSyMb diff --git a/tools/SOCEdit/frmHUDEdit.frm b/tools/SOCEdit/frmHUDEdit.frm deleted file mode 100644 index 2b267b79b..000000000 --- a/tools/SOCEdit/frmHUDEdit.frm +++ /dev/null @@ -1,315 +0,0 @@ -VERSION 5.00 -Begin VB.Form frmHUDEdit - Caption = "HUD Edit" - ClientHeight = 2505 - ClientLeft = 60 - ClientTop = 345 - ClientWidth = 5160 - Icon = "frmHUDEdit.frx":0000 - LinkTopic = "Form1" - MaxButton = 0 'False - ScaleHeight = 2505 - ScaleWidth = 5160 - StartUpPosition = 3 'Windows Default - Begin VB.CommandButton cmdCodeDefault - Caption = "&Load Code Default" - Height = 375 - Left = 3480 - TabIndex = 9 - Top = 1080 - Width = 1575 - End - Begin VB.CommandButton cmdDelete - Caption = "&Delete from SOC" - Height = 375 - Left = 3480 - TabIndex = 7 - Top = 2040 - Width = 1575 - End - Begin VB.CommandButton cmdSave - Caption = "&Save Changes" - Height = 375 - Left = 3480 - TabIndex = 6 - Top = 1560 - Width = 1575 - End - Begin VB.TextBox txtY - Height = 285 - Left = 4080 - MaxLength = 3 - TabIndex = 3 - Top = 720 - Width = 615 - End - Begin VB.TextBox txtX - Height = 285 - Left = 4080 - MaxLength = 3 - TabIndex = 2 - Top = 360 - Width = 615 - End - Begin VB.ListBox lstHUD - Height = 2010 - Left = 120 - TabIndex = 0 - Top = 360 - Width = 3255 - End - Begin VB.Label lblNote - Caption = "HUD items are placed on a 320x200 grid." - Height = 255 - Left = 1680 - TabIndex = 8 - Top = 120 - Width = 3015 - End - Begin VB.Label lblY - Alignment = 1 'Right Justify - Caption = "Y:" - Height = 255 - Left = 3600 - TabIndex = 5 - Top = 720 - Width = 375 - End - Begin VB.Label lblX - Alignment = 1 'Right Justify - Caption = "X:" - Height = 255 - Left = 3720 - TabIndex = 4 - Top = 360 - Width = 255 - End - Begin VB.Label lblHUDItems - Caption = "HUD Items:" - Height = 255 - Left = 120 - TabIndex = 1 - Top = 120 - Width = 975 - End -End -Attribute VB_Name = "frmHUDEdit" -Attribute VB_GlobalNameSpace = False -Attribute VB_Creatable = False -Attribute VB_PredeclaredId = True -Attribute VB_Exposed = False -Option Explicit - -Private Sub cmdCodeDefault_Click() - LoadHUDInfo (lstHUD.ListIndex) -End Sub - -Private Sub cmdDelete_Click() - Call WriteHUDItem(True) -End Sub - -Private Sub cmdSave_Click() - Call WriteHUDItem(False) -End Sub - -Private Sub Form_Load() - Call Reload -End Sub - -Private Sub Reload() - txtX.Text = "" - txtY.Text = "" - Call LoadCode - lstHUD.ListIndex = 0 -End Sub - -Private Sub LoadCode() - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim number As Integer - Dim startclip As Integer, endclip As Integer - Dim addstring As String - - ChDir SourcePath - Set ts = myFSO.OpenTextFile("st_stuff.h", ForReading, False) - - Do While ts.ReadLine <> "/** HUD location information (don't move this comment)" - Loop - - ts.ReadLine ' */ - ts.ReadLine ' typedef struct - ts.ReadLine ' { - ts.ReadLine ' int x, y; - ts.ReadLine ' } hudinfo_t; - ts.ReadLine ' - ts.ReadLine ' typedef enum - ts.ReadLine ' { - - line = ts.ReadLine - number = 0 - - lstHUD.Clear - - Do While InStr(line, "NUMHUDITEMS") = 0 - startclip = InStr(line, "HUD_") - If InStr(line, "HUD_") <> 0 Then - endclip = InStr(line, ",") - line = Mid(line, startclip, endclip - startclip) - addstring = number & " - " & line - lstHUD.AddItem addstring - number = number + 1 - End If - line = ts.ReadLine - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub lstHUD_Click() - LoadHUDInfo (lstHUD.ListIndex) - Call ReadSOC(lstHUD.ListIndex) -End Sub - -Private Sub LoadHUDInfo(HUDNum As Integer) - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim number As Integer - Dim startclip As Integer, endclip As Integer - - ChDir SourcePath - Set ts = myFSO.OpenTextFile("st_stuff.c", ForReading, False) - - Do While InStr(ts.ReadLine, "hudinfo[NUMHUDITEMS] =") = 0 - Loop - - ts.SkipLine ' { - line = ts.ReadLine ' First HUD item - - number = 0 - - Do While number <> HUDNum - line = ts.ReadLine - number = number + 1 - Loop - - startclip = InStr(line, "{") + 1 - endclip = InStr(line, ",") - - txtX.Text = TrimComplete(Mid(line, startclip, endclip - startclip)) - - startclip = endclip + 2 - endclip = InStr(startclip, line, "}") - 1 - - txtY.Text = TrimComplete(Mid(line, startclip, endclip - startclip)) - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub ReadSOC(HUDNum As Integer) - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim word As String - Dim word2 As String - - Set ts = myFSO.OpenTextFile(SOCFile, ForReading, False) - -SOCLoad: - Do While Not ts.AtEndOfStream - line = ts.ReadLine - - If Left(line, 1) = "#" Then GoTo SOCLoad - - If Left(line, 1) = vbCrLf Then GoTo SOCLoad - - If Len(line) < 1 Then GoTo SOCLoad - - word = FirstToken(line) - word2 = SecondToken(line) - - If UCase(word) = "HUDITEM" And Val(word2) = HUDNum Then - Do While Len(line) > 0 And Not ts.AtEndOfStream - line = ts.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondTokenEqual(line)) - - If word = "X" Then - txtX.Text = Val(word2) - ElseIf word = "Y" Then - txtY.Text = Val(word2) - ElseIf Len(line) > 0 And Left(line, 1) <> "#" Then - MsgBox "Error in SOC!" & vbCrLf & "Unknown line: " & line - End If - Loop - Exit Do - End If - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub WriteHUDItem(Remove As Boolean) - Dim myFSOSource As New Scripting.FileSystemObject - Dim tsSource As TextStream - Dim myFSOTarget As New Scripting.FileSystemObject - Dim tsTarget As TextStream - Dim line As String - Dim word As String - Dim word2 As String - Dim hudremoved As Boolean - - hudremoved = False - - Set tsSource = myFSOSource.OpenTextFile(SOCFile, ForReading, False) - Set tsTarget = myFSOTarget.OpenTextFile(SOCTemp, ForWriting, True) - - Do While Not tsSource.AtEndOfStream - line = tsSource.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondToken(line)) - - 'If the current item exists in the SOC, delete it. - If word = "HUDITEM" And Val(word2) = lstHUD.ListIndex Then - hudremoved = True - Do While Len(TrimComplete(tsSource.ReadLine)) > 0 And Not tsSource.AtEndOfStream - Loop - Else - tsTarget.WriteLine line - End If - Loop - - tsSource.Close - Set myFSOSource = Nothing - - If Remove = False Then - If line <> "" Then tsTarget.WriteLine "" - - tsTarget.WriteLine "HUDITEM " & lstHUD.ListIndex - txtX.Text = TrimComplete(txtX.Text) - txtY.Text = TrimComplete(txtY.Text) - If txtX.Text <> "" Then tsTarget.WriteLine "X = " & Val(txtX.Text) - If txtY.Text <> "" Then tsTarget.WriteLine "Y = " & Val(txtY.Text) - End If - - tsTarget.Close - Set myFSOTarget = Nothing - - FileCopy SOCTemp, SOCFile - - Kill SOCTemp - - If Remove = True Then - If hudremoved = True Then - MsgBox "HUD Item deleted from SOC." - Else - MsgBox "Couldn't find HUD Item in SOC." - End If - Else - MsgBox "HUD Item Saved." - End If -End Sub diff --git a/tools/SOCEdit/frmHUDEdit.frx b/tools/SOCEdit/frmHUDEdit.frx deleted file mode 100644 index 2ae3673307b7e47781b379ec9ae8ac569ee3fda5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1090 zcmb7@F>V_%5Jf*NBa1YVwlZ8bguo>ysh?txuZQfIDs5wrO4i z6*PoZbDb3pJ26%}!93CsvY^`WP1>}|>9DztMak1cXxm#`(d4~p*ajNqy`3iUC?{@w zk>z&KapGBSftY{e`dG>l*oZIJCqF&Mdu1C_%Q9`eP_z0w&U+O3IkerVp)Afj=GI^;PI13#+b=1~t1f0E7pc}Wk)}X-++Pbw1Kfzmn>#=L@&JNC8U8D=Z#Q>cKg{gzHsA$VpHILP?E1XJKRi4=PKKV2h9~a- z_PMKVL+P}Q{b%>Tf|?Cv=9mqAWj%%^EMe0%El9`u#W1sWx0l24n6_f2k#EOV*`7&5 fC9V0s*L>%u?60IH&hkb2gXUL8h5Zfg!87;^dSyMb diff --git a/tools/SOCEdit/frmHelp.frm b/tools/SOCEdit/frmHelp.frm deleted file mode 100644 index acf991057..000000000 --- a/tools/SOCEdit/frmHelp.frm +++ /dev/null @@ -1,213 +0,0 @@ -VERSION 5.00 -Begin VB.Form frmHelp - BorderStyle = 3 'Fixed Dialog - Caption = "Getting Started" - ClientHeight = 7395 - ClientLeft = 45 - ClientTop = 330 - ClientWidth = 6360 - Icon = "frmHelp.frx":0000 - LinkTopic = "Form1" - MaxButton = 0 'False - MinButton = 0 'False - ScaleHeight = 7395 - ScaleWidth = 6360 - ShowInTaskbar = 0 'False - StartUpPosition = 1 'CenterOwner - Begin VB.CommandButton cmdOK - Caption = "&OK, I know what I'm doing now." - Height = 495 - Left = 1920 - Style = 1 'Graphical - TabIndex = 8 - Top = 6840 - Width = 2535 - End - Begin VB.Line Line9 - X1 = 120 - X2 = 6120 - Y1 = 4800 - Y2 = 4800 - End - Begin VB.Line Line7 - X1 = 120 - X2 = 6120 - Y1 = 5400 - Y2 = 5400 - End - Begin VB.Label Label12 - Caption = $"frmHelp.frx":0442 - Height = 615 - Left = 120 - TabIndex = 12 - Top = 4800 - Width = 6015 - End - Begin VB.Line Line6 - X1 = 120 - X2 = 6120 - Y1 = 4200 - Y2 = 4200 - End - Begin VB.Label Label11 - Caption = $"frmHelp.frx":04F8 - Height = 615 - Left = 120 - TabIndex = 11 - Top = 4200 - Width = 6015 - End - Begin VB.Line Line8 - X1 = 120 - X2 = 6120 - Y1 = 6360 - Y2 = 6360 - End - Begin VB.Line Line5 - X1 = 120 - X2 = 6120 - Y1 = 3720 - Y2 = 3720 - End - Begin VB.Line Line4 - X1 = 120 - X2 = 6120 - Y1 = 2880 - Y2 = 2880 - End - Begin VB.Line Line3 - X1 = 120 - X2 = 6120 - Y1 = 2400 - Y2 = 2400 - End - Begin VB.Line Line2 - X1 = 120 - X2 = 6120 - Y1 = 1800 - Y2 = 1800 - End - Begin VB.Line Line1 - X1 = 120 - X2 = 6120 - Y1 = 1200 - Y2 = 1200 - End - Begin VB.Label Label10 - Caption = $"frmHelp.frx":05EC - Height = 495 - Left = 120 - TabIndex = 10 - Top = 3720 - Width = 6135 - End - Begin VB.Label Label9 - Caption = $"frmHelp.frx":068F - Height = 615 - Left = 120 - TabIndex = 9 - Top = 1200 - Width = 6135 - End - Begin VB.Label Label8 - Caption = $"frmHelp.frx":0772 - Height = 495 - Left = 120 - TabIndex = 7 - Top = 6360 - Width = 6135 - End - Begin VB.Label Label7 - Caption = "However, if you have these settings in the SOC you are using, don't worry - the editor will not erase them from your file." - Height = 495 - Left = 120 - TabIndex = 6 - Top = 5880 - Width = 6135 - End - Begin VB.Label Label6 - Caption = $"frmHelp.frx":0816 - Height = 495 - Left = 120 - TabIndex = 5 - Top = 5400 - Width = 6135 - End - Begin VB.Label Label5 - Caption = $"frmHelp.frx":08A9 - BeginProperty Font - Name = "MS Sans Serif" - Size = 8.25 - Charset = 0 - Weight = 700 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 855 - Left = 120 - TabIndex = 4 - Top = 2880 - Width = 6135 - End - Begin VB.Label Label4 - Caption = $"frmHelp.frx":09B1 - Height = 495 - Left = 120 - TabIndex = 3 - Top = 2400 - Width = 6135 - End - Begin VB.Label Label3 - Caption = $"frmHelp.frx":0A5A - Height = 495 - Left = 120 - TabIndex = 2 - Top = 1920 - Width = 6135 - End - Begin VB.Label Label2 - Caption = "Finally! A way to easily edit SOC files! I know you're anxious to get started, but here are some things you should know first:" - BeginProperty Font - Name = "MS Sans Serif" - Size = 9.75 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 495 - Left = 120 - TabIndex = 1 - Top = 600 - Width = 6135 - End - Begin VB.Label Label1 - Caption = "How To Use This Program" - BeginProperty Font - Name = "MS Sans Serif" - Size = 13.5 - Charset = 0 - Weight = 700 - Underline = -1 'True - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 495 - Left = 120 - TabIndex = 0 - Top = 120 - Width = 3855 - End -End -Attribute VB_Name = "frmHelp" -Attribute VB_GlobalNameSpace = False -Attribute VB_Creatable = False -Attribute VB_PredeclaredId = True -Attribute VB_Exposed = False -Option Explicit - -Private Sub cmdOK_Click() - frmHelp.Hide -End Sub diff --git a/tools/SOCEdit/frmHelp.frx b/tools/SOCEdit/frmHelp.frx deleted file mode 100644 index 25004fe298fb4d56690dd551c70f3c8947b60cd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2795 zcmb7F&2Ah;5bjMPEH2nSMLDHpMUY6Fu>=waBuF46C{hxmI7o0py)(VLot^0(P4{@R zr!3;Y36UIq3Kw30Cs>|h& z5Iu2D5Uug6`1_m??_*tCi~QA|5bvEA;woeWx(Vuua7@gg`}Suh1pdWr78m^DRm|se zth~{Nf6=!52EreU_~-3UZ+(4v1MK?6B>~v=i_M9kcWHNbw`ooUD`4C9Ra15v4Q|5o zYN7Bnux;BZtStD$cKy25 zIeKA}8=q0FS5*^L9ARA6!%=eFOaP1C3uR)CSH4uRo zIG^MF?avGt#||(Z7X0G%|Khy2&KC-CX*b}H>;DQYuPt_-VmSn^7-Lu=76NN5(=%*` z`~@*iEvnav!G~>5R(!hZu$AM>LL99Kae)3lK%cYb{!JnF@Ur(>h(Dn7V@E4ke**mp z`UmtobicDTrP3JdDXoHX)n`D)aH6qg{&Ff5M5lF!rtV+}?&lIr4;Pfib&n6oxxwVr;V4JQ=Pfj!_ zGI9cN0tq#6AsG?1$y|~mBr~+hxKGZ1?|eNRvW&|KhZIdz>62eitAIjf@L&o=k6fP+ zH-j(c^f9+cW|iZzJEa1e2WSXX7yye%K!P0*kY{}=b0yJ8C=CI>6Jwj$YG_LaL`KDw z)b&E@oMe_&$^oLD#@?5oY;NKUnK)-Wc3ont(J%1v5u-1*T<{~*$<<|Pfn=7m7hC9@ zukOJafDd3t03|93Ksl#Jrr=iNDgvhLThL1AzMLWuJ*2y_;|h!1cwMN?D_5?>LZloN zcDXZ?B%x2QUBFm6869Qte`6c{xk|+sWC>F)bwetx*u#`!Ux-*s+69xe~ zOcbC4W2ZnX0QT2UkRAsRbbJ_TSxouE&+i8~^X$oNNJ{i3ppXX$#*^pf;jx$NbixUc z067nbHysOTt|%Q#GXkD?im)A6+|jmnQNPi^Co*<#Yx`01TPV%agoJ}#_wYrbD?>6v zpG4Orb*bXc`ZBcdM(1Wij{=@y#aQ~rWER-9d|Rq2;KA_F3cZg`(-zZjpx|Y25j6$` z;IG5Xg6Yunk_IxJ)MfJX0z->w9Ku-oM8K;Ds@dS7vh-CL>I%T`z9Kv`iqcQx7!Dr< hPHUwM<{6I 0 Then - MsgBox "The thing says not to include the .SOC at the end, stupid.", vbOKOnly, "You goofed!" - Exit Sub - End If - - If Len(socname) > 0 Then - socname = socname & ".soc" - - Dim myFSOSOC As New Scripting.FileSystemObject - Dim tsSOC As TextStream - - Set tsSOC = myFSOSOC.OpenTextFile(File1.Path & "\" & socname, ForWriting, True) - tsSOC.Close - Set myFSOSOC = Nothing - - MsgBox "Blank SOC named " & socname & " created in " & File1.Path, vbOKOnly, "Success!" - End If -End Sub - -Private Sub cmdEditCutscenes_Click() - frmCutsceneEdit.Show vbModal, Me -End Sub - -Private Sub cmdEmblemEdit_Click() - frmEmblemEdit.Show vbModal, Me -End Sub - -Private Sub cmdHelp_Click() - frmHelp.Show vbModal, Me -End Sub - -Private Sub cmdHUDEdit_Click() - frmHUDEdit.Show vbModal, Me -End Sub - -Private Sub cmdLevelHeader_Click() - frmLevelHeader.Show vbModal, Me -End Sub - -Private Sub cmdMaincfg_Click() - frmMaincfg.Show vbModal, Me -End Sub - -Private Sub cmdSoundEdit_Click() - frmSoundEdit.Show vbModal, Me -End Sub - -Private Sub cmdStateEdit_Click() - frmStateEdit.Show vbModal, Me -End Sub - -Private Sub cmdThingEdit_Click() - frmThingEdit.Show vbModal, Me -End Sub - -Private Sub cmdUnlockables_Click() - frmUnlockablesEdit.Show vbModal, Me -End Sub - -Private Sub Dir1_Change() - SourcePath = Dir1.Path -End Sub - -Private Sub Dir2_Change() - File1.Path = Dir2.Path -End Sub - -Private Sub Drive1_Change() - Dir1.Path = Drive1.Drive -End Sub - -Private Sub Drive2_Change() - Dir2.Path = Drive2.Drive -End Sub - -Private Sub File1_DblClick() - SOCTemp = File1.Path & "\" & "socedit.tmp" - SOCFile = File1.Path & "\" & File1.List(File1.ListIndex) - MsgBox "You are now using the file: " & vbCrLf & SOCFile - cmdLevelHeader.Enabled = True - cmdThingEdit.Enabled = True - cmdStateEdit.Enabled = True - cmdHUDEdit.Enabled = True - cmdMaincfg.Enabled = True - cmdEmblemEdit.Enabled = True - cmdSoundEdit.Enabled = True - cmdCharacterEdit.Enabled = True - cmdEditCutscenes.Enabled = True - cmdAuthor.Enabled = True - cmdUnlockables.Enabled = True - lblAuthor.Caption = "Modification By: " & GetAuthor -End Sub - -Private Sub Form_Load() - SourcePath = App.Path - Dir1.Path = SourcePath -End Sub - -Private Function GetAuthor() As String - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim word As String - Dim word2 As String - - Set ts = myFSO.OpenTextFile(SOCFile, ForReading, False) - -SOCLoad: - Do While Not ts.AtEndOfStream - line = ts.ReadLine - - If Left(line, 1) = "#" Then GoTo SOCLoad - - If Left(line, 1) = vbCrLf Then GoTo SOCLoad - - If Len(line) < 1 Then GoTo SOCLoad - - word = FirstToken(line) - word2 = SecondToken(line) - - If UCase(word) = "MODBY" Then - GetAuthor = word2 - Exit Do - End If - Loop - - ts.Close - Set myFSO = Nothing -End Function - -Private Sub WriteAuthor(Remove As Boolean, ModderName As String) - Dim myFSOSource As New Scripting.FileSystemObject - Dim tsSource As TextStream - Dim myFSOTarget As New Scripting.FileSystemObject - Dim tsTarget As TextStream - Dim line As String - Dim word As String - Dim word2 As String - - Set tsSource = myFSOSource.OpenTextFile(SOCFile, ForReading, False) - Set tsTarget = myFSOTarget.OpenTextFile(SOCTemp, ForWriting, True) - - Do While Not tsSource.AtEndOfStream - line = tsSource.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondToken(line)) - - 'If the entry exists in the SOC, delete it. - If word <> "MODBY" Then - tsTarget.WriteLine line - End If - Loop - - tsSource.Close - Set myFSOSource = Nothing - - If Remove = False Then - If line <> "" Then tsTarget.WriteLine "" - - tsTarget.WriteLine "ModBy " & ModderName - End If - - tsTarget.Close - Set myFSOTarget = Nothing - - FileCopy SOCTemp, SOCFile - - Kill SOCTemp - - If Remove = True Then - MsgBox "Name removed." - Else - MsgBox "Name Saved." - End If -End Sub - diff --git a/tools/SOCEdit/frmHub.frx b/tools/SOCEdit/frmHub.frx deleted file mode 100644 index 176491ab691e992176c9abbf087904eabfdfce0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50308 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 0 Then - lstMaps.ListIndex = 0 - End If -End Sub - -Private Sub cmdRename_Click() - Dim Response As String - Dim NewNum As Integer - Dim i As Integer - - Response$ = InputBox("Rename level to (NUMBER ONLY):") - - If Response = "" Then - Exit Sub - End If - - NewNum = Val(TrimComplete(Response)) - - i = InStr(lstMaps.List(lstMaps.ListIndex), " ") + 1 - - i = Mid(lstMaps.List(lstMaps.ListIndex), i, Len(lstMaps.List(lstMaps.ListIndex)) - i + 1) - i = Val(i) - Call WriteLevel(True, i) - lstMaps.List(lstMaps.ListIndex) = "Level " & NewNum - Call cmdSave_Click -End Sub - -Private Sub cmdSave_Click() - Dim i As Integer - - i = InStr(lstMaps.List(lstMaps.ListIndex), " ") + 1 - - i = Val(Mid(lstMaps.List(lstMaps.ListIndex), i, Len(lstMaps.List(lstMaps.ListIndex)) - i + 1)) - Call WriteLevel(False, i) -End Sub - -Private Sub Form_Load() - Call LoadMusic - Call LoadSOCMaps - If lstMaps.ListCount > 0 Then lstMaps.ListIndex = 0 -End Sub - -Private Sub LoadSOCMaps() - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim word As String - Dim word2 As String - - Set ts = myFSO.OpenTextFile(SOCFile, ForReading, False) - - lstMaps.Clear - -SOCLoad: - Do While Not ts.AtEndOfStream - line = ts.ReadLine - - If Left(line, 1) = "#" Then GoTo SOCLoad - - If Left(line, 1) = vbCrLf Then GoTo SOCLoad - - If Len(line) < 1 Then GoTo SOCLoad - - word = FirstToken(line) - word2 = SecondToken(line) - - If UCase(word) = "LEVEL" Then - lstMaps.AddItem ("Level " & Val(word2)) - End If - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub LoadMusic() - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim number As Integer - Dim startclip As Integer, endclip As Integer - Dim addstring As String - - ChDir SourcePath - Set ts = myFSO.OpenTextFile("sounds.h", ForReading, False) - - Do While InStr(ts.ReadLine, "Music list (don't edit this comment!)") = 0 - Loop - - ts.SkipLine ' typedef enum - ts.SkipLine ' { - - line = ts.ReadLine - number = 0 - - cmbMusicslot.Clear - - Do While InStr(line, "NUMMUSIC") = 0 - startclip = InStr(line, "mus_") - If InStr(line, "mus_") <> 0 Then - endclip = InStr(line, ",") - line = Mid(line, startclip, endclip - startclip) - addstring = number & " - " & line - cmbMusicslot.AddItem addstring - number = number + 1 - End If - line = ts.ReadLine - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub ClearForm() - Dim j As Integer - - txtLevelName.Text = "" - txtInterscreen.Text = "" - txtAct.Text = "" - txtNextlevel.Text = "" - cmbMusicslot.Text = "" - txtForcecharacter.Text = "" - cmbWeather.Text = "" - txtSkynum.Text = "" - txtScriptname.Text = "" - chkScriptislump.Value = 0 - txtPrecutscenenum.Text = "" - txtCutscenenum.Text = "" - txtRunSOC.Text = "" - chkNozone.Value = 0 - chkHidden.Value = 0 - txtCountdown.Text = "" - chkNossmusic.Value = 0 - chkNoReload.Value = 0 - chkTimeAttack.Value = 0 - chkLevelSelect = 0 - - For j = 0 To 11 - chkTypeoflevel(j).Value = 0 - Next j -End Sub - -Private Sub lstMaps_Click() - Dim startclip As Integer - Call ClearForm - startclip = InStr(lstMaps.List(lstMaps.ListIndex), " ") - Call LoadSOCMapInfo(Val(Mid(lstMaps.List(lstMaps.ListIndex), startclip + 1, Len(lstMaps.List(lstMaps.ListIndex))))) -End Sub - -Private Sub LoadSOCMapInfo(num As Integer) - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim word As String - Dim word2 As String - - Set ts = myFSO.OpenTextFile(SOCFile, ForReading, False) - -SOCLoad: - Do While Not ts.AtEndOfStream - line = ts.ReadLine - - If Left(line, 1) = "#" Then GoTo SOCLoad - - If Left(line, 1) = vbCrLf Then GoTo SOCLoad - - If Len(line) < 1 Then GoTo SOCLoad - - word = UCase(FirstToken(line)) - word2 = UCase(SecondToken(line)) - - If word = "LEVEL" Then - If Val(word2) = num Then - Do While Len(line) > 0 And Not ts.AtEndOfStream - line = ts.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondTokenEqual(line)) - - If word = "LEVELNAME" Then - txtLevelName.Text = word2 - ElseIf word = "INTERSCREEN" Then - txtInterscreen.Text = word2 - ElseIf word = "ACT" Then - txtAct.Text = Val(word2) - ElseIf word = "NOZONE" Then - chkNozone.Value = Val(word2) - ElseIf word = "TYPEOFLEVEL" Then - ProcessMapFlags (Val(word2)) - ElseIf word = "NEXTLEVEL" Then - txtNextlevel.Text = Val(word2) - ElseIf word = "MUSICSLOT" Then - cmbMusicslot.ListIndex = Val(word2) - ElseIf word = "FORCECHARACTER" Then - txtForcecharacter.Text = Val(word2) - ElseIf word = "WEATHER" Then - cmbWeather.ListIndex = Val(word2) - ElseIf word = "SKYNUM" Then - txtSkynum.Text = Val(word2) - ElseIf word = "SCRIPTNAME" Then - txtScriptname.Text = word2 - ElseIf word = "SCRIPTISLUMP" Then - chkScriptislump.Value = Val(word2) - ElseIf word = "PRECUTSCENENUM" Then - txtPrecutscenenum.Text = Val(word2) - ElseIf word = "CUTSCENENUM" Then - txtCutscenenum.Text = Val(word2) - ElseIf word = "COUNTDOWN" Then - txtCountdown.Text = Val(word2) - ElseIf word = "HIDDEN" Then - chkHidden.Value = Val(word2) - ElseIf word = "NOSSMUSIC" Then - chkNossmusic.Value = Val(word2) - ElseIf word = "NORELOAD" Then - chkNoReload.Value = Val(word2) - ElseIf word = "TIMEATTACK" Then - chkTimeAttack.Value = Val(word2) - ElseIf word = "LEVELSELECT" Then - chkLevelSelect.Value = Val(word2) - ElseIf word = "RUNSOC" Then - txtRunSOC.Text = word2 - ElseIf Len(line) > 0 And Left(line, 1) <> "#" Then - MsgBox "Error in SOC!" & vbCrLf & "Unknown line: " & line - End If - Loop - Exit Do - End If - End If - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub ProcessMapFlags(flags As Long) - Dim j As Integer - - For j = 0 To 11 - If flags And chkTypeoflevel(j).Tag Then - chkTypeoflevel(j).Value = 1 - Else - chkTypeoflevel(j).Value = 0 - End If - Next j -End Sub - -Private Sub WriteLevel(Remove As Boolean, Mapnum As Integer) - Dim myFSOSource As New Scripting.FileSystemObject - Dim tsSource As TextStream - Dim myFSOTarget As New Scripting.FileSystemObject - Dim tsTarget As TextStream - Dim line As String - Dim word As String - Dim word2 As String - Dim flags As Long - Dim i As Integer - - Set tsSource = myFSOSource.OpenTextFile(SOCFile, ForReading, False) - Set tsTarget = myFSOTarget.OpenTextFile(SOCTemp, ForWriting, True) - - Do While Not tsSource.AtEndOfStream - line = tsSource.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondToken(line)) - - i = InStr(lstMaps.List(lstMaps.ListIndex), " ") + 1 - - i = Mid(lstMaps.List(lstMaps.ListIndex), i, Len(lstMaps.List(lstMaps.ListIndex)) - i + 1) - i = Val(i) - 'If the current level exists in the SOC, delete it. - If word = "LEVEL" And Val(word2) = i Then - Do While Len(TrimComplete(tsSource.ReadLine)) > 0 And Not (tsSource.AtEndOfStream) - Loop - Else - tsTarget.WriteLine line - End If - Loop - - tsSource.Close - Set myFSOSource = Nothing - - If Remove = False Then - If line <> "" Then tsTarget.WriteLine "" - - tsTarget.WriteLine UCase(lstMaps.List(lstMaps.ListIndex)) - txtLevelName.Text = TrimComplete(txtLevelName.Text) - txtInterscreen.Text = TrimComplete(txtInterscreen.Text) - txtAct.Text = TrimComplete(txtAct.Text) - txtNextlevel.Text = TrimComplete(txtNextlevel.Text) - cmbMusicslot.Text = TrimComplete(cmbMusicslot.Text) - txtForcecharacter.Text = TrimComplete(txtForcecharacter.Text) - cmbWeather.Text = TrimComplete(cmbWeather.Text) - txtSkynum.Text = TrimComplete(txtSkynum.Text) - txtScriptname.Text = TrimComplete(txtScriptname.Text) - txtPrecutscenenum.Text = TrimComplete(txtPrecutscenenum.Text) - txtCutscenenum.Text = TrimComplete(txtCutscenenum.Text) - txtCountdown.Text = TrimComplete(txtCountdown.Text) - txtRunSOC.Text = TrimComplete(txtRunSOC.Text) - - If txtLevelName.Text <> "" Then tsTarget.WriteLine "LEVELNAME = " & txtLevelName.Text - If txtInterscreen.Text <> "" Then tsTarget.WriteLine "INTERSCREEN = " & txtInterscreen.Text - If txtAct.Text <> "" Then tsTarget.WriteLine "ACT = " & Val(txtAct.Text) - If txtNextlevel.Text <> "" Then tsTarget.WriteLine "NEXTLEVEL = " & Val(txtNextlevel.Text) - If cmbMusicslot.Text <> "" Then tsTarget.WriteLine "MUSICSLOT = " & cmbMusicslot.ListIndex - If txtForcecharacter.Text <> "" Then tsTarget.WriteLine "FORCECHARACTER = " & Val(txtForcecharacter.Text) - If cmbWeather.Text <> "" Then tsTarget.WriteLine "WEATHER = " & cmbWeather.ListIndex - If txtSkynum.Text <> "" Then tsTarget.WriteLine "SKYNUM = " & Val(txtSkynum.Text) - If txtScriptname.Text <> "" Then tsTarget.WriteLine "SCRIPTNAME = " & txtScriptname.Text - If txtPrecutscenenum.Text <> "" Then tsTarget.WriteLine "PRECUTSCENENUM = " & Val(txtPrecutscenenum.Text) - If txtCutscenenum.Text <> "" Then tsTarget.WriteLine "CUTSCENENUM = " & Val(txtCutscenenum.Text) - If txtCountdown.Text <> "" Then tsTarget.WriteLine "COUNTDOWN = " & Val(txtCountdown.Text) - If chkScriptislump.Value = 1 Then tsTarget.WriteLine "SCRIPTISLUMP = 1" - If chkNozone.Value = 1 Then tsTarget.WriteLine "NOZONE = 1" - If chkHidden.Value = 1 Then tsTarget.WriteLine "HIDDEN = 1" - If chkNossmusic.Value = 1 Then tsTarget.WriteLine "NOSSMUSIC = 1" - If chkNoReload.Value = 1 Then tsTarget.WriteLine "NORELOAD = 1" - If chkTimeAttack.Value = 1 Then tsTarget.WriteLine "TIMEATTACK = 1" - If chkLevelSelect.Value = 1 Then tsTarget.WriteLine "LEVELSELECT = 1" - If txtRunSOC.Text <> "" Then tsTarget.WriteLine "RUNSOC = " & txtRunSOC.Text - - flags = 0 - For i = 0 To 11 - If chkTypeoflevel(i).Value = 1 Then - flags = flags + Val(chkTypeoflevel(i).Tag) - End If - Next - - If flags > 0 Then tsTarget.WriteLine "TYPEOFLEVEL = " & flags - End If - - tsTarget.Close - Set myFSOTarget = Nothing - - FileCopy SOCTemp, SOCFile - - Kill SOCTemp - - If Remove = True Then - MsgBox "Level Deleted." - Else - MsgBox "Level Saved." - End If -End Sub - diff --git a/tools/SOCEdit/frmLevelHeader.frx b/tools/SOCEdit/frmLevelHeader.frx deleted file mode 100644 index fe81f4413fa61a067d219c069b5879dcd6861328..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1204 zcmb7Dv2GJV5PcgXpCcjctD;oC3Yh{C2vFjD03rzZfhd^R5}YH;=#C1?wH)s# z;9d>rFqRMpgo2$0P3`8P0Y1>$8NTVFC<$ML7R?yxdd$fFUNK$r$C1NxYGIV-CQeMleG-f!UHu|zs30-L4HCS z@{%;G)rzeud%3{JVlpin}RzPtgS|kQ1VTN-MGXl zDpab%Qq7h5Li{Q@b;^SlsJgm-cBz~DKM5m%hdyNN!`Wp~R$aNf1#wMCpSOsFSoL{9 zfAi4nac0=l*6>aDfBRg;vLUdW+y0aLpOK0+%uHw&>?`RpT805ycTML^+xposXRU6} zhskYPisgpC9a&}B2C4{{^Zz~P|6G*i0WhUAy#~Hh^VK7w{YLyCeiL=nSf9OHPaSPE zu$MecUJcXUHXhS^J06ZcHSk2-beJ`;Pw&mqAiayH^j?p8$4AHgUK`KIUJg$B<8+Xo UJbKsvoWAdkl1@5IMpQre10r!&#Q*>R diff --git a/tools/SOCEdit/frmMaincfg.frm b/tools/SOCEdit/frmMaincfg.frm deleted file mode 100644 index 3efca74a8..000000000 --- a/tools/SOCEdit/frmMaincfg.frm +++ /dev/null @@ -1,644 +0,0 @@ -VERSION 5.00 -Begin VB.Form frmMaincfg - Caption = "Global Game Settings" - ClientHeight = 5295 - ClientLeft = 60 - ClientTop = 345 - ClientWidth = 9360 - Icon = "frmMaincfg.frx":0000 - LinkTopic = "Form1" - MaxButton = 0 'False - ScaleHeight = 5295 - ScaleWidth = 9360 - StartUpPosition = 3 'Windows Default - Begin VB.Frame frmReset - Caption = "Reset Data (Be sure this is at the TOP of your SOC)" - Height = 975 - Left = 4800 - TabIndex = 43 - Top = 4200 - Width = 4455 - Begin VB.CheckBox chkReset - Caption = "Thing Properties" - Height = 255 - Index = 2 - Left = 1680 - TabIndex = 46 - Tag = "4" - Top = 240 - Width = 1575 - End - Begin VB.CheckBox chkReset - Caption = "States" - Height = 255 - Index = 1 - Left = 240 - TabIndex = 45 - Tag = "2" - Top = 600 - Width = 1335 - End - Begin VB.CheckBox chkReset - Caption = "Sprite Names" - Height = 255 - Index = 0 - Left = 240 - TabIndex = 44 - Tag = "1" - Top = 240 - Width = 1575 - End - End - Begin VB.CheckBox chkDisableSpeedAdjust - Caption = "Disable speed adjustment of player animations depending on how fast they are moving." - Height = 375 - Left = 1080 - TabIndex = 42 - Top = 4200 - Width = 3615 - End - Begin VB.TextBox txtTitleScrollSpeed - Height = 285 - Left = 4080 - TabIndex = 41 - Top = 1920 - Width = 495 - End - Begin VB.CheckBox chkLoopTitle - Caption = "Loop the title screen music?" - Height = 195 - Left = 1080 - TabIndex = 39 - Top = 3840 - Width = 2415 - End - Begin VB.TextBox txtCreditsCutscene - Height = 285 - Left = 4080 - TabIndex = 37 - Top = 1560 - Width = 495 - End - Begin VB.CommandButton cmdSave - Caption = "&Save" - Height = 495 - Left = 120 - TabIndex = 36 - Top = 3120 - Width = 735 - End - Begin VB.CommandButton cmdReload - Caption = "&Reload" - Height = 495 - Left = 120 - TabIndex = 35 - Top = 2520 - Width = 735 - End - Begin VB.TextBox txtNumemblems - Height = 285 - Left = 4080 - MaxLength = 2 - TabIndex = 33 - Top = 3360 - Width = 495 - End - Begin VB.TextBox txtGamedata - Height = 285 - Left = 3240 - MaxLength = 64 - TabIndex = 31 - Top = 2880 - Width = 1335 - End - Begin VB.TextBox txtExeccfg - Height = 285 - Left = 3240 - TabIndex = 9 - Top = 2400 - Width = 1335 - End - Begin VB.Frame frmTimers - Caption = "Timers (35 = 1 second)" - Height = 3975 - Left = 4800 - TabIndex = 8 - Top = 120 - Width = 4455 - Begin VB.TextBox txtGameovertics - Height = 285 - Left = 3000 - TabIndex = 29 - Top = 3480 - Width = 1335 - End - Begin VB.TextBox txtHelpertics - Height = 285 - Left = 3000 - TabIndex = 27 - Top = 3120 - Width = 1335 - End - Begin VB.TextBox txtParalooptics - Height = 285 - Left = 3000 - TabIndex = 25 - Top = 2760 - Width = 1335 - End - Begin VB.TextBox txtExtralifetics - Height = 285 - Left = 3000 - TabIndex = 23 - Top = 2400 - Width = 1335 - End - Begin VB.TextBox txtSpacetimetics - Height = 285 - Left = 3000 - TabIndex = 21 - Top = 2040 - Width = 1335 - End - Begin VB.TextBox txtUnderwatertics - Height = 285 - Left = 3000 - TabIndex = 19 - Top = 1680 - Width = 1335 - End - Begin VB.TextBox txtTailsflytics - Height = 285 - Left = 3000 - TabIndex = 17 - Top = 1320 - Width = 1335 - End - Begin VB.TextBox txtFlashingtics - Height = 285 - Left = 3000 - TabIndex = 15 - Top = 960 - Width = 1335 - End - Begin VB.TextBox txtSneakertics - Height = 285 - Left = 3000 - TabIndex = 13 - Top = 600 - Width = 1335 - End - Begin VB.TextBox txtInvulntics - Height = 285 - Left = 3000 - TabIndex = 11 - Top = 240 - Width = 1335 - End - Begin VB.Label lblGameovertics - Alignment = 1 'Right Justify - Caption = "Game Over Screen Time:" - Height = 255 - Left = 960 - TabIndex = 30 - Top = 3480 - Width = 1935 - End - Begin VB.Label lblHelpertics - Alignment = 1 'Right Justify - Caption = "NiGHTS Nightopian Helper Time:" - Height = 255 - Left = 240 - TabIndex = 28 - Top = 3120 - Width = 2655 - End - Begin VB.Label lblParalooptics - Alignment = 1 'Right Justify - Caption = "NiGHTS Paraloop Powerup Time:" - Height = 255 - Left = 360 - TabIndex = 26 - Top = 2760 - Width = 2535 - End - Begin VB.Label lblExtralifetics - Alignment = 1 'Right Justify - Caption = "Extra Life Music Duration:" - Height = 255 - Left = 960 - TabIndex = 24 - Top = 2400 - Width = 1935 - End - Begin VB.Label lblSpacetimetics - Alignment = 1 'Right Justify - Caption = "Space Breath Timeout:" - Height = 255 - Left = 1200 - TabIndex = 22 - Top = 2040 - Width = 1695 - End - Begin VB.Label lblUnderwatertics - Alignment = 1 'Right Justify - Caption = "Underwater Breath Timeout:" - Height = 255 - Left = 840 - TabIndex = 20 - Top = 1680 - Width = 2055 - End - Begin VB.Label lblTailsflytics - Alignment = 1 'Right Justify - Caption = "Tails Flying Time:" - Height = 255 - Left = 1440 - TabIndex = 18 - Top = 1320 - Width = 1455 - End - Begin VB.Label lblFlashingtics - Alignment = 1 'Right Justify - Caption = "Flashing Time After Being Hit:" - Height = 255 - Left = 360 - TabIndex = 16 - Top = 960 - Width = 2535 - End - Begin VB.Label lblSneakertics - Alignment = 1 'Right Justify - Caption = "Super Sneakers Time:" - Height = 255 - Left = 240 - TabIndex = 14 - Top = 600 - Width = 2655 - End - Begin VB.Label lblInvulntics - Alignment = 1 'Right Justify - Caption = "Invincibility Time:" - Height = 255 - Left = 360 - TabIndex = 12 - Top = 240 - Width = 2535 - End - End - Begin VB.TextBox txtIntrotoplay - Height = 285 - Left = 4080 - TabIndex = 6 - Top = 1200 - Width = 495 - End - Begin VB.TextBox txtRacestage_start - Height = 285 - Left = 4080 - MaxLength = 4 - TabIndex = 4 - Top = 840 - Width = 495 - End - Begin VB.TextBox txtSpstage_start - Height = 285 - Left = 4080 - MaxLength = 4 - TabIndex = 2 - Top = 480 - Width = 495 - End - Begin VB.TextBox txtSstage_start - Height = 285 - Left = 4080 - MaxLength = 4 - TabIndex = 0 - Top = 120 - Width = 495 - End - Begin VB.Label lblTitleScrollSpeed - Alignment = 1 'Right Justify - Caption = "Scroll speed of title background:" - Height = 255 - Left = 1560 - TabIndex = 40 - Top = 1920 - Width = 2415 - End - Begin VB.Label lblCreditsCutscene - Alignment = 1 'Right Justify - Caption = "Cutscene # to replace credits with:" - Height = 255 - Left = 1080 - TabIndex = 38 - Top = 1560 - Width = 2895 - End - Begin VB.Label lblNumemblems - Alignment = 1 'Right Justify - Caption = "# of LEVEL Emblems (Gamedata field must also be filled out):" - Height = 375 - Left = 1440 - TabIndex = 34 - Top = 3240 - Width = 2535 - End - Begin VB.Label lblGamedata - Alignment = 1 'Right Justify - Caption = "Gamedata file (to save mod emblems and time data):" - Height = 375 - Left = 960 - TabIndex = 32 - Top = 2760 - Width = 2175 - End - Begin VB.Label lblExeccfg - Alignment = 1 'Right Justify - Caption = "CFG file to instantly execute upon loading this SOC:" - Height = 495 - Left = 960 - TabIndex = 10 - Top = 2280 - Width = 2175 - End - Begin VB.Label lblIntrotoplay - Alignment = 1 'Right Justify - Caption = "Cutscene # to use for introduction:" - Height = 255 - Left = 1440 - TabIndex = 7 - Top = 1200 - Width = 2535 - End - Begin VB.Label lblRacestage_start - Alignment = 1 'Right Justify - Caption = "Racing mode starts/loops back to this map #:" - Height = 255 - Left = 720 - TabIndex = 5 - Top = 840 - Width = 3255 - End - Begin VB.Label lblSpstage_start - Alignment = 1 'Right Justify - Caption = "Single Player Game Starts on this map #:" - Height = 255 - Left = 1080 - TabIndex = 3 - Top = 480 - Width = 2895 - End - Begin VB.Label lblSstage_start - Alignment = 1 'Right Justify - Caption = "First Special Stage Map #:" - Height = 255 - Left = 2040 - TabIndex = 1 - Top = 120 - Width = 1935 - End -End -Attribute VB_Name = "frmMaincfg" -Attribute VB_GlobalNameSpace = False -Attribute VB_Creatable = False -Attribute VB_PredeclaredId = True -Attribute VB_Exposed = False -Private Sub cmdReload_Click() - Call Reload -End Sub - -Private Sub cmdSave_Click() - Call WriteSettings -End Sub - -Private Sub Form_Load() - Call Reload -End Sub - -Private Sub ClearForm() - Dim i As Integer - - txtSstage_start.Text = "" - txtSpstage_start.Text = "" - txtRacestage_start.Text = "" - txtIntrotoplay.Text = "" - txtExeccfg.Text = "" - txtGamedata.Text = "" - txtNumemblems.Text = "" - txtInvulntics.Text = "" - txtSneakertics.Text = "" - txtFlashingtics.Text = "" - txtTailsflytics.Text = "" - txtUnderwatertics.Text = "" - txtSpacetimetics.Text = "" - txtExtralifetics.Text = "" - txtParalooptics.Text = "" - txtHelpertics.Text = "" - txtGameovertics.Text = "" - txtCreditsCutscene.Text = "" - txtTitleScrollSpeed.Text = "" - chkLoopTitle.Value = 0 - chkDisableSpeedAdjust.Value = 0 - - For i = 0 To 2 - chkReset(i).Value = 0 - Next i -End Sub - -Private Sub Reload() - Call ClearForm - Call ReadSOCMaincfg -End Sub - -Private Sub ReadSOCMaincfg() - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim word As String - Dim word2 As String - - Set ts = myFSO.OpenTextFile(SOCFile, ForReading, False) - -SOCLoad: - Do While Not ts.AtEndOfStream - line = ts.ReadLine - - If Left(line, 1) = "#" Then GoTo SOCLoad - - If Left(line, 1) = vbCrLf Then GoTo SOCLoad - - If Len(line) < 1 Then GoTo SOCLoad - - word = FirstToken(line) - word2 = SecondToken(line) - - If UCase(word) = "MAINCFG" Then - Do While Len(line) > 0 And Not ts.AtEndOfStream - line = ts.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondTokenEqual(line)) - - If word = "SSTAGE_START" Then - txtSstage_start.Text = Val(word2) - ElseIf word = "SPSTAGE_START" Then - txtSpstage_start.Text = Val(word2) - ElseIf word = "RACESTAGE_START" Then - txtRacestage_start.Text = Val(word2) - ElseIf word = "INVULNTICS" Then - txtInvulntics.Text = Val(word2) - ElseIf word = "SNEAKERTICS" Then - txtSneakertics.Text = Val(word2) - ElseIf word = "FLASHINGTICS" Then - txtFlashingtics.Text = Val(word2) - ElseIf word = "TAILSFLYTICS" Then - txtTailsflytics.Text = Val(word2) - ElseIf word = "UNDERWATERTICS" Then - txtUnderwatertics.Text = Val(word2) - ElseIf word = "SPACETIMETICS" Then - txtSpacetimetics.Text = Val(word2) - ElseIf word = "EXTRALIFETICS" Then - txtExtralifetics.Text = Val(word2) - ElseIf word = "PARALOOPTICS" Then - txtParalooptics.Text = Val(word2) - ElseIf word = "HELPERTICS" Then - txtHelpertics.Text = Val(word2) - ElseIf word = "GAMEOVERTICS" Then - txtGameovertics.Text = Val(word2) - ElseIf word = "INTROTOPLAY" Then - txtIntrotoplay.Text = Val(word2) - ElseIf word = "CREDITSCUTSCENE" Then - txtCreditsCutscene.Text = Val(word2) - ElseIf word = "TITLESCROLLSPEED" Then - txtTitleScrollSpeed.Text = Val(word2) - ElseIf word = "LOOPTITLE" Then - chkLoopTitle.Value = Val(word2) - ElseIf word = "DISABLESPEEDADJUST" Then - chkDisableSpeedAdjust.Value = Val(word2) - ElseIf word = "GAMEDATA" Then - txtGamedata.Text = word2 - ElseIf word = "NUMEMBLEMS" Then - txtNumemblems.Text = Val(word2) - ElseIf word = "RESETDATA" Then - Dim resetflags As Integer - Dim z As Integer - - resetflags = Val(word2) - - For z = 0 To 2 - If resetflags And chkReset(z).Tag Then - chkReset(z).Value = 1 - Else - chkReset(z).Value = 0 - End If - Next z - ElseIf Len(line) > 0 And Left(line, 1) <> "#" Then - MsgBox "Error in SOC!" & vbCrLf & "Unknown line: " & line - End If - Loop - Exit Do - End If - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub WriteSettings() - Dim myFSOSource As New Scripting.FileSystemObject - Dim tsSource As TextStream - Dim myFSOTarget As New Scripting.FileSystemObject - Dim tsTarget As TextStream - Dim line As String - Dim word As String - Dim word2 As String - Dim flags As Long - Dim i As Integer - - Set tsSource = myFSOSource.OpenTextFile(SOCFile, ForReading, False) - Set tsTarget = myFSOTarget.OpenTextFile(SOCTemp, ForWriting, True) - - Do While Not tsSource.AtEndOfStream - line = tsSource.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondToken(line)) - - 'If the category exists in the SOC, delete it. - If word = "MAINCFG" Then - Do While Len(TrimComplete(tsSource.ReadLine)) > 0 And Not (tsSource.AtEndOfStream) - Loop - Else - tsTarget.WriteLine line - End If - Loop - - tsSource.Close - Set myFSOSource = Nothing - - If line <> "" Then tsTarget.WriteLine "" - - tsTarget.WriteLine "MAINCFG CATEGORY" - txtSstage_start.Text = TrimComplete(txtSstage_start.Text) - txtSpstage_start.Text = TrimComplete(txtSpstage_start.Text) - txtRacestage_start.Text = TrimComplete(txtRacestage_start.Text) - txtIntrotoplay.Text = TrimComplete(txtIntrotoplay.Text) - txtCreditsCutscene.Text = TrimComplete(txtCreditsCutscene.Text) - txtExeccfg.Text = TrimComplete(txtExeccfg.Text) - txtGamedata.Text = TrimComplete(txtGamedata.Text) - txtNumemblems.Text = TrimComplete(txtNumemblems.Text) - txtInvulntics.Text = TrimComplete(txtInvulntics.Text) - txtSneakertics.Text = TrimComplete(txtSneakertics.Text) - txtFlashingtics.Text = TrimComplete(txtFlashingtics.Text) - txtTailsflytics.Text = TrimComplete(txtTailsflytics.Text) - txtUnderwatertics.Text = TrimComplete(txtUnderwatertics.Text) - txtSpacetimetics.Text = TrimComplete(txtSpacetimetics.Text) - txtExtralifetics.Text = TrimComplete(txtExtralifetics.Text) - txtParalooptics.Text = TrimComplete(txtParalooptics.Text) - txtHelpertics.Text = TrimComplete(txtHelpertics.Text) - txtGameovertics.Text = TrimComplete(txtGameovertics.Text) - txtTitleScrollSpeed.Text = TrimComplete(txtTitleScrollSpeed.Text) - - If txtSstage_start.Text <> "" Then tsTarget.WriteLine "SSTAGE_START = " & Val(txtSstage_start.Text) - If txtSpstage_start.Text <> "" Then tsTarget.WriteLine "SPSTAGE_START = " & Val(txtSpstage_start.Text) - If txtRacestage_start.Text <> "" Then tsTarget.WriteLine "RACESTAGE_START = " & Val(txtRacestage_start.Text) - If txtIntrotoplay.Text <> "" Then tsTarget.WriteLine "INTROTOPLAY = " & Val(txtIntrotoplay.Text) - If txtCreditsCutscene.Text <> "" Then tsTarget.WriteLine "CREDITSCUTSCENE = " & Val(txtCreditsCutscene.Text) - If txtExeccfg.Text <> "" Then tsTarget.WriteLine "EXECCFG = " & txtExeccfg.Text - If txtGamedata.Text <> "" Then tsTarget.WriteLine "GAMEDATA = " & txtGamedata.Text - If txtNumemblems.Text <> "" Then - tsTarget.WriteLine "NUMEMBLEMS = " & Val(txtNumemblems.Text) - EditedNumemblems = True - End If - If txtInvulntics.Text <> "" Then tsTarget.WriteLine "INVULNTICS = " & Val(txtInvulntics.Text) - If txtSneakertics.Text <> "" Then tsTarget.WriteLine "SNEAKERTICS = " & Val(txtSneakertics.Text) - If txtFlashingtics.Text <> "" Then tsTarget.WriteLine "FLASHINGTICS = " & Val(txtFlashingtics.Text) - If txtTailsflytics.Text <> "" Then tsTarget.WriteLine "TAILSFLYTICS = " & Val(txtTailsflytics.Text) - If txtUnderwatertics.Text <> "" Then tsTarget.WriteLine "UNDERWATERTICS = " & Val(txtUnderwatertics.Text) - If txtSpacetimetics.Text <> "" Then tsTarget.WriteLine "SPACETIMETICS = " & Val(txtSpacetimetics.Text) - If txtExtralifetics.Text <> "" Then tsTarget.WriteLine "EXTRALIFETICS = " & Val(txtExtralifetics.Text) - If txtParalooptics.Text <> "" Then tsTarget.WriteLine "PARALOOPTICS = " & Val(txtParalooptics.Text) - If txtHelpertics.Text <> "" Then tsTarget.WriteLine "HELPERTICS = " & Val(txtHelpertics.Text) - If txtGameovertics.Text <> "" Then tsTarget.WriteLine "GAMEOVERTICS = " & Val(txtGameovertics.Text) - If txtTitleScrollSpeed.Text <> "" Then tsTarget.WriteLine "TITLESCROLLSPEED = " & Val(txtTitleScrollSpeed.Text) - If chkLoopTitle.Value = 1 Then tsTarget.WriteLine "LOOPTITLE = " & chkLoopTitle.Value - If chkDisableSpeedAdjust.Value = 1 Then tsTarget.WriteLine "DISABLESPEEDADJUST = " & chkDisableSpeedAdjust.Value - - flags = 0 - For i = 0 To 2 - If chkReset(i).Value = 1 Then - flags = flags + Val(chkReset(i).Tag) - End If - Next - - If flags > 0 Then tsTarget.WriteLine "RESETDATA = " & flags - - tsTarget.Close - Set myFSOTarget = Nothing - - FileCopy SOCTemp, SOCFile - - Kill SOCTemp - - MsgBox "Settings Saved." -End Sub - diff --git a/tools/SOCEdit/frmMaincfg.frx b/tools/SOCEdit/frmMaincfg.frx deleted file mode 100644 index 2ae3673307b7e47781b379ec9ae8ac569ee3fda5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1090 zcmb7@F>V_%5Jf*NBa1YVwlZ8bguo>ysh?txuZQfIDs5wrO4i z6*PoZbDb3pJ26%}!93CsvY^`WP1>}|>9DztMak1cXxm#`(d4~p*ajNqy`3iUC?{@w zk>z&KapGBSftY{e`dG>l*oZIJCqF&Mdu1C_%Q9`eP_z0w&U+O3IkerVp)Afj=GI^;PI13#+b=1~t1f0E7pc}Wk)}X-++Pbw1Kfzmn>#=L@&JNC8U8D=Z#Q>cKg{gzHsA$VpHILP?E1XJKRi4=PKKV2h9~a- z_PMKVL+P}Q{b%>Tf|?Cv=9mqAWj%%^EMe0%El9`u#W1sWx0l24n6_f2k#EOV*`7&5 fC9V0s*L>%u?60IH&hkb2gXUL8h5Zfg!87;^dSyMb diff --git a/tools/SOCEdit/frmSoundEdit.frm b/tools/SOCEdit/frmSoundEdit.frm deleted file mode 100644 index c91d84ed8..000000000 --- a/tools/SOCEdit/frmSoundEdit.frm +++ /dev/null @@ -1,485 +0,0 @@ -VERSION 5.00 -Begin VB.Form frmSoundEdit - Caption = "Sound Edit" - ClientHeight = 4995 - ClientLeft = 60 - ClientTop = 345 - ClientWidth = 6180 - Icon = "frmSoundEdit.frx":0000 - LinkTopic = "Form1" - MaxButton = 0 'False - ScaleHeight = 4995 - ScaleWidth = 6180 - StartUpPosition = 3 'Windows Default - Begin VB.CommandButton cmdDelete - Caption = "&Delete sound from SOC" - Height = 495 - Left = 5040 - Style = 1 'Graphical - TabIndex = 13 - Top = 4320 - Width = 1095 - End - Begin VB.CommandButton cmdSave - Caption = "&Save" - Height = 495 - Left = 3840 - TabIndex = 6 - Top = 4320 - Width = 1095 - End - Begin VB.CommandButton cmdReload - Caption = "&Load Code Default" - Height = 495 - Left = 2640 - Style = 1 'Graphical - TabIndex = 5 - Top = 4320 - Width = 1095 - End - Begin VB.Frame frmSpecial - Caption = "Special Properties" - Height = 3375 - Left = 2640 - TabIndex = 4 - Top = 840 - Width = 3495 - Begin VB.CheckBox chkTotallySingle - Caption = "Make sure only one sound of this is playing at a time on any sound channel." - Height = 615 - Left = 120 - TabIndex = 12 - Tag = "1" - Top = 2640 - Width = 3255 - End - Begin VB.CheckBox chkEightEx - Caption = "Sound can be heard across 8x the distance" - Height = 375 - Left = 120 - TabIndex = 10 - Tag = "16" - Top = 2160 - Width = 2295 - End - Begin VB.CheckBox chkOutside - Caption = "Volume dependent on how close you are to outside" - Height = 375 - Left = 120 - TabIndex = 9 - Tag = "4" - Top = 360 - Width = 2295 - End - Begin VB.CheckBox chkFourEx - Caption = "Sound can be heard across 4x the distance" - Height = 375 - Left = 120 - TabIndex = 8 - Tag = "8" - Top = 1560 - Width = 2055 - End - Begin VB.CheckBox chkMultiple - Caption = "More than one of this sound can be played per object at a time (i.e., thunder)" - Height = 615 - Left = 120 - TabIndex = 7 - Tag = "2" - Top = 840 - Width = 2535 - End - Begin VB.Label Label1 - Caption = "Combine for 32x" - Height = 495 - Left = 2760 - TabIndex = 11 - Top = 1800 - Width = 615 - End - Begin VB.Line Line4 - X1 = 2400 - X2 = 2640 - Y1 = 2400 - Y2 = 2400 - End - Begin VB.Line Line2 - X1 = 2400 - X2 = 2640 - Y1 = 1800 - Y2 = 1800 - End - Begin VB.Line Line1 - X1 = 2640 - X2 = 2640 - Y1 = 2400 - Y2 = 1800 - End - End - Begin VB.ComboBox cmbPriority - Height = 315 - ItemData = "frmSoundEdit.frx":0442 - Left = 3360 - List = "frmSoundEdit.frx":0444 - TabIndex = 2 - Top = 120 - Width = 855 - End - Begin VB.CheckBox chkSingularity - Caption = "Only one can be played at a time per object." - Height = 255 - Left = 2640 - TabIndex = 1 - Top = 480 - Width = 3495 - End - Begin VB.ListBox lstSounds - Height = 4740 - Left = 120 - TabIndex = 0 - Top = 120 - Width = 2415 - End - Begin VB.Line Line3 - X1 = 0 - X2 = 720 - Y1 = 0 - Y2 = 0 - End - Begin VB.Label lblPriority - Alignment = 1 'Right Justify - Caption = "Priority:" - Height = 255 - Left = 2640 - TabIndex = 3 - Top = 120 - Width = 615 - End -End -Attribute VB_Name = "frmSoundEdit" -Attribute VB_GlobalNameSpace = False -Attribute VB_Creatable = False -Attribute VB_PredeclaredId = True -Attribute VB_Exposed = False -Option Explicit - -Private Sub cmdDelete_Click() - Call WriteSound(True) -End Sub - -Private Sub cmdReload_Click() - Call ClearForm - If InStr(lstSounds.List(lstSounds.ListIndex), "(free slot)") = 0 Then - Call LoadSoundInfo(lstSounds.ListIndex) - Else - MsgBox "Free slots do not have a code default." - End If -End Sub - -Private Sub cmdSave_Click() - Call WriteSound(False) -End Sub - -Private Sub Form_Load() - Call Reload -End Sub - -Private Sub ClearForm() - cmbPriority.Text = "" - chkSingularity.Value = 0 - chkOutside.Value = 0 - chkMultiple.Value = 0 - chkFourEx.Value = 0 - chkEightEx.Value = 0 - chkTotallySingle.Value = 0 -End Sub - -Private Sub Reload() - Call ClearForm - Call LoadCode - lstSounds.ListIndex = 0 -End Sub - -Private Sub LoadCode() - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim number As Integer - Dim startclip As Integer, endclip As Integer - Dim addstring As String - Dim i As Integer, numfreeslots As Integer - - ChDir SourcePath - Set ts = myFSO.OpenTextFile("sounds.h", ForReading, False) - - Do While InStr(ts.ReadLine, "List of sounds (don't modify this comment!)") = 0 - Loop - - ts.SkipLine ' typedef enum - ts.SkipLine ' { - - line = ts.ReadLine - number = 0 - - lstSounds.Clear - - Do While InStr(line, "sfx_freeslot0") = 0 - startclip = InStr(line, "sfx_") - If InStr(line, "sfx_") <> 0 Then - endclip = InStr(line, ",") - line = Mid(line, startclip, endclip - startclip) - addstring = number & " - " & line - lstSounds.AddItem addstring - number = number + 1 - End If - line = ts.ReadLine - Loop - - ts.Close - Set myFSO = Nothing - -'Populate the free slots! - numfreeslots = 800 - - For i = 1 To numfreeslots - If i < 10 Then - addstring = number & " - " & "sfx_fre00" & i & " (free slot)" - ElseIf i < 100 Then - addstring = number & " - " & "sfx_fre0" & i & " (free slot)" - Else - addstring = number & " - " & "sfx_fre" & i & " (free slot)" - End If - lstSounds.AddItem addstring - number = number + 1 - Next - - For i = 0 To 127 - cmbPriority.AddItem i - Next -End Sub - -Private Sub lstSounds_Click() - Call ClearForm - If InStr(lstSounds.List(lstSounds.ListIndex), "(free slot)") = 0 Then - Call LoadSoundInfo(lstSounds.ListIndex) - End If - Call LoadSOCSoundInfo(lstSounds.ListIndex) -End Sub - -Private Sub LoadSOCSoundInfo(SoundNum As Integer) - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim word As String - Dim word2 As String - - Set ts = myFSO.OpenTextFile(SOCFile, ForReading, False) - -SOCLoad: - Do While Not ts.AtEndOfStream - line = ts.ReadLine - - If Left(line, 1) = "#" Then GoTo SOCLoad - - If Left(line, 1) = vbCrLf Then GoTo SOCLoad - - If Len(line) < 1 Then GoTo SOCLoad - - word = FirstToken(line) - word2 = SecondToken(line) - - If UCase(word) = "SOUND" And Val(word2) = SoundNum Then - Do While Len(line) > 0 And Not ts.AtEndOfStream - line = ts.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondTokenEqual(line)) - - If word = "SINGULAR" Then - If Val(word2) = 1 Then - chkSingularity.Value = 1 - Else - chkSingularity.Value = 0 - End If - ElseIf word = "PRIORITY" Then - cmbPriority.Text = Val(word2) - ElseIf word = "FLAGS" Then - ProcessSoundFlags (Val(word2)) - ElseIf Len(line) > 0 And Left(line, 1) <> "#" Then - MsgBox "Error in SOC!" & vbCrLf & "Unknown line: " & line - End If - Loop - Exit Do - End If - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub LoadSoundInfo(StateNum As Integer) - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim number As Integer - Dim startclip As Integer, endclip As Integer - Dim token As String - Dim frame As Long - - ChDir SourcePath - Set ts = myFSO.OpenTextFile("sounds.c", ForReading, False) - - Do While InStr(ts.ReadLine, "S_sfx[0] needs to be a dummy for odd reasons.") = 0 - Loop - - number = 0 - - Do While number <> StateNum - Do While InStr(ts.ReadLine, """") = 0 - Loop - number = number + 1 - Loop - - Do While InStr(line, """") = 0 - line = ts.ReadLine - Loop - - startclip = InStr(line, """") + 1 - line = Mid(line, startclip, Len(line) - startclip) - endclip = InStr(line, """") - 1 - token = TrimComplete(Left(line, endclip)) - - 'txtName.Text = line - - startclip = InStr(line, ",") + 1 - line = Mid(line, startclip, Len(line) - startclip) - endclip = InStr(line, ",") - 1 - token = TrimComplete(Left(line, endclip)) - - If token = "true" Then - chkSingularity.Value = 1 - Else - chkSingularity.Value = 0 - End If - - startclip = InStr(line, ",") + 1 - line = Mid(line, startclip, Len(line) - startclip) - endclip = InStr(line, ",") - 1 - token = TrimComplete(Left(line, endclip)) - cmbPriority.Text = token - - startclip = InStr(line, ",") + 1 - line = Mid(line, startclip, Len(line) - startclip) - endclip = InStr(line, ",") - 1 - token = TrimComplete(Left(line, endclip)) - - ProcessSoundFlags (Val(token)) - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub ProcessSoundFlags(flags As Long) - - chkTotallySingle.Value = 0 - chkMultiple.Value = 0 - chkOutside.Value = 0 - chkFourEx.Value = 0 - chkEightEx.Value = 0 - - If flags = -1 Then - Exit Sub - End If - - If flags And 1 Then - chkTotallySingle.Value = 1 - End If - - If flags And 2 Then - chkMultiple.Value = 1 - End If - - If flags And 4 Then - chkOutside.Value = 1 - End If - - If flags And 8 Then - chkFourEx.Value = 1 - End If - - If flags And 16 Then - chkEightEx.Value = 1 - End If - -End Sub - -Private Sub WriteSound(Remove As Boolean) - Dim myFSOSource As New Scripting.FileSystemObject - Dim tsSource As TextStream - Dim myFSOTarget As New Scripting.FileSystemObject - Dim tsTarget As TextStream - Dim line As String - Dim word As String - Dim word2 As String - Dim flags As Long - Dim soundfound As Boolean - - soundfound = False - - Set tsSource = myFSOSource.OpenTextFile(SOCFile, ForReading, False) - Set tsTarget = myFSOTarget.OpenTextFile(SOCTemp, ForWriting, True) - - Do While Not tsSource.AtEndOfStream - line = tsSource.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondToken(line)) - - 'If the current sound exists in the SOC, delete it. - If word = "SOUND" And Val(word2) = lstSounds.ListIndex Then - soundfound = True - Do While Len(TrimComplete(tsSource.ReadLine)) > 0 And Not (tsSource.AtEndOfStream) - Loop - Else - tsTarget.WriteLine line - End If - Loop - - tsSource.Close - Set myFSOSource = Nothing - - If Remove = False Then - If line <> "" Then tsTarget.WriteLine "" - - tsTarget.WriteLine "SOUND " & lstSounds.ListIndex - cmbPriority.Text = TrimComplete(cmbPriority.Text) - If cmbPriority.Text <> "" Then tsTarget.WriteLine "PRIORITY = " & Val(cmbPriority.Text) - If chkSingularity.Value = 1 Then tsTarget.WriteLine "SINGULAR = 1" - - flags = 0 - - If chkOutside.Value = 1 Then flags = flags + Val(chkOutside.Tag) - If chkMultiple.Value = 1 Then flags = flags + Val(chkMultiple.Tag) - If chkFourEx.Value = 1 Then flags = flags + Val(chkFourEx.Tag) - If chkEightEx.Value = 1 Then flags = flags + Val(chkEightEx.Tag) - If chkTotallySingle.Value = 1 Then flags = flags + Val(chkTotallySingle.Tag) - - If flags > 0 Then tsTarget.WriteLine "FLAGS = " & flags - End If - - tsTarget.Close - Set myFSOTarget = Nothing - - FileCopy SOCTemp, SOCFile - - Kill SOCTemp - - If Remove = True Then - If soundfound = True Then - MsgBox "Sound removed from SOC." - Else - MsgBox "Sound not found in SOC." - End If - Else - MsgBox "Sound Saved." - End If -End Sub - diff --git a/tools/SOCEdit/frmSoundEdit.frx b/tools/SOCEdit/frmSoundEdit.frx deleted file mode 100644 index 980538679b05296de823a191f94f0564401fd92d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1094 zcmb7@F>V_%5Jf*NBa1YVwlZ8bguo>ysh?txuZQfIDs5wrO4i z6*PoZbDb3pJ26%}!93CsvY^`WP1>}|>9DztMak1cXxm#`(d4~p*ajNqy`3iUC?{@w zk>z&KapGBSftY{e`dG>l*oZIJCqF&Mdu1C_%Q9`eP_z0w&U+O3IkerVp)Afj=GI^;PI13#+b=1~t1f0E7pc}Wk)}X-++Pbw1Kfzmn>#=L@&JNC8U8D=Z#Q>cKg{gzHsA$VpHILP?E1XJKRi4=PKKV2h9~a- z_PMKVL+P}Q{b%>Tf|?Cv=9mqAWj%%^EMe0%El9`u#W1sWx0l24n6_f2k#EOV*`7&5 gC9V0s*L>%u?60IH&hkb2gXUL8h5Zfg!85S&7jZm2vH$=8 diff --git a/tools/SOCEdit/frmStateEdit.frm b/tools/SOCEdit/frmStateEdit.frm deleted file mode 100644 index 4eca5a1bc..000000000 --- a/tools/SOCEdit/frmStateEdit.frm +++ /dev/null @@ -1,940 +0,0 @@ -VERSION 5.00 -Begin VB.Form frmStateEdit - Caption = "State Edit" - ClientHeight = 6750 - ClientLeft = 60 - ClientTop = 345 - ClientWidth = 8970 - Icon = "frmStateEdit.frx":0000 - LinkTopic = "Form1" - MaxButton = 0 'False - ScaleHeight = 6750 - ScaleWidth = 8970 - StartUpPosition = 3 'Windows Default - Begin VB.TextBox lblVar2Desc - Height = 495 - Left = 4440 - Locked = -1 'True - MultiLine = -1 'True - ScrollBars = 2 'Vertical - TabIndex = 25 - Top = 3000 - Width = 4455 - End - Begin VB.TextBox lblVar1Desc - Height = 495 - Left = 4440 - Locked = -1 'True - MultiLine = -1 'True - ScrollBars = 2 'Vertical - TabIndex = 24 - Top = 2400 - Width = 4455 - End - Begin VB.TextBox lblActionDesc - Height = 735 - Left = 4440 - Locked = -1 'True - MultiLine = -1 'True - ScrollBars = 2 'Vertical - TabIndex = 23 - Top = 1560 - Width = 4455 - End - Begin VB.ListBox lstThings - Height = 450 - ItemData = "frmStateEdit.frx":0442 - Left = 7440 - List = "frmStateEdit.frx":0444 - TabIndex = 22 - Top = 6120 - Visible = 0 'False - Width = 975 - End - Begin VB.TextBox txtFuncVar2 - Height = 285 - Left = 7200 - TabIndex = 19 - Top = 3600 - Width = 1215 - End - Begin VB.TextBox txtFuncVar1 - Height = 285 - Left = 5520 - TabIndex = 18 - Top = 3600 - Width = 1095 - End - Begin VB.CommandButton cmdCopy - Caption = "&Copy state to..." - Height = 495 - Left = 6120 - Style = 1 'Graphical - TabIndex = 17 - Top = 6120 - Width = 1095 - End - Begin VB.CommandButton cmdDelete - Caption = "&Delete State from SOC" - Height = 495 - Left = 6120 - Style = 1 'Graphical - TabIndex = 16 - Top = 5520 - Width = 1095 - End - Begin VB.CommandButton cmdReload - Caption = "&Load Code Default" - Height = 495 - Left = 4920 - Style = 1 'Graphical - TabIndex = 15 - Top = 5520 - Width = 1095 - End - Begin VB.CommandButton cmdSave - Caption = "&Save" - Height = 495 - Left = 7320 - TabIndex = 14 - Top = 5520 - Width = 1095 - End - Begin VB.ComboBox cmbTranslucency - Height = 315 - ItemData = "frmStateEdit.frx":0446 - Left = 6720 - List = "frmStateEdit.frx":045C - TabIndex = 12 - Top = 5040 - Width = 1695 - End - Begin VB.CheckBox chkFullbright - Caption = "Make sprite full-brightness (unaffected by lighting)" - Height = 495 - Left = 6240 - TabIndex = 11 - Top = 4440 - Width = 2175 - End - Begin VB.ComboBox cmbNextstate - Height = 315 - Left = 6120 - TabIndex = 9 - Top = 3960 - Width = 2295 - End - Begin VB.ComboBox cmbAction - Height = 315 - Left = 6000 - TabIndex = 7 - Top = 1200 - Width = 2295 - End - Begin VB.TextBox txtTics - Height = 285 - Left = 7800 - TabIndex = 5 - Top = 720 - Width = 495 - End - Begin VB.TextBox txtFrame - Height = 285 - Left = 5880 - MaxLength = 2 - TabIndex = 3 - Top = 720 - Width = 495 - End - Begin VB.ComboBox cmbSprite - Height = 315 - Left = 5880 - TabIndex = 1 - Top = 120 - Width = 2415 - End - Begin VB.ListBox lstStates - Height = 6495 - Left = 120 - TabIndex = 0 - Top = 120 - Width = 4215 - End - Begin VB.Label lblFuncVar2 - Alignment = 1 'Right Justify - Caption = "Var2:" - Height = 255 - Left = 6600 - TabIndex = 21 - Top = 3600 - Width = 495 - End - Begin VB.Label lblFuncVar1 - Alignment = 1 'Right Justify - Caption = "Var1:" - Height = 255 - Left = 4920 - TabIndex = 20 - Top = 3600 - Width = 495 - End - Begin VB.Label lblTranslucency - Alignment = 1 'Right Justify - Caption = "Translucency:" - Height = 255 - Left = 5520 - TabIndex = 13 - Top = 5040 - Width = 1095 - End - Begin VB.Label lblNextstate - Alignment = 1 'Right Justify - Caption = "Next State:" - Height = 255 - Left = 5160 - TabIndex = 10 - Top = 3960 - Width = 855 - End - Begin VB.Label lblAction - Alignment = 1 'Right Justify - Caption = "Function to Call:" - Height = 375 - Left = 5040 - TabIndex = 8 - Top = 1080 - Width = 855 - End - Begin VB.Label lblTics - Alignment = 1 'Right Justify - Caption = "Tics (-1 for infinite duration):" - Height = 495 - Left = 6480 - TabIndex = 6 - Top = 600 - Width = 1215 - End - Begin VB.Label lblFrame - Alignment = 1 'Right Justify - Caption = "Frame:" - Height = 255 - Left = 5160 - TabIndex = 4 - Top = 720 - Width = 615 - End - Begin VB.Label lblSprite - Alignment = 1 'Right Justify - Caption = "Sprite:" - Height = 255 - Left = 5160 - TabIndex = 2 - Top = 120 - Width = 615 - End -End -Attribute VB_Name = "frmStateEdit" -Attribute VB_GlobalNameSpace = False -Attribute VB_Creatable = False -Attribute VB_PredeclaredId = True -Attribute VB_Exposed = False -Option Explicit - -Private Sub cmbAction_Click() - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim index As Integer - Dim ActionName As String - - ActionName = cmbAction.List(cmbAction.ListIndex) - - If cmbAction.ListIndex = 0 Then - lblActionDesc.Text = "" - lblVar1Desc.Text = "" - lblVar2Desc.Text = "" - Exit Sub - End If - - ChDir SourcePath - Set ts = myFSO.OpenTextFile("p_enemy.c", ForReading, False) - - Do While Not ts.AtEndOfStream - line = ts.ReadLine - - If Mid(line, 4, 9) = "Function:" And InStr(line, ActionName) > 0 Then - ts.ReadLine ' // - line = ts.ReadLine ' // Description: - index = InStr(line, ":") - lblActionDesc.Text = Mid(line, index + 2, Len(line) - (index + 1)) - - ts.ReadLine ' // - line = ts.ReadLine ' // var1 = - If InStr(line, "var1:") Then - lblVar1Desc.Text = Mid(line, 4, Len(line) - 3) - line = ts.ReadLine - Do While Left(line, 7) <> "// var2" - lblVar1Desc.Text = lblVar1Desc.Text & vbCrLf & TrimComplete(Mid(line, 4, Len(line) - 3)) - line = ts.ReadLine - Loop - Else - lblVar1Desc.Text = Mid(line, 4, Len(line) - 3) - End If - - If Left(line, 7) <> "// var2" Then - line = ts.ReadLine ' // var2 = - End If - - If InStr(line, "var2:") Then - lblVar2Desc.Text = Mid(line, 4, Len(line) - 3) - line = ts.ReadLine - Do While Len(line) > 4 - lblVar2Desc.Text = lblVar2Desc.Text & vbCrLf & TrimComplete(Mid(line, 4, Len(line) - 3)) - line = ts.ReadLine - Loop - Else - lblVar2Desc.Text = Mid(line, 4, Len(line) - 3) - End If - End If - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub cmdCopy_Click() - Dim Response As String - - Response$ = InputBox("Copy state to #:", "Copy State") - - If Response = "" Then Exit Sub - - Response = TrimComplete(Response) - - Call WriteState(False, Val(Response)) - - MsgBox "State copied to #" & Val(Response) -End Sub - -Private Sub cmdDelete_Click() - Call WriteState(True, lstStates.ListIndex) -End Sub - -Private Sub cmdReload_Click() - Call ClearForm - - If InStr(lstStates.List(lstStates.ListIndex), "S_FREESLOT") = 0 Then - LoadStateInfo (lstStates.ListIndex) - Else - MsgBox "Free slots do not have a code default." - End If -End Sub - -Private Sub cmdSave_Click() - If TrimComplete(txtFrame.Text) = "" And (chkFullbright.Value = 1 Or cmbTranslucency.ListIndex > 0) Then - MsgBox "ERROR: Frame field required for fullbright/translucency." - Exit Sub - End If - Call WriteState(False, lstStates.ListIndex) -End Sub - -Private Sub Form_Load() - Call Reload - lstStates.ListIndex = 0 -End Sub - -Private Sub ClearForm() - cmbNextstate.Text = "" - cmbSprite.Text = "" - txtFrame.Text = "" - cmbAction.Text = "" - txtFuncVar1.Text = "" - txtFuncVar2.Text = "" - lblActionDesc.Text = "" - lblVar1Desc.Text = "" - lblVar2Desc.Text = "" - chkFullbright.Value = False - cmbTranslucency.ListIndex = 0 -End Sub - -Private Sub Reload() - LoadStates - LoadSprites - LoadActions -End Sub - -Private Sub LoadStates() - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim number As Integer - Dim startclip As Integer, endclip As Integer - Dim addstring As String - Dim numfreeslots As Integer, i As Integer - - ChDir SourcePath - Set ts = myFSO.OpenTextFile("info.h", ForReading, False) - - Do While InStr(ts.ReadLine, "Object states (don't modify this comment!)") = 0 - Loop - - ts.SkipLine ' typedef enum - ts.SkipLine ' { - - line = ts.ReadLine - number = 0 - - lstStates.Clear - - Do While InStr(line, "S_FIRSTFREESLOT") = 0 - startclip = InStr(line, "S_") - If InStr(line, "S_") <> 0 Then - endclip = InStr(line, ",") - line = Mid(line, startclip, endclip - startclip) - addstring = number & " - " & line - lstStates.AddItem addstring - cmbNextstate.AddItem addstring - number = number + 1 - End If - line = ts.ReadLine - Loop - - ts.Close - - 'Populate the free slots! - Set ts = myFSO.OpenTextFile("info.h", ForReading, False) - - line = ts.ReadLine - Do While InStr(line, "#define NUMMOBJFREESLOTS") = 0 - line = ts.ReadLine - Loop - - startclip = InStr(line, "SLOTS ") + 6 - numfreeslots = Val(Mid(line, startclip, Len(line) - startclip + 1)) * 6 - - For i = 1 To numfreeslots - addstring = number & " - " & "S_FREESLOT" & i - lstStates.AddItem addstring - cmbNextstate.AddItem addstring - number = number + 1 - Next - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub LoadSprites() - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim number As Integer - Dim startclip As Integer, endclip As Integer - Dim addstring As String - Dim numfreeslots As Integer, i As Integer - - ChDir SourcePath - Set ts = myFSO.OpenTextFile("info.h", ForReading, False) - - Do While InStr(ts.ReadLine, "Hey, moron! If you change this table, don't forget about") = 0 - Loop - - ts.SkipLine ' typedef enum - ts.SkipLine ' { - - line = ts.ReadLine - number = 0 - - cmbSprite.Clear - - Do While InStr(line, "SPR_FIRSTFREESLOT") = 0 - startclip = InStr(line, "SPR_") - If InStr(line, "SPR_") <> 0 Then - endclip = InStr(line, ",") - line = Mid(line, startclip, endclip - startclip) - addstring = number & " - " & line - cmbSprite.AddItem addstring - number = number + 1 - End If - line = ts.ReadLine - Loop - - ts.Close - - 'Populate the free slots! - Set ts = myFSO.OpenTextFile("info.h", ForReading, False) - - line = ts.ReadLine - Do While InStr(line, "#define NUMMOBJFREESLOTS") = 0 - line = ts.ReadLine - Loop - - startclip = InStr(line, "SLOTS ") + 6 - numfreeslots = Val(Mid(line, startclip, Len(line) - startclip + 1)) - - For i = 1 To numfreeslots - If i < 10 Then - addstring = number & " - " & "SPR_F00" & i & " (Free slot)" - ElseIf i < 100 Then - addstring = number & " - " & "SPR_F0" & i & " (Free slot)" - Else - addstring = number & " - " & "SPR_F" & i & " (Free slot)" - End If - - cmbSprite.AddItem addstring - number = number + 1 - Next - - ts.Close - - Set myFSO = Nothing -End Sub - -Private Sub LoadActions() - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim number As Integer - Dim startclip As Integer, endclip As Integer - Dim addstring As String - - ChDir SourcePath - Set ts = myFSO.OpenTextFile("dehacked.c", ForReading, False) - - Do While InStr(ts.ReadLine, "actionpointer_t actionpointers[]") = 0 - Loop - - ts.SkipLine ' { - - line = ts.ReadLine - number = 0 - - cmbAction.Clear - - cmbAction.AddItem "None" - - Do While InStr(line, "NULL") = 0 - startclip = InStr(line, "A_") - If InStr(line, "A_") <> 0 Then - endclip = InStr(line, "}") - line = Mid(line, startclip, endclip - startclip) - cmbAction.AddItem line - number = number + 1 - End If - line = ts.ReadLine - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub lstStates_Click() - Call ClearForm - - If InStr(lstStates.List(lstStates.ListIndex), "S_FREESLOT") = 0 Then - LoadStateInfo (lstStates.ListIndex) - End If - - LoadSOCStateInfo (lstStates.ListIndex) -End Sub - -Private Sub LoadSOCStateInfo(StateNum As Integer) - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim word As String - Dim word2 As String - Dim frameNum As Long - - Set ts = myFSO.OpenTextFile(SOCFile, ForReading, False) - -SOCLoad: - Do While Not ts.AtEndOfStream - line = ts.ReadLine - - If Left(line, 1) = "#" Then GoTo SOCLoad - - If Left(line, 1) = vbCrLf Then GoTo SOCLoad - - If Len(line) < 1 Then GoTo SOCLoad - - word = FirstToken(line) - word2 = SecondToken(line) - - If UCase(word) = "FRAME" And Val(word2) = StateNum Then - Do While Len(line) > 0 And Not ts.AtEndOfStream - line = ts.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondTokenEqual(line)) - - If word = "SPRITENUMBER" Then - cmbSprite.ListIndex = Val(word2) - ElseIf word = "SPRITESUBNUMBER" Then - frameNum = Val(word2) - - If frameNum >= 327680 Then ' 5 << 16 - cmbTranslucency.ListIndex = 5 - frameNum = frameNum And Not 327680 - ElseIf frameNum >= 262144 Then ' 4 << 16 - cmbTranslucency.ListIndex = 4 - frameNum = frameNum And Not 262144 - ElseIf frameNum >= 196608 Then ' 3 << 16 - cmbTranslucency.ListIndex = 3 - frameNum = frameNum And Not 196608 - ElseIf frameNum >= 131072 Then ' 2 << 16 - cmbTranslucency.ListIndex = 2 - frameNum = frameNum And Not 131072 - ElseIf frameNum >= 65536 Then ' 1 << 16 - cmbTranslucency.ListIndex = 1 - frameNum = frameNum And Not 65536 - End If - - If frameNum >= 32768 Then - chkFullbright.Value = 1 - frameNum = frameNum And Not 32768 - Else - chkFullbright.Value = 0 - End If - - txtFrame.Text = frameNum - ElseIf word = "DURATION" Then - txtTics.Text = Val(word2) - ElseIf word = "NEXT" Then - cmbNextstate.ListIndex = Val(word2) - ElseIf word = "ACTION" Then - Call FindComboIndex(cmbAction, UCase(SecondToken(line))) - ElseIf word = "VAR1" Then - txtFuncVar1.Text = Val(word2) - ElseIf word = "VAR2" Then - txtFuncVar2.Text = Val(word2) - ElseIf Len(line) > 0 And Left(line, 1) <> "#" Then - MsgBox "Error in SOC!" & vbCrLf & "Unknown line: " & line - End If - Loop - Exit Do - End If - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub LoadStateInfo(StateNum As Integer) - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim number As Integer - Dim startclip As Integer, endclip As Integer - Dim token As String - Dim frame As Long - Dim templine As String - - ChDir SourcePath - Set ts = myFSO.OpenTextFile("info.c", ForReading, False) - - Do While InStr(ts.ReadLine, "Keep this comment directly above S_NULL") = 0 - Loop - - number = 0 - - Do While number <> StateNum - Do While InStr(ts.ReadLine, "SPR_") = 0 - Loop - number = number + 1 - Loop - - Do While InStr(line, "SPR_") = 0 - line = ts.ReadLine - Loop - - startclip = InStr(line, "SPR_") - line = Mid(line, startclip, Len(line) - startclip) - endclip = InStr(line, ",") - 1 - token = Left(line, endclip) - Call FindComboIndex(cmbSprite, token) - - startclip = InStr(line, ",") + 1 - line = TrimComplete(Mid(line, startclip, Len(line) - startclip)) - endclip = InStr(line, ",") - 1 - frame = Val(Left(line, endclip)) - - If frame >= 32768 Then - chkFullbright.Value = 1 - frame = frame - 32768 - Else - chkFullbright.Value = 0 - End If - - txtFrame.Text = frame - - cmbTranslucency.ListIndex = 0 - - startclip = InStr(line, ",") + 1 - line = TrimComplete(Mid(line, startclip, Len(line) - startclip)) - endclip = InStr(line, ",") - 1 - txtTics.Text = Val(Left(line, endclip)) - - startclip = InStr(line, "{") + 1 - line = TrimComplete(Mid(line, startclip, Len(line) - startclip)) - endclip = InStr(line, "}") - 1 - cmbAction.Text = TrimComplete(Left(line, endclip)) - If cmbAction.Text = "NULL" Then cmbAction.Text = "None" - - startclip = InStr(line, ",") + 1 - line = TrimComplete(Mid(line, startclip, Len(line) - startclip)) - endclip = InStr(line, ",") - 1 - templine = Left(line, endclip) - - templine = TrimComplete(templine) - 'Check for *FRACUNIT values - endclip = InStr(templine, "*FRACUNIT") - If endclip <> 0 Then - templine = Left(templine, endclip - 1) - templine = Val(templine) * 65536 - End If - 'Check for crazy-odd MT_ usage - endclip = InStr(templine, "MT_") - If endclip <> 0 Then - templine = FindThingNum(templine) & " - " & templine - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(templine, "pw_") - If endclip <> 0 Then - templine = FindPowerNum(templine) & " - " & templine - End If - txtFuncVar1.Text = templine - - startclip = InStr(line, ",") + 1 - line = TrimComplete(Mid(line, startclip, Len(line) - startclip)) - endclip = InStr(line, ",") - 1 - templine = Left(line, endclip) - - templine = TrimComplete(templine) - 'Check for *FRACUNIT values - endclip = InStr(templine, "*FRACUNIT") - If endclip <> 0 Then - templine = Left(templine, endclip - 1) - templine = Val(templine) * 65536 - End If - 'Check for crazy-odd MT_ usage - endclip = InStr(templine, "MT_") - If endclip <> 0 Then - templine = FindThingNum(templine) & " - " & templine - End If - 'Check for crazy-odd pw_ usage - endclip = InStr(templine, "pw_") - If endclip <> 0 Then - templine = FindPowerNum(templine) & " - " & templine - End If - txtFuncVar2.Text = templine - - startclip = InStr(line, ",") + 1 - line = TrimComplete(Mid(line, startclip, Len(line) - startclip)) - endclip = InStr(line, "}") - 1 - Call FindComboIndex(cmbNextstate, TrimComplete(Left(line, endclip))) - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub FindComboIndex(ByRef Box As ComboBox, line As String) - Dim i As Integer - - For i = 0 To Box.ListCount - If InStr(UCase(Box.List(i)), UCase(line)) Then - Box.ListIndex = i - Exit For - End If - Next -End Sub - -Private Sub WriteState(Remove As Boolean, num As Integer) - Dim myFSOSource As New Scripting.FileSystemObject - Dim tsSource As TextStream - Dim myFSOTarget As New Scripting.FileSystemObject - Dim tsTarget As TextStream - Dim line As String - Dim word As String - Dim word2 As String - Dim flags As Long - Dim statefound As Boolean - - statefound = False - - Set tsSource = myFSOSource.OpenTextFile(SOCFile, ForReading, False) - Set tsTarget = myFSOTarget.OpenTextFile(SOCTemp, ForWriting, True) - - Do While Not tsSource.AtEndOfStream - line = tsSource.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondToken(line)) - - 'If the current sound exists in the SOC, delete it. - If word = "FRAME" And Val(word2) = num Then - statefound = True - Do While Len(TrimComplete(tsSource.ReadLine)) > 0 And Not (tsSource.AtEndOfStream) - Loop - Else - tsTarget.WriteLine line - End If - Loop - - tsSource.Close - Set myFSOSource = Nothing - - If Remove = False Then - If line <> "" Then tsTarget.WriteLine "" - - tsTarget.WriteLine "FRAME " & num - cmbSprite.Text = TrimComplete(cmbSprite.Text) - txtFrame.Text = TrimComplete(txtFrame.Text) - txtTics.Text = TrimComplete(txtTics.Text) - cmbAction.Text = TrimComplete(cmbAction.Text) - txtFuncVar1.Text = TrimComplete(txtFuncVar1.Text) - txtFuncVar2.Text = TrimComplete(txtFuncVar2.Text) - cmbNextstate.Text = TrimComplete(cmbNextstate.Text) - cmbTranslucency.Text = TrimComplete(cmbTranslucency.Text) - - If cmbSprite.Text <> "" Then tsTarget.WriteLine "SPRITENUMBER = " & cmbSprite.ListIndex - - flags = Val(txtFrame.Text) - If chkFullbright.Value = 1 Then flags = flags + 32768 - - ' Grrr VB doesn't have bitshifts!! - If cmbTranslucency.Text <> "" Then - flags = flags + cmbTranslucency.ListIndex * 65536 - End If - - If txtFrame.Text <> "" Then tsTarget.WriteLine "SPRITESUBNUMBER = " & flags - If txtTics.Text <> "" Then tsTarget.WriteLine "DURATION = " & Val(txtTics.Text) - If cmbNextstate.Text <> "" Then tsTarget.WriteLine "NEXT = " & cmbNextstate.ListIndex - If cmbAction.Text <> "" Then tsTarget.WriteLine "ACTION " & cmbAction.Text - If txtFuncVar1.Text <> "" Then tsTarget.WriteLine "VAR1 = " & Val(txtFuncVar1.Text) - If txtFuncVar2.Text <> "" Then tsTarget.WriteLine "VAR2 = " & Val(txtFuncVar2.Text) - End If - - tsTarget.Close - Set myFSOTarget = Nothing - - FileCopy SOCTemp, SOCFile - - Kill SOCTemp - - If Remove = True Then - If statefound = True Then - MsgBox "State removed from SOC." - Else - MsgBox "State not found in SOC." - End If - Else - MsgBox "State Saved." - End If -End Sub - -Private Sub LoadThings() - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim number As Integer - Dim startclip As Integer, endclip As Integer - Dim numfreeslots As Integer, i As Integer - - ChDir SourcePath - Set ts = myFSO.OpenTextFile("info.h", ForReading, False) - - Do While InStr(ts.ReadLine, "Little flag for SOC editor (don't change this comment!)") = 0 - Loop - - ts.SkipLine ' typedef enum - ts.SkipLine ' { - - line = ts.ReadLine - number = 0 - - lstThings.Clear - - Do While InStr(line, "MT_FIRSTFREESLOT") = 0 - startclip = InStr(line, "MT_") - If InStr(line, "MT_") <> 0 Then - endclip = InStr(line, ",") - line = Mid(line, startclip, endclip - startclip) - lstThings.AddItem number & " - " & line - number = number + 1 - End If - line = ts.ReadLine - Loop - - ts.Close - - 'Populate the free slots! - Set ts = myFSO.OpenTextFile("info.h", ForReading, False) - - line = ts.ReadLine - Do While InStr(line, "#define NUMMOBJFREESLOTS") = 0 - line = ts.ReadLine - Loop - - startclip = InStr(line, "SLOTS ") + 6 - numfreeslots = Val(Mid(line, startclip, Len(line) - startclip + 1)) - - For i = 1 To numfreeslots - lstThings.AddItem number & " - " & "MT_FREESLOT" & i - number = number + 1 - Next - - ts.Close - Set myFSO = Nothing -End Sub - -Private Function FindThingNum(ThingName As String) As Integer - Dim i As Integer - Dim temp As String - Dim startpoint As Integer - Dim endpoint As Integer - - lstThings.Clear - LoadThings - - For i = 0 To lstThings.ListCount - 1 - temp = lstThings.List(i) - startpoint = InStr(temp, "-") + 2 - endpoint = Len(temp) - startpoint + 1 - temp = Mid(temp, startpoint, endpoint) - If temp = ThingName Then - FindThingNum = Val(lstThings.List(i)) - Exit For - End If - Next -End Function - -Private Function FindPowerNum(PowerName As String) As Integer - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim number As Integer - Dim startclip As Integer - - ChDir SourcePath - Set ts = myFSO.OpenTextFile("d_player.h", ForReading, False) - - Do While InStr(ts.ReadLine, "Player powers. (don't edit this comment)") = 0 - Loop - - ts.SkipLine ' typedef enum - ts.SkipLine ' { - - line = ts.ReadLine - number = 0 - - Do While InStr(line, "NUMPOWERS") = 0 - startclip = InStr(line, PowerName) - If startclip <> 0 Then - FindPowerNum = number - Exit Do - End If - number = number + 1 - line = ts.ReadLine - Loop - - ts.Close - Set myFSO = Nothing -End Function diff --git a/tools/SOCEdit/frmStateEdit.frx b/tools/SOCEdit/frmStateEdit.frx deleted file mode 100644 index 8069c37e05db5bf778fe4a3f43101626fdb0d320..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1254 zcmb7D!EVz)5Pfb?++0Xn6?%#hhhE#GPyH41 z1^onagB!jjk=!hA)=qFrE^Pcf^Jd=edS@qZ9s%7E@RAmAumh!P;^Nm1@RYVz%Xq^9 z9+!XyV~RK-9N1|Hsog$8fDghjGknuU9LKbhF!q5l;t~8wNM75AQ?C~jr1iZ*fV93h zUI(20D2m48b-*PxW;X8UiZOTMn5_g8OO43|?usw6P2D_g7B{vi`E+BV=tfo)c_JEa zLu%!ToF?N|&baXFTrLN#W;~Zmz~=vQREly6WY~{OGCzA)H_BFJEsJU41vOWH!1*18 z{Dic~6Vf6Vb#eKBIFC_Sj_&4krZ=Wju)(E_X30(GB^H&Fr)U!gCgx5tYa60OIPy(~ z-MB;_DN-lJ(wRHvEAcbo)F}@dBW;J}%iFMe{DUw8GK+) zh*h7*^tX?YJFfjR%*bNp982d&?$ zjvgqopgBC(qv4?sf35k_QjMYh6sR-Z)q`O+vwLwC^hVE=9-Rk_>Hg{Gi{S7NKyGDA diff --git a/tools/SOCEdit/frmUnlockablesEdit.frm b/tools/SOCEdit/frmUnlockablesEdit.frm deleted file mode 100644 index f43209a78..000000000 --- a/tools/SOCEdit/frmUnlockablesEdit.frm +++ /dev/null @@ -1,391 +0,0 @@ -VERSION 5.00 -Begin VB.Form frmUnlockablesEdit - Caption = "Unlockables Edit" - ClientHeight = 3675 - ClientLeft = 60 - ClientTop = 345 - ClientWidth = 8130 - Icon = "frmUnlockablesEdit.frx":0000 - LinkTopic = "Form1" - MaxButton = 0 'False - ScaleHeight = 3675 - ScaleWidth = 8130 - StartUpPosition = 3 'Windows Default - Begin VB.CheckBox chkGrade - Caption = "Must have beaten Ultimate" - Height = 255 - Index = 4 - Left = 5400 - TabIndex = 20 - Tag = "1024" - Top = 2160 - Width = 2655 - End - Begin VB.CheckBox chkGrade - Caption = "Must have beaten Very Hard" - Height = 255 - Index = 3 - Left = 5400 - TabIndex = 19 - Tag = "128" - Top = 1800 - Width = 2655 - End - Begin VB.CheckBox chkGrade - Caption = "Must have all emblems" - Height = 255 - Index = 2 - Left = 5400 - TabIndex = 18 - Tag = "16" - Top = 1440 - Width = 2055 - End - Begin VB.CheckBox chkGrade - Caption = "Must have gotten all 7 emeralds" - Height = 255 - Index = 1 - Left = 5400 - TabIndex = 17 - Tag = "8" - Top = 1080 - Width = 2655 - End - Begin VB.CheckBox chkGrade - Caption = "Game must be completed" - Height = 255 - Index = 0 - Left = 5400 - TabIndex = 16 - Tag = "1" - Top = 720 - Width = 2175 - End - Begin VB.TextBox txtVar - Height = 285 - Left = 4320 - TabIndex = 14 - Top = 2640 - Width = 615 - End - Begin VB.ComboBox cmbType - Height = 315 - ItemData = "frmUnlockablesEdit.frx":0442 - Left = 3360 - List = "frmUnlockablesEdit.frx":044C - TabIndex = 12 - Top = 2160 - Width = 1575 - End - Begin VB.TextBox txtNeededTime - Height = 285 - Left = 4080 - TabIndex = 10 - Top = 1680 - Width = 855 - End - Begin VB.TextBox txtNeededEmblems - Height = 285 - Left = 4440 - TabIndex = 9 - Top = 1200 - Width = 495 - End - Begin VB.TextBox txtObjective - Height = 285 - Left = 3240 - TabIndex = 7 - Top = 720 - Width = 1695 - End - Begin VB.TextBox txtName - Height = 285 - Left = 3240 - TabIndex = 5 - Top = 240 - Width = 1695 - End - Begin VB.CommandButton cmdDelete - Caption = "&Delete from SOC" - Height = 375 - Left = 3480 - TabIndex = 3 - Top = 3120 - Width = 1575 - End - Begin VB.CommandButton cmdSave - Caption = "&Save Changes" - Height = 375 - Left = 1800 - TabIndex = 2 - Top = 3120 - Width = 1575 - End - Begin VB.ListBox lstUnlockables - Height = 2985 - ItemData = "frmUnlockablesEdit.frx":046A - Left = 120 - List = "frmUnlockablesEdit.frx":049B - TabIndex = 0 - Top = 480 - Width = 1215 - End - Begin VB.Label lblNote - Caption = "Note: All requirements are combinable." - Height = 495 - Left = 6000 - TabIndex = 22 - Top = 2760 - Width = 1695 - End - Begin VB.Label lblOtherReqs - Caption = "Other Requirements:" - Height = 255 - Left = 5400 - TabIndex = 21 - Top = 360 - Width = 1935 - End - Begin VB.Label lblVar - Alignment = 1 'Right Justify - Caption = "Map # to warp to:" - Height = 255 - Left = 2880 - TabIndex = 15 - Top = 2640 - Width = 1335 - End - Begin VB.Label lblType - Alignment = 1 'Right Justify - Caption = "Type of Unlockable:" - Height = 255 - Left = 1800 - TabIndex = 13 - Top = 2160 - Width = 1455 - End - Begin VB.Label lblNeededTime - Alignment = 1 'Right Justify - Caption = "Needed time on Time Attack rank (in seconds):" - Height = 375 - Left = 1440 - TabIndex = 11 - Top = 1560 - Width = 2535 - End - Begin VB.Label lblNeededEmblems - Alignment = 1 'Right Justify - Caption = "# of Emblems Needed:" - Height = 255 - Left = 2640 - TabIndex = 8 - Top = 1200 - Width = 1695 - End - Begin VB.Label lblObjective - Alignment = 1 'Right Justify - Caption = "Objective:" - Height = 255 - Left = 2400 - TabIndex = 6 - Top = 720 - Width = 735 - End - Begin VB.Label lblName - Alignment = 1 'Right Justify - Caption = "Name:" - Height = 255 - Left = 2640 - TabIndex = 4 - Top = 240 - Width = 495 - End - Begin VB.Label lblHUDItems - Caption = "Unlockables:" - Height = 255 - Left = 120 - TabIndex = 1 - Top = 240 - Width = 975 - End -End -Attribute VB_Name = "frmUnlockablesEdit" -Attribute VB_GlobalNameSpace = False -Attribute VB_Creatable = False -Attribute VB_PredeclaredId = True -Attribute VB_Exposed = False -Option Explicit - -Private Sub cmdDelete_Click() - Call WriteUnlockableItem(True) -End Sub - -Private Sub cmdSave_Click() - Call WriteUnlockableItem(False) -End Sub - -Private Sub Form_Load() - Call Reload -End Sub - -Private Sub Reload() - txtName.Text = "" - txtObjective.Text = "" - txtNeededEmblems.Text = "" - txtNeededTime.Text = "" - cmbType.Text = "" - txtVar.Text = "" - - Dim i As Integer - - For i = 0 To chkGrade.Count - 1 - chkGrade(i).Value = 0 - Next i - - lstUnlockables.ListIndex = 0 -End Sub - -Private Sub lstUnlockables_Click() - Call ReadSOC(lstUnlockables.ListIndex + 1) -End Sub - -Private Sub ReadSOC(UnlockableNum As Integer) - Dim myFSO As New Scripting.FileSystemObject - Dim ts As TextStream - Dim line As String - Dim word As String - Dim word2 As String - - Set ts = myFSO.OpenTextFile(SOCFile, ForReading, False) - -SOCLoad: - Do While Not ts.AtEndOfStream - line = ts.ReadLine - - If Left(line, 1) = "#" Then GoTo SOCLoad - - If Left(line, 1) = vbCrLf Then GoTo SOCLoad - - If Len(line) < 1 Then GoTo SOCLoad - - word = FirstToken(line) - word2 = SecondToken(line) - - If UCase(word) = "UNLOCKABLE" And Val(word2) = UnlockableNum Then - Do While Len(line) > 0 And Not ts.AtEndOfStream - line = ts.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondTokenEqual(line)) - - If word = "NAME" Then - txtName.Text = word2 - ElseIf word = "OBJECTIVE" Then - txtObjective.Text = word2 - ElseIf word = "NEEDEDEMBLEMS" Then - txtNeededEmblems.Text = Val(word2) - ElseIf word = "NEEDEDTIME" Then - txtNeededTime.Text = Val(word2) - ElseIf word = "TYPE" Then - cmbType.ListIndex = Val(word2) - ElseIf word = "VAR" Then - txtVar.Text = Val(word2) - ElseIf word = "NEEDEDGRADE" Then - Dim i As Integer - - For i = 0 To chkGrade.Count - 1 - If Val(word2) And chkGrade(i).Tag Then - chkGrade(i).Tag = True - End If - Next i - ElseIf Len(line) > 0 And Left(line, 1) <> "#" Then - MsgBox "Error in SOC!" & vbCrLf & "Unknown line: " & line - End If - Loop - Exit Do - End If - Loop - - ts.Close - Set myFSO = Nothing -End Sub - -Private Sub WriteUnlockableItem(Remove As Boolean) - Dim myFSOSource As New Scripting.FileSystemObject - Dim tsSource As TextStream - Dim myFSOTarget As New Scripting.FileSystemObject - Dim tsTarget As TextStream - Dim line As String - Dim word As String - Dim word2 As String - Dim unlockableremoved As Boolean - - unlockableremoved = False - - Set tsSource = myFSOSource.OpenTextFile(SOCFile, ForReading, False) - Set tsTarget = myFSOTarget.OpenTextFile(SOCTemp, ForWriting, True) - - Do While Not tsSource.AtEndOfStream - line = tsSource.ReadLine - word = UCase(FirstToken(line)) - word2 = UCase(SecondToken(line)) - - 'If the current item exists in the SOC, delete it. - If word = "UNLOCKABLE" And Val(word2) = lstUnlockables.ListIndex + 1 Then - unlockableremoved = True - Do While Len(TrimComplete(tsSource.ReadLine)) > 0 And Not tsSource.AtEndOfStream - Loop - Else - tsTarget.WriteLine line - End If - Loop - - tsSource.Close - Set myFSOSource = Nothing - - If Remove = False Then - If line <> "" Then tsTarget.WriteLine "" - - tsTarget.WriteLine "UNLOCKABLE " & lstUnlockables.ListIndex + 1 - txtName.Text = TrimComplete(txtName.Text) - txtObjective.Text = TrimComplete(txtObjective.Text) - txtNeededEmblems.Text = TrimComplete(txtNeededEmblems.Text) - txtNeededTime.Text = TrimComplete(txtNeededTime.Text) - txtVar.Text = TrimComplete(txtVar.Text) - - If txtName.Text <> "" Then tsTarget.WriteLine "NAME = " & txtName.Text - If txtObjective.Text <> "" Then tsTarget.WriteLine "OBJECTIVE = " & txtObjective.Text - If txtNeededEmblems.Text <> "" Then tsTarget.WriteLine "NEEDEDEMBLEMS = " & txtNeededEmblems.Text - If txtNeededTime.Text <> "" Then tsTarget.WriteLine "NEEDEDTIME = " & txtNeededTime.Text - If cmbType.ListIndex <> -1 Then tsTarget.WriteLine "TYPE = " & cmbType.ListIndex - If txtVar.Text <> "" Then tsTarget.WriteLine "VAR = " & txtVar.Text - - Dim writegrade As Long - Dim i As Integer - writegrade = 0 - - For i = 0 To chkGrade.Count - 1 - If chkGrade(i).Value = 1 Then - writegrade = writegrade + chkGrade(i).Tag - End If - Next i - - If writegrade > 0 Then tsTarget.WriteLine "NEEDEDGRADE = " & writegrade - End If - - tsTarget.Close - Set myFSOTarget = Nothing - - FileCopy SOCTemp, SOCFile - - Kill SOCTemp - - If Remove = True Then - If unlockableremoved = True Then - MsgBox "Unlockable deleted from SOC." - Else - MsgBox "Couldn't find Unlockable in SOC." - End If - Else - MsgBox "Unlockable Saved." - End If -End Sub diff --git a/tools/SOCEdit/frmUnlockablesEdit.frx b/tools/SOCEdit/frmUnlockablesEdit.frx deleted file mode 100644 index d9d464d4e6a38acb9cb4cbd09818f5705e8c1a26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1399 zcmb7@F>ezw6vzKg5GN|i<)*4rZ$cg0rY*3Let=302z4&ib>RdNsyKDZAqLiVys2O1 z_yl|evccBdl1SH>|FfOchDZqKo}Yj3{cYbpJ1-vq`2}!D4=8kyrac+rR|j}X-|Jc4 zR=|@ku+3OXJEAF=X(*{(-AaHD%F;Ua9HOpkdP!*WKx-M%_>+)ytD8y^KS4}3yZ|xT zD3$@WSyfe0ECUfy>q#+mih?__O%{TYL9Lx2TJX$n8o9KdU7Mn~=~`FSwX7)eMl{@p zXylE2jb$TeT=>e#C3kg*`P_|AYA+UVcRM zxgq*2YJd5^n4jS-$6+{~>0mkq0ZSS6oSRO&EGj3DF`#Yfnmg63ZHX>T$vbJ@#yN&) z(W(}6HC6gE?PtTOV}59jc2GXNyeZ@U51JN(v+@;V=a)Bi(+=e9X0$t+-18nSr7iAx z&GG71@{TjZJ8c|$4*&O_t3);gHY;=g!8c}?C|N} zF@ML|rz}rjXL)vZvF7OH^y4sI>a6;oeT;Q3_vU^6;q2Y%+dNBm1KJCyAJBe42LT-h a^emv~0lioccHaqcH^jXV`yuX!c<>wC+KfN| diff --git a/tools/SOCEdit/icon1.ico b/tools/SOCEdit/icon1.ico deleted file mode 100644 index 1ea9d1005fd0b48b539586fa21e1c4afca63daf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmb7@J#yPH5QQHsPdIKOvGS<0Dv$acK)!)*;o2R?m5@o1)-GA;D$EITgs6)6ev*>NDqs*`|!6|N=_G=%_g$;dLi9nCzHhIPWn8O=J;md4me%XOCIg{<_Qw< zJ{fw3>beeVfe`-+!A5|exvV?iTwRv|XnkEcp!Icgbhv5TwoP+%RL~GM&0|(H>_pof z1j|T6$b#y?cWKiqhr{kACM8b~p>1DmMU(fYVH;?a_ja4aqa45S=Pb92juX#vbHw-` zuB%dxz*;<9pT?;lpQLR}F3Yg-Le1)ban4c1m(Y^;(2|?FT>c-uBjD^zfok0AQG*6IXz#WzdF+cHkXYoln3F9O}Gde7<>VoCq}?4L!sEt#en~hSIc+^=I$D zftn3OmY5xNWi^JyEn(9$Jrj=ki*9BeUN5`hF>J|7Ex(SfvcHjrO4{;$Z~4wm+22WP T2J3g}2bymg74|#$3Esd5wi7&7 From a4ef2133ab29f32e4a612f7794cb787c6f5f6e4f Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sun, 17 Jul 2022 19:54:12 -0500 Subject: [PATCH 375/377] Remove old master server PHP scripts Blast from the past, buuuut let's trim the fat here too. --- tools/PHP/RSS1.0.php | 55 --------------------------- tools/PHP/RSS92.php | 37 ------------------ tools/PHP/index.php | 90 -------------------------------------------- tools/PHP/text.php | 24 ------------ 4 files changed, 206 deletions(-) delete mode 100644 tools/PHP/RSS1.0.php delete mode 100644 tools/PHP/RSS92.php delete mode 100644 tools/PHP/index.php delete mode 100644 tools/PHP/text.php diff --git a/tools/PHP/RSS1.0.php b/tools/PHP/RSS1.0.php deleted file mode 100644 index 30eb32585..000000000 --- a/tools/PHP/RSS1.0.php +++ /dev/null @@ -1,55 +0,0 @@ -'; -echo "\n"; -echo ''; -echo "\n"; -echo "\n"; -echo ' '; -echo "\n"; -echo ' SRB2 Master Server RSS Feed'; -echo "\n"; -echo ' http://srb2.servegame.org/'; -echo "\n"; -echo ' Playing around with RSS'; -echo "\n"; -//echo ' en-us'; -//echo "\n"; - $fd = fsockopen("srb2.servegame.org", 28900, $errno, $errstr, 5); -// $fd = 0; - if ($fd) - { - $buff = "000012400000"; - fwrite($fd, $buff); - while (1) - { - $content=fgets($fd, 13); // skip 13 first bytes - $content=fgets($fd, 1024); - echo "$content"; - if (feof($fd)) break; - } - fclose($fd); - } - else - { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo "\n"; - echo ' '; - echo 'No master serverThe master server is not running'; - } -?> - \ No newline at end of file diff --git a/tools/PHP/RSS92.php b/tools/PHP/RSS92.php deleted file mode 100644 index 4dd194089..000000000 --- a/tools/PHP/RSS92.php +++ /dev/null @@ -1,37 +0,0 @@ -'; -echo "\n"; -echo ''; -echo "\n"; -echo ' '; -echo "\n"; -echo ' SRB2 Master Server RSS Feed'; -echo "\n"; -echo ' Playing around with RSS'; -echo "\n"; -echo ' http://srb2.servegame.org/'; -echo "\n"; -echo ' en-us'; -echo "\n"; - $fd = fsockopen("srb2.servegame.org", 28900, $errno, $errstr, 5); - if ($fd) - { - $buff = "000012380000"; - fwrite($fd, $buff); - while (1) - { - $content=fgets($fd, 13); // skip the next 13 bytes - $content=fgets($fd, 1024); - echo "$content"; - if (feof($fd)) break; - } - fclose($fd); - } - else - { - echo "No master serverThe master server is not running"; - } -?> - - \ No newline at end of file diff --git a/tools/PHP/index.php b/tools/PHP/index.php deleted file mode 100644 index 93bb7c92b..000000000 --- a/tools/PHP/index.php +++ /dev/null @@ -1,90 +0,0 @@ - - - - -SRB2 Master Server Status - - -

- - - - - - - - - -
-
- SRB2 logo. -
- SRB2's HomePage
-
-
-
- Chompy World logo. -
- Chompy World
-
-
-
- SRB2 World logo. -
- SRB2 World
-
-
- -
-
-
- -SRB2 Master Server Status\nCurrent host: $host_addr
"; - $buff = "000043210000"; - fwrite($fd, $buff); - while (1) - { - $content=fgets($fd, 13); // skip 13 first bytes - $content=fgets($fd, 1024); - echo "$content"; - if (feof($fd)) break; - } - fclose($fd); - - } - else - { - echo 'The master server is not running
'; - echo "ERROR: $errno - $errstr
\n"; - } -?> -
-

Info:

-
Win32 SRB2MSLauncher Great job, "Gregor Dick"/Oogaland of Gregorsoft Software -
-

-

Version Info:

-srb2dos.exe (DOS/Allegro/WATTCP32 version)
-srb2.exe (Windows/DirectX/FMOD version)
-srb2sdl.exe (Windows/SDL/SDL_mixer version)
-lsdlsrb2 (GNU/Linux/SDL/SDL_mixer version)
-
-Srb2win.exe v1.09.4 (use Internet search menu)
- - - diff --git a/tools/PHP/text.php b/tools/PHP/text.php deleted file mode 100644 index 282b812b7..000000000 --- a/tools/PHP/text.php +++ /dev/null @@ -1,24 +0,0 @@ - From 22eceb403a4b3eeeac93fc6d7034a4d46c5efad0 Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sun, 17 Jul 2022 19:56:08 -0500 Subject: [PATCH 376/377] Remove legacy SRB2Launcher --- tools/SRB2Launcher/ReadMe.txt | 35 - tools/SRB2Launcher/SRB2Launcher.cpp | 1155 --------------------------- tools/SRB2Launcher/SRB2Launcher.dsp | 144 ---- tools/SRB2Launcher/SRB2Launcher.dsw | 29 - tools/SRB2Launcher/SRB2Launcher.h | 8 - tools/SRB2Launcher/Script1.rc | 355 -------- tools/SRB2Launcher/StdAfx.cpp | 8 - tools/SRB2Launcher/StdAfx.h | 29 - tools/SRB2Launcher/bitmap1.bmp | Bin 21558 -> 0 bytes tools/SRB2Launcher/i_tcp.c | 57 -- tools/SRB2Launcher/i_tcp.h | 34 - tools/SRB2Launcher/icon1.ico | Bin 2998 -> 0 bytes tools/SRB2Launcher/launcher.c | 19 - tools/SRB2Launcher/launcher.h | 34 - tools/SRB2Launcher/lilsocklib.h | 52 -- tools/SRB2Launcher/mserv.c | 400 ---------- tools/SRB2Launcher/mserv.h | 64 -- tools/SRB2Launcher/mservsdk.h | 65 -- tools/SRB2Launcher/resource.h | 71 -- 19 files changed, 2559 deletions(-) delete mode 100644 tools/SRB2Launcher/ReadMe.txt delete mode 100644 tools/SRB2Launcher/SRB2Launcher.cpp delete mode 100644 tools/SRB2Launcher/SRB2Launcher.dsp delete mode 100644 tools/SRB2Launcher/SRB2Launcher.dsw delete mode 100644 tools/SRB2Launcher/SRB2Launcher.h delete mode 100644 tools/SRB2Launcher/Script1.rc delete mode 100644 tools/SRB2Launcher/StdAfx.cpp delete mode 100644 tools/SRB2Launcher/StdAfx.h delete mode 100644 tools/SRB2Launcher/bitmap1.bmp delete mode 100644 tools/SRB2Launcher/i_tcp.c delete mode 100644 tools/SRB2Launcher/i_tcp.h delete mode 100644 tools/SRB2Launcher/icon1.ico delete mode 100644 tools/SRB2Launcher/launcher.c delete mode 100644 tools/SRB2Launcher/launcher.h delete mode 100644 tools/SRB2Launcher/lilsocklib.h delete mode 100644 tools/SRB2Launcher/mserv.c delete mode 100644 tools/SRB2Launcher/mserv.h delete mode 100644 tools/SRB2Launcher/mservsdk.h delete mode 100644 tools/SRB2Launcher/resource.h diff --git a/tools/SRB2Launcher/ReadMe.txt b/tools/SRB2Launcher/ReadMe.txt deleted file mode 100644 index 9aafe08b8..000000000 --- a/tools/SRB2Launcher/ReadMe.txt +++ /dev/null @@ -1,35 +0,0 @@ -======================================================================== - WIN32 APPLICATION : SRB2Launcher -======================================================================== - - -AppWizard has created this SRB2Launcher application for you. - -This file contains a summary of what you will find in each of the files that -make up your SRB2Launcher application. - -SRB2Launcher.cpp - This is the main application source file. - -SRB2Launcher.dsp - This file (the project file) contains information at the project level and - is used to build a single project or subproject. Other users can share the - project (.dsp) file, but they should export the makefiles locally. - - -///////////////////////////////////////////////////////////////////////////// -Other standard files: - -StdAfx.h, StdAfx.cpp - These files are used to build a precompiled header (PCH) file - named SRB2Launcher.pch and a precompiled types file named StdAfx.obj. - - -///////////////////////////////////////////////////////////////////////////// -Other notes: - -AppWizard uses "TODO:" to indicate parts of the source code you -should add to or customize. - - -///////////////////////////////////////////////////////////////////////////// diff --git a/tools/SRB2Launcher/SRB2Launcher.cpp b/tools/SRB2Launcher/SRB2Launcher.cpp deleted file mode 100644 index 4138676d3..000000000 --- a/tools/SRB2Launcher/SRB2Launcher.cpp +++ /dev/null @@ -1,1155 +0,0 @@ -///////////////////////////// -// // -// Sonic Robo Blast 2 // -// Official Win32 Launcher // -// // -// By // -// SSNTails // -// ah518@tcnet.org // -// (Sonic Team Junior) // -// http://www.srb2.org // -// // -///////////////////////////// -// -// This source code is released under -// Public Domain. I hope it helps you -// learn how to write exciting Win32 -// applications in C! -// -// However, you may not alter this -// program and continue to call it -// the "Official Sonic Robo Blast 2 -// Launcher". -// -// NOTE: Not all files in this project -// are released under this license. -// Any license mentioned in accompanying -// source files overrides the license -// mentioned here, sorry! -// -// SRB2Launcher.cpp : Defines the entry point for the application. -// - -#include "stdafx.h" -#include -#include -#include "SRB2Launcher.h" - -char TempString[256]; - -char Arguments[16384]; - -HWND mainHWND; -HWND hostHWND; -HWND joinHWND; -HINSTANCE g_hInst; - -HANDLE ServerlistThread = 0; - -typedef struct -{ - char nospecialrings; - char suddendeath; - char scoringtype[16]; - char matchboxes[16]; - int respawnitemtime; - int timelimit; - int pointlimit; -} matchsettings_t; - -typedef struct -{ - char raceitemboxes[16]; - int numlaps; -} racesettings_t; - -typedef struct -{ - char nospecialrings; - char matchboxes[16]; - int respawnitemtime; - int timelimit; - int pointlimit; -} tagsettings_t; - -typedef struct -{ - char nospecialrings; - char matchboxes[16]; - int respawnitemtime; - int timelimit; - int flagtime; - int pointlimit; -} ctfsettings_t; - -typedef struct -{ - char nofile; - char nodownload; -} joinsettings_t; - -typedef struct -{ - matchsettings_t match; - racesettings_t race; - tagsettings_t tag; - ctfsettings_t ctf; - char gametype[16]; - char startmap[9]; - int maxplayers; - char advancestage[16]; - int inttime; - char forceskin; - char noautoaim; - char nosend; - char noadvertise; - - // Monitor Toggles... - char teleporters[8]; - char superring[8]; - char silverring[8]; - char supersneakers[8]; - char invincibility[8]; - char jumpshield[8]; - char watershield[8]; - char ringshield[8]; - char fireshield[8]; - char bombshield[8]; - char oneup[8]; - char eggmanbox[8]; -} hostsettings_t; - -typedef struct -{ - hostsettings_t host; - joinsettings_t join; - char EXEName[1024]; - char ConfigFile[1024]; - char ManualParameters[8192]; - char PlayerName[24]; - char PlayerColor[16]; - char PlayerSkin[24]; -} settings_t; - -// Whole structure is just dumped to a binary file when settings are saved. -settings_t launchersettings; - -#define APPTITLE "Official Sonic Robo Blast 2 Launcher" -#define APPVERSION "v0.1" -#define APPAUTHOR "SSNTails" -#define APPCOMPANY "Sonic Team Junior" - -LRESULT CALLBACK MainProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); - -// -// RunSRB2 -// -// Runs SRB2 -// returns true if successful -// -BOOL RunSRB2(void) -{ - SHELLEXECUTEINFO lpExecInfo; - BOOL result; - char EXEName[1024]; - - memset(&lpExecInfo, 0, sizeof(SHELLEXECUTEINFO)); - - lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); - - SendMessage(GetDlgItem(mainHWND, IDC_EXENAME), WM_GETTEXT, sizeof(EXEName), (LPARAM)(LPCSTR)EXEName); - lpExecInfo.lpFile = EXEName; - lpExecInfo.lpParameters = Arguments; - lpExecInfo.nShow = SW_SHOWNORMAL; - lpExecInfo.hwnd = mainHWND; - lpExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; - lpExecInfo.lpVerb = "open"; - - result = ShellExecuteEx(&lpExecInfo); - - if(!result) - { - MessageBox(mainHWND, "Error starting the game!", "Error", MB_OK|MB_APPLMODAL|MB_ICONERROR); - return false; - } - - return true; -} - -// -// ChooseEXEName -// -// Provides a common dialog box -// for selecting the desired executable. -// -void ChooseEXEName(void) -{ - OPENFILENAME ofn; - char FileBuffer[256]; - - ZeroMemory(&ofn, sizeof(ofn)); - ofn.hwndOwner = NULL; - FileBuffer[0] = '\0'; - ofn.lpstrFilter = "Executable Files\0*.exe\0All Files\0*.*\0\0"; - ofn.lpstrInitialDir = NULL; - ofn.lpstrFile = FileBuffer; - ofn.lStructSize = sizeof(ofn); - ofn.nMaxFile = sizeof(FileBuffer); - ofn.nFilterIndex = 1; - ofn.lpstrFileTitle = NULL; - ofn.nMaxFileTitle = 0; - ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; - - if(GetOpenFileName(&ofn)) - { - SendMessage(GetDlgItem(mainHWND, IDC_EXENAME), WM_SETTEXT, 0, (LPARAM)(LPCSTR)FileBuffer); - strcpy(launchersettings.EXEName, FileBuffer); - } -} - -// -// ChooseConfigName -// -// Provides a common dialog box -// for selecting the desired cfg file. -// -void ChooseConfigName(void) -{ - OPENFILENAME ofn; - char FileBuffer[256]; - - ZeroMemory(&ofn, sizeof(ofn)); - ofn.hwndOwner = NULL; - FileBuffer[0] = '\0'; - ofn.lpstrFilter = "Config Files\0*.cfg\0All Files\0*.*\0\0"; - ofn.lpstrInitialDir = NULL; - ofn.lpstrFile = FileBuffer; - ofn.lStructSize = sizeof(ofn); - ofn.nMaxFile = sizeof(FileBuffer); - ofn.nFilterIndex = 1; - ofn.lpstrFileTitle = NULL; - ofn.nMaxFileTitle = 0; - ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; - - if(GetOpenFileName(&ofn)) - { - SendMessage(GetDlgItem(mainHWND, IDC_CONFIGFILE), WM_SETTEXT, 0, (LPARAM)(LPCSTR)FileBuffer); - strcpy(launchersettings.ConfigFile, FileBuffer); - } -} - -// -// Add External File -// -// Provides a common dialog box -// for adding an external file. -// -void AddExternalFile(void) -{ - OPENFILENAME ofn; - char FileBuffer[256]; - - ZeroMemory(&ofn, sizeof(ofn)); - ofn.hwndOwner = NULL; - FileBuffer[0] = '\0'; - ofn.lpstrFilter = "WAD/SOC Files\0*.soc;*.wad\0All Files\0*.*\0\0"; - ofn.lpstrInitialDir = NULL; - ofn.lpstrFile = FileBuffer; - ofn.lStructSize = sizeof(ofn); - ofn.nMaxFile = sizeof(FileBuffer); - ofn.nFilterIndex = 1; - ofn.lpstrFileTitle = NULL; - ofn.nMaxFileTitle = 0; - ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; - - if(GetOpenFileName(&ofn) && SendMessage(GetDlgItem(mainHWND, IDC_EXTFILECOMBO), CB_FINDSTRING, -1, (LPARAM)(LPCSTR)FileBuffer) == CB_ERR) - SendMessage(GetDlgItem(mainHWND, IDC_EXTFILECOMBO), CB_ADDSTRING, 0, (LPARAM)(LPCSTR)FileBuffer); -} - -// -// CompileArguments -// -// Go through ALL of the settings -// and put them into a parameter -// string. Yikes! -// -void CompileArguments(void) -{ - HWND temp; - int numitems; - int i; - - // Clear out the arguments, if any existed. - memset(Arguments, 0, sizeof(Arguments)); - - - // WAD/SOC Files Added - temp = GetDlgItem(mainHWND, IDC_EXTFILECOMBO); - - if ((numitems = SendMessage(temp, CB_GETCOUNT, 0, 0)) > 0) - { - char tempbuffer[1024]; - - strcpy(Arguments, "-file "); - - for (i = 0; i < numitems; i++) - { - SendMessage(temp, CB_GETLBTEXT, i, (LPARAM)(LPCSTR)tempbuffer); - strcat(Arguments, tempbuffer); - strcat(Arguments, " "); - } - } - - // Manual Parameters - temp = GetDlgItem(mainHWND, IDC_PARAMETERS); - - if (SendMessage(temp, WM_GETTEXTLENGTH, 0, 0) > 0) - { - char tempbuffer[8192]; - - SendMessage(temp, WM_GETTEXT, 8192, (LPARAM)(LPCSTR)tempbuffer); - - strcat(Arguments, tempbuffer); - } -} - -// -// GetConfigVariable -// -// Pulls a value out of the chosen -// config.cfg and places it into the -// string supplied in 'dest' -// -BOOL GetConfigVariable(char* varname, char* dest) -{ - FILE* f; - int size = 0; - char* buffer; - char* posWeWant; - char* stringstart; - char varnamecpy[256]; - - varnamecpy[0] = '\n'; - - strncpy(varnamecpy+1, varname, 255); - - if(!(f = fopen(launchersettings.ConfigFile, "rb"))) - return false; // Oops! - - // Get file size - while(!feof(f)) - { - size++; - fgetc(f); - } - - fseek(f, 0, SEEK_SET); - - buffer = (char*)malloc(size); - - fread(buffer, size, 1, f); - fclose(f); - - posWeWant = strstr(buffer, varname); - - if(posWeWant == NULL) - { - free(buffer); - return false; - } - - posWeWant++; - - // We are now at the line we want. - // Get the variable from it - - while(*posWeWant != '\"') posWeWant++; - - posWeWant++; - - stringstart = posWeWant; - - while(*posWeWant != '\"') posWeWant++; - - *posWeWant = '\0'; - - strcpy(dest, stringstart); - - free(buffer); - - // Phew! - return true; -} - -SOCKET ConnectSocket(char* IPAddress, int portnumber) -{ - DWORD dwDestAddr; - SOCKADDR_IN sockAddrDest; - SOCKET sockDest; - - // Create socket - sockDest = socket(AF_INET, SOCK_STREAM, 0); - - if(sockDest == SOCKET_ERROR) - { -// printf("Could not create socket: %d\n", WSAGetLastError()); - return INVALID_SOCKET; - } - - // Convert address to in_addr (binary) format - dwDestAddr = inet_addr(IPAddress); - - if(dwDestAddr == INADDR_NONE) - { - // It's not a xxx.xxx.xxx.xxx IP, so resolve through DNS - struct hostent* pHE = gethostbyname(IPAddress); - if(pHE == 0) - { -// printf("Unable to resolve address.\n"); - return INVALID_SOCKET; - } - - dwDestAddr = *((u_long*)pHE->h_addr_list[0]); - } - - // Initialize SOCKADDR_IN with IP address, port number and address family - memcpy(&sockAddrDest.sin_addr, &dwDestAddr, sizeof(DWORD)); - - sockAddrDest.sin_port = htons(portnumber); - sockAddrDest.sin_family = AF_INET; - - // Attempt to connect to server - if(connect(sockDest, (LPSOCKADDR)&sockAddrDest, sizeof(sockAddrDest)) == SOCKET_ERROR) - { -// printf("Could not connect to server socket: %d\n", WSAGetLastError()); - closesocket(sockDest); - return INVALID_SOCKET; - } - - return sockDest; -} - -// -// MS_Write(): -// -static int MS_Write(msg_t *msg, SOCKET socket) -{ -#ifdef NONET - msg = NULL; - return MS_WRITE_ERROR; -#else - int len; - - if (msg->length < 0) - msg->length = (long)strlen(msg->buffer); - len = msg->length + HEADER_SIZE; - - msg->type = htonl(msg->type); - msg->length = htonl(msg->length); - - if (send(socket, (char *)msg, len, 0) != len) - return MS_WRITE_ERROR; - return 0; -#endif -} - -// -// MS_Read(): -// -static int MS_Read(msg_t *msg, SOCKET socket) -{ -#ifdef NONET - msg = NULL; - return MS_READ_ERROR; -#else - if (recv(socket, (char *)msg, HEADER_SIZE, 0) != HEADER_SIZE) - return MS_READ_ERROR; - - msg->type = ntohl(msg->type); - msg->length = ntohl(msg->length); - - if (!msg->length) // fix a bug in Windows 2000 - return 0; - - if (recv(socket, (char *)msg->buffer, msg->length, 0) != msg->length) - return MS_READ_ERROR; - return 0; -#endif -} - -/** Gets a list of game servers from the master server. - */ -static inline int GetServersList(SOCKET socket) -{ - msg_t msg; - int count = 0; - - msg.type = GET_SERVER_MSG; - msg.length = 0; - if (MS_Write(&msg, socket) < 0) - return MS_WRITE_ERROR; - - while (MS_Read(&msg, socket) >= 0) - { - if (!msg.length) - { -// if (!count) -// printf("No server currently running.\n"); - return MS_NO_ERROR; - } - count++; - printf(msg.buffer); - } - - return MS_READ_ERROR; -} - -// -// RunSocketStuff -// -// Thread that checks the masterserver for new games. -void RunSocketStuff(HWND hListView) -{ - WSADATA wsaData; - SOCKET sock; - int i = 0; - char ServerAddressAndPort[256]; - char Address[256]; - char Port[8]; - - if(!GetConfigVariable("masterserver", ServerAddressAndPort)) // srb2.servegame.org:28900 - { - ServerlistThread = NULL; - return; - } - - strcpy(Address, ServerAddressAndPort); - - for(i = 0; i < (signed)strlen(Address); i++) - { - if(Address[i] == ':') - { - Address[i] = '\0'; - break; - } - } - - for(i = 0; i < (signed)strlen(ServerAddressAndPort); i++) - { - if(ServerAddressAndPort[i] == ':') - { - strcpy(Port, &ServerAddressAndPort[i+1]); - break; - } - } - - // Address now contains the hostname or IP - // Port now contains the port number - - - // Initialize WinSock - if(WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) - { -// printf("Could not initialize sockets.\n"); - ServerlistThread = NULL; - return; - } - - // Create socket and connect to server - sock = ConnectSocket(/*IPAddress*/0, /*PortNumber*/0); - if(sock == INVALID_SOCKET) - { -// printf("Socket Error: %d\n", WSAGetLastError()); - ServerlistThread = NULL; - return; - } - - // We're connected! - // Now get information from server - - - // Add games to listview box. - ListView_DeleteAllItems(hListView); - -/* - while (MoreServersStillExist) - { - GetTheNextServerInformation(); - AddItemToList(hListView, servername, ping, players, gametype, level); - } -*/ - - // close socket - closesocket(sock); - - // Clean up WinSock - if(WSACleanup() == SOCKET_ERROR) - { -// printf("Could not cleanup sockets: %d\n", WSAGetLastError()); - ServerlistThread = NULL; - return; - } - - printf("Winsock thread terminated successfully.\n"); - ServerlistThread = NULL; - - return; -} - -BOOL GetGameList(HWND hListView) -{ - DWORD dwThreadID; - ServerlistThread = CreateThread( NULL, // default security - 0, // default stack - (LPTHREAD_START_ROUTINE)(void*)RunSocketStuff, // thread function - hListView, // arguments - 0, // default flags - &dwThreadID); // don't need this, but it makes it happy (and compatible with old Win32 OSes) - - if(ServerlistThread == NULL) - return false; - - return true; -} - -void RegisterDialogClass(char* name, WNDPROC callback) -{ - WNDCLASS wnd; - - wnd.style = CS_HREDRAW | CS_VREDRAW; - wnd.cbWndExtra = DLGWINDOWEXTRA; - wnd.cbClsExtra = 0; - wnd.hCursor = LoadCursor(NULL,MAKEINTRESOURCE(IDC_ARROW)); - wnd.hIcon = LoadIcon(NULL,MAKEINTRESOURCE(IDI_ICON1)); - wnd.hInstance = g_hInst; - wnd.lpfnWndProc = callback; - wnd.lpszClassName = name; - wnd.lpszMenuName = NULL; - wnd.hbrBackground = (HBRUSH)(COLOR_WINDOW); - - if(!RegisterClass(&wnd)) - { - return; - } -} - -int APIENTRY WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) -{ - // Prevent multiples instances of this app. - CreateMutex(NULL, true, APPTITLE); - - if(GetLastError() == ERROR_ALREADY_EXISTS) - return 0; - - g_hInst = hInstance; - - RegisterDialogClass("SRB2Launcher", MainProc); - - DialogBox(g_hInst, (LPCSTR)IDD_MAIN, NULL, (DLGPROC)MainProc); - - return 0; -} - -// -// InitHostOptionsComboBoxes -// -// Does what it says. -// -void InitHostOptionsComboBoxes(HWND hwnd) -{ - HWND ctrl; - - ctrl = GetDlgItem(hwnd, IDC_MATCHBOXES); - - if(ctrl) - { - SendMessage(ctrl, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Normal (Default)"); - SendMessage(ctrl, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Random"); - SendMessage(ctrl, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Non-Random"); - SendMessage(ctrl, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"None"); - } - - ctrl = GetDlgItem(hwnd, IDC_RACEITEMBOXES); - - if(ctrl) - { - SendMessage(ctrl, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Normal (Default)"); - SendMessage(ctrl, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Random"); - SendMessage(ctrl, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Teleports"); - SendMessage(ctrl, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"None"); - } - - ctrl = GetDlgItem(hwnd, IDC_MATCH_SCORING); - - if(ctrl) - { - SendMessage(ctrl, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Normal (Default)"); - SendMessage(ctrl, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Classic"); - } -} - -LRESULT CALLBACK MatchOptionsDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch(message) - { - case WM_INITDIALOG: - InitHostOptionsComboBoxes(hwnd); - break; - - case WM_DESTROY: - EndDialog(hwnd, LOWORD(wParam)); - break; - - case WM_COMMAND: - { - switch(LOWORD(wParam)) - { - case 2: - PostMessage(hwnd, WM_DESTROY, 0, 0); - break; - default: - break; - } - - break; - } - } - - return 0; -} - -LRESULT CALLBACK RaceOptionsDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch(message) - { - case WM_INITDIALOG: - InitHostOptionsComboBoxes(hwnd); - break; - - case WM_DESTROY: - EndDialog(hwnd, LOWORD(wParam)); - break; - - case WM_COMMAND: - { - switch(LOWORD(wParam)) - { - case 2: - PostMessage(hwnd, WM_DESTROY, 0, 0); - break; - default: - break; - } - - break; - } - } - - return 0; -} - -LRESULT CALLBACK TagOptionsDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch(message) - { - case WM_INITDIALOG: - InitHostOptionsComboBoxes(hwnd); - break; - - case WM_DESTROY: - EndDialog(hwnd, LOWORD(wParam)); - break; - - case WM_COMMAND: - { - switch(LOWORD(wParam)) - { - case 2: - PostMessage(hwnd, WM_DESTROY, 0, 0); - break; - default: - break; - } - - break; - } - } - - return 0; -} - -LRESULT CALLBACK CTFOptionsDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch(message) - { - case WM_INITDIALOG: - InitHostOptionsComboBoxes(hwnd); - break; - - case WM_DESTROY: - EndDialog(hwnd, LOWORD(wParam)); - break; - - case WM_COMMAND: - { - switch(LOWORD(wParam)) - { - case 2: - PostMessage(hwnd, WM_DESTROY, 0, 0); - break; - default: - break; - } - - break; - } - } - - return 0; -} - -LRESULT CALLBACK HostProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - HWND temp; - - switch(message) - { - case WM_INITDIALOG: - hostHWND = hwnd; - - temp = GetDlgItem(hwnd, IDC_ADVANCEMAP); - SendMessage(temp, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Off"); - SendMessage(temp, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Next (Default)"); - SendMessage(temp, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Random"); - - temp = GetDlgItem(hwnd, IDC_GAMETYPE); - SendMessage(temp, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Coop"); - SendMessage(temp, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Match"); - SendMessage(temp, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Team Match"); - SendMessage(temp, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Race"); - SendMessage(temp, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Time-Only Race"); - SendMessage(temp, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Tag"); - SendMessage(temp, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"CTF"); - - break; - - case WM_CREATE: - { - - break; - } - - case WM_DESTROY: - { - hostHWND = NULL; - EndDialog(hwnd, LOWORD(wParam)); - break; - } - - case WM_COMMAND: - { - switch(LOWORD(wParam)) - { - case 2: - PostMessage(hwnd, WM_DESTROY, 0, 0); - break; - case IDC_OPTIONS: - { - int gametype; - int dialognum; - DLGPROC callbackfunc; - - // Grab the current gametype from the IDC_GAMETYPE - // combo box and then display the appropriate - // options dialog. - temp = GetDlgItem(hostHWND, IDC_GAMETYPE); - switch(SendMessage(temp, CB_GETCURSEL, 0, 0)) - { - case 0: - gametype = 0; - break; - case 1: - gametype = 1; - break; - case 2: - gametype = 1; - break; - case 3: - gametype = 2; - break; - case 4: - gametype = 2; - break; - case 5: - gametype = 3; - break; - case 6: - gametype = 4; - break; - } - - switch(gametype) - { - case 1: - dialognum = IDD_MATCHOPTIONS; - callbackfunc = (DLGPROC)MatchOptionsDlgProc; - break; - case 2: - dialognum = IDD_RACEOPTIONS; - callbackfunc = (DLGPROC)RaceOptionsDlgProc; - break; - case 3: - dialognum = IDD_TAGOPTIONS; - callbackfunc = (DLGPROC)TagOptionsDlgProc; - break; - case 4: - dialognum = IDD_CTFOPTIONS; - callbackfunc = (DLGPROC)CTFOptionsDlgProc; - break; - case 0: - default: // ??? - dialognum = 0; - callbackfunc = NULL; - MessageBox(hostHWND, "This gametype does not have any additional options.", "Not Available", MB_OK|MB_APPLMODAL); - break; - } - - if(dialognum) - DialogBox(g_hInst, (LPCSTR)dialognum, hostHWND, callbackfunc); - } - break; - default: - break; - } - - break; - } - - case WM_PAINT: - { - break; - } - } - - return 0; -} - -// -// AddItemToList -// -// Adds a game to the list view. -// -void AddItemToList(HWND hListView, char* servername, - char* ping, char* players, - char* gametype, char* level) -{ - LVITEM lvTest; - - lvTest.mask = LVIF_TEXT | LVIF_STATE; - - lvTest.pszText = servername; - lvTest.iIndent = 0; - lvTest.stateMask = 0; - lvTest.state = 0; - - lvTest.iSubItem = 0; - lvTest.iItem = ListView_InsertItem(hListView, &lvTest); - - ListView_SetItemText(hListView,lvTest.iItem,1,ping); - - ListView_SetItemText(hListView,lvTest.iItem,2,players); - - ListView_SetItemText(hListView,lvTest.iItem,3,gametype); - - ListView_SetItemText(hListView,lvTest.iItem,4,level); -} - -// -// InitJoinGameColumns -// -// Initializes the column headers on the listview control -// on the Join Game page. -// -void InitJoinGameColumns(HWND hDlg) -{ - HWND hItemList; - LVCOLUMN columns[10]; - int i = 0; - - //Create the columns in the list control - hItemList = GetDlgItem(hDlg, IDC_GAMELIST); - - columns[i].mask = LVCF_TEXT | LVCF_WIDTH; - columns[i].pszText = "Server Name"; - columns[i].cchTextMax = 256; - columns[i].cx = 120; - columns[i].fmt = LVCFMT_LEFT; - ListView_InsertColumn(hItemList, i, &columns[i]); - - i++; - - columns[i].mask = LVCF_TEXT | LVCF_WIDTH; - columns[i].pszText = "Ping"; - columns[i].cchTextMax = 256; - columns[i].cx = 80; - columns[i].fmt = LVCFMT_LEFT; - ListView_InsertColumn(hItemList, i, &columns[i]); - - i++; - - columns[i].mask = LVCF_TEXT | LVCF_WIDTH; - columns[i].pszText = "Players"; - columns[i].cchTextMax = 256; - columns[i].cx = 80; - columns[i].fmt = LVCFMT_LEFT; - ListView_InsertColumn(hItemList, i, &columns[i]); - - i++; - - columns[i].mask = LVCF_TEXT | LVCF_WIDTH; - columns[i].pszText = "Game Type"; - columns[i].cchTextMax = 256; - columns[i].cx = 80; - columns[i].fmt = LVCFMT_LEFT; - ListView_InsertColumn(hItemList, i, &columns[i]); - - i++; - - columns[i].mask = LVCF_TEXT | LVCF_WIDTH; - columns[i].pszText = "Level"; - columns[i].cchTextMax = 256; - columns[i].cx = 120; - columns[i].fmt = LVCFMT_LEFT; - ListView_InsertColumn(hItemList, i, &columns[i]); -} - -LRESULT CALLBACK JoinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch(message) - { - case WM_INITDIALOG: - joinHWND = hwnd; - InitJoinGameColumns(hwnd); - // Start server listing thread - // and grab game list. - GetGameList(GetDlgItem(hwnd, IDC_GAMELIST)); - break; - - case WM_DESTROY: - joinHWND = NULL; - // Terminate server listing thread. - EndDialog(hwnd, LOWORD(wParam)); - break; - - case WM_COMMAND: - { - switch(LOWORD(wParam)) - { - case 2: - PostMessage(hwnd, WM_DESTROY, 0, 0); - break; - case IDC_SEARCHGAMES: - if(ServerlistThread == NULL) - GetGameList(GetDlgItem(hwnd, IDC_GAMELIST)); - break; - default: - break; - } - - break; - } - - case WM_PAINT: - { - break; - } - } - - return 0; -} - -void InitializeDefaults(void) -{ - memset(&launchersettings, 0, sizeof(launchersettings)); - strcpy(launchersettings.EXEName, "srb2win.exe"); - strcpy(launchersettings.ConfigFile, "config.cfg"); -} - -LRESULT CALLBACK MainProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - HWND temp; - - switch(message) - { - case WM_INITDIALOG: - mainHWND = hwnd; - InitializeDefaults(); - SendMessage(GetDlgItem(hwnd, IDC_EXENAME), WM_SETTEXT, 0, (LPARAM)(LPCSTR)launchersettings.EXEName); - SendMessage(GetDlgItem(hwnd, IDC_CONFIGFILE), WM_SETTEXT, 0, (LPARAM)(LPCSTR)launchersettings.ConfigFile); - break; - - case WM_CREATE: - { - - break; - } - - case WM_DESTROY: - { - PostQuitMessage(0); - break; - } - - case WM_COMMAND: - { - switch(LOWORD(wParam)) - { - case 2: - PostMessage(hwnd, WM_DESTROY, 0, 0); - break; - case IDC_ABOUT: // The About button. - sprintf(TempString, "%s %s by %s - %s", APPTITLE, APPVERSION, APPAUTHOR, APPCOMPANY); - MessageBox(mainHWND, TempString, "About", MB_OK|MB_APPLMODAL); - break; - case IDC_FINDEXENAME: - ChooseEXEName(); - break; - case IDC_FINDCONFIGNAME: - ChooseConfigName(); - break; - case IDC_ADDFILE: - AddExternalFile(); - break; - case IDC_REMOVEFILE: - temp = GetDlgItem(mainHWND, IDC_EXTFILECOMBO); - SendMessage(temp, CB_DELETESTRING, SendMessage(temp, CB_GETCURSEL, 0, 0), 0); - break; - case IDC_HOSTGAME: - DialogBox(g_hInst, (LPCSTR)IDD_HOSTGAME, mainHWND, (DLGPROC)HostProc); - break; - case IDC_JOINGAME: - DialogBox(g_hInst, (LPCSTR)IDD_JOINGAME, mainHWND, (DLGPROC)JoinProc); - break; - case IDC_GO: - CompileArguments(); - RunSRB2(); - break; - default: - break; - } - - break; - } - - case WM_PAINT: - { - break; - } - } - - return 0; -} - diff --git a/tools/SRB2Launcher/SRB2Launcher.dsp b/tools/SRB2Launcher/SRB2Launcher.dsp deleted file mode 100644 index 386dc301c..000000000 --- a/tools/SRB2Launcher/SRB2Launcher.dsp +++ /dev/null @@ -1,144 +0,0 @@ -# Microsoft Developer Studio Project File - Name="SRB2Launcher" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Application" 0x0101 - -CFG=SRB2Launcher - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "SRB2Launcher.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "SRB2Launcher.mak" CFG="SRB2Launcher - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "SRB2Launcher - Win32 Release" (based on "Win32 (x86) Application") -!MESSAGE "SRB2Launcher - Win32 Debug" (based on "Win32 (x86) Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "SRB2Launcher - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /c -# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /subsystem:windows /machine:I386 - -!ELSEIF "$(CFG)" == "SRB2Launcher - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "SRB2Launcher - Win32 Release" -# Name "SRB2Launcher - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\SRB2Launcher.cpp -# End Source File -# Begin Source File - -SOURCE=.\StdAfx.cpp -# ADD CPP /Yc"stdafx.h" -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\lilsocklib.h -# End Source File -# Begin Source File - -SOURCE=.\resource.h -# End Source File -# Begin Source File - -SOURCE=.\SRB2Launcher.h -# End Source File -# Begin Source File - -SOURCE=.\StdAfx.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# Begin Source File - -SOURCE=.\bitmap1.bmp -# End Source File -# Begin Source File - -SOURCE=.\icon1.ico -# End Source File -# Begin Source File - -SOURCE=.\Script1.rc -# End Source File -# End Group -# Begin Source File - -SOURCE=.\ReadMe.txt -# End Source File -# End Target -# End Project diff --git a/tools/SRB2Launcher/SRB2Launcher.dsw b/tools/SRB2Launcher/SRB2Launcher.dsw deleted file mode 100644 index b716faced..000000000 --- a/tools/SRB2Launcher/SRB2Launcher.dsw +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "SRB2Launcher"=.\SRB2Launcher.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/tools/SRB2Launcher/SRB2Launcher.h b/tools/SRB2Launcher/SRB2Launcher.h deleted file mode 100644 index 3b9049f82..000000000 --- a/tools/SRB2Launcher/SRB2Launcher.h +++ /dev/null @@ -1,8 +0,0 @@ -extern char TempString[256]; -extern char EXEName[1024]; -extern char Arguments[16384]; - -#define APPTITLE "Official Sonic Robo Blast 2 Launcher" -#define APPVERSION "v0.1" -#define APPAUTHOR "SSNTails" -#define APPCOMPANY "Sonic Team Junior" diff --git a/tools/SRB2Launcher/Script1.rc b/tools/SRB2Launcher/Script1.rc deleted file mode 100644 index 1a27c0414..000000000 --- a/tools/SRB2Launcher/Script1.rc +++ /dev/null @@ -1,355 +0,0 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 272, 226 -STYLE DS_3DLOOK | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "Official Sonic Robo Blast 2 Launcher v0.1" -FONT 8, "MS Sans Serif" -BEGIN - COMBOBOX IDC_LAUNCHCONFIG,125,15,135,155,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Saved Launch Configuration",IDC_STATIC,120,5,145,45 - GROUPBOX "WAD/SOC Files",IDC_STATIC,120,55,145,45 - COMBOBOX IDC_EXTFILECOMBO,125,65,135,95,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - CONTROL 102,IDC_STATIC,"Static",SS_BITMAP,5,90,107,79 - PUSHBUTTON "&About",IDC_ABOUT,125,210,25,10 - DEFPUSHBUTTON "&Go!",IDC_GO,60,150,50,14 - PUSHBUTTON "Add",IDC_ADDFILE,225,80,35,15 - PUSHBUTTON "Remove",IDC_REMOVEFILE,185,80,35,15 - PUSHBUTTON "Save",IDC_SAVELAUNCHCFG,220,30,40,15 - GROUPBOX "Multiplayer",IDC_STATIC,5,5,105,50 - PUSHBUTTON "&Join A Game",IDC_JOINGAME,10,15,50,15 - PUSHBUTTON "&Host A Game",IDC_HOSTGAME,55,35,50,15 - EDITTEXT IDC_PARAMETERS,160,190,105,30,ES_MULTILINE | - ES_AUTOVSCROLL | WS_VSCROLL - RTEXT "Manual Parameters:",IDC_STATIC,115,190,40,15 - GROUPBOX "Executable Name",IDC_STATIC,120,105,145,50 - EDITTEXT IDC_EXENAME,125,115,95,12,ES_AUTOHSCROLL - PUSHBUTTON "Choose...",IDC_FINDEXENAME,225,115,35,10 - PUSHBUTTON "General &Options",IDC_OPTIONS,55,60,50,20,BS_MULTILINE - EDITTEXT IDC_CONFIGFILE,125,140,95,12,ES_AUTOHSCROLL - LTEXT "Configuration File:",IDC_STATIC,125,130,60,10 - PUSHBUTTON "Choose...",IDC_FINDCONFIGNAME,225,140,35,10 - CONTROL "List1",IDC_LIST1,"SysListView32",WS_BORDER | WS_TABSTOP, - 20,180,85,40 -END - -IDD_JOINGAME DIALOG DISCARDABLE 0, 0, 367, 166 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "Join Game" -FONT 8, "MS Sans Serif" -BEGIN - PUSHBUTTON "&Refresh List",IDC_SEARCHGAMES,5,140,55,20,BS_MULTILINE - CONTROL "List1",IDC_GAMELIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,5,15,240,120 - EDITTEXT IDC_NAME,295,10,65,12,ES_AUTOHSCROLL - COMBOBOX IDC_COLOR,295,30,65,130,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - RTEXT "Name:",IDC_STATIC,265,10,25,10 - RTEXT "Color:",IDC_STATIC,265,30,25,10 - COMBOBOX IDC_SKIN,295,50,65,110,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - RTEXT "Character:",IDC_STATIC,255,50,35,10 - EDITTEXT IDC_ADDRESS,255,115,70,12,ES_AUTOHSCROLL - LTEXT "Manual Address:",IDC_STATIC,255,105,60,10 - CONTROL "Don't check server for files.",IDC_NOFILE,"Button", - BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,255,70,105, - 10 - DEFPUSHBUTTON "&Go!",IDC_JOINSTART,330,115,30,15 - LTEXT "Double-Click on a game to join:",IDC_STATIC,5,5,215,10 - CONTROL "Don't download files",IDC_NODOWNLOAD,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,255,90,105,10 -END - -IDD_HOSTGAME DIALOG DISCARDABLE 0, 0, 287, 156 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Host Game" -FONT 8, "MS Sans Serif" -BEGIN - GROUPBOX "Game Type",IDC_STATIC,5,5,110,65 - PUSHBUTTON "&Options...",IDC_OPTIONS,55,30,40,15 - COMBOBOX IDC_GAMETYPE,10,15,85,100,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - RTEXT "Max # of players:",IDC_STATIC,35,86,70,10 - EDITTEXT IDC_MAXPLAYERS,110,86,20,12,ES_AUTOHSCROLL - GROUPBOX "General Options",IDC_STATIC,5,75,275,75 - COMBOBOX IDC_STARTMAP,40,50,70,95,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - RTEXT "Start on map #:",IDC_STATIC,10,45,25,20 - CONTROL "Force players to use host's character",IDC_FORCESKIN, - "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,140, - 85,135,10 - COMBOBOX IDC_ADVANCEMAP,45,105,85,50,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - RTEXT "Advance Stage:",IDC_STATIC,10,100,30,20 - CONTROL "Don't advertise server on Internet",IDC_INTERNETSERVER, - "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,140, - 130,120,10 - RTEXT "Intermission Delay Between Levels (in seconds):", - IDC_STATIC,10,125,90,15 - EDITTEXT IDC_INTTIME,105,130,20,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Don't allow autoaim",IDC_DISABLEAUTOAIM,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,140,100,75,10 - CONTROL "Disable WAD/SOC Downloading",IDC_NODOWNLOAD,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,140,115,120,10 - PUSHBUTTON "Monitor &Toggles...",IDC_MONITORTOGGLES,125,45,40,20, - BS_MULTILINE -END - -IDD_MATCHOPTIONS DIALOG DISCARDABLE 0, 0, 142, 141 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "Match Options" -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "Don't use special ring weapons.",IDC_SPECIALRINGS, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,5,115,10 - RTEXT "Item Box Behavior:",IDC_STATIC,5,50,60,10 - EDITTEXT IDC_RESPAWNITEMTIME,115,70,20,12,ES_AUTOHSCROLL | - ES_NUMBER - COMBOBOX IDC_MATCHBOXES,70,50,65,65,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - RTEXT "Item Respawn Time (in seconds):",IDC_STATIC,5,70,105,10 - EDITTEXT IDC_TIMELIMIT,115,84,20,12,ES_AUTOHSCROLL | ES_NUMBER - RTEXT "Time Limit (in minutes):",IDC_STATIC,35,84,75,10 - RTEXT "Point Limit:",IDC_STATIC,70,100,40,10 - EDITTEXT IDC_POINTLIMIT,115,100,20,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Sudden Death Mode",IDC_SUDDENDEATH,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,15,20,80,10 - COMBOBOX IDC_MATCH_SCORING,70,35,65,65,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - RTEXT "Scoring Type:",IDC_STATIC,15,35,50,10 - PUSHBUTTON "Cance&l",IDC_CANCEL,100,120,35,15 - DEFPUSHBUTTON "O&K",IDC_OK,60,120,35,15 -END - -IDD_RACEOPTIONS DIALOG DISCARDABLE 0, 0, 142, 71 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "Race Options" -FONT 8, "MS Sans Serif" -BEGIN - RTEXT "Item Box Behavior:",IDC_STATIC,5,10,60,10 - COMBOBOX IDC_RACEITEMBOXES,70,10,65,55,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_NUMLAPS,115,30,20,12,ES_AUTOHSCROLL | ES_NUMBER - RTEXT "Number of Laps:",IDC_STATIC,55,30,55,10 - PUSHBUTTON "Cance&l",IDC_CANCEL,100,50,35,15 - DEFPUSHBUTTON "O&K",IDC_OK,60,50,35,15 -END - -IDD_CTFOPTIONS DIALOG DISCARDABLE 0, 0, 142, 126 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "CTF Options" -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "Don't use special ring weapons.",IDC_SPECIALRINGS, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,5,115,10 - RTEXT "Item Box Behavior:",IDC_STATIC,5,20,60,10 - COMBOBOX IDC_MATCHBOXES,70,20,65,60,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - RTEXT "Item Respawn Time (in seconds):",IDC_STATIC,5,40,105,10 - EDITTEXT IDC_RESPAWNITEMTIME,115,40,20,12,ES_AUTOHSCROLL | - ES_NUMBER - RTEXT "Time Limit (in minutes):",IDC_STATIC,35,70,75,10 - EDITTEXT IDC_TIMELIMIT,115,70,20,12,ES_AUTOHSCROLL | ES_NUMBER - RTEXT "Point Limit:",IDC_STATIC,70,86,40,10 - EDITTEXT IDC_POINTLIMIT,115,86,20,12,ES_AUTOHSCROLL | ES_NUMBER - RTEXT "Flag Respawn Time (in seconds):",IDC_STATIC,5,55,105,10 - EDITTEXT IDC_FLAGTIME,115,55,20,12,ES_AUTOHSCROLL | ES_NUMBER - PUSHBUTTON "Cance&l",IDC_CANCEL,100,105,35,15 - DEFPUSHBUTTON "O&K",IDC_OK,60,105,35,15 -END - -IDD_TAGOPTIONS DIALOG DISCARDABLE 0, 0, 142, 111 -STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "Tag Options" -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "Don't use special ring weapons.",IDC_SPECIALRINGS, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,5,115,10 - COMBOBOX IDC_MATCHBOXES,70,20,65,60,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - RTEXT "Item Box Behavior:",IDC_STATIC,5,20,60,10 - DEFPUSHBUTTON "O&K",IDC_OK,60,90,35,15 - PUSHBUTTON "Cance&l",IDC_CANCEL,100,90,35,15 - RTEXT "Item Respawn Time (in seconds):",IDC_STATIC,5,40,105,10 - EDITTEXT IDC_RESPAWNITEMTIME,115,40,20,12,ES_AUTOHSCROLL | - ES_NUMBER - RTEXT "Time Limit (in minutes):",IDC_STATIC,35,55,75,10 - EDITTEXT IDC_TIMELIMIT,115,55,20,12,ES_AUTOHSCROLL | ES_NUMBER - RTEXT "Point Limit:",IDC_STATIC,70,70,40,10 - EDITTEXT IDC_POINTLIMIT,115,70,20,12,ES_AUTOHSCROLL | ES_NUMBER -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 265 - TOPMARGIN, 7 - BOTTOMMARGIN, 219 - END - - IDD_JOINGAME, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 360 - TOPMARGIN, 7 - BOTTOMMARGIN, 159 - END - - IDD_HOSTGAME, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 280 - TOPMARGIN, 7 - BOTTOMMARGIN, 149 - END - - IDD_MATCHOPTIONS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 135 - TOPMARGIN, 7 - BOTTOMMARGIN, 134 - END - - IDD_RACEOPTIONS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 135 - TOPMARGIN, 7 - BOTTOMMARGIN, 64 - END - - IDD_CTFOPTIONS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 135 - TOPMARGIN, 7 - BOTTOMMARGIN, 119 - END - - IDD_TAGOPTIONS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 135 - TOPMARGIN, 7 - BOTTOMMARGIN, 104 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_BITMAP1 BITMAP DISCARDABLE "bitmap1.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_ICON1 ICON DISCARDABLE "icon1.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog Info -// - -IDD_JOINGAME DLGINIT -BEGIN - IDC_SKIN, 0x403, 6, 0 -0x6f53, 0x696e, 0x0063, - IDC_SKIN, 0x403, 6, 0 -0x6154, 0x6c69, 0x0073, - IDC_SKIN, 0x403, 9, 0 -0x6e4b, 0x6375, 0x6c6b, 0x7365, "\000" - 0 -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/tools/SRB2Launcher/StdAfx.cpp b/tools/SRB2Launcher/StdAfx.cpp deleted file mode 100644 index 444cafebf..000000000 --- a/tools/SRB2Launcher/StdAfx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// SRB2Launcher.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file diff --git a/tools/SRB2Launcher/StdAfx.h b/tools/SRB2Launcher/StdAfx.h deleted file mode 100644 index 549cbf9ee..000000000 --- a/tools/SRB2Launcher/StdAfx.h +++ /dev/null @@ -1,29 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) -#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers - -#include -#include -#include -#include -#include -#include "lilsocklib.h" -#include "resource.h" - - -// TODO: reference additional headers your program requires here - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) diff --git a/tools/SRB2Launcher/bitmap1.bmp b/tools/SRB2Launcher/bitmap1.bmp deleted file mode 100644 index 01b7cecd9552752087bee882d4e9de29b4ef6d47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21558 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 -#include - - -#include "launcher.h" -#include "mserv.h" //Hurdler: support master server - - - - -static int init_tcp_driver = 0; - - -void I_InitTcpDriver(void) -{ - if (!init_tcp_driver) - { -#ifdef __WIN32__ - WSADATA winsockdata; - if( WSAStartup(MAKEWORD(1,1),&winsockdata) ) - I_Error("No Tcp/Ip driver detected"); -#endif -#ifdef __DJGPP_ - if( !__lsck_init() ) - I_Error("No Tcp/Ip driver detected"); -#endif - init_tcp_driver = 1; - } -} diff --git a/tools/SRB2Launcher/i_tcp.h b/tools/SRB2Launcher/i_tcp.h deleted file mode 100644 index 9cd34f930..000000000 --- a/tools/SRB2Launcher/i_tcp.h +++ /dev/null @@ -1,34 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// MSERV SDK -// -// Copyright (C) 1998-2000 by DooM Legacy Team. -// Adapted by Oogaland. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// 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. -// -// -// -// DESCRIPTION: -// Header file for the TCP/IP routines -// -//----------------------------------------------------------------------------- - - -#ifndef _I_TCP_H_ -#define _I_TCP_H_ - -extern int sock_port; - -void I_InitTcpDriver(void); - -#endif // !defined(_I_TCP_H_) diff --git a/tools/SRB2Launcher/icon1.ico b/tools/SRB2Launcher/icon1.ico deleted file mode 100644 index f54ce0d6a1f8b76b7b8e96cc82c9d7a1dbc89f3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2998 zcmc(gF=$&y7{@Q^1KSWv(;*G2plYC{nQw4IJ(QrN2HOy90@V_2=c!)uilj6UL8E7d z2GYh5I89M$n{=oO2}&r=;31UK9B7M|Y6>N-n<$noV+9Y_-<>2|4puVev)`r*m-^_lqDy+v=nbohex>&=dmyD)FP z;6{sR+w&RDW0Mbarf4(C%msv=U%Ya0zT>-`Y_XU;G2Zpb$rO{=j?nRw#a_l{*2ihn zvCYgym!Ijjpg{IMLeGaMdpViBV!Lsev&H*K3uI@1rdXtaZ6`YgGrnAM9Eq*Ye7|J! zGk1I5vS$3U`J?OjX}mbk%=Pq?fA~y1eEe8^`|~d}l3a>QbD54S(IlEglTPD{oC^!@x3JwK_KPosB3 zKWchwm^4i_4Kz%e-kPAMx2CtIw|^YIH#+?_{WbmFBhvKOoQ;M-!=O0__t-cUfA=WN zjP5aV28MnHHUo#DpMSKDgEKI27{|el`Nz#B1B-#h0AXn8UjbMQ8x2VY!N9_Yi#j|L z1B-Fz;aS|<;GO~+3>F3pgN4DuU}5mD6AT6h3xkEhz(5%;@?o$rSQsn}l;%Q*!NOo+ zumD*48;V&rT9Ons6uyGP`r0l>iTA~iBAreP_p=g3k+^p4nt1Twfw*<+mRMe17WH~v zJbLsX&V9 zHXFH@#n&3SFnmcuBh+CyJvlv~eJU5`a^b}2*5?CjgyBT)%vNf8P{Q=Y=-=1Rq-JLJ z$~c!wO^$ADo#B*bCMPGlDd(`18=R%4KlbaH$*B+Co9<|Pj^WhF=ZV1yxo{zT{ydS} zbFUY}aPwX>J~&?b^2Eu1=NhfnyE{4Su~Nx;1OY#H){7 zoqJNbtj5%AFt@-<>&)rf7XPopZyT?AxuBlj^95+T9j?cp)V>eK(qm(VLXdv@EO*-4 z39{1hT2w9s0TqJTQmHi5Uz~WeQLWu5m&=7hpm4(W;LStyU`}P=B3GYgbpQ1PE?y&}EHityYUvkS;_-pGMK0 zAy;+VsL K#?QfPwf_N_3^F|c diff --git a/tools/SRB2Launcher/launcher.c b/tools/SRB2Launcher/launcher.c deleted file mode 100644 index 4967a95cc..000000000 --- a/tools/SRB2Launcher/launcher.c +++ /dev/null @@ -1,19 +0,0 @@ -#include - -#include "launcher.h" - -int WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpvReserved) -{ - return TRUE; -} - - -void CONS_Printf(char *fmt, ...) -{ - MessageBox(NULL, fmt, "Master Server", 0); -} - -void I_Error (char *error, ...) -{ - MessageBox(NULL, error, "Master Server", MB_ICONERROR); -} diff --git a/tools/SRB2Launcher/launcher.h b/tools/SRB2Launcher/launcher.h deleted file mode 100644 index 12b10aad5..000000000 --- a/tools/SRB2Launcher/launcher.h +++ /dev/null @@ -1,34 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// MSERV SDK -// -// Copyright (C) 1998-2000 by DooM Legacy Team. -// Adapted by Oogaland. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// 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. -// -// -// -// DESCRIPTION: -// Header file for the launcher routines -// -//----------------------------------------------------------------------------- - - -#ifndef _LAUNCHER_H_ -#define _LAUNCHER_H_ - - -void CONS_Printf(char *fmt, ...); -void I_Error (char *error, ...); - -#endif // !defined(_LAUNCHER_H_) diff --git a/tools/SRB2Launcher/lilsocklib.h b/tools/SRB2Launcher/lilsocklib.h deleted file mode 100644 index 232f3753a..000000000 --- a/tools/SRB2Launcher/lilsocklib.h +++ /dev/null @@ -1,52 +0,0 @@ -// Unlike lilsocklib.c, since this takes code from SRB2, -// it is under the GPL, rather than public domain. =( -// -#ifndef __LILSOCKLIB_H__ -#define __LILSOCKLIB_H__ - -#define SD_BOTH 0x02 - -#define PACKET_SIZE 1024 - -#define MS_NO_ERROR 0 -#define MS_SOCKET_ERROR -201 -#define MS_CONNECT_ERROR -203 -#define MS_WRITE_ERROR -210 -#define MS_READ_ERROR -211 -#define MS_CLOSE_ERROR -212 -#define MS_GETHOSTBYNAME_ERROR -220 -#define MS_GETHOSTNAME_ERROR -221 -#define MS_TIMEOUT_ERROR -231 - -// see master server code for the values -#define ADD_SERVER_MSG 101 -#define REMOVE_SERVER_MSG 103 -#ifdef MASTERSERVERS12 -#define ADD_SERVERv2_MSG 104 -#endif -#define GET_SERVER_MSG 200 -#define GET_SHORT_SERVER_MSG 205 -#ifdef MASTERSERVERS12 -#define ASK_SERVER_MSG 206 -#define ANSWER_ASK_SERVER_MSG 207 -#endif - -#define HEADER_SIZE ((long)sizeof (long)*3) - -#define HEADER_MSG_POS 0 -#define IP_MSG_POS 16 -#define PORT_MSG_POS 32 -#define HOSTNAME_MSG_POS 40 - -/** A message to be exchanged with the master server. - */ -typedef struct -{ - long id; ///< Unused? - long type; ///< Type of message. - long length; ///< Length of the message. - char buffer[PACKET_SIZE]; ///< Actual contents of the message. -} msg_t; - -SOCKET ConnectSocket(char* IPAddress); -#endif diff --git a/tools/SRB2Launcher/mserv.c b/tools/SRB2Launcher/mserv.c deleted file mode 100644 index 0dd00e2bb..000000000 --- a/tools/SRB2Launcher/mserv.c +++ /dev/null @@ -1,400 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// MSERV SDK -// -// Copyright (C) 1998-2000 by DooM Legacy Team. -// Adapted by Oogaland. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// 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. -// -// -// -// DESCRIPTION: -// Commands used to communicate with the master server -// -//----------------------------------------------------------------------------- - - -#ifdef WIN32 -#include // socket(),... -#else -#include -#endif - - - - -#include "launcher.h" - -#include "mserv.h" -#include "i_tcp.h" - - - - - -// ================================ DEFINITIONS =============================== - -#define PACKET_SIZE 1024 - -#define MS_NO_ERROR 0 -#define MS_SOCKET_ERROR -201 -#define MS_CONNECT_ERROR -203 -#define MS_WRITE_ERROR -210 -#define MS_READ_ERROR -211 -#define MS_CLOSE_ERROR -212 -#define MS_GETHOSTBYNAME_ERROR -220 -#define MS_GETHOSTNAME_ERROR -221 -#define MS_TIMEOUT_ERROR -231 - -// see master server code for the values -#define GET_SERVER_MSG 200 - - -#define HEADER_SIZE ((long)sizeof(long)*3) - -#define HEADER_MSG_POS 0 -#define IP_MSG_POS 16 -#define PORT_MSG_POS 32 -#define HOSTNAME_MSG_POS 40 - -#ifndef SOCKET -#define SOCKET int -#endif - -typedef struct { - long id; - long type; - long length; - char buffer[PACKET_SIZE]; -} msg_t; - - -// win32 or djgpp -#if defined( WIN32) || defined( __DJGPP__ ) -#define ioctl ioctlsocket -#define close closesocket -#endif - -#if defined( WIN32) || defined( __OS2__) -// it seems windows doesn't define that... maybe some other OS? OS/2 -int inet_aton(char *hostname, struct in_addr *addr) -{ - return ( (addr->s_addr=inet_addr(hostname)) != INADDR_NONE ); -} -#endif - - - -enum { MSCS_NONE, MSCS_WAITING, MSCS_REGISTERED, MSCS_FAILED } con_state = MSCS_NONE; - - -static SOCKET socket_fd = -1; // TCP/IP socket -static struct sockaddr_in addr; -static struct timeval select_timeout; -static fd_set wset; - -int MS_Connect(char *ip_addr, char *str_port, int async); -static int MS_Read(msg_t *msg); -static int MS_Write(msg_t *msg); -static int MS_GetIP(char *); - -void ExtractServerInfo(char *serverout, struct SERVERLIST *serverlist); - - - - - - - - - - -void CloseConnection(void) -{ - if(socket_fd > 0) close(socket_fd); - socket_fd = -1; -} - - - - -/* -** MS_GetIP() -*/ -static int MS_GetIP(char *hostname) -{ - struct hostent *host_ent; - - if (!inet_aton(hostname, &addr.sin_addr)) { - //TODO: only when we are connected to Internet, or use a non bloking call - host_ent = gethostbyname(hostname); - if (host_ent==NULL) - return MS_GETHOSTBYNAME_ERROR; - memcpy(&addr.sin_addr, host_ent->h_addr_list[0], sizeof(struct in_addr)); - } - return 0; -} - - - - - - -/* -** MS_Connect() -*/ -int MS_Connect(char *ip_addr, char *str_port, int async) -{ - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - I_InitTcpDriver(); // this is done only if not already done - - if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) - return MS_SOCKET_ERROR; - - if (MS_GetIP(ip_addr)==MS_GETHOSTBYNAME_ERROR) - return MS_GETHOSTBYNAME_ERROR; - addr.sin_port = htons((u_short)atoi(str_port)); - - if (async) // do asynchronous connection - { - int res = 1; - - ioctl(socket_fd, FIONBIO, &res); - res = connect(socket_fd, (struct sockaddr *) &addr, sizeof(addr)); - if (res < 0) - { - // humm, on win32 it doesn't work with EINPROGRESS (stupid windows) - if (WSAGetLastError() != WSAEWOULDBLOCK) - { - con_state = MSCS_FAILED; - CloseConnection(); - return MS_CONNECT_ERROR; - } - } - con_state = MSCS_WAITING; - FD_ZERO(&wset); - FD_SET(socket_fd, &wset); - select_timeout.tv_sec = 0, select_timeout.tv_usec = 0; - } - else - { - if (connect(socket_fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) - return MS_CONNECT_ERROR; - } - - return 0; -} - - - - - - -/* - * MS_Write(): - */ -static int MS_Write(msg_t *msg) -{ - int len; - - if (msg->length < 0) - msg->length = strlen(msg->buffer); - len = msg->length+HEADER_SIZE; - - //msg->id = htonl(msg->id); - msg->type = htonl(msg->type); - msg->length = htonl(msg->length); - - if (send(socket_fd, (char*)msg, len, 0) != len) - return MS_WRITE_ERROR; - - return 0; -} - - - - - - -/* - * MS_Read(): - */ -static int MS_Read(msg_t *msg) -{ - if (recv(socket_fd, (char*)msg, HEADER_SIZE, 0) != HEADER_SIZE) - return MS_READ_ERROR; - - msg->type = ntohl(msg->type); - msg->length = ntohl(msg->length); - - if (!msg->length) //Hurdler: fix a bug in Windows 2000 - return 0; - - if (recv(socket_fd, (char*)msg->buffer, msg->length, 0) != msg->length) - return MS_READ_ERROR; - - return 0; -} - - - - - - - - -/***************************************************************************/ - - - - - - - - - -/* GetServerListEx */ -EXPORT int __stdcall GetServerListEx(char *host, char *str_port, struct SERVERLIST serverlist[], short max_servers) -{ - msg_t msg; - int count = 0; - - - /* Attempt to connect to list server. */ - MS_Connect(host, str_port, 0); - - /* Poll the list server. If it fails, depart with an error code of -1. */ - msg.type = GET_SERVER_MSG; - msg.length = 0; - if (MS_Write(&msg) < 0) - return -1; - - - - /* Get a description of each server in turn. */ - /* What we get is exactly the same as the output to the console when using LISTSERV. */ - while (MS_Read(&msg) >= 0) - { - if(msg.length == 0 || count >= max_servers) - { - CloseConnection(); - return count; - } - - ExtractServerInfo(msg.buffer, &serverlist[count]); - - count++; - } - - - CloseConnection(); - return -2; -} - - - - - - - - - - - -/* GetServerList */ -/* Warning: Large kludge follows! This function is only included for backwards-compatibility. */ -/* Use GetServerListVB or GetServerListEx instead. */ -EXPORT int __stdcall GetServerList(char *host, char *str_port, - - struct SERVERLIST *serverlist1,struct SERVERLIST *serverlist2,struct SERVERLIST *serverlist3, - struct SERVERLIST *serverlist4,struct SERVERLIST *serverlist5,struct SERVERLIST *serverlist6, - struct SERVERLIST *serverlist7,struct SERVERLIST *serverlist8,struct SERVERLIST *serverlist9, - struct SERVERLIST *serverlist10,struct SERVERLIST *serverlist11,struct SERVERLIST *serverlist12, - struct SERVERLIST *serverlist13,struct SERVERLIST *serverlist14,struct SERVERLIST *serverlist15, - struct SERVERLIST *serverlist16) -{ - msg_t msg; - int count = 0; - struct SERVERLIST *serverlist[16]; - - - /* Attempt to connect to list server. */ - MS_Connect(host, str_port, 0); - - /* Poll the list server. If it fails, bomb with an error code of -1. */ - msg.type = GET_SERVER_MSG; - msg.length = 0; - if (MS_Write(&msg) < 0) - return -1; - - serverlist[0] = serverlist1; - serverlist[1] = serverlist2; - serverlist[2] = serverlist3; - serverlist[3] = serverlist4; - serverlist[4] = serverlist5; - serverlist[5] = serverlist6; - serverlist[6] = serverlist7; - serverlist[7] = serverlist8; - serverlist[8] = serverlist9; - serverlist[9] = serverlist10; - serverlist[10] = serverlist11; - serverlist[11] = serverlist12; - serverlist[12] = serverlist13; - serverlist[13] = serverlist14; - serverlist[14] = serverlist15; - serverlist[15] = serverlist16; - - - - - while (MS_Read(&msg) >= 0 && count < 16) - { - if(msg.length == 0 || count >= 16) - { - CloseConnection(); - return count; - } - - ExtractServerInfo(msg.buffer, serverlist[count]); - - count++; - } - - - CloseConnection(); - - - return -2; -} - - - -void ExtractServerInfo(char *serverout, struct SERVERLIST *serverlist) -{ - char *lines[5]; - int i; - - i=0; - lines[0] = strtok(serverout, "\r\n"); - for(i=1; i<5; i++) - { - lines[i] = strtok(NULL, "\r\n"); - } - - strcpy(serverlist->ip, strstr(lines[0], ": ")+2); - strcpy(serverlist->port, strstr(lines[1], ": ")+2); - strcpy(serverlist->name, strstr(lines[2], ": ")+2); - strcpy(serverlist->version, strstr(lines[3], ": ")+2); - strcpy(serverlist->perm, strstr(lines[4], ": ")+2); -} diff --git a/tools/SRB2Launcher/mserv.h b/tools/SRB2Launcher/mserv.h deleted file mode 100644 index 8f32ae632..000000000 --- a/tools/SRB2Launcher/mserv.h +++ /dev/null @@ -1,64 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// MSERV SDK -// -// Copyright (C) 1998-2000 by DooM Legacy Team. -// Adapted by Oogaland. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// 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. -// -// -// -// DESCRIPTION: -// Header file for the master server routines -// -//----------------------------------------------------------------------------- - -#ifndef _MSERV_H_ -#define _MSERV_H_ - - - -#ifndef EXPORT -#ifdef __cplusplus -#define EXPORT extern "C" __declspec (dllexport) -#else -#define EXPORT __declspec (dllexport) -#endif -#endif - - - -struct SERVERLIST -{ - char ip[16]; - char port[6]; - char name[32]; - char version[16]; - char perm[4]; -}; - - - -EXPORT int __stdcall GetServerListEx(char *ip_addr, char *str_port, struct SERVERLIST serverlist[], short max_servers); -EXPORT int __stdcall GetServerList(char *ip_addr, char *str_port, - struct SERVERLIST *serverlist1,struct SERVERLIST *serverlist2,struct SERVERLIST *serverlist3, - struct SERVERLIST *serverlist4,struct SERVERLIST *serverlist5,struct SERVERLIST *serverlist6, - struct SERVERLIST *serverlist7,struct SERVERLIST *serverlist8,struct SERVERLIST *serverlist9, - struct SERVERLIST *serverlist10,struct SERVERLIST *serverlist11,struct SERVERLIST *serverlist12, - struct SERVERLIST *serverlist13,struct SERVERLIST *serverlist14,struct SERVERLIST *serverlist15, - struct SERVERLIST *serverlist16); - - - - -#endif // !defined(_MSERV_H_) diff --git a/tools/SRB2Launcher/mservsdk.h b/tools/SRB2Launcher/mservsdk.h deleted file mode 100644 index 722288e0b..000000000 --- a/tools/SRB2Launcher/mservsdk.h +++ /dev/null @@ -1,65 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// MSERV SDK -// -// Copyright (C) 1998-2000 by DooM Legacy Team. -// Adapted by Oogaland. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// 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. -// -// -// -// DESCRIPTION: -// Header file for the master server SDK. -// -//----------------------------------------------------------------------------- - -#ifndef _MSERVSDK_H_ -#define _MSERVSDK_H_ - - - -#ifndef IMPORT -#ifdef __cplusplus -#define IMPORT extern "C" __declspec (dllimport) -#else -#define IMPORT __declspec (dllimport) -#endif -#endif - - - - -struct SERVERLIST -{ - char ip[16]; - char port[6]; - char name[32]; - char version[16]; - char perm[4]; -}; - - - -IMPORT int __stdcall GetServerListEx(char *host, char *str_port, struct SERVERLIST serverlist[], short max_servers); -IMPORT int __stdcall GetServerList(char *host, char *str_port, - struct SERVERLIST *serverlist1,struct SERVERLIST *serverlist2,struct SERVERLIST *serverlist3, - struct SERVERLIST *serverlist4,struct SERVERLIST *serverlist5,struct SERVERLIST *serverlist6, - struct SERVERLIST *serverlist7,struct SERVERLIST *serverlist8,struct SERVERLIST *serverlist9, - struct SERVERLIST *serverlist10,struct SERVERLIST *serverlist11,struct SERVERLIST *serverlist12, - struct SERVERLIST *serverlist13,struct SERVERLIST *serverlist14,struct SERVERLIST *serverlist15, - struct SERVERLIST *serverlist16); - - - - -#endif // !defined(_MSERVSDK_H_) diff --git a/tools/SRB2Launcher/resource.h b/tools/SRB2Launcher/resource.h deleted file mode 100644 index d787fef41..000000000 --- a/tools/SRB2Launcher/resource.h +++ /dev/null @@ -1,71 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by Script1.rc -// -#define IDD_MAIN 101 -#define IDB_BITMAP1 102 -#define IDI_ICON1 103 -#define IDD_JOINGAME 104 -#define IDD_HOSTGAME 106 -#define IDD_MATCHOPTIONS 108 -#define IDD_RACEOPTIONS 109 -#define IDD_CTFOPTIONS 110 -#define IDD_TAGOPTIONS 111 -#define IDC_GO 1001 -#define IDC_LAUNCHCONFIG 1002 -#define IDC_EXTFILECOMBO 1003 -#define IDC_ABOUT 1005 -#define IDC_ADDFILE 1006 -#define IDC_REMOVEFILE 1007 -#define IDC_SAVELAUNCHCFG 1008 -#define IDC_JOINGAME 1010 -#define IDC_HOSTGAME 1011 -#define IDC_SOUNDOPTS 1012 -#define IDC_PARAMETERS 1013 -#define IDC_EXENAME 1014 -#define IDC_FINDEXENAME 1015 -#define IDC_SEARCHGAMES 1016 -#define IDC_GAMELIST 1018 -#define IDC_NAME 1020 -#define IDC_COLOR 1021 -#define IDC_SKIN 1022 -#define IDC_ADDRESS 1023 -#define IDC_NOFILE 1024 -#define IDC_JOINSTART 1026 -#define IDC_NODOWNLOAD 1027 -#define IDC_OPTIONS 1028 -#define IDC_GAMETYPE 1029 -#define IDC_MAXPLAYERS 1030 -#define IDC_STARTMAP 1031 -#define IDC_FORCESKIN 1032 -#define IDC_ADVANCEMAP 1033 -#define IDC_INTERNETSERVER 1034 -#define IDC_SPECIALRINGS 1036 -#define IDC_MATCHBOXES 1037 -#define IDC_OK 1038 -#define IDC_CANCEL 1039 -#define IDC_RESPAWNITEMTIME 1040 -#define IDC_TIMELIMIT 1041 -#define IDC_POINTLIMIT 1042 -#define IDC_FLAGTIME 1048 -#define IDC_RACEITEMBOXES 1051 -#define IDC_NUMLAPS 1052 -#define IDC_SUDDENDEATH 1060 -#define IDC_MATCH_SCORING 1061 -#define IDC_INTTIME 1064 -#define IDC_DISABLEAUTOAIM 1065 -#define IDC_MONITORTOGGLES 1067 -#define IDC_CONFIGFILE 1069 -#define IDC_FINDCONFIGNAME 1070 -#define IDC_LIST1 1071 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 117 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1072 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif From c7e7f5c3960942b23a817b06f57759e350ad1914 Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sun, 17 Jul 2022 20:01:43 -0500 Subject: [PATCH 377/377] Remove FMOD files Aren't used and definitely should not be in here anymore --- libs/FMOD.props | 21 - libs/dll-binaries/i686/Old/fmod.dll | Bin 162816 -> 0 bytes libs/dll-binaries/i686/Old/fmodexL.dll | Bin 1302528 -> 0 bytes libs/dll-binaries/i686/fmodex.dll | Bin 1256448 -> 0 bytes libs/dll-binaries/x86_64/Old/fmod64.dll | Bin 413184 -> 0 bytes libs/dll-binaries/x86_64/Old/fmodexL64.dll | Bin 1527296 -> 0 bytes libs/dll-binaries/x86_64/fmodex64.dll | Bin 1478144 -> 0 bytes libs/fmodex/inc/fmod.h | 2462 -------------------- libs/fmodex/inc/fmod_codec.h | 159 -- libs/fmodex/inc/fmod_dsp.h | 743 ------ libs/fmodex/inc/fmod_errors.h | 123 - libs/fmodex/inc/fmod_memoryinfo.h | 201 -- libs/fmodex/inc/fmod_output.h | 93 - libs/fmodex/lib/fmodex64_vc.lib | Bin 248676 -> 0 bytes libs/fmodex/lib/fmodexL64_vc.lib | Bin 249370 -> 0 bytes libs/fmodex/lib/fmodexL_bc.lib | Bin 145920 -> 0 bytes libs/fmodex/lib/fmodexL_lcc.lib | Bin 566264 -> 0 bytes libs/fmodex/lib/fmodexL_vc.lib | Bin 251478 -> 0 bytes libs/fmodex/lib/fmodex_bc.lib | Bin 145920 -> 0 bytes libs/fmodex/lib/fmodex_lcc.lib | Bin 566264 -> 0 bytes libs/fmodex/lib/fmodex_vc.lib | Bin 250782 -> 0 bytes libs/fmodex/lib/libfmodex.a | Bin 280138 -> 0 bytes libs/fmodex/lib/libfmodexL.a | Bin 280828 -> 0 bytes libs/fmodex/lib/which library do I use.txt | 28 - tools/fmoddyn.h | 582 ----- 25 files changed, 4412 deletions(-) delete mode 100644 libs/FMOD.props delete mode 100644 libs/dll-binaries/i686/Old/fmod.dll delete mode 100644 libs/dll-binaries/i686/Old/fmodexL.dll delete mode 100644 libs/dll-binaries/i686/fmodex.dll delete mode 100644 libs/dll-binaries/x86_64/Old/fmod64.dll delete mode 100644 libs/dll-binaries/x86_64/Old/fmodexL64.dll delete mode 100644 libs/dll-binaries/x86_64/fmodex64.dll delete mode 100644 libs/fmodex/inc/fmod.h delete mode 100644 libs/fmodex/inc/fmod_codec.h delete mode 100644 libs/fmodex/inc/fmod_dsp.h delete mode 100644 libs/fmodex/inc/fmod_errors.h delete mode 100644 libs/fmodex/inc/fmod_memoryinfo.h delete mode 100644 libs/fmodex/inc/fmod_output.h delete mode 100644 libs/fmodex/lib/fmodex64_vc.lib delete mode 100644 libs/fmodex/lib/fmodexL64_vc.lib delete mode 100644 libs/fmodex/lib/fmodexL_bc.lib delete mode 100644 libs/fmodex/lib/fmodexL_lcc.lib delete mode 100644 libs/fmodex/lib/fmodexL_vc.lib delete mode 100644 libs/fmodex/lib/fmodex_bc.lib delete mode 100644 libs/fmodex/lib/fmodex_lcc.lib delete mode 100644 libs/fmodex/lib/fmodex_vc.lib delete mode 100644 libs/fmodex/lib/libfmodex.a delete mode 100644 libs/fmodex/lib/libfmodexL.a delete mode 100644 libs/fmodex/lib/which library do I use.txt delete mode 100644 tools/fmoddyn.h diff --git a/libs/FMOD.props b/libs/FMOD.props deleted file mode 100644 index 785f11ce1..000000000 --- a/libs/FMOD.props +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - $(SolutionDir)libs\fmodex\inc;$(IncludePath) - $(SolutionDir)libs\fmodex\lib;$(LibraryPath) - - - - - fmodexL64_vc.lib;%(AdditionalDependencies) - - - - - fmodexL_vc.lib;%(AdditionalDependencies) - - - - \ No newline at end of file diff --git a/libs/dll-binaries/i686/Old/fmod.dll b/libs/dll-binaries/i686/Old/fmod.dll deleted file mode 100644 index 6b0e379d3196f4e65b288b60237f8321fae3309f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162816 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

8T>U`)v56pXqCWnP$9E&z&ZlRdB%)Q%Pdw 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 diff --git a/libs/dll-binaries/i686/Old/fmodexL.dll b/libs/dll-binaries/i686/Old/fmodexL.dll deleted file mode 100644 index 1ac9e21c99abdbc38ecb2545a201616d13455637..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1302528 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%0DTUA5%{Cm)W1B0lzeWk9HI7 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 z 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

IE%goqtoHLXJJb3C8U_G7c1TSq$e;?N-p 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

-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

^=quk;H)EjYWDFXU<0Q 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બL7^TmDJ(4*zQeX7$fj^8X)O05?|mkF)VlszG)g$Las^ zoNfOkdUK2Z)(~qgfaO#U|D+t*o&L8Sv9Z9~WTxqDE3H129nt?5e{mdZ1j%E^jh`@a z(&Q;qr%j(RbJpyXALq=SH~*&v3l}Y3vh?R=%TrgZT(x@5+I8zU{IYS=uba1|ZQZtg z$Ie~5_w3!b|G>dRhtrQ7J$C%W$y29)J9GBj`3n~_E?vHI_4jLk{CWMx&0BxnzLR

GJt; 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 diff --git a/libs/dll-binaries/x86_64/Old/fmod64.dll b/libs/dll-binaries/x86_64/Old/fmod64.dll deleted file mode 100644 index 2a8bab284c3a3146bec8ebb18363fbf9506863c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413184 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

}(B{a)ZlJZot3Is!xuSOg&Ymt}2r&(N%H$+YTTt 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 RbTEnaSsjvYx4l5sV{^p%g@-DAG;f8Ruh~$# zO)+7Q)GCqRhEiTF3Dnfusoz_7M@Oe0=}HToN1P+UX0$y;>w9e>CxZAk0=ls`19%O@UiIEZo+v1kjP-{)5F-pP_-YnM#wLe*b8 zK%*69(nFpk)cYidbUaX^OMLbxtZ?F98?9Iv+L;^?dslzzqR<*yA!9Y^u_@`c`z%>u z2)eWA3Y>7B2dD%|I=X+54i7tSW&MF1a$wV!%)x@b+3&7ww|65$GG*NG?>zD4lPb8v zd1l>a`?qIGBYNyYs){_EWk!!j7>0C&l1LPo7$9dXlp|lG==~=$rMJY*8cjqlf)xJI3w5TMi;|h-2$s<{N@t2AO^|7k zlc_A3X@Saw(NZ9-*O}CE2$t#U8`f8Fv#+xM$mapEUh^@LAw>zi4?S>cd(hhYY~qBp zw5AE!I1=*L!^S1i&b_GW9@D@3XmfJb_7SLB%HidWusK3p}?$rVbc1{5ouFnIk}1a<(&12 z4uVx>D1pZD#1Nif%+kW*su~aDH>rmP6z_pU+&fou2p`ERsOQ_{FlSvxF*iw>+K=eBmH=9s-LT-7S$t ze4I*KEuBj|^wE^J>(TLYr?0!^7tj?%S~9U4Anw*YUj57Cu^Wc?V@tC8(R4tj3d02o z1DNT&IrvQ*tC)iD6qo|vIq?9_>52Ts@B?dlO|)v3`zd0Dvdy^!W)j(u**lG2RdoOi zQvikwfD#A50&IrW!f&eMdD81#hZf56aryADpldhxbILu$?^CoL4xw=eh=KPh`ZTbF zj_1ot^#ubNqQ!Q5r~cw@-37lOR>Ms-?$y`UjOcxV*JL$Fla+R=iUko}%KFWhL-_IVQy+uo5{0 zmj5(dxc4Y(V?0gQ_Sfldl8NeP7o>nU1-$w1fj0&GQ;3Jj#-2)ou}U@endN%Wr0PL| z9sKuTznFkEUzP&hV&%q{eAeTB>Z z6!#cdi{>lgtYJOT=|p(Y^YTYhVwGYjZ^9UbBMEWCQ26uj4XPVZy`xgN#Czhgyh`|r z9Z7*bLtxMN_h4Iq>TORU@gFJJYEqt>0{cIilx~4NHwE^`5Rg#$Ce6ZChx{j0{&V2; z4od+XCc#)WOgiNH6xdUxL#F&-K|nD(Se7dp zBJPNHtEd9g(QtP7%g!FiP~3r@tnmWU_>!88STq^jn3ZC|?0*`|N5m#QKjE00Tuo~{ z#`5f-t0!jY_YO~x!^`7$APjB|y)qt?qFVc{s+tGcvn0ZU-K*`~XjP5jevVk0D++xc zy5-sqKsT=yac#iK=(5g<;++!mOgvM5j+uCt{EVE)eK16wo>n@D zn-+?!GQ~b=A6bcUtHNjX;!K-J(VcTw^#ihP>}aQYN&r3KQZ0bqPO_*@a^Y+ee$K~l z5IsPRyt6HxFCPokM`C*r(MsMuyjM$HMhQg6dyy*ifjAU5sSaoJn1txku&?gN@A#xEoOj z4Y5z}|Lk|b6p#|MvVI2MYPM%1HON8E*U#CBHEG>GN4WXcA9N>{zh=L#$PU@9sfyg~ zq^#{vx!Fni8!18SxPbLaz;Z>hJ><8qmzbMk?-~&~=}iJvw0z8{OvrHG)z0qbLawkt z``xxrI@w|-5Fyg;yINzi0t@Z#kDbzc?U)c5-YFx^F0}&(3{kdafkvUV76-scU#@%Q z57}IZZ2;f1ql~t%QsLeU+<^5Nw~&+XXB3kt&@DZTNU;2`vZr^qNTgh;^oigKMpa@k zTHO0bNygfA0=uX0Z)NDBw@H38I!wHHF^;jdnIh@leeRZ@klASK)R=qOYbl7Eg#;k3 zK6Z0jgTTI9(b^Q1znA>I+IdaLf;Wnxea^PhAHWSE(mgVoUTM9n(+;Gg#eY_}fSYv6 zCvMy#cJs}o97xXyc_I^+tkb^!!V?ntw{%gZ#9E{IpK_^4{c1HHS@%*16J&vY`;~r^ zF>|l}UQMn$qT)a@b4)eExL7F2W=%~SQ`FNa$kpZ1K6$AXLNAkf)&xd*DUswFc`A~p z*?J~)-%Tu{EL*w&d1m{}Hetha~ z-_MC}pU9t~F-~zXp5tJI_CYz0)KIpSHBNwY<)qw#nRS-Da0{kf=$mzlytoFu2OK-A z>J+ire!7-bJpaQNwdcS~Ys6;zax{N838*R70$+~#ih^Q3syU-gY!xt#&iOEn=o!D4 z?^gbwQ?eN<+vPgjJvv*A@4m9)=o$4Yel^N-2NB1|D1G`$3>c+wC_fl(uCPbTl|j! zz%j#lPvo86o=oKCX4rI~ssJ*jTEDd7DgXx%AXF_c^F-OgnZ)}%Rc z7ygIQ!2xePR3wR`1J=-hwMtOHJUB zLJBO-1(Rx`=|sAT9;3hA@1>s9&`JHx zfhRgq2s)VV(S^8bEXvjRrlsOb_4`To-PsCH*69wOks1$6#OSl6J_y-7b1ul^RV=awa@+;dTr^*g~lp+jLaJm zJr>GWVn43nCy~FC3Sn+*eTlc&Z0^%U!;gO@N`l!GhBw#yV-@egsK=VI79BhVfN<@N zqIL&d2}cYRC!fFzk(HD!pzJOMJfeVyaY2|>IKfyYiP*6pOSdzC4d>eZoJW$tX$sEu z_TT>|IsAnaB!(>Tl&#UKA(ApA!EuA2w8liwDl>{o)slzakcJ%WkcNbZi4-shzV3;- zmv<`e2$@J%*=IZnaNP8HPPvbu#+sDr2b2dzwV)gaG?D3+GC7%8ysTz&K^4*md@u6w z#xLzwzbZfP6C{^?avc+#Is&a*+YzOjK6`{TOgc{0y(f|Hqq@>9K2YT;R6nPD=?3nJ z$e)WAem61@^ROnx*90zDlE^=rf~5!0%-8j~SN?`F!Pv=>@#tr*56!waFo1x;+Chap zeB*5D?lLMmC6+TLk^j$j!C6g3=(%aJ;F#>yS+f3MYt%#Nv2o%?AnVVvV$3}NS)JLR ztE*Mo&6)=r1BLxP@^`h$u&cD@b%HIi-b`$ExBggiMR3!Y;~W4?(lJJ;H0uLdE~Zc; zrztEPRBUu1O=&$4o+?D)F=I3D(PU$9d4w`kGgmb?H8m9vbN_YY!CseK*mYOO=lC_R zG1Tp&YgE_!T`n6-a3cE9T42VnjC_?IzEnhhkbz=mi373$kaC3&sd!5B*C_5$@c(z{ zcPSW^u1>q1hDRR~-L%=y z>if@`^m(Kbmdg8T=oAx6Cy}U_IoWcVau!?7_>sg~4fFq1^4D zKd^No23q;glBe`QdDb7$$GiPIOz&6G{0B*s$W=$1Y~a9lEM$1bheGjlXc9~2?ToDH zeFGaw_$@Q~9gXeURBT!b=-Q# zewux&AX4V5P#q3pMJ7uh|0%XwliTElV)Y8Ft)ZRKYdz-OP)9E3DyJ7L=L+J^W!OOE zUg1yi*5RZCCX$!!d;bCwW_}Z}SQ+gQ1fd)8r?uLar!6AiV#B5-wJeE0pDJt?;k5Js zoymP|G|C^FcYN%cbRkaezF2E<{5MoM&A#l%@Ms~Fe}aeB~@1#gVyF0q$86^&;GBG-u6wT zh2M_!Hy1fAg>e7NmOk10jg}JozQ3iKd+Ht@XP*pS)GqE;|9_45yl>+DP72y?Xju7_c8oI9DdR8R=}^t&Sa5WjT?hCi)!>z)JMwJ%wOM#Z ztqbAZ_&*()X`&=$Q#1=)5G;^}C$T5;Px)UlQ@JGOjqeNQU58=r#l+`Z&VD^uINM$& z^DwfuHn|A&^9$uS>0_RqY3g}a#w{A`A?#_hzf3&KD63v53QFwP%5>{x7Df+skMw28 zeVy;N>&o}WA%1CQp=6Y1+Mmyq7KV3As)y7hA=z*70U8Q-NMlcQKUvR>SkK5Fxa0l7 zu0BaTssCw=dg3T>A@@-mu7CPtS9=HJpyfGd!@Nj+VNnL5UdE*@W8(5qn#P}Vh@ zH=)v$>8xtATBI)fDuvhOZmpCB(W#Zxb&EYM`RQ~%In@G5$2-}>cIpbrQ*R4k6k3=2 z<`;N=T4aqR9`PnzXJ<;QJKe2sIrCOpE;zQ^A6%fnbnzuN^D8MfR)4fN^N9|1w?4$T z!_d3>(d(x%RLQkd=0MXS&-GbNhnlX>ZrR{&6+=AKd-ep+^_deS4N)>%r=63U_75sd zzS7jRJ*2VkocI-ye%!ZimTn-VtRP*!Y-j@(&MH!me_j%_<5#0VM=$pPFu9ym7pTPL>6p~jIaM54AjxXh z6#BALyB7X>1{kfEy`ABqgdes?5iuYx=Mg{oyHxSVRFP_3aH&JXm9e>_hWfqlyKm-} zBXm#ghPah&vM+>`ojFow-}MmH6nDcb`d6cYoWwWw0(1&a!_W};!lHL=n>$6`ZJ$920yz!D`cv><- zBa4EZnqE}^ER-kr*GOW%wO)FdZ;q7ptUV3 zfBs?;NdKSfGZCvr$D7DM>M7yi6K^94Z;xgC1g)LI$lox^yx~6hHa(lQT~t-=lVdr@ zw`IxraR-IR{+)z50G}_3@7R8Pc^cmkjqjWkeD|}>0pAH4U%|KI8~*mU;XBL0SCho| zCnMRu-%nE%@JkYC-)Y@>|Cw%IFo|z`KfZAq-)S1( z1u6K}qk5!$=WBdr-;Qs@x8j@b;PZpe-SQE0mA0(+CEM6ut=jkm38cTVaG;GBXq-JH z(Z;p>d|Mm$d|MlLbG*FwW`!z$L8qQ4Nur+kdp&>Z)Mt+QrxM#a)Mg$NXqeai%L zC|Z|k#!A_POEr2&vT%uqC|6?>kFTY2)@HtGM)he>S~L9M^kg#-gA@779>+aR@kIbl z@T30|`hCS-OKy1+_^e)%^e9R0rx07=ZX;-$(RMin;chP>7ip2*-GbeR6GBu$3Ms^* zmA#RovS3ZX3dL6ivMWA;>MXkQu<9H_5zsX8`y@)oUdFF<>=1mV3`GC%L1u^CcOILH z%$+}$rlib{W{d|^?Z!8yYBvgBP#Ulua5$;ZxWsy_H7nM$w3Q~*Eq6gzsBod*^|9Z3 zb>S@citEL9+R{;RDeUZ%&qaV)Z(7<)WdGw2z(!X~QxDVCa{e7x;T)2Y zp|(1@O5w}wAZEjmXPvJl8y{LGLXJL?5u4e>R>GbQZTn*jT(Jeoodj|V!o7X|RQXUh ztXDRWG}!xw{Lp)qtnl}v*<*asahxOi?CHvMvN_V(WRHRuOl+bW?%UiHblCgm(%tsQ z5J>M`q{U_)0Kff)qHr}Fn}Lb6^x_neao4$9S7?-LUr#|<3QF+(g$M%#&PFptB`I?^ zWe^*}2#iX^+N=eyW|9%Sj+IozvCaL0*L;;9r(S>bXz42`kzi!Psm;#WUolaP?k(0&=#}X-)xVT2Jm~Dum@#KvvwNAuiJlMX47tKyL{{u z%I7zeOx8|1ouRaS333=E+mMjWp?XnESfd8TvzxpVu`MM!Ws>ga zCH%ehF43Cx?v}|o8o76Mk(B3hE7oUwug!I@m`94%koGrC>zB|&1gt}bC?OEu zFd95dqtI7B`M9I6{>`6K_0_*4Idr`!mVeB7m0YxtU$@*7Dq+BKAKSJ;zTeXK_{fT zW+K}irY}lYb>9-zC9=JP%!ss26Lnm_hF2o_L+nVTggG+T$77a=yeJCpdMSo!b#%^A`c9>94}nIQH@^EZ+zBl<v`hZ)eC=DVIzBTpB>U6l+SZNocv^&Hm*%L^sSuSyef{CzMq={)NzocwfB0 zzmDP#8P$=DUU*adWP!-2PN4zA1mGZRipPj%>u#P7=KgL@>c>>wIj*8)?p>t``w~-$ z+`U_60>tt!+9^LUQmv%7pF<%gifsS#^|6|U-e2lmMaf+DZ`F5qE1E>EQq+vOR#xmC zcEa!M=R~I|FlUpFl+35U^NGP}l+^j8I?Q>8-J{B6hUW?szDjuV{C-aSqyDD_NuE4g z^W@m9@}V?Ir1<4k!fku(pVKTxM_Qub)5Wq4SfJp$+$|%Ruw7YWAMMvVaCW+#O9Clc z1qfMiBWp{TgK>ou~f#pxDI8lhj|o`a4*}8O8&wuQ~nbbC(C*Rmy*bS!!(~i=YQTj z3(|p8Aoe z)?Wo8o^M8HGana1!HYcbeZn<&7D;%zO^N&u?w8t)e&{sbu~y(t(!(Gn@?Vv7+W1{H ziN#D(#^|bA`udNDuqEqOCqznFQ94abIG#lQ1C$I}qb~tse3Ud|zU;&269qjx7#%%H z5Jj_gEBsl7RGh>=5RRB;{Ds7>tQKB|WTtVVzL6(n6h4XTfR*(zaoSm50{VHlJvi5X{ajucQzy2CT1SO7VWNjM=^LCIGfmgxTBA>BZ{Wy{THe}Gnt03{Fg{DcV)#FY?iFDUl(vQQE z61K5QQWMIiDl6;WM*M=NdQd4P$cO>um_+{109IZ?gq5!LCWs|ojM?ZwD0k5(y|uiO zDkMZ`jjnctpM+ewQjv?H2)dY>OB<7sZ4Z}gnE=MFPQp{TgN)MQ(Ik?M`~Z3v4=#plR$;CL{%3gRvo=v-Wya>z z;7-Ya!+Wng#>}G59cFQ-IZ^80z~b3SSHv=pF@I?muQ9i>-fW@zqFA|?%=UJrE1p$Y z7SJ8YH+#RN(JscpxgoW+ebMP^4%-pf14mJ@HF3L;+`CX?*2xq`J6dA8)|;-K@jTO7 zp@8G?q-T>m@G%|{?iJso!9uN!B-KQ7wAn^yf)IN+{u>VI+ z0kT=gePnsvWSUKi^iwo%8A}WEvfqa0$g4_c3{!eoT_b`xP>sJ`D~FkpU-yO2l5SxY zRr94*)ZfyqtX?)z!n_s_T~#j)6lJ~{yIM@N8|`;blb4lulg8Ycevahajf=r8ed*N0 zCC3YIY2u?SX7eGIQ#RpH4eu|Dz@x3|&y2B7TV}3A}*`#^@(J)4i(st~@zi^Y7jk(Av%`Ru?f^}77 z$H%i{PZrZ1oy}P*BN}HO``H3HuIf3wHWV(_6e-{M%x*r^IBt7`S|Q=Cxb&c zi3(9d9`Kjn4x)Dz>zfYjDwf4e{UtJC5C_aTb(u!;Y%_M7P)NXf!?5xO8_!80`y@EIjCV;2 zBlv(&e+-*@SsU49>Xq0L1{=HNY{Q%BcDMdarBlcOY5x=U5I?7}#H?Eqh{OD!tlHjT0E6fi<`;p0^G(4Pq3 znC?_9Dz3Z47*~~BDOurt)=q{a;C&gd+J_iFn&$5w%GTK25ZMVS*GhsCUcM7 zGKxOH)O}^G2HAHqNQ?cW!JNs)<{o|3QeuTz{_Bd|t{(UlSnWLsNJX0NO2%x5{VbfQ+B(SS zyIbyrdJS(^W4UQH7C5LS&s9hWq=%m&O{!M9&0c=KN^-YcMVVDgp^)D1@WnY1?Ot)K z)WrJKFz$9|qA$zQ%CTP8iRL#{qf`hV&|`?6y}kc8@PxrdURjdaH> z9wa|5!-}lk0Os9iaoL}MH>|EkqN+@tT|Oc-jP)zhk?F1Q)$ikvyConM#4qB7AtU zbtP1svEH2m!yzp_4EF0~sv^#i9GuAQS@fcGo{*Pxp8Q&qv*}-xfLh6~LWaq%4PEUo zZ_EwPBY+TDkSc62j!huA_p7ca22&?-44^W%`Bck+)Od=Q1ZE>SKY2##jANYgkh%Qj|$axX;YL zVMAKlPqM><)K*bG+$?k=woX}KCe7dPzG4j&6ztCSN7W~OG@V`24b2Vj>=vpT+oASG zTL0o8WBBR~96v9~4vqKD@HL$4-QM6Szr<(lZ_HCFS-Xe2-~{H{DSiK;NYp4@s-U?S zOoB*S{%#~e1a_&iFu#HLXk`uxqQSFT3!+OkqM3qd8i-B;k^ABUjrn?~uud>_dav|R z<-PTBchUMd%a5SiCYRp1HtaXur-M(CN-XE6y2Z4;Bc4s4WX<@EoRGLykVV#(C4DVZ z2mtG=_(_%C_d+c0il32w5$W;agpdklyViH~W%ymTY-nl&gp_UN z@N}AWu=j`3$o>+XcmezYcWY4QJyk5KM)L-ve2TLV2ny~M#7b}$99KP|jIlP@RalOl z1%j2J$NnR7hi+LfUz}Dq;5H_ik0r@peuK~8QeegPh2_tjU7i8UCtA{)Oz%`-`BP!} z577@%OZSFq60-kHBv*Vt)|ZJyMhAj43uUZo19qh&z$^j-}!H0$mZ z1afB(j&P={Jy4v}&fa(vgwdEAh!LmUm5mxibJGCgUoqN~sf*(07<%+?ksVC5Vp04= z)#M=j*8UU((h+D0{A5Yjee$wkk3J^ToFAFXFy<`97)(nCm#|NRvA~{%st*&B zv_3e6?iFoXAFNiSYVET7*pN8lK#*PTiWYh$vLrh#N%D(%uWtRwy=(ywL2eYd?fX3V ztva8Pcrj4-(xNeH)lqYjy-;^{b#Y0x_v3~f`5dvO7Z$@QxI2NhhWw^Ac1zHz-@?qL z^S04{$|P=D^%vZlGs(n8_niJ z$^HFjaU34kn8oWQC@|p^%;HV#^$(&5d%WnyH|TWlXG`%o4inyDhjjK^TwN^0s^%45 z6U7y|cDfurQak=WcZ)jJ%4Y2p6Hg^MwzCqeCL2ittOe-kq-wGOY!<>bg$6lY}DVFq^)zlNR_NPD@)FFs;wxr6w0#bE={-81yb- zQ=dSy>u6vUnte{)Pp0lk_yGjC6{RvO*@f?=hCz&kGm+?rz&-pE6fMM{i+$h*wb z0ZC6nZ3sQsE})|IA-d7%Smjr}4Kk(sVKPt}Z2XUY?|m`{P5*S_DrPI2{p%-UzS>B>x`VEVMS?g+~`Bnr07G=9QFWkDF9_;l0$G0=3lETIlY_L%6vV1M)&V0*oZ7t8oPa1 zg!AAkvO%3DglTQEU;9)KvoEQ&xRqX(_*)+X(5$;fGfAb@5V>KpS~u)V*`Y}oIMke4 z3&NT(iGuOR(Vh%1#PGV4}qMmxDyGf%xD!RQr>7H6AX zlNZqpM61>fjmHFHCTt^}U@0QQrcYkv{kasZk6Ul{9)kK84TDjG<88Cgmc@U#7oNGL6N#_hRoV_M;nttigcT9m%j`y3VW6-VIHA)4 zGBOEdv;!nQEVZO4fn3HyDYa1Tu~GeI>-%7xXo-;zO{cPkwGXqgR^q!?h^j`fc$r~> zDJia`X1_hBL{opbP&x`%9Nke|=7}Pen4W9sbD2W2gNQ%lUMcqt%32vZ-Vs^qQ9FE1 z7|ZJxwZqK$)|5;O_u$@N5`bObfNmW8(l6d%>e}zt#L}T^Men^*fa<#^(#^V0f_3}C zOW}d5sP(~}$H^&>gIk;5YT}hpi7UBglx~;vC$ZU0D95T>4>VRxwK8AWKgpe&*|gt% zN!EGKioicR>jkJ0!GBBS^QDc0S1$!Xe6Zo&Zn%TnW0^xShI8+%+~h%|)B0yIhZB>i z{?EO?1%Y*!LT{}(xU=%O4aUK(M)O-~)PRMsRa9y0tCqBGaIch`CFQ)&2IJWT@Qvrw z&^*hrpQ6$Yt@tC2%BZ&1Hhy<{EbqMi2Gz5qdJkbmk?Ixe>b2vv(wJq)(P%cdRIUrB z0WN|`t9GeiNb3V!K!Vhl9Y|~l-=~6=2GR`)(lkPh461hk0moRem&eM z(RiI2jnrCzT}EXpqr%24H}iHu`vgU#)#v_iXbsl}uo5}2FI&dNz$H0d@K$@**FV9r z2+l*+|G{sGx?7Vlj$LUeiA)Boo$8qB3sh{aZ0>;IH98c!`$W1`tCh|FWlfQ}Qz=Fj zVqvmPYlH=2OM_jQbypYGa)SaihGxFHZf6ja$Na`0n#HeFd%GL1tZv1GIc{jsIZGc^d)!;R+H+YzlV^ zJt~f#9V7(SJ%PG4@v{_;oUTSh&h6E#nZ;YBKZgRLoqy@*O43;ZD8C{69wvWcyVt*% z;(P1p?leKg`z7+etjch1R;_F67hcdyVodG8<=#hF1iKVBN<->kGI@pyORUr6>jw zo=V(-fRzX9%Xz?_u>@60C)!ukN>^mo?{@GC03qri?@j!c?v_}wFS@?6?*V5V11kN7 z^+NUAXhbadBNtC{E8>;NGu|&7W(Q(1y|#l??Lmt_!5eM*I#t2(67WGPXx8nec4o(W z)b0ya!6{be`B)WD|LY1q@)M~bp^}{n%69%6w0mJn;4?7`iW$hq?*1VzGBKl-1QFD)zKA z_m^x+ir18G+u9eb+hZ?+BqS(pv@$!uk5ccoyUoa+z4n6*G`@I`+}PM2MCI#iJb6ki z^AAW;NT_^|>hEGx_n|G{!Hnn9fqKYcliFX4dxc*@6xokaeI3&@u|t}%TtFbl;yXyQ z!j1orCgrFmO`UIDM~m#`S!!SPOWg*}K0m>5o3RTyn2w2Hr~TY%0=yEgP>oFm&jrzy zmROZ+2=O~y%NcvDG1~n25F1PA9WQ%(MZEy|LCUp=mt8Jvb}*Lp1NK|J6A;pPJ{kF= zw?wupj(K;s^{7&kSXbprZ;J&V_t*@_bZ-qy+*!t6l*WqvDLRvxG*cTY?33P7a-GCZ z^oz_^V!t$876`0dMf6XacYQE6oqb@B7>`1y!=mlqQAAmH#fsWv-_DiuiZ$44WUGaz zoibVyZPgB|oS_}ct{VS)zdWw|Ly1+0mxP`@{b%Ojq#<|dHY%TPBxV(6t0Uk{6fh)p zgFSZpP0~x2hbCc9G*)?JAfsOUFDiYi#~u!KuodS7t#|~yY+u4V+DA3`-S(|cHa@(> z2eB>(b5%vyP#qBj>CA~4hJF>gy>vW*xagQLTB*xNYj9zRlZ&h&<%dWR@= zU<)pjI`#et#b=#a%fOSnxrv-qD@_TA$J;vf+m?tQ2j<*xmYBrA!*wI zewi$kwOYUVyay!K=18w6bdCI}jr96L7eqRmLjGnI#wk?FFO3PE#BV0QBbpDTW#dRN znUk_t5Gx^$lrs9|kvx?15Jbs{`ZG4Vb0`m|@-V)YhvRuT`vx9}HaYr%Aw00j9{sy> z@UmgI_I-5eiN-l7Mh}`+oS*d~Z>;0IGFnoeFUjgv&zEF9s(vqRx9<+8rG4tY6g9Cd z(3cF)Lvq;fzO=($%7?^y{b@us9BN&r_h9`)u0(S}&O*3Xx}oJ1b*nh{(KlR1J1+8p zC-fuvb9v+gU#KRsrYTg>{DC<9&~gormWqS3*X1^z zC1J^rG$Rv^P79&R&XdRsr`#%2MK*-k6TWu}bcO?4SGMq#ef)*~n8ruNXJ8H<=7A{9d!M*Lxu_8lL>!RV zht{nztjwm)Rl+mG#}k6{D3(a6BKsDyQ==a%xc38hbzi=!mP;^4D-_(MZ>Z7*Dz{71 zy2Mk8T-+=B#g?TE38psd6YMXs8$4$DcSD$Nj{tHZ8v3v_#_A)c}kg%^{>^=|F9jHT|vs${!h_G*3HMyqumCzs-gtWxAgoyDNeAm&f zIrTg6rm_xVE2sD%U0l{7ic4+*kqd}KO+jk0-1;}lm*gdj4bjCQpVVTWZx+jwVg(fA z(85EWVK9U82JYJxMD|=15E298NPaM?xy6H}`QwBGdZ>mSm>a9~1d*c72|AP0OD!mUUmv(%U(5>b!|k(V87I{ZVMecm=2XaiH%C5 zAawNVWb+S>NlRN+$+7-*iJow8Kg2yG(`A!$-OIKELxCKnKpsqjRK8JXT2=LDuBl(hW)XsSG$3gcYjW%F za2yIZ(+~Z9y~+Oc^TYevle#_nnyo-N#V+=UYwD+_1bW$*q_z*3+)jUPvj2DzqaHV& zXB_A?Z)dcsps^wt`=iV)8n?4q8kfh{)g|PhUDuo_ymAxncL=tHc7$X(;0iZSGhCm* z7dQt{P``FHoB(>=L_dhV;T)+`wG(s2B z70PYIFY2$tT1^o~{5)N-6*)_E+GlfeJ)`r@S71 z!UGj}?}d~K2q*h`1uh`p;T6bBsel{E{T0a36>#Ya(9-@2*q;6#5c{5ZJj4!3566c8 zAhiO*#J^sFt>inr0y!xaSP5j^{A~A1SqjbAwH(Zr;e#&PMM2ay8I%aSP{r&Ma4i#M zJ5Ga@Y4!{X3s077lQtRn*ZQ0Uo}*lH3SFG(q$o<{QYA?{Hd)NT3AGxt;o{7OGx?j{ zP-Io*lp8q>9>evfV&hk4yH|wZIvT0H2eqttQn=;t?{*aShq0u?cbtkB%Q~v%$}Im7 z*=BNlRCx>URgxy25Zlt|9*#?}ifX;_BJ3LKNmbeYF(_HY5kq}2{XuN6o?Re)Gq=!Z zJgcZ*w9PuNA=T6RIU}(#{BC8ea*!Fz|4XBW=(As-D5An(KUaOjr&T3xv|Hd1aZjW%2Olc=6n6LLUo1wD zEY&Y!6gKV0uL1kl&mdXp%Y9i~b%6kgQeHi0s^<~zCnx2&pPZ6SP=ZOr@#4!44r}Le z*udk^fyW{87#P;ht~uKr#?k&Mg9jc5Igd%WQ*wbbf}AR&JNa;gdJuU@>up*$sGG_{ zi)Guj2-35IKVmARjZhSM4O?!b?I8vYci5TP_BqFiv*TZQhg@gK$Jh+HgP@|wN17RR z*}3Fk?^MM1vt_@o{AB;C03dZ0*n5xVZlkAbK_o($Qm8|4vYAZoO+=2zyop}-mtR`YSRCX)j^DbV;9n@fC1QZ|FY|#v zgA0_Fnbbg%I(l;n22`+&BSuyR-;e2!sTUfig?+nmzSBOUoTc7V5IQ}jZ*N^9eftLn z1+H^5Bh)W_+uu!=SN$V2Q)bo~xr%7S;rBEnC$cyvt#M?qPWa0f)5ZRFi2W=?)KwvT zjYvj0cxV-Oc>B;ZTSvy~%aIIZY>wdqf#F~d)^*7)d5sX?pFticDq7Y*&~ce{uOLB6 z^6CN++Feni;n!8a0j zjw*hDXIJrcxsk;MjPEW(-O3ZLj(l}o{RME3N1C;M3SMCSP}qmN^>G^EezNLV4j>)J z1&Q^=Xztq^QN>++ocqZP20F1Oy<(K);7Ws!{7^Yp)VL}}dDk}%CVZ@tm0}me?^YBx z0SfJx{qa0n7n^<*&uExlmA5*swc((R2NmRC_-2t+F{=NxiHC$T`*MUrkRAr;eTp&+ z#QeTX0e67fG16m`$v!=O^>mO1>)N|23V2{tM#)bi|8!A~u!SG&bg9){Jj^Wa<3I%J zf=aWFgApzwjC~}w;A-wPDnMnYYUv_`TV*cwLyJgqS4EzNtH9H42Sa*=oUAaBrjmxT z{xw4Re4>8{S{Xs>`dsUJnFYQ~{>&c1jbihUMLEQanH6o(#{ufD9YrjLXf%c>m zpF<8cNRHv;SOt11pTou^Th4F}>z3DHM&$hrNfM26nUgqF5}fBDDbLv{&oI^gJaE1UZLFnL&u#~l@nspR6&ub zYnV4j+shz0fAojB^!Y@qYHabk&{({w3m7}x{;sNawcGQ^!530J#rRO?J;*l}g$%oz z52sx__OxqD05Hz`J7KWlq5ksUtNv>os&>h}he)NkpF8&q!Y!ryy&X$0z%{U-BIYkT zk?Gh7O#o8PJ`{mZrsXbr*FNfKtYYtE+(6x6@6G$f#iBsa_v1zW@(kjZ`~%* zUeS|3LUO=*-SGArs}nqj!knQf@m@>|UXa_Os)(nYN$lq*(-IwlNP7mI;+;OW{$qn1 znW7hu#SM!r^SUx?(lQfOV-r;+(jpn}&{!OVvAoEEh^q_B8cza7F#kAWy9QnRiuW1b z7wX;0BDB5!-8dfo~)<}vgT2%tr`UegCGh|;_g@}T?K%lOh zQzJwiC`k*Q5Lr4lt?Sm=bT|K}HL^d~_~$hT&9BljaMFq1DubccxY>uxY^CjR%BYbW zHS&ml8#PA3GfUgMnkB!~H2HOG)F_D>-@R)Tu%ly$x zvpL;eKovqqR;FK)8yKjlAvFbknlMCB21+nOd>V$()w0jLI9L~;)gAuwfNu5ueC4)0 z-Ri*58;%JinxwxCEOSQG=QO*CT#PQ)FNbLFgut`XT)*|E&;8_^&F@Ql{bOEFHg{Sq zFA#{Vp}8G~`}qu~y?*zk*9V$Q8*-yRp{YKaitdO>PE!?TGb&B>sirzDRc*LZDK}I2 zyAt9oqeeUP2d(+pL92FA!1}Srp3IJ`63^~{YyqZb+c%D+l{~23xqUU-q0$7Kj-jg- z(=Wa6(>epHpRMvvV6!=mt;ShcUN0}bZZuQqZMO`l-NHQZ>EBie%wR?<)k0;RX@hZA^QUu zv7$tNg!M^hDrQAza?Yr$Vw`-TOQBM2_YiU0kqVSd>hoKZXu~BQ&YtUS;r9?7^|p`} zrr8&Pw{#mJ1qUmth@XQ*8P80t+1iK7Z0SK==4@TL@L*lDBgFg4n$-ibW>}dKaQc+K zSMPh20BfweUDbIrLfD0ugE4w#O;^=isjk^oHCuia-_%=^P%c`+c#z z!QL5j8!tB_i)W{W&NkYRyJTI%5;!|tWr_MJy*I`D*F>C5i9xmJp>SlS6Gz@bOZJatvEQD70On%h-XD^GMF4dd52=&tNS znv{3hDt0Ii%gHU;cU4X9AUkzU7pRu3Sr3ny8tKT{XB+e@*?i5 z#sk>9+3E@ni*yidH_^VeH~jgt*%UI`9^@}&kbMP%!oEW$UB9pYQSn#QEzYQDdwe6=stU*JjUk^w6V`>KvY5vZnlteJ46A@<*R zwOpkeFivmn!;$W{?_xg{q}f(QW->8KB1ySs`O~7H4`0dtynw?X8W}tEL3H|uIijI2 zAat1-RoZ@Sxjx><#p^pUX7Plrkebvu};Q|iZ;`Ka(uE-=dL3o{$fHmObBMINK=#s0b?bJ{-Y zik>)Eu!zOk|0IPDoRdK z_i2#xzX{R1BoAO4pZFqC-=&$=VM5+F<^$p;yh08ywDhnD1+DL86AelNm0Rp|JyG zf~VtML%!2gK1r4>u};g^Wj+06eYz}T{zYopkA?`2nI!+Szw9p3g5^tULzl}rFas-{ zuUZD_Nf{mHciZDKI#}0mvbXM1BlG{W_wIpF6=&oBNp=$g3G6Ne2#UI3&}a}N!Iluz zoMZ#Luz_$VHVR=AAT^MfY`EAE0|6x-7Ok~bd$HEusP(O_?c0iNH3XDP6}hQ+dqqWE zzzbFD70vJS%sD67ETP)(`~Cg?`Yq(lIdggDnP;AvdFGjCW~LZv7j@3`%EG`CN<%H{ z0xv=m%KHc^3$j?KZ*@>$6TKB?7E8m|l0~{?p<7u{O=K~*D~qL)g{hGa_SfR_NN;+< z%ww*Z2ivnyk6L*QH1ntnk0+1elE>L?+OSI0KnM1w|mAt?`YFN@5op#NL%Pv2f=2 zaDPM3%F{EOT_T!U=2*L&^ziz4rVd8o=$-mR$-hk>PqCP`5Unppeg6DHe|V5xguu>L z8&USY`TcE3;dvun>t)vps=M)q^CmSiARZaX>W!h?nB=_Mhc4wVtIV9Z9tah#3MAr1(zxmj4c;xDN zr=JyrXOGELHeh@!#n{1&bM$$J>dkv;!-Dk%HP z-}Ps|Kwg}4=fr&Cn3*>w$7vXhoSykJa(tLsKC5iZh$ztdX#fpI#{I_F$%3hk2iDF~ zHFra>lZ>agGjOess-Qf$aa$ zvmXyc(l#6W3}-6KQ5cxYKH2wuY>bf>EczCAiCJk1Hvo94vb7ej(<08T&4Z~bOz1G; zaJPx|G9Y$0{?kv=EL|BjFsL_jU4aSGwdqY!e=6z46P81AoU zD=$<9nI{@`Gk-l>_v4YJ8+xXmr)M>n3!zTT{c1#L$GZcLU4ga$DBMuc86FwPpHdJW z-aOFQre_xxg!`#no%%&|m4Y2eDW4Rbt`y`=5xo~1YdSspMf%1A5C`=~b1+}eTr(MS zS~)N6^5VRy&gLw292)wFkRRs26x*2rJ8eW2f#94@m2HPvredorK7lsYMhY_Z?1C&Y zpZL~x)Hj33#abuGWSw9QmAE}&MwVJ8h?_Hji*%F9zPN}^dbgMvsdnfyK4F$@^%PO^ zaAG8BhCs_;Xx|#qRoz5kQCt-SjN^^7e0d1N#;)co1IE6ReA=q?Vu!H`Pi*$0db-o- zqc$bnQ`qLbhl4=ro%*1Sa+c)3&~#Mo*9{ueN!q2=V?>K0&WqK1=PooQCHY4rZ|s%*#za<0oewr;(2w1V!ryQXrR7Nz zJnjr&w*Hi~QNql1LRj^vVBaE+%J6 ze!{dR`6t7dOFqqPpFOOw56z(V+v!mdQ@O4ylK$NQwI87NefdSI_H}AMxj1`97R4Xh zLl}_xr^o}cS=zTR1@#;CZrQ*YFCa@8Cz%_2k&UBMO6W7>fRDBXDQzn=WJp&EJD(9i zORJ-hXN7w3x8K#YNyhNo4NtLSf27cL zbSsjh=F8vTJcsq!1U-BA!6RGU;+5JizE|O!X!>S!`(A{vL-`U-S;6{%Kd6`;^#fdg zp6S%Hx81Vq;A_6rj^gvTgTwYGea0T2BLMGh(_3Hd!`L2hw!YR!Iu%Dk0t0?9!Q7+7 zI&hFvv(aZp`rq{q1CnvJ&g8Nf@x9QP*cK^r`W$=o{0=EvhaO3LURTOiDd4UfYf6k+ z?pyYt>y9be?&g^&;|mkA_r#WLck@K?O;o;JCEMM6f%rOv`JR*E*3?H(+af@vhY_#^I#BH;Kh<`8HP;!rRr`)^@y& zjYj8S$G4PWuIPPO+BW-e&WC?kDk$^<`ga;MYxl-6eQOXuMF0fNsF`XnOXB1Fp@t@ZI{E*JsSWgOQ^T^fW#a!Kthmj?_4dvU2aG+<;|dMmdheEm#zAyhox3{Oht^)$=3Ae6df0TCDI8p-1aFf^3&bBWi4fnTxI-=?2 z6Dim_GKrPVJ==r%FS<6(fi4W2VBTDexpuMZ(cu@dJ&9|Q@EN8XZaT$*2ak7dYke)j zXB_aQ?$h)C(exH-!#;Y;#EY~rEy>L?900ck33*fw3|+fJNNO7Tvmc>cS^*D8^&G4) z2MS`u@w_!3qSi#9?Ee|Wq#Z`YP4t{RFsISlVaoLe+ zNIiNRsH%kk2sp?WDNW#fE7ybjbk~D>pkd>OItzDw_59s8rgXNSIM})C#M4&mjh}BV zMHWm@rst(Ro8&yQsM7f^_PK6ke@3`J5fZ~PU^{5&M!+4t9s$#sn(oT_MA=^&4*2DA zxJ=(_+K#v$-05>=wcE_|$fu_|X}@eT-xD<08NU^xbnanKEiD1b9l12`JIoR8<5O1A zQ)#X#keTyZ*BB0t_23*0b+k*3Op=TuZ@~57lYYlu=;hof^onkP5nI1A+%!LDUl^pE z|1^Jl!wy&0KY{5FIhenPf`8Z8-M>rHvR^FiR#*yDId4yW-fTD!r~REz_%L0#!_UMP z?MLShRCP|*rVt!sUZTtdHV>2jF2s#pOxJ!-kz{`Ab#0c(iWCFOlc^M=sXsOm>qXOP zmNY{R1+7g zysih2`SNp{Hp*ga~`y zKf@~>J;RjPy|Y~pF8Pu&(j*E$Rvmkn-TV76xxQ6a5(ykdpxrqNc<;B4z2pV z(H~ML!2GL9#%3)V5+juv_sx$^bxK@o4PyrD<^k$Kp~@lF2WRl zrL&pUjmas-bZ5(WtvONnnof~vqcPdp)<8y2v=upxK5Y(T9{Ta=DbY7j&IChWqQno- zm&NWj%cmz|w;9_|gY1m+He$B)kLZ0g0Uf)UV{bVbgg$CsQ(`=YjgHTFRyR_%ZF8%U z3R92cDcE!6?qjghIs$LNZ4ckx*J>KuO9iM6Gapy`+1m(!=jP;3*+F8?hEJ)8pbsJn!p>Kts$ zQtvW;`6Gqq&biu2sw{BLhPlFQ-==~%m=>!^Z}i3wsG{9+*k%z%$N~1HiDhm8bpZ2A z|6O`p+WO9IY;S&p;xbL$i|HxFEy;c|7-Aabge+5$fIAoy_Ap6V+ZaVvdY;Oqfn3<# zX6o;PAD-gikR9fkNVOPDPK~5r#rMubde|IamFL^`Qe zdIaD2i3!aE10gu4$jd};aa%gm&30D$^5;35UI>KtD`5IoIff(p3&6=?Uzo_UI4KaD zF$y;U-Qr9rp0HD3rJ7Sw4jR#?TwJ#<1BD;k47) z?1*sMnb=If<;fUM^BFJb`%l1TzTCq+^|h}HxACEt?GGNI{LK@JBMUJpF3Qq58C<0N z&W?je3>lMh0;%k%%-kq}lwZFk9jRUo&&)OQ4>avzHs+J_jMC||ww^~(^haS>>iEU% zspE@{_b8Hn@XZYz@V^GV-&?`ZUSuf9x7ABrHb)Xm2MJ@}whp&QQf+f+K`EFx=I)|J z9Z6aHs%l`n%y#G8c3d?u+MQ}(`y~m5-F7U|jGwsnRn@>0?y|*{ed@-3|Ni5S-TvHt zvPpC8Yf^rH?*7(^w`r~o?+ePDE|b4^&ACzwQzEk;cKY%XSGr}ZHRB}vQ#ed%Z_|mA z{O8w%Xv~cL#oX%P zn!L}KzYAveVAEga#C>KFvz+939XaY-FU5l~bu4*;Fo;Qx z(Z}R2^LIpw3r_`$<`rgG^w;>~H}VnbMWhsWs^c;^r&5Mam38718=V7Aq`*-rPdJm= zf?Bruq@ZtP^_VFSyOy+W3?nJ;{ez0^Pwtnh||PLZ@cseuRFgXm~h{ zk#?Zb;B-Bhd!nE4Kp&1d;?O2`)JKwvN`+313P%>cRk!GPNBaAtYVh$kpCiHu#ApL5 zH1IN<{0zbe*`&hY6UH2{$lKbqo$6cIOr6rMJ0$(80|~AHSfV zzfV8E-IsmbaTvrvL=xTjGy+nVKXj0}t%uU&KXYT>=o6HO6AaTR+FyB9*Y=(B(Y2;!E)FXsIg#(_M7fL&zaeL4ij$YJ&v6qsg_aD zAv^E!J6_=s=FFzo{Tw*|TdV!pm5AD~`E4c4Sh@WcjS6>-pw@iX|&!7lbo&l8tvk zXorr3zIpwt!s7DssQq$}`4YYn?=VIWyTZCWMoO#=jBgtAP*%l4+l}YI(RmYnfa4Xx z@+Jvzwh`j6LLC3!gjm`8L)hbWIG*EE5LqkOZ5G5fTOp_U=fCXQvXQ!0tj^teuI538 zY$!nHX!HF9{@b4KYU1p<|7m(uRiUj#GkNOWE}l|n#e02h<=+UoInRSB*4?s|*`g5Z!M)6}=yU9mK-r81<+Y!~9F?J+B0%sq;25 z8SuR<_;7Bvu-n5BY(82!kMrTiKHTZSJZz`3;CAMhXiW$7{12P%wJ`3!=h4LaIP+Io z#q43H#RR}S0vcUSU6jYF!=k4tVAbh3Ysm~RnNwi9t(Svu?rsV4KP=DEEym+ri)FzO zle}kT!SJvYOB8(T-ekOvq>TZ<>!OGZ?bo+{L%~qnu9?aT+o=2^Df6Bo|x1P~fF-F5NfJmkcmt3k;9MD$s#bR{B=>7S^K%>n z=k)EA6g%gWwvX3Yn}8O(<^V0UWl zly!(*j;D=|gP*W#h96W@bKtfR~GgV^I2Fd7u$pxX%JY5{1Snpsnr?VJOP0cARCWBahHuIHUyln<5hl; zmok!hnhxUvKT!31z_0jIDyB=Je@ z)+h4dBDSoPlI?KfUeCi50D?O(p0^p~>zW-+JIYssk|!|U zmGu-Jeet+RKu>gK!PoQ2w|u`V>q#7wDkSyHAh(^atY--)juf*T*g}-~6+*hzDOB3T zOjp+97KCST>HIu8*n4I;RgvaH%W|Qm;Or?AB(E2otHD{((H)S=sSpCsfPVA$DvZjn z$9Fye%d5px;YW^w6B=!}VksOsQFRjnLfB8e$P`7y<5ZV4I9 zLjZebfIfup#!?cNjT4E^T6+;ZXDDP>@up8yoFyn<{vK*P+)G|J-9Qr`qYkJKlR5AZ zo|->{lpbAzRn^OWHlPgcnbs&Xx5K zLSE(%Ww^;OONp^da*(14=ecLpNL*kl#x?W8%Y;L8k6shUbPEA^h(D^#6Cj4F8jGu` zA2TJ9JTu6|J)=^hEi`eV+RI=pGZzWaE6pNMg=JC+s%>T1NDe1P86e$d^96{IGf+;T zq845p^F}Vb%nuONExhf~N$u8WOMIfb1EqF$5?ChD%G?r-7$&B$FI8J6s6j+epwyLx zLcL5d60#|31&OR0TnaJFCX{Bw<;5c{*B$T++@LCu37Xi7&w%e92E0T3?U3libO#C~ zI#JxZ&%%ZF=8>MoJ;N!n3VKwaNi+%2eLd=3WwA?=N?_mUK!hVKi3$`SBkk`Pf2+hTAWKrvh;COUbNiu08J%mH>PHVsfBvyt(JUE$~m;@TGR7CHV37@DTWE7W|U} z-)zuj(&bz5Qv|*Ok6)RvodsShq#!DJ9JRqyXcPQV0e@71cUs_ySr(wnQRwH`;1yuL z%F4zCTBGD(0nhaFCAAgI?{KwVj|^l6Gu1h)w;t!T4%TH4G^cXE zxExF{id0*faA?O|2t~TmNHP@5?yb#o;KU>7;JNfCV0?b?wS%9CBp5=b=9I%H{Rck_ z?Elmh;T{hfUrdYC+F*M=^+r@!W4>Eo;T?|zeMW3d``MNuc7iSjw$Zu znBFsyWW8k~3?rPO7^W)|VSw^$)N>AXZm~^qH{0}{iQ=0QRnBXjD#O_FoX$LRdSRa8 zZszGd69wKPm%5Qy2o`94$4iEuIf{vb9LU}JEm*3i9*M^ID7wzjFc*S+=8%%^{ z^*S=EbKCJGPW)qWKwC_f28{F-O^PV0wd!t!tg`6*LF>);aJN zy1XC0sMg20yv|(2>rjDn&A>GT+6!CWXx>F4Uz)lN*g61}U*h-%hvw8nQn@ zEQ56fXSv&9&;U1p! zBofP0cZv*{S;B|&5wXkPBcM=vFi#c__jRX0lD{eRb#I7=h1jf5;wd<1)Glav*IZSN1wyBDr)SIpZ`W3+X>SIi|?dg`afao~56-*8Ksd zFa;bXm6;Mu*Zh}R_jm)kX+F@~9ui4)*3JBcS9 zrO37Ahlz8ws#7F6qKb@CCc{k`!(i6yPOB%cn*1e4}!m8*X_ ziaaF%%15|sRE+jWIt6OE3r`860$v^>6`NxM8M##kg=uK1R0P7*_yYn^bcXa)5=)_- zNZ1r%pE77%R82J#0B3;vS)l&f_Wc(HJb>47X6J`>d#s@d@*{rdB0 zlLY0U@uJ*~87biizVwF$qJW;l`sNA2NwN)q2!b6jr%I2bA_#ISv$BD(E5x0@kE>3I zC)_7vxI00>yv@3xfGLa$oKszJgs|f0_CQRGj`a@%`D#piiFh;LjssU9lqfvOBXE>( zU4TvLMv5Yvp)({vmnbs{?SYXD{BGf1cL3;RI>5@Nbm5bVzj(Q45~HjT|FRjUA#uvJ z?qwMKVbKks$7B`imnr`2ov2<~1uWHkjBX<;-G;|cM0`_73?PP9nz6RN~C9pEVsY2|f;v6AEOl;kO{HNH^ zz4GO53C%u^jr|a3>T`cPUi#eE8O!N&FL<_RpSxKF9yJ5|5@`3i8PUhj@9uNE>@+`> z1`-`EycStd@Ms@JuR&;c)+j(MK}as`&yY*&b~cIcZ9KyEl^hn2W)NvUkqG{o1RFm% zLSzDF5^$9nu+a=SX$H(9-~uzCmH;sklVt()crp~ok%S`!Matc6Gq^ELB0L{WA%x`T zDXc~V&$KqYP$6cHBR%wAGN>4@ah%v=0)dood{d~#hy=n|T187pSz{lbbaLL^iR7IQiPROd9|4?bwf+I|l$C9X z{jX=Zh0J)5v#EA+IR*9M+PsM%&I8;?6t+Y=jpqQK+S)FgAUkBeT#`LXGUK_n4H`{e zH>NpducWf1u54PzQV9M=jtOIDA&Ak3;Ts?n<(-nDKy-ninukxn$ z6FPnQzg4(wlB4kC@+yUEK;Z3k-FiFUt@#PfqxHOIC#M&32JCfCB{Zt?6N^0a9cz}U zLkh9aUEypxl9%5c;1EI|MeHj4Cx?J;Q{n_4ZIjyd{K@V$xm~``h;K5U>1)oFMd2r$ z`T1fWhov+NQ?cR)O(^;nLJL-LuZv!|hn>sXx9Gwi;y}F)S&L*$C^NG(+x628C6-v&B8?a z+vRx6TZNtFmdMa|70>1kzoW6QKa`;74PVa|DqeOvWxYkiT`w*j4yG@=8u#X%$I<+o zg-tm(PuM5ewoDVU_>2#j&@`6?jcfctW7+r;;}E%0lmFnb9%tUz#*up7Sy(ZCza6_Y z9Rvd`uz)kIG%X>}ma4Rea#0^PHtKI1dl@EU^e?yrknNx)iiDJUydtA2LNOLogP;A* z=M?dd4s(}ivD+tSH?zrYY0zkd!z}X7952~%JKQ$~XV<1l5XQJwh|;+`7}_7qKj_*d z^=K4(UGol1i~RTpLM63%fCl{m2Q>sjhL9`BB?^I1YS2jA(_B%K&B~f+m))9N9gvpb zy0l}(NY|x%Rxp$^JQcAzkZ|HMC0D3-8NE_Yc&!*n8~COroN$>jRT>%K#oosc#ea## z5u$=q(2J}9Ws}&iyEgwo>c#lLZ(QRJMrskTi?J~p06BKv!0~`FOgGI)8_>;ocPPfg zBo4-dgP{)PNmdLvGY6XpA(H5Ci}RN_o9;JxzIlw_XmoQBd%$2LX?h=Nm+Xsrf_+i! z!s;7c{Vx!s6Og0W7dV@qS1W<@qrdZlVWcX?cu-FF?m1SZGkVEb@zQW%sif?&Fx}Q- zRWz|o|9r0uVzFa|xwgbIw_naD6Vqf49y3m0U@mu>G=mo;na3%$!^f&^on!T_29dC? z0^9?DGq-i-*QPW*ClU3n(#4y>5rXp;WHn!40?E<0ZZ^Xxv{;NUljLe!NdAJXCe}&j z5#`pdU*z_DSB+o#X?2Q?tXND7n7eot9B zd_;(pyPJ_IIu!^(<2&BSf(*8|$v&2o(W{<@k>#T;Ihxz`KFJxqfRD&L>h?*7z)305 zA?h2OVTn5_Et<@CUUM27(0vRXSNkK&(;sn=AHmV%dl?O^VUky^IvJZh9j-Rsm68=rE=`rf1>eUG;yEf7}ocUT`SU>?hkMkZ2l|U&Jg)sIxy)X zyM~l?z>)4sdIB~hzNNEaW(%NL!11|$p4>1Z5E{r5s~59hzmb+Dhz1;Y zN-0!t+m_zfT+C++(e|dNf^0BcMPDEzyzHUi1XIq$ERznCl3=hrkNL&L%qL`piM7G( zVdiogyGI1)NNbyOEc|cYkzeGHpSC%$!$9*aojGjED?v-*Wq-9XB_%ttt;AUpI(Byuk%SRw z{KubSU0$peMtt5*h3+TpBSU@1B*QZQxaVvja}|WFqzB~~&S2XdZ!@D|W7f8}9L95W z+R^2Y$bdA*8)$RBpjM_|ZhDglZkDjQ-`UuK08^mntw?ii7DH7yh3r#uJLP5^*vl-b3k92f{qbovWyz|f|&rA=_H&me-8 zd3#V@0#RH50&u%rp|$xLsO2-RaT>2s6EEg}>WVz3So0&fK5(-bPB5tZMLyCaa}$ic zCC2fCua#u)LFOxMo0DTOL1BLz5)TI#VBl1oF(s7tvkkL1riY99g5n&-q;N{Z+gZW2XoAPK0LSz-ds7H}DiH)-4gmgonCscNAx&uFJEWD2<(#u$= zY}m;Q;{-02WPc}o%z`Y%XwGN9Ut#OS?`h!y6lfoIzyYqOhff2Y9l`wlO|Q$oHx7?V z`reD8X}}iGm+6hpqzkl6#pH5RWs_l^SNXrnqv)lWJl6B@Vz-*{afa}KrnZk zz;v(k5j2i$c(HLzfQv|wQB$H9zF_hDvji$$FNW8-PJY7yHdtnwwm!MysA zTPe2SVou_E@YDQoX3m;=k!pjOCQ-z+ExPOHg9=Yuf0?sz3m-y@Lr2M`ZuY zrS@{LzcaHyF7S~vxS+!(2TZH1QR2?O>nV>dR5O+5qd|rSI^Kg>(s_5wW7j?2Esyn> z^JgVNGvv5*Gu@9=x|!f*&iQj=()B(zUr#eT{wO%gwvTd>qm@|xh@gYv71k^*z={R| z6Pb%d^OQ{eCp{rX)<-$8%Moc#Y#tRe^L;9M5rO$9>0n*KlRon>ZeRZSO|SSO%?a#F zl1h~RfYWRW;1?#tvRB6vf1Zk-c)V+>{gh*8+oYE0^Z1a{B(4NpK+Leq5@DW-K1K*f zy(iPvZS)bO=TFLTMJDiOOlvndzu=>TN3gh^QewOfA+lB$FZ6rc|Q) zVFM{5vg3ZE!3lgPV=y@d&E&TxHml8ld zq&X=;YXOp7G#yU_klc^N>_#B?jFWk}&0LFgofDagDVAfsA^yS8C$zGo*Tt_nte z@y8&k74l-JymyC?0{gJu4LA{yHdzSZ_uzkrS(az%d-vZXoh12QnpXCp>Rc8X!%Pi@J~7)*^vBZ83` zTywz%!mPgl^drKK$aTZFE5V{|i<@sFqOvj$w{1+}Gp|u=J_|c=RI^T|yfVdg{Aojr zAjXQyJGxx@EdwSKaL2zkeAM~WS5t!JV>W^&NAO)iHJCxD%2Afq% zsRgy2(%i9vrF~DG`T1Pan?^)xy>oXs zhd(cWZfuvw>}*Y=Bn6c2#7OfUk&Uan%=Z>~=MEl;BTXVQ=}VY*1!$*9F(cm>RzR>a z{wPHB86#zHB^?WgkQPU-PG}w*j6|e7dR|_0YH{9(HOab>=QH-{d6%t`?`FO)!}ia# z9pz5Hre}O@-#tZUzP4dXB9!IbKGN z1r$+V&S+F~7>xV;MvF+ha=7q#89=h4DILQJW`ioSNpA`pnE*V2f zwBn!|#i$|IdLbN5(91|70~Hyl)TC3Oku_u!Kf)!0P>yT!kBEc7^siFfh@ZVn;qSxn z%wyzsR-*WY@z38THr=d5J33k?-b|$dzX{{zw3~aN@xlRxMq9FL{X?MW6EuSKemPx8 z$RVz%Ws}K_T+G5s7vo1Tmu@YXzf0lO)MlaYFh@+z6O;bMmwy#^K1;D&oBoQNrRUuv zHR#%WCD{ccn@w*0fpBX{WDWBzv&?=gk*-YOxj-Tem1;_Z z$C(;>{!KzAm`g>ps9{sbwdpvdWFBIPcX6TucM~G##kD_w(70W-J!yua016n@{sP<{ zMEeVhyk|H!qDPay(dJ!+}gxKH{gW^|Do5~!cMK$#A7N&f_`*!7^dIPX!j zM)OsT-lPOMQs)FiDU*%S8}+qs$PS~)`J*?wHhe(ZB4hn6suo=j-Y%&3!i(pCg7A2VOC zpF{jIOF}z**@w|LJ;t1tGiZYxc^7(4lz-0ktZVrqOn*H*ks$q?UwlGDSMJnmoa$K8Uq7F&L#JT_3;K+_baAvxFVz8A-k*iGXykoL?Q*|>Z zJnR<<80-SzFzqRQsTvfrJK|2O5qa^_9_LCdjGjwe2H=;^g>RKZ^otw^=+(DQQ}INwNRo7s z83RG-8(UAAt0ZbnIUMcyYiH+UZeq#}B~P)z>koLC?_8qv3qB(AK9UeNO5LfxK2cw3 z(T(csL-pm3-oRI9I}15nq0}@@U5?~e7bO)kMm1f*G`*c|osotNB|VZT>L&%QDR~vb zAFXoDFl$BTJLyf>yvve|t!ETrY7#ubV$89wa&kurYRT5OS8?9*Xe`m@}HDOvxL*%e7$}?NJ6@RM{67BRf^o=CSSaapb{`KD0l@u8U=nR+&Jw ziz1C?k@WIe(8#$(>C;iVpdxCI=A+j{9dyz%!!8y}0F^4~x5OsZs4KgLa7S^`Xn**P*D1pnNX7ED0jYT5s0z){%GxAPIdb7Uq>ax$lyHY z+AMQEK^#r(2WGj@aD8q(q|B4e zG~F0?Vf)+eG=i$iFX@LWoia)&!v;b0YQG)=CHq)vwEgVZb3{sMCX-W;CXKXcTe=*) zOh^BcYtvYfMb%zlE+%tEt+Us;9`r%%c51_NEg>8Il`S^2MKQx>gce8UpRGGqbxU2s zH)_AVc>$iR$VHOgfe^HdJ7^aVK~RIGv!v(oYx6rHtiJVbh}xE-ZWNLQ+{6C1RTE6+y)i3|jU1wRE@cOWXqDcUMkfXn7f)rq z|Kd+n55|_=sp*|)B`>DNt`%d0PouY@A|oNngux_b#^qWsGE{z1x-0T)0W#0Yxefli z{Go6weM~XJB&QQ^dy}OO-AhaJJAN;sqhm-U{rfVZihlMh+R{6DwJ47cH;?eK=n`Uo z{0>AXLo7c&ep2NUp5_>nU(4awGKI*S>}<|428gD1cQe*?PcVC6Ulm(zux;=-TY({) zh_^KzWs5hxbh!0Y6WiD(^X{403aMm3R#gT)s4}UYg05wRn7*qZXe`PIaJQN90*f>3 zxCyW<$!Si>=xpTVim7rmzA!l3r-JP5lo zD3}~k=#92P0duez27aTZk7fMxwYt@yF<8cP88o_)qcr`O7O3W&bQIR5&f)u=T8dAFPq=}7<*N<(y_95bt03+KnF~`Pb`4Y2A zW?pD8cM~Lq1naUR{2gn2g~f=A%}5eb_M#c$P8xcp&`bG=Sr91Rn1cMoiG>;AWmxP9F;MUS>&jG z>UoNCc8+>iJyVp=9`!Ee?;Q0z^}JU-uU5~|>Upkurl{v}WRA{JFRAD6c%tYPT`$XA z9PE07ku-Ktq9(oM%@DwE^nY=PlPN4BSX)vCA>nC$Bk3{xFkt51I5Cdn2FHj?h{5zFAK;f2n@{~$~M&ZHJT<)=CX3Z1pR^|OS=e{Pjosd*QGsB4q1 zAsRd6q+iI|?%%1B0D6*ujtrhhf&7vF1>&?NU4&=!PSSTKE$5osZphu`ll!Hy?BF&N zIn1-b;B+rWhLerw<_*p#Nn;r~v4T|~r)Z9s+jr%R8HHLnsr9qO#ys*qFqpjAou1se zkEaK#3*(?jRgX}WY-}3RI|w_Ps1f|p>2CZD^)UkbA@LagF}}&Be5`!g3#9 zY#Q(XOTMA#T$LwM@Gba*!#hhz6*<^MC~o}o?+72Xq`lE^NQ;6IjKhuR8&9)8FqM8T^3y0| z1vii^JdVQ+_LINJ|Dti9NChhUo=7QdO#T)QbNgGba7ocQK5Xze0T;t2ouhumysdN8 z7WKSeJs(idU&UZ5KgH=Ie_$Zo*R+4|PVaQ@Ot7|7qB0thNctC%` zA-;_#g9d3~Q2LV{?(M|=|9?FwaAYXD3Vu5*_fM94ujL-FTszU5XPNQex7-0|o8O16 z@1}Fi??sk7&2n=rH{EhI%YA#e8UKLg{>^e9u-qS7?k3BvvE12~JIQjtVYyz*bz1Hz z3%}Pa_kiX8&2qO`?vE{ZljYuExs{eX*K)74+zTwX!z%YfmiuFy4p#oRS>?RR^0(=@ zC&MiFBbNIs%iUzT(=7MfmV1Nc+UXMqo9W$_JJNE;S+3u5-%mH=9kJX!miw^f+VCo^ z_)S)QFS6WH%Pq9rF_t^Ta{F2CheOPKj#};^%k8k-dJFz7mV1xoK4iJ=mV4N8|74|m z-}+9mzK2`x#g;qKa;I4CLd&hQ+?y=-PRsp;<=W*=GhbTFPF`!Fr;}exjpa62Za>RK zl#pLbt>vPYkzY&LauF5f*RsTNnbyd!g`QZsVpGPiMY=6<)sx3Wi$5k=ZmH$YwcKkh zcd_N(V7cQg_hQRE*K#u~_YsT#IxKgOI1x1Z%| zmiv*_elD=SU$Dw=(|@ED?zY@h7GIBxYj<}1mK3K|g|<)cZp&rKDxP<&=@v~WuM3qo z)bm%{xV*A_@v_>=^4cX!7ObePUsT;tZaFp8i>%kh)iqUPLI8Kj=r#F8*KQ_GXkx!U zoa*I^YZU|&wxs^*^q{1$TwGtVta|wpmHz9bi@|?UO>O8pJK=wTZ(YM`Gu038o}mx@ z%l`2fmAeXVJ*7{0_t-sS74q5rC$X5As`9QCCNm z=O~>2gLL&(4Q87EkUooRYHRB+GpqbRDW6IwIj;Y7WFdL-*CKAOzjo7ilGWd9_V=V& z)8|a{Ehq`hFP^zz#vDBum|eD@Xu+(~U|?D?Y0eN{G^a37Bp`bakMk#HuklKzPn#}4 z`1J@slfR8$Ny+@uZ}gHbHvIB`6F#YQju{%4ubp0>GkdzPcy@8o>^Qv6kgwp=TYiPX z;%UATK*i+~1HV`PlJ0R?V?%Xl!Q$HbWfkGY4T~)H&?W)SJF8+@T}_p@uwwajQjS1L z=`70)*yZ|KaI4KmMf#F|n{H+Ga@85e;7Q<*6x44|r}q*ZgjDFG?PBY`ZHhyT1bF8%Fs z-|OPO?~ePP6r9beEN2*};`xIyRQRLFKaD?48!s>XzG1l~Bc_g!?~*Z7$A~Mxuf-n? zxyuCZtfHBUKc+8PqWJ7bfwTABdS_NISsL!) zr84K?tFEsKg?;rED~sx@D!2`5l^If5iPxCQ8cVL$$}4j#^J2cubhAVzDqc>*s3)xq z@G<@-Kr5ru{Ks4QD6uNH(gt0rzU?oJa&q;Kvxgt>-0?5?zT=iXg>m0MUi9XBAFo|o z`1kMbe%AS$t3O(OUc!4?!LovzAAIcdtG54S-fcn8d*?hg&41?`eV=~tyBCib{k<#S zOFcAW`lhF^y6c}0{p6b4uh{e6;aBP>{mK#cwoU!7yWH!(c)>I8yHkJq`p4h8;kDI| zU4QLe@9li%P~jsbm-M-E%$*;$y^}WZ!~6#QXJaS+Df#KKmn}^^b@QAbE-d=~{o0gs ze)3w)>xC&B7o@*g^qX%tC4c`- z+ddV`JY#R@#SwOw%_)pv#@2=y4>LYl`l-#v|-W{ z{a-Ks%fdtN{W$A#xS z@ZM$RGxm9Yb3gq;#iQRd$2o7YKHuuat@_;Zt7J#!LkB!}zky!!@XnFHj{9D_^s_B1 z{&dju_pMs{$xB|jd0pIhEI(A#g&XUudazLsJ~G35u+tgCEw++&sF>4gpkJ#!(Y%&P z4^Y484DC-%16DVLtClUW#r$5|X-vFjRm*DYE&2FTXty*RuA5L^Zn~FVs*S1~WB*r_ z{VI6Nt1Q9Ns)w8l9%|gY_-W6to~OPR?XAg;`!4v!z5{(;Kj8VnNyeFLx0FgUl(br+ zm44;&iiW!C+_83xn_LyvXO#wW$Ifc3tE;VN;9IPw&a>zZ&48lXWy>m-OCROF5Upa| zPvAQFV@+4X#NaE#`w*+I)=x{-(zO2C0L`s=v_aZnZKyU(8?K$FjnqbI7ipJhW3_K; z6A>8$TB$Z)tI)2~R%q+ATeY8P|D`>u?bqJazR-pyDSM@bm89WMPae8k>78YZkcc zbzRH&zkFj?$I~8TlGd`I=DmgS^!~^E1opjADA*VSTb#T>5Q4PW@EWIzwGLY zMWM>7#Y>h}fBU+cWy@>puCH$hH?CN@YV{2{myOLGclkHIIX*92SV;Z8ici8z>CV+C z`&IF!3twOlQ!;#NCHl;%k}5FGl#^!7n&y-5qUj}ST-7aEY0`9aoRzSy-!Br>{CT0} z)>-b!`%M3oyG=Li=RLn||F3d4#-;OVjaohY5Z0=-TFo3&1(#mwV~?Mvl*;(I*d9K$ zc_n85GHdnn&`c;-rABj2Te)mSsJ6b!ZXVi;*A?8Eoqf>r$Lko6DpERMi2Gjq)A>nr zx9|0EnB4u^9BQ?(5|xx&Yti@~|D)?yRQLS$X)`spacWhRp^|64Hb$F8nHFgc8a)xE zs_QCSkt$)BSj+JXXi_P?rSBQf2aE>d3#>&z4g=dDQyK5YtRANZT@6!D{ z%KiIv-4y$G@uc8Ei|1y-PfIlJxQ1WkCo~ey65f>-5mdhPjrf|pTcoJCRM9ln-;5Yf zO1Q;J?;5h8vWM; z;g9}!;u}Y&&)ny<1D<_GC z1+L1chIVH6AQDURTY+2O)&8cDbCI?{!8pCAW*%sT7n4&3sqJ}`?OzIy$#`W?C~be8 za#yO7HYg6X{igv%aJGNa$Jc?4^y((R#&W00x62j$dde&~EFpDw9O28;!|gJkDgA76 ztW#LbqmC}+uLufAA8LM2CTzLF-W~}||1$ig{!Wi)m&c4JJ(P@5%Ya*JQM?;xiEG9a z?yn_QZCBrB$1=ms)+2qJ{fmb$JP;-~o1$i0UO@YQ1O3v zRn&V=UxCw;VzbJoq2(1lXQArnaL3Abul=OV=Pa4gR&9P&JWEyimGG9;RjI|ASz+Y$ zWpnCluDDQ}9he;~1{ZziY^AC6UgFiv@Y&Vjnkr&^HJ$=@LCj?FtMFz0$Xp6iGk~v# z-xc4=q_QGhA@plN(<^RG#UkZaRECvn>s%LCgj5xV8mqh#@2l`yS+PQ4gpO9l59qm- zbHdd%6DIItitJezL7+($th-fu!?oU`+AeR2?5$oNuBs>7sxh)A+?75i#muTD)lBN^ zz2T)*UOm^Rmj=f8f;shId>lMCe+)yIg$W`Q4R@7B@O;dV>XCr6B?5&W! z;qiZ7KFPtv@HE;eYW7ag*m5fzdnq*KRfX*hUz0xF^=VaPbyb5+t={vkUS1upuBfTL zp-NGR>F((%LvP%*J@xthp4&c0kN&d{^@_Of5%ouYxZ{?CoRp#;XE1o%X`pgM5ipHAC zJ2hU+Ur*Lia!yvVm;_H=qe_2`a|`iz-tb*&k-VT9M4Ra#S3(NINmYN)CY zdn>#}zDs>`eNd_*>%S_&**Uv*(acOKQCOf#qyUHb?V6nOiJ=LU+37X+qFVmc|hss1$7X|rb) z%~EeY@*5SJ;H{`Jvl0^6cy!UFA{3IwX%(u{M30h@Pyr%8g}Mo~s~n?jdB7@HcQ<4+ z6C@MdDB!3DP`ALbMlmbk)oHWR@9?wX%6gfKzv8knIWhj_C>p3TA?phwyciYS{{bZ(45K(vusTly0X4@`4X*&4{wMSFzHei zLKTYz)zX>Mi;8E>g7~v_S-a^bU=8L2ECNuUz0nuVt@JUz^k)S+R_nyJ>%6+c;QE17iFr%Cp%^s&VEvT(D=>QZd@iVpAw zC@Bm9uUMsqJmHP%@KSG;z1Ah5=PbABS+NLpv5k%<>6DLE(9_|th!q1$!WUIx#$b+^ z4GmU0^wFgZp}IAAhU|W9F*G)LV{zm1kc@;4)V8Yc9&MP46a}XWlWGZogi0-CasrA~R7tw^w%%PIk>~fGnR@XKP_KTp%YQ_8}>#K%kMpr!;%p;6O?E0Sl zjUYMQVr*;OrO0P5U=UVBS9F!x9jSHo1x3D@(@`SN4ooVOvdOR4enH8vW}i^mP^ZS2 zuMuy-V%vxXxFu>G!z;@kUn`#mwd8LOXUMZkww_&De3?qjLjX-+{lk=NVQ14uz_J%m z!Z4nu7F*JM6}~LbBR`w@F%&78b15T>q!p4C@F(L#QSI{OEO^2%6TG3C+J-9e<)PO6RJuHhma9FHr;R zC1Nh7X+6Kyar;MbiMM&?de}1GX3irHO=hQcVj(z5YplH@TYY3 zc1I`S>f4GT-^!3829A8&03^JwaZyb*h?-q{C{94rUC=rzaiEZyT@* zuMLB?YAOmZ`f>SIQM$v;CKU7C6%HL$I@~V5MfKhJFRGuQ!Wlmh*1{?dwqwv7`{e z1C#x;3C7IHKYb=fo5j;+7V|xOrd~7^cND#dtbG+vV>P5$CkAnYg>#hNr#HLKnEp0g zVcB9949C8x1v|*Pf_~4PKk=z2pJbz$bW1Idec5^AV;?yGTWlm-_-o&OL1F=J%eKFK zDSitx<~<>9!R4DA;=k~J-u~S3e^&X=+;-A(k6d+ozniYy{_sOrY=3y{mACgx=6x)C z&9tk2d;k3s$Nm)n{!#gmYftCQc}Bu^YF~B=j^BLI6(AgSs&BNY_V}IDEthz^kT-U9 z5Vo7R)7Q4Nt%_F=>)4civk6-vrGp@E>({9A?e*RiunHzlK?@jvNums%EeUhwb zSjzJDNpg~Auia~P9~anxcKn*S_~ZCC;}?khGf{gWaS~-DpWCRq&PybH%bfNC=*{6j=Ds+G9fitOC8&%J*m#Q&{3M0lhD79*1xdtzHT4l3{27nb_}TNzc8&dRnoXp zG}nRDBeAg(GWuy52_DUJ(siW&zSQ=HV~H;`Too2cvJ2 z*0<2cgnUw*TFO{wonxV-Nz&4nCTe{aS$Ll>F!a-5DAl;J(`6b@A8= zJ^E-pvBJ;BJC<(e_0`T>boR+%M~3bj+&-vo;6hKSTWB+)U-6J4Pe+fkX8w)=^J|~1q`TH)4fe}j|8%L>|v8g9xA*;M&>1xL5S%03sny0V_)^Gzj z4Fk{nVxh(1Y3G}mpsDzrX5#Vmv!iH(WS=56f-EeyLEAeIQt!{(qT5yX)n{<~`%ifrzjarqgd6)Ll z&hD+R;oxoWDvk16JUGmu4WrFC7g>B(*aIt*CN{m9-1d>9;adM-4mwv|iQBBeo63zMs`sJL|q7 zC)1A%+~;nO>ECUfZ1+rgx*2B@CTp?1!x`K2nfhBhj{%9=fU*5@P8*NLd$jRe61A~+ zIkeFmo!YspsHdgLn)|ibT%ltuFOTe}ja-$e4PWZeQtP{W8wES|`Z*EM~a#lHd z9}Da@7wM}-7*7XRQr_8&595+mA17mSg2Wk!E40La5b*{OuP^bO(hu4&&X#tY-`#F) ze;IFj^wy-2zJHzF!sVNOU;49nH`Ph`tbQz(AA1`EhB>u<2_wwD#tr@8?XEu1#>IBy zdC_j$<5IP8TQqIVT?yKS(9H|o(w90l=Y8PVGDK_nBvHFQ>d=-Pc53r>C22DrPS&p6 z(nlMAR|;*nFKxGetl?S9I42jyE&x#o;a)T;P9EV!pY z%R^`N^m98kH*ivblj%)VVJ9W-pOdveLx;1VOF!r$@FhG=^1vwJZ_w!>a99nUmVwVu zXxRr^_P|Bz8vLE8fuzh`WpL8hjXSSLnN|OiaE>-Y>X5o>>7S_GL|bbjzl1jjX>U@G z&ry&2kM`3pKu$axIdSNrRBh0XG|e^J1+Nb-PG^-T7uP{RsB>ZX{G;4(B^!UpryP`Il1>fDb6o} zeSc?#otj75)*`E3D+g=$KANEYj=vU3C-oY3V{{(pfAtXU>ZM8AoDb8q8AtnTC5HxR z0pd)&D^bhZ=+Mq$OibJ1f@W^bIXk@v%!C2()3`z4?9meJG27;MyFGlBYsc^B(E7b* z$)_2~S_XYkR~wW5p|F>}_AIA%7Hu(krpN&Bf1xe)Sp7h(+-B!vEO8_&iqmTs}(f}_w-!sF|i_LQ2C-c2XFJh8Ci@rZ@}Re8%8 zG4tPyt#mZ*XF9h_B-_(JQ__W8=lbv&#_c7yBNcpE>92 zDfbI~rN0wbC-f)03zyhDReUEfl7Nw{B_FV1{9p8o zAA5V7_r}xTE@QlVCi%IyG1^WWPxG(x?`<5n)7Wl2%rlMicKowal`P`vIeRzf$!AI% zTTeEeGsU&ThxAqB-Dz{{-pUkD%M2Osv&`|{h9|D{Cu$5Ca{3se=3bX|&%I*X!@sK& z8-8pVrEER5B$gflS&K1TjmIK)_4XcLAEKM3E%m1@b&cP#?Q*QuF8`gM9cH_+Ws7~c z!@tV4%WS)L{8$>Ox#ZcV9A(FoyzYyWHDmKX)4QGif9w9g4L?@aj(v~KHk*zXw68Wa%sj19=4t)S zdD?3-Z{jyIQ9FmfO#-KFfYx?&fVO^zTf6YX{@S2JF3rU}FQpP0diJ0maTCsQYUhkg z*M=nwR&ai=Cu+O-J1lTEyS2?9rfTbtrfE0q7@#%I_GlLz>d!g@^D5?y&T#{^*!T&< z5`i-aIEl=snOhgoHu%f@3|RNMwfknLYIiWFUw5dFHupnxI!BYWbmH|3_h)XH)+4?> zN073$_u(Z^&|rfBKtW8BOw`xHW> zb5gW(NH>^x{fL(oP9iK(^IXpS9=HibeYGOeURs%~U98fjXwG${lW~Z2E;}7@+@lk< z$R&x|lakKYSMvcYhjiJo=`@oDw+&9ze!ySW=ir|0*0L%0d6fHXXfTwri|)u(*$w25#;=iaDf4hH~d6qUany5|P<Bc4}8`Nz(G}g8m!(Xql^0&>N8+zI2})a3pPC zzxI^6J`0melX7~j5yiH-bNXll67JEuXDHxi_c3Q`r}6!BDs#u%tv)y_Rm(y?=~b^D zpHA?w=N36B+K7akwb)gn)7E2R@s5Yp8_qV(;`@{Mw6;$5^zxc>XO2=-GG=@_!N=~) z?YwL^K2J4wwPdn$`fBH(xAG)p^rU-i`C{K~nDK6Gobp@CZ9M-$6Xwxk|Z<9tn=eV(DABwKz_U@iY$pNvt6C1AW+U-Gb>`fLIeZab2^Z|DI z=7C!C?3LQo53kq8AFbEM9cs}2ANI}!uBzhw|HGo9Vxn2O7P(Stkpi;c%MOZ3ibkc0 z3WkM(f`+MyW=O82WT;eRYFcV!YNQCb?}ke5B`%p|CTXRmdH$czIdd+T3$*;JZ}xj} z>+PIb&Yb6YX6BhW=iW1P+L|n!l1GdCW5!^PPr=+gR#?R~#(VqI#ekR@!tIBtqRqK< zabL+RqQ%x};-1Kv;!c-YqM_AnVb!9pXpszGkGY^xWL;s8-xsLsT>W~wyw$apUe4Sm zmVMj&T)n&=VjoaD-4E;6((^3q(bM(kN_t!m)%KlU-oD!SsQCS+W&4`TtzTacwX((f z$X3Ur`8c<%i}Ie)OPh@w)~Amnf26DTIceH`4(q6@zo`DEX}Q0#j8kW>JFD^mE$}-5 z%lr4L%BkNscP_V=rM;c%qA%66wJ)nzYFBLb>>AtoJ509tj;^ttXgmtvc9qsCw^voy zH17+R*Sn8v0c+Z$ybkmBu`J&V@-4cn?9S3g#SM!ZB-%&UkEqAz#+Ei!=ac$Y^e$GM z7gr;!>bDQ-?@k(6S$YmDb-hu~s(h5=8tVOM$w z^;~uBSJihM)qQ_logYIRJ6QFsD2popU6tim)4Ntq*Y&FI+U9mLKi1DvzuTTE>Xy|h z)kkZExvc~4E3DdES8O@7IreqD!>V8TnAGdj{e=vjzSs5=iABiI^D-`N9?_^ZzpH4Y z-eZR^wG~CB*xnnT^dE#sxvZVL1|dJ&WZZOa8$SE*ZjyoLm&x<(a2->-Qg3~3RQ=-U z@^N0By*ZbyF7M_1-mbot(Mnsfpl-{)YOeoa;9@Hg2OBZY=aZW|fX($*!im2D@Ndub5i=f9A)Om-DtRw;t-}RrSo0vQ4(s0=nN-TikWU z?Dv>0@H>hsemli}<#5hQd;#+C9qaw=>_odCT39tLX=UZG^aLz+E`ifw>Nn1W4SuDYJz83XUu;Y3fY*p*&?pnp?I-XQ1n>3+W21m)M)3_@?WJka%v#^2A|QTHQWDD5vW~#Jl0ETuK3)<>e7E1MkZceX;Mad3BrgQkEHFm7Zf>sdz`$V|H<|Os4gY#k=7mTgLF}wA?yk zsZ3D?5%0=aMYZzPRA{SJBG&0~TnO!e4KlcK@n${s@lnJ0!sQ#Xt^mGKiyb*>Kh&W` z#eBgHuu(xI0=%^~e8@0vCn`4*^%D!#{64YCL1WYx>KCZ-9>e0}wFDQQfz#DZmhr+c z-V#SYz%EgI<4;uvdqMFSWx|Jzh~>M9qY~m_`;isWxtFOQ_5o7MO4*W3CG<9Y)|4Xa z3FPaNtZj^z13@e1U{|WJM|<{E_anJxh5q~4=-5$X`wfa8jqQ{n>9h+NzE}G@~iO(71R=CLW6MljHuo;csFPq@4ORaB*akqvMLtuIAl$FqTg#O0*3rMjS z0pWeZ0)w&5jAkogK$$Sp-X=mM#K+1i9}t6vuoSl*vgnY)sXVU_c2^Ls%j42^?aNat zb|TTHJO`%2z725m?aI^CHfzB+#y|Fp?=$+DXD}M^mU$n)fSyve$NTgO=pm2aw#GiX z?9}2d9t}wxE5uUk#DwQXrgeP6Ga}b|l)7JmkM*GBgkg9;(Hdi0Ewx=e8lEVytE|D$ z)%b*8R0K9NHa;mDBi;pZMhEslg4oNl@ff6{&^jp*-7I;i7+^g#f#Y_F^-%5}BA&Iz zHW=6yJI;D&Qf%yVBEov;5Vg~b7?yzj=UemdKO_th;zMhkq8@IsPD&awXv9#wiD*46 zDJc=V5s5=q1IHx6=;~#}Q`Y>;B6#`JI%y=Wm0=wp6PuDK-c&dF{joZhF&ai%oAM$P^b>@eP&-wq zx^IUVXU#4WtZp{Y&bqws2Eg6mZRPkr+AI8`r*(KNT#aQiJW3FEeX5i`1zw*!Sy*P= z5W#4>aBaUQv4t~JA9YU%ZJTQB;Or+BG1Y7@3hXsu9gZEE(1jybrW9f z;e(w8lE;cL)*$~nfR+`879T0?qouHitL`HLn^tjfV3cEz6>1~;+w_T#jZH*5T9$zH zBS*)M7&2D8Vhz8G&EW%M2akS68~>2(BCp&}+dhRJsGqzhE$k2tCBWfdMHg z!Q9_P8wLvIa`7k^jdCTM@!Ov*2$6Oj`8$ywh_pDI-+!yMSb@+E z=k8r@Et=pOS$U{q72fe#i#(ineZ94q0&G9QIcuy%#s=1Wqjd$4E*od15n;;AXMIiTn z8#Y(&d&8?g+OK58SbN8l~<$85y6I6jHIaL@^4 zBW{l{7uX@c1n~&)gV9Db1uOh)M2^3W$Oy0ziGj!q!nwhy6F7vTJO~W768*c{h;t{c zMd=A^k#4XN@xC@@(Wg}d?ZN$;t_?;Qj9bl`S-JmPVUGHKe^7o)UasAAPphIUH zk^Gd6nDL~Ia0kWxaSeodOylvFXhZ%s3Skt&@IgoeMK9Qhtz%&`yyxVC<0%N&B*At_ z8;|(SXYpIHkv5_~(zBko5p9!UXV4O5;zuDLc`k{_+XX$K>xG@r!5OlFQlw=<{%FX# zCIZhF5r!kp*&XH3H;Y|t#A4_+9`?xggdWh>9`PLL>I6Mc!hT0#YxjpC(;l?XN}TsT zmnCYb})?7%gP&`$f%Hnz5+=}wg2f;K~#jI?h-ILc>kL;GH|5ynes zW8jG6(C=_Q_yNZ*NONC-I&*P82;2`D*P!m*uqm$Vfa{dz;kBHvl{a;=n{O3oHg3!2$3UxCtDb@Ln$H0=k2zz(_C=WPlv-0Vn_mz*+DE zuzjGGxEnkKd_iCE4442i!D5gPO2C)kCt&|zEzt@%gJAF^cos|sZ-PQl3T}bBJ3=PV z6AS}WKqhz}6oP}`BCzg+vfu&W4#L4;Fc!=N*5DYyde=n7pyPcR51gEWu>@<9nG0}d{=M0?;3dV#@UJjeoTz(H^Y z*tw$3K^G7L27yr^4P=A&K>;`ku7XBxupe*+exMh42Bd)L;7yPR_Jh;l3aH<$mS_pO zfgT_lq=0$gL$C{+1wVtP?kETPfffbkjC+VC_}dhB zi)T-aUc7{ls z!qR^@o>f@31S>K>6So9x7Ov6drtGGpy6ZuE8_&7~UkMa?N%v%Bpy<_q4WUyI@-U-iFQD4QzzG+SwZX|ZeIKs2sjG9J4P#&($~XP(}3*odBkQg92TJ&r2R3+Il?Bd{S? zbtjt&K(s1rH!mP>8qKa<-C0Q2r3uDX)A*xopCadsbU*Eq&9QG29a(Na7g<;}Aq6R@kTMSZF`cxIYhDScR?A0JC6 zj;$g$I5@J3)SmpSmsO;jp81%m2GRNiM^#Z6&SePa2y=N%<}&poY6sI-wgwwdf5ap& z7aTQEK94nAyolH7zDgSJ1Y0 z<#NJY7<9n$7G#BR{$@47&1pKApM%8E$E&z3(+7=;;onQGI=9d0!Bu2vPcqFeswHR- z$0{ZFHuEHq7gMZRk%}IV*%l)PNqm@zKf{SNjL9?@uN7zd@|?t2>{mX@!s_LEm{)>s z#BVswlH{XU^Ax%4)Goj$-g>6lI!MdZRx@T5ni9AY(#rIX9g;9AhTgDZ*RxDF?`-9H zl^eG_&$8Fc91QR(uY_(jD!Jl#(9bZNGPFTWab-8a^Ij~ElCfofxkg+Gu}HOfsy|cL z;J;O*a-JsMK&*rkhUk}*Y39?BOo9X!g=pp2p@Z;ueofMrm(_F1+on9P;`C*fj`19k zfG>ussITf}O8L3wJ+eI2yq#q#m(Lc8V3T1ihP56fOR-(6*3B%Zl5WVOPpVP}RNqK^W=ft^|o)byccuwY2_MA+$aFR%>xX3gm_zg~iuPmR8v>O&P zcZhGj@O}0`{O*B&%u(%wCL3y5>Q{}HX%&{DvJUOrcC5TC3TxjYR#!dlWMd)+Jrg`E zHokm>X;+4;uo(0f={?H_gej*&hc~6dNn^Uv1g+vEX6x!#ovn*lMXuTN1=;SV%T^jF zrW|dAT38ASo5c8yEcMUK>Z8h3qb_0P6U}c)WLrHNn_Ry7ufoY|waQZb7PF7~N4L4| zDPI9stgG5QbVlti<2SE^Qrr@re;TR$&bxv=DGf>?;Iok5E`&>^nC|1u3M#AXw zX-QL+jc8#xdfh6L%zT%2s!6{J&eD_@gu5iuvy%!6;Y2z+?F-+E?J2V?<^)rnRdjNk z5fOkVbe31BrVFCDX+Tsy$&`hk9^uIZet=P_UUt;#^{S%FncwyHO+-86=O6#@XWszF zgF{OcrOTpIo#%JdF7|P&O|~PvCf7aIKA^$LF}8O;_uRI7R`*P6UMnKx-n>h8?HiWu zYJK?dw1)@n>CrJ}p}p&&w0)1%%bDf9abqv{#1oCecWf^Xy|;93(DGk<`>j}c*T5FJ zB~NXh_jDKJoi5-uQSlVFWkVXzqKGVe5YV11$PEL4X+*^tJhCZEKx~@&u z=VQ{Mp6Xa|Iry9PZqds>o-`ruqbZ#q zUfI?8yXD{9y>jt@`tdm#!@HDpNW5Bnt6%QtVLe733vc1J<3{akTUtA=+5ei)=-p1K zo>$&_^zjUnf!%x1a11>6GF4&iUp>y$sZ=X+0b151g;@qrG={PD$-`_uEVDTim^2-+gypoMyH7ryjK?6x-SD-nYxX z&ik*YYcFme51kEH;RWA2EX;R-BV9Ld0;}T$A?Cr z>@&o9Vb7AzPlh$9-z;$b-A9eDZ(p*)@kGqBpMUMJY47&6 zuh+FpUeD!ToiS$QwZ0KuemT?g>aBrg`P(mCny~qiJ-(l&9ai?dl$Q6I%fhh-E^YKY z`DD(Gqu-U<4}0R*eZx~v%!=-|y;n?^d3GkHTiwy`;qO1`@!gNn z!&hEEk{EyUpkv1~u|D6N&u_8(V*T22m)C9RaKviq`9nujmwb`%M$GYN_qEyjdGVPd z+n?Uv_tC}ZT`$h`-MA}5`NUye{+f5+pOCxghUcog&fj=%Z&BX6<31nz&h}`xg(D|i zdu!QKYv$Y+JbGU9ySt>XtbcVza_8JhTbxI}JU?UFfQM%Gc;edoc9F()yCQOY{t1)E&5I70*eh6!y8hIrF~8PNi|c-ONc>!9+d*wRZ;So9$HGQW z_j~fLsfo>+IuAeE($(iJ>&cE!*M6#YtNP!zIN9*ArE|NT-_X0O;f+SV>8Zt@GmBqu z>$$I=q-#*M6n)`iBm=AJlFz^8HgCyDW`!ySixj&^7tT$BoXj8Q`{djq%!t z^Z@)#2!7pwZ>@xA2<`*i(0?LO2nr}DprC+)0tyN!D8RpEuAqQ|0tyN!D4?K#f&vN( zC@6qeD2WxY0d+t_a33&$i2yZdpHu`zpcIsW>)<9R&kP0S)DIg7`gK1y}m<2Mx9FPg-fh@29WP=>A2rLFm!7}h3SOHdnT*+#L zWDQs+$wRmvQ$=XIKLc${XkXfpcBOqu8sN1^2GH&MCXNYZSqgFi<)aNwZWcvj zxBg=YBd+mhiNra{fc=M<>&Cu9s2}y$`w#mLb^KrJ*96!6Et(>q?d}BJ0c}D3`hyg} zc8mkj66($V!1Of0_T`x2_#o6X2P_85fZmquk0qe=?`==96aDq~C`Os1-~tekfjS#O zgd|kPnHDb7q7YI~>PYl#y6YLuZfLU#}{Wzl^nWmyVV zfYpHhb2Hcp4g$#XPxw)_A90c}rx zX@AbK1%Ub<1sDDveT4(+`aPPU3~39Tfv#s9j#EG)hym1@Fg_kk1{r{DOMQ7vovAO| zI2%w`!v3bWFLf;f)b%g6t?Dc2FMbP-ErDwhTVM~UYaj@fA=}?5i9i?*s55m;2GpBj zDll(f^R}g)%K&|-?o;w`Tm-1=VNm+#+Ew)x^cU5UgS=%R4;%&5mHIgV>gW!fffH~9 zOe39u5wI^u0_w~#8c^3bkOnn)Y(zS0};|LgnEWbqGUV;VJe{RWCoz# zS%7*k1=QKR9~UEjva-JF_+fp&$9RPZ_Dy^m36>dQW6t}kuB0#M)0U_Urh+3tUr zzUr8W#5I14DCGACF(6uoj8o6aK-ZgnfO-?XeKT>)H3@Yk*&s*4_SM_A2*+&Oqkpfi zrg7kox_=9A56o?1ZllrFs_G>Z&=sVMF??PT$OZI`x_{(al0K3?u@rEAV5nn{x~YdP z5I`@_a|m^H0kjW~X&1(+H=)jvAW$Ate;$)?K-aAM1;wJwwVDkKqklrOF=H+ zJVM<|s@L0me5>nJt|NF3?Y0ikj;t>SuFis&O_|OKhSZhzT`i%Vw*uO(^q4rDSIFJa#xsetJWlL6CMhVdzY=TUc(38*vcrM>j_)%DFon%S88t8Jy9 zul6rqSJy??gR)X)bK((?1{@2KAQZ%b2zksnkC_(*n8&uJ&J5E*2H^GBk8=QZC5r+3 z3fp!KVB2m6yTM^_?*FfSE3AJhH|6gy;jyj{(cr!=prynKp(Ahy;UEyO zoUZqH94CTgKs!z`gZ6`QS`MH+b(=EI>oC;&SuTz_miB|+v9Er;|5d2Ymy~NO;25B+v=Md4 z2GomVRUc2f|Da8I%zXM<>bn^5eAcrQ90q^TzW;>2rul(mx(Kk%*=B4P%1rsEfhiyv zq{!n`c|2Lh^*)q^IM1c7%K+qdQ|fe|>%&>bP^Btzzr za6ny2JV*pQpHP3oHcypdIznD26X>>}9aaFg`(J4D-_?zBP#(5bAZQ6}fg`X70yLFz zrZcSxpx$kP3!pt1cam`)M}SZ>qHs)jofwb;sQ(n8>z{>V>b(Z+1bqrA?*9yFEMAtVmK5wry? z6Aq|1ZQ(7$D1@PaHejg3vdp6m;sEVP{dH)E$sirD{TBna`Cphj)H#1I>evkOWPM8! zQfKxxUW5LVY5EvrIbL%spsf!A+WX9(vv+m<>+ece{oGE-MOoK?6@cS~y0H&UlOd0@ zfUf5<9J4I@6?LU;*tb~MesCC^{C9P&q#OGI+b9RH-Kd*+|6!k*0jMkWr>?XG;d#{A z(trF*x>g#8YzOu|_C?A*3#5SlAWjm6kT5MCBm%bbI z_wT(prX5Pa$-my_6?Dr-oxB$9u8%YN8Olk$yg?{%0c~YyMCdFDL`a>(0n=HYX*`E% zF@W{3AB+d=6SN0I+AtGjgT;VyQ0Lu%c>9BcFmNb?o*Z_PJP#a zJV1RJQfKy$qu@5txsq;dqim24*jL$iQsi+OLiQt$QQd#AKM}Sw^``$YZ{HHcPyT!D ztM>7okbz^H?Lk@DUeqZD#DQoK4megwl!SRxKs-nU<7IprLfU}st?QkGWA<~xYvh7F zuoZBeo%#E1P-*Q#`%@;$N8P*u^Rgpv~9^ z*zdCebzcGU0rlJuPX0Z5R%$ou#%s<1l!bD(1&*Mp4BZh@X7fCz>19}s=P*qVy>Z-0 zLi;eCA#Ffi(*gD5xL5<&kM;ukt-q;F)wLu02z^5l;25I5^eu}e?;%_bXzQJz1pH05 z{wIAW>sDoD-`EQB0CmX$>__w?86XQVje4&D)RlgOy8ex}{yTM55~&>uvBP#M=l z>Yf6qH`|zcXG`d-76aNWAM6C|*Z%|k)$4E^)8-u0)QkO+?Lqlw0O~;60%s5iyn&w1 zwEnzo_tNAdvs3$K3^ocsIR`w!{of@^mIZGo;=IF6|wWoJIq znNM9AwgfzD*nfBJ(lzq(H zpPc*qum4xa+i#t(jz!v!x=|PQ(=0$cX8_uI8DKwV8QOuiJ_*j>{<^AuZ!2VFU(wrc z29DX6Qa~Eu7|H}WfbB}3NnN*t{opA00^EjetID?-vax+AJKHW1M1v@KOg)oj+IWQ2 zo$X7V={M(rY`}iK0?HR?}mK@-3@LubHq5&><+a0XyIF9Ugi?fDPtXx!uglzeM@=|WH@roKFP1zEY=4I@Rr@M^1@+1RnSgDnlZ9jEtpn=;%l?P-bd~1 zJ=xCGb1TsM+L_z4JvnEq_XU)98K5q4fMYKba4bbgsB0>i0@$WY0d2yzCDgkBQ19J< zZCnD5f-n9Z{nfrnnO1;IK%GKCQ_u+n%Fqd6ONl!|>P&s3K?axxcs})|-^>H_Cz}C% z%3g2~K-a%xO#P8MRJ-!pYd{uYySM=A)fPAdZy9Ik2=w3H^Y{1E*H)&pJkO(j;=v5S z`G$R(K5H>x|A6j)M7F=XjOs(_Kd2|?dG_GkKy!{9%nX9fM}JNtt`Fa@N8Ss+_N8&F^N zU$!m%$4)@sahvK}K|lJ32+$V9OQ-Hfu|DelLMs99NW){yYb;4^nUDoxi=>ISyp|8xX4EYjB!d}XGN6uZ)1_b;(0$5n>@(SaRNq1w^}e|n$1xy65|5C& zGK>S$KpLPOSeCF)(>6Q7(c7p0s=Be=*x%Ui*f#8s^pl-HQxFP_fci3Yl7!2&NQBg# zZLH6coEKrQ+hP3aGKezB#CBW((gFLUKEJVDPTpSf>T>_lu!4S5pwAq@wq!qK`%?Gw z|4kiDx^eEy0rV@WfbGaQ{U-DNqwT2bR}A^Neqo>FSW5&Pht!ikg>6Y)=}(pcjxp-Z z_Qlx!qy6OHD97Kct8GJhsYf6P1edvv z%Q(|`+!8dAp(8>k(CPNpPwzA8e8K*f3D}P8i-dh~4d5KN9TfjJ^wIUwLz8|}pu-HX z2yo0XWZP1Aj?wl1as4>f#slieIa_Z}>bex5J$0M>mqNAuRzQA^LF&hl#DNG9D&cX| ze@jQzhaQF8?1zz34_%-Bh=6>g|10{b z{gS%TcPs;$fMd;q|B61Aa#pEdI`p%^^1S~_+@#+M=#&j+fJDIY#%J-^C+)wYOI323 z^yB)B`f(j*1RQhRd*c6!er!LkrK17cj()@zK*y@=@?S|awIAnh&gX19?#ZP4OuO69 zSK`Hddhx*uJU)&1M2W_M4?PU{}AXMFd#r-ye>Jo9w-ywJzGr@j=} zec8+I-JJqDchAag-Q9Uh)9z)74ZAz#*6yBKb~DU4=~9@{=2TefGY7(qIa|YWbMnG+ z`mYR2-MJ_%_gGd~>C3aj#MZR1=({F_IV>I?R@`P_m}A;wVU8OE!-_Y!hdGSt92Q;L zI?SQ0X_#2pFs$fE?XVorUqef`UkXhPJQZ5H_&}&QzBRP;a9(KY?3JO$>x)8DYtIjL z%$*&YdND1uXyAm^K!H91jLB=(#O;Xuv1ILw{TuETY~C9vVGAc&Keg@IKF}!9#zT5WHaYh~S|Y1_tl* z?HxSy*`VNkPkRLKyW^o?k=Q2q^q6MBvzs{t&wjK{@R4S>g2rWi7u3IQY0!cJ2ZKgV z-4=9Y>?c9voK^*WJN2EQ{xjzXjeI?>Q+E@+sgsp%_t4H=h(r3m>b&ycAftuAaB;HfU>XN37GlS z{D8=pG6KH+aB9G~k{1J3g(L(VS{WVSaJ_fH+@`?+_ST*ONy{Dzz;`SGuD6;6%*}EL zIJ>P*z=@x4`A>ZIvj4IDrT+EqIpjafb-RC9tM&d@Hm&lvX}Z||gC-07x3A3bUvq4# z|NZw(^glE+!9VYEwEs2NKK}3Y4)%ZB-P3=@iHH2}cW&$dSjXo6*Ec)(ueemlKRZzI zyOMj^Z;!)izgv-q{N7C1?svVG81u}b&5``L+pok|k? zG9DS^cQL7t-&Zq&{e~rY`W4>su%CZ)TfbRR&Hct-a`2mRm!03p*^2S8YnP21d!II5 zn{&wc)$;AesngaQXF7dgj89o?d@x~wagFt>##bIlH~zF{qH%ijMB}EUK}MU^eTp4Krj3jvee8^n9ajtseaZ|rubnouJ#fh2b#A+%Lw3*0-xBj) z{)90_`R@fD%Wrc3kNKZITyJA^Zi|iaeh+V)+B|5Z+o%B>ohGMjoEI>CW8G5=H|}v> zwQ*y=%^O?CAKln~TG__agKHIh{`#E-Az!yH82d!mg162G7JNAE@q#X1&lPm}dSbzn zqG<(bH&!0U% zaOPh-f0;brcg?x3bzi;Ob^2;67jMUUE^V6M=@PxXrOUfV+Pn1l;1QPyFCUl0sbMZ{ za{9UC&53d8J3PrH{jEtZH|tMxnQJ@OW!Ri-mo9}%T@0^%=rZ@djV|Yg?Q&U}df3Hn zdg7A+HKq;uE%YBT%QgPbM+e3&-IgDF|Ie; zCAm%;JIOWe>?^M0kIiv?IVRh+_pGI^T?c*W+U`QW>&b_9x$gHn?CST>IoHRnue#12 zYUS4J)4FayZfWe6)w8ABh0*QZx`aI9mb};7?de8gZn3TVx$U=)am)K+l-uilCb_lT z@QT~0Rdd`vaLaa^G+?QlYv&K$cI4)}ox8fz&C2GmTlB@VZuf4u;cbh_gH^$)@$xL;k5I|3SeJhruk$J(>)JSM*H z?6Ii5x5u{VP>()C`+B?-IK(5a?kEqdGpQbJ{a^8Tqw^e(aVr;k4B4~9WB#kT9u4Z} zdkhWO=}|xAGmkE9&U#$>@_Ua~pW?5~KUCM#xoKn1oXb z@3r(L;r;ICcHUW=8+lLmYT<3wyPbEWgR}RbNnYMNb3?qpd@s`b!uY}7B`zbqKTS;a zp0_LA+jHfs-bHN}dT;Ys;{EbZA9#NmyTN<%+#TMZOfT_X^VAvdv5mg>zA-@fyt3BL z=hW+se5~(i;WP98c0Qk+eAs7rcP}5~m=K>=<0E}u_8jcf`nyD*2YaOYOnf`tCw=m( zKB3nZ_(auR;&Wy52R_#y+TdgJ#15a~JxhH0H#_5VV0W3%Q|`j|`I&aUU57XF%_wc| z+u{4Rz7H*b*mvrkUcS4%LVSBZ6zSXT`XJva?1Y8_)&Ai{-U;q4@W<2 zSbfsd5Nj1;XjRt7aAWNt!;R=fx#rV6Qps%1pERALg)uUoEyE_6T6)Io75z^90xdq{ z4K2)^uZ4SMctNH+y``U*Y6$ptqM_l36Ai;31zTSirM;hKdI>PYuOYw$x>pp8Z`rI>yC*F%OWNjN{s8#T^ zp?T(0hCZQDhDT0B8hm;_X0U#%r=jtIFoVsxAVcC&Kf}+fd<_0^9`N<9h7B(}8@gZY zXz1tG!7%@s)`kNUTN#QbHZ?pLccPhdA=p%SNMLpAjkKSoJ`-jv(kO{ewyNYXa8v5&D%nJ7dbra`;zf) z-=x*Q__%G{=~HX@JRj#9p+33wc6rm<2=fu&i1dxf--vP>QN94@72x~=)Kh@^3Q%tW z>My``3UIvwT()%jh(N zZ^X-nC0(W%nzww((A$2pp`Oj83S&T%Dm4T)3c)eLwZV`#7;%IG;o2a?gAhk35UveG zJP>h&0^wS$GgAW)M<@`k^+((vafAZlTHI5m`XP=`AY5xioa+&U0^wR!9>fs}u1kE8 z?~6D>fpD!4;y#EY6bRR%Kc#vj&VGe(try~6h$9pT*LouEi8w-maIFX89*83p2-mtJ z?v6M@fpBd%#DV!I)exU{zhOH-1G4P_rTs$ z+!KCj@BZYvgWY;xoziW^whrA6tvlq_?zNZQPQU8pHYKmbbz`?Q*MR(XIPu%YnXM)%h2E1!*Fw& zo1y#Vu7>*uJYpDB@{r-n$WDeCUp!!N9ofN9Xy49I_runP(OKrU!7t~((EM7l40p;f z{Z8CPTa}kJ|GQC&n#}v{>OWk!ntvD%T*1FxRsQ#<%=7>Jv6*mx{$$e`f1f<2Dr*jE zEKp;C8Vl4|pvD3<7O1g6jRk5fP-B4_3)EPk#sW1KsIfqe1!^o%V}bvp7HHT3J30Ly z)vZRY8Vl4|pvD3<7O1g6jRk5fP-B4_3)EPk#sW1KsIfqe1!^o%V}TkA)L7u3wZQH6 zd&SbD^8FLs%>LvP)cy2_(^CN@|8`ML_6G45%qrJ2e4eI&) ze|*$x^h;C-OOI*4qt$2e5Yl+*dm@M z<7Z@kmW-d3@e~<9C*x5v{-umN%lLU2caZU~WW4mScKr)7UL@mR%Xo&2eK-^*vsdKo=5Py4-No|9@|n-{Ip#$DKmF@xfV#W?mE zG(0grmgm=e%q^g|E7Klu)P94`<5d1r#piv;DiZ(YB#v1-U=Qf@nt-O@UeFeF0(`lE zFIjX4Pl6F34J-m%!FRwB9j6~y1dMPLthXv^Bc1S?guc`A+AWdR8axQP05=d0-UR%x zJY}SO&cGi~t`v|Bwu76%7qVnkBabeFe*HU8zA?BPPT^Pmaj=nhh=kw>=`<zW721CJ%fVSBTD2EedhzCWWz4agOKe}wXTdxy@Zhoq=5Bm@0S_QrV?vUk8(6SnNXdlad!TMW+2LZ3a56khGZKuoE z7RTmxi9kFWB!d}X8Q2NF11%v#1egJeK|LuC>#YjPq}$~V9GlyQ{l*cr2ec2zwKt%R zJOSH@AIeKvDJRoHK{TL!DBBl+eTOpX^4KCxN0&>Ng>q1T+Q$*lK8*9jvVYV*qfj;- zECQRs1#mZH;JBIwXdk`3bQvr|T_#>rw-05x8|d=2$FXi7BaVYXIG{cFv9!;lNQ(y< zU_B@U>_7B9x;(mV7*ZxnIVb~d?g%;oUV|T&<*}a6{!KYpMjuzVd;h7iSQ0 z_M!exfcD_0#y(m)2wwG0>`J02&X`XbYb@?Z%-Z5w zUn!TAt0sxM;*2&Z)djZX`C2`ioUDVAS|NwhQhOmbD22)n<(P6-xeSSaR<-Rbf{-66 z`ruzz%#1v<9ab)P!5WJ47*cCt-c*zb5Folr8@0vyrU_E~(0+PNwo)4Ep-V%38ml!` zrB9)3oqE(8JGPX|Xtj#^+agDA6QikjP$sQC*c#dy zRrmL)%53Fb^pMY#FVSNwYCl@ljk+sJGI(6{m6G-ow1K9--u^+b0ee#)(E;HoKnv(v z-UC}uDmT?m)Q4?MduzIDeQ&T@raflhyVWzPJ6oT%=%YhX*!J`rnzYnjQOf(Hrny$D z)*J6v&!=Z$udLV~XDV+fA7gw_d)*JQ^~a#}^Nd8MZS9W9`Tb%Ko8Jte?bgH z-W%eWn)jpl3b7SpgOsY5_(4tIjXUP6$T5JKnAtAM>pm>5sQDu><295v-X)$E@2ja3 z#1ZkRX+-Z7hw;opQ9c0+#e4YoKJmTy8eW6)mLa}ge5syy4)(+0Hk~-#;a%S5Iqr_F7jlLDiI41Uyiw0QML;oaRS~+x8@-+PIN~4LD5RB z|6?5Y7u(c&=8G4^7E^1#D_$2p!~r#@fhb0~X}H_cM@~4Nv?$7RVjceV#_FH_X|s4r z4cCfSu$K4?b1D6qqHIE$EUZ2hr3kFS^9ZeFmx{5%3n?FgbgVG6(j5_7B8K7L#UMpY zRprdY@$(p2t5J&AY9T&UuT@{Ztwv2Af0}^FT9;5e;jj><8;^6F{&3*I{9Q|6I^Z@jMZPhdVF()@sX9G&8`#)Yyn*n+BNHwb+ z=9RC%8r=%G^~SBAZ-rsxf27U=`W&c;%edk#jCMu&4*ZJouE}x}ck7CB2_s)oZh-yb zTbc8@_yF-=FxGjMix~Cv2ydDCeEGO%zCPyPlxKe}CZhZ`u~I$zI7YjoB!E>InVk7} z4#z&jSy(wM%0Tgk8v7A`LQ%dFD`d;>#`tHcV`8T0r5^ntIP$MzG-z<In9RhtNjI3*ud*E(JxRKK|VdI>7_% z!U|3IuWR846y+6>rRul|{=|Izdtv;4q~^Si=O~KO(c}YGBeq1ez`q}YTzCUbDvopd zg%tIysd!5Cj!EM3G0)a0AMH69@7mcM?TV5qJXD?L;`n({7ym|ym&G1Pt=segxq_R6 zyjMXpjB2e0j_mTe-CgKDLCbX#labq0Op>LOafhQQsaW?>qViRbZeylH;DGIrrbG9zCM2#P!vg`Rb45^z}IB|E{+--kPtRfM3(w{Ia-(+A+_oHGPWN zUr`Fh4b|q_2-oNF>teQ)Z6aoBj@O^CO3-Jjf#OGuKSlWgbMGEpm2;#4_h`Jw(!49z z3|uMDqj1&m4d!vp-&_(G)vFi4i%{Z|SS_rQ^UGe8St*XI=`Ui`?}lV7vrA0C+`SQV z`aAI5OnDf-<35!BUVN&KIF7_O5ziNU)U!1|@&;B7TKjK+$551`_&$REAzNLcvYz+x z6i!jTlpa7)IKwl2r@A5-j=aNSq4da1{{&;7BVHTN%T>#bL;Pcm(zEhf<=%j2lzV}- z>Uvb~$qP(t0G8rB-$0(vxtwDPLErHR_e06-(g*G!|+{!qI4IFWofPq-cfTr#S?gj`xfqP4pm~Cd^Zyulh-PYOdV&l*<6!A2SQRJ=$Nxps^@d`WpRDGF z;K_MY^=Oiut?l3gc;CmXCgIFjb#KrcICma=LHV6`cdQDg zB9&_bo>jgc&|3Cw_ya|uFJNvMJc2grH{tn~-lALyC<^C)mKlS40M7oe%4=6W`#YId zAY9=q3P(Tt>LeU#!Pg3jW9l$74tMfjgd=;QQ>)?IACOz-?6@{yQ zt#@f_0BzpihxwP!Ej6q0Nf1{6+U#HPiID!}tBLH96-U1|_VxRAZTvSzJ@*6N`_m@o z&%e%^J@u-Oxl&OY;7*mL>cIQdRgY?`cM|o`dzfymK0UKlpZp4w<_*>R+Xk{see@4S zsf#k2=5_Eyhq~CRHQ3-eFIOPupNu>^?E$JxjJ}}#UPLdGXc5n{h+CdtWRWkvu2`SZ zB3^6}kN&1&`7+D+MT`7zE#j9d#x3P5`(De}tx)!(7U%PFe)PDF7B$6fE#myHiXXi^ zpU3l~$N9Z2KYF}@7B$69_5G|}zm}da3TB1u0?)*i@53fvb@X|WxrOm zm-8(xzF>Z{!Y$Zmb<2;-3Kl2&6!f3HdE=XxJ8Zo7-MIXZ#*Nz078MYF|G--~r$Qd_fq91OvgdU^GYt)4@ED0}L>fE$XNRYudom@VkOq@KCkIX?U|u@Z^)= zldP~_w7OMaSlzT2R@WN{tFk+URcS+ERpcP7Qg4^@>3yj~J+$;6)x%u=n)Cmg_M;!5 z};(k867hW4(cb>kcx*cwswgITL+`CvW+$fD?6jGjxb;j#s5Zwm7}mt70w3S z+*%ohBg*4n;edSpCkzYb^Ye9~79P_>J>Af9$4LDDZJ`#Pl;K`Il=&xR_^s)0f8a5J z`e8q)?!#v&c-*6Y^k*qDY6|Yc5$ob_{P~Q9pQeD%T39!K>&lPTf3@c|j5|!yo^xhQ zmSK9u=bkK6)ki;1&(qJ>Z5*DVJ-u0V~L)xpR30iT9&OUu9w%(w+!|C z-wXBgey?10`E1jwFfadG^6TgRUU|zpSiZ=*Him}~#yVP9R$mL98_4(_TG#?*_`7sI zpXIYr9_t@R92h|~NCi2d2$TXggd;G5XpjnWKoQVCjyP}zd~Rq25g-~Qf>e+Lia;q4 zIL`=DEzajN$Uj>LtK-KJ{MNY{$jTY>Ii;M7QH?cRX=~_{J<5k z#RgO}0q=G7gM0%J_r)(VJ3>ypAY{BxyGHa6T02Hv)WTF5M#%IO8E0vHDO2U=7E;aO zw>RXbgx_$HU%=0j>j?S1>`&lFa1~quW#BTn1TKOL;5;}BPJ_?Eac~420-pl@;$u75 z1oFYh;6v~}SOVSxS>RPL9lQj_gVA6(7zzf0$3X-L1OC7pxB+L-5wr)b!F`|=Xer^b zBWMF204(ng0zfY?0E_^Wz&x-L>;Tk>KB6rM1qon2*am(8?a`N>0WK$<_$|_a0MFstyCF++FaR?0J*iKS#kML%Cpq;ieouN6 z-&CVRWTHdFphG-}&Tt+bVLm!S;1BqH4m!fr@9|wCI>X1`;rnHDhEo^uYlv^~UEkM= z^3GSVEjq>5=Wq^;*yjv>pMlPC`4oQV`h}wG`y74bB>Lb9v;&xp4r2x897Fw}8E6b1 z0b{{8ARYOAP_`$|OTqais3)dWQJheBYh0%{uJ;K#V-)0g7%~|l-z$){K4jkxUDiXt z^U%3FY;_Kfa4jbH^_aA;z(MxEUx;h%@kePp39+V&5G8PEEwECU8iaX09PQm3ZTy4~ zW1{h%>oY=38UZ_xhJEp6hw>8qAHL)mIS21AqH`S05#rXnLfrKM+Hf7dr`agPu`NQ( z+>JIlfOiRx!2X}(`;N1Ce-|(P54((aebAZi`~~0RC`hxh5}onoN2I-#c-X;86yQsc zn|KlN>tOXEWWauEnV%cxlchrx=-7Os3ba=3{a~Icc9{8K9egQ!tVLiehjd-k2 zWWUFsc=D+MPe%_LJS2ALGjY#87e9PN;>b}+$)m?SpECA^apNbvn3_6i@=H@*PMezk z%CzY-X3m~TRAyzFM8*l#Y>jH`|h&k@4ff_ij^x@ zeUO{`;p){Nty#Nv-Nzs2ee%ir4IA<|ZY(G)D%!MZ^Oh}Jw{6?LW5>>2yLRu{vv=>l z{rf*HET;`_0}y# zU_1&(e9wr0z{@e(OZifWjJ1jx!6O>B&J_xI%_{J(Q{ZQ)a{}!%%h<^ElAbwY@o*ei;7UKl)3r z^77id;!z$h-sWlAN`)z0vG9{qB#hbcmM;WoaqVA&jd@Hv*6ro)Cgql)Zif{zUS^S= zXc7NCdzDJNHI;VOL)|V;GTm8*db%z#?PHC(rT3Tkg&*d#3z%D)VSa0Z`Q;n1 z=X}mSzcwvs3A!IWik?O;^b%T!-b0_F9cT|ah~hc+NknI$bI}Ae9c81d(OhIfccOcc z4LyOX(OUE(dL3;*AEGVjOVou9AbId<5IO}VqfuxaGNT#ja+HVWqFc~!(eIEIJ&c|} zPoo;-K~1OyZ9wm%PtkU?3++J%&=E9%W4oc~G&BN@LSxYdXgZpSu0VOH0L@3Yp~dKK zbU(783bY12hn&cRn$YX$Ewm8@(Pp$Ab)wy9A3BI+Asv8*pd>U5jYQ|7v1k&ShGw8_ z^lLO5-GJsH3%Uc9qPvk5J%m=F)#xeoJd*Q@dh{at6M6%^jRNQc)Q+|y4k3BoJ$5d` z?if7}>R$t7`6@!0t@4CT?A5=1`FmsQxcTofF4M%;GpjbnmOh3K$KE&f9M*Zh8X7#aPOYHB`zI^@d_3w(M z_pj?e|2+M-KOYR^XU!{H^+MBz_R#L0Lx=x<_)yR8Q2U0a7gm+cn>Ai8CB$ADZTtZJ zpuq`46HhuN>9o@g!_F8!!Z`A*lygR%d*0~t)5eS)XBt0YV)~>DCY#MurcRrdkuiPx zg%@6U(M15>J+ni@&%L9Cr%h|8aH-K+WDi;J9pGMDQAr|ju?K% zFvIDmC7p6o;?RV_gY*O9wHkHg@b`xz-|g?&*S+_fuCKoe@7nq0j?fp|w|%yC%jQo% zY2WnmN5Kz2c)#s0?`;eO-hF4ohSt`%-+t?@x7M#;@BiV&U!-x^6+P|>1UT&CpzFgR zM_e3lZQio=vuzw^?f7!%E{?6bzS-NouV?>vkwf1fKEl@qI1y#vk%On}xxOI}kmYj3 za5-t0A&wN}$U`1Dvva;>orE~|vX3Ke4A+rH!&J6AhqSZNNc@?kaRDng8PA2)%wKWN z%SBf!=W!;v5Szrclaoo~+%Cvo#KT;i98(Mr#TD{!oSpN&@L;w>RkBN?5+0xnb53YM za(-<^Nyx`}b1v$MXFDY4>IyY;{#=UEQG^A;k5;05l!^{Sc0= z&<5l|mFOO1LD!&6G!_j_$7#r|3Pj4mF`VWJmH$-DBt>bRQ~1i%?(qqsOj< zpYJ3@!_PC^`~&Og64V#|==D3o&o_q@--L^XKl(d5grDyqD!xq~duFgN{L$Z*ApFs5 z+;YvE@beA**t3R&pKle%uB-KhKl)4}Nk4t{b;#P+A!{vf+YueIK8jZ0`#O~QqYfRP zPsisIyL0q>3>$A80=JqH!-wiZS)97>#7$BjO*v_-H!%viw51?&1Glx%vO3 z+~s}krPOG6yqK}M(e`Mu^Qv9I`P7D&*B<4 zJ_0}EV4~=Rc(o0-bDWnuBwm$|0;O4ybGcnWfOPnD02?g}ysE-eOy!rIdRu(l*$GO35R9Y6<-% zy&7J47srYC2t4&(j#+7^0lxnL_aN~>Xk1PnX*2xWBm7M}mzQ&|X%)wyY?}(dLYeq3 z7`KM@v8@h%`Ygw?gW^>OJn4C2OF2m}BV5UWV+VPHu&|!vSjtKEaH#I3F8uOF zzGLwsr|(!1ep9UON{9=H=l_UaVphl+DQ!W>((xwfMJ43%!OM3sH}E--^Ho(s9^s&` z7(3Dv;HafO*~jsjuo5Lve)1vOi4yQRa1qksOW{MP_pnacU{)`6 zv90h8WRbqWU8s9Nyb8n553?>%FV{pA*F%&K&-D|^}negfGYVMz<;N?ErnVd`|QD=x-W)4t3(~kZU=rojk(nr_xr^ zGvQm@xAWs$;ZW|~wU8$fzKDGICODpxJvW}~LW*la%8nOql62z3bs=>aRgo@VhB^;b z;M3r2WW(pf24uzi;3p#~hiyCHP24Bc6VD>Jg!_eMOqh45XFYhB7f9$^h%{OZ=kE3SK~36mH*(z*7f)*wBe>tAX=Qh2U` zsYw^asmM3XPgslGw4sn6OkIuac&=lqaZ}<{7kRiQq*kC#Joj1DcC-!8y&UyFD2V5N zjyf|VPF1ok_jDBZb5wxzX86o>+DzN3VdjN#YB_m=@cfGyck-mc%TcqG30u%I@(91k zj8i4}5IlJXu_6!mcog?_lmjokDT_8xKKFRk;+f1>@^gPjWnIc#A&(CRv#Eln75J+z{gzL0p~?QqsS+DZN{xcR0yl}$Mv@Xq<{*S*XKXe(m8 z@WQng<~G|}7qai8cGAOe?5(t$a!f*$j~5QQjhIko0?b9}c;PaXh8J!@t(3D34)`r| z53h$lRE-y&SHfCE{xtX|O2GT!#zk?eoIGvNSIRz4+k`9cqR;r!-^HnC%h-RVzc6tr z?VxSK7k*D$Nq4{l_b?YpkH8uC(tgsjpcR=(7rrBZQ&#|Pzb{Ue;zMw$l{Epczn}S! z6m84?1J5HoNI9gNp%vxeh0m{K|LtN8g#JgUm-IHc=P~w8d^a3i!J0t53Gg85Ab&4B z_et{8wp92Iva!wt;J~MN-eEBPg43R6Ub1ZlJlW2CBYzUS3ni0Y1~Xn@y`@ZH_aA8w z+X~OEVI3h)Dtrj(@iuq_MdJ9pbHu5+s0&{LtC6D3LdRORm3YF7-K-Df$$~c2N?pQr zs0Htb`dXgJzzdfn4_>$lIq>c9S9R2ZPllza5-+s)=x=;{lnY-ZKGanV3twf<(-$91 zZ>C@0v+hCjpGn6H1E`#GgqOWe9N0D+-iuoCR@mD@`zc@e_&W07?XUq^*;e@No2)5# z;a6`npYg)tR@PyB39LZ@>h-~SAJ8w#DStCcSCiM zcG4bU4eB7>2OrRDlpCLzpizsEkA4Yn8KO}Yc;S7>inqcQLp5p{`Gq4+)F=zy2*;vQ z@(6<`Yg9H~_|T~uWx`j$H7FG?JYl#-MGnzUSb#e5e%L*N@@c2=5Gtg6;SrRB7Y;a6 zqtfxh6r+Y?K-OwF`z*HqnmE9lQ3qZaI$NV!@j??neDB5!gQ*&2!waqFX;d*@sLt1@ zJiPG4G>yu{C&E=@G^&ku3N`5(<-sSylO}0YC0@9A8gal|VabIWm5UcHr>1E>nGuGXmGs2ndmGM~8Ng{zBb z1Ktk*`)2B*FT(K)G)j*bZn>4Q_=+~)u2Fa1rBMO#aP%_zh&RE@kePC#yjP)$o=k;)%Dw39k@Gd^${e72$8Is8sM zF^Ry6*U3Y=a99iT5T6VeAUoayYf%;60|&mrHh4W;glzayxE@*Yt#IHvjVhBoa5gHz z=R+s5;N5UPD#S#0!g&886&`O!xpatY`hf3oXcq7q%k< zUO3||#tWYX+mT+<;mEg%8$JcrqMq;QBhnRuZcneoC7w4DBiV9qwyL(+w1C@KsR%SK^Ns{tgB3b~ye^KI8D|@Ezp92jHAe)@|C84{K31=^l6( zRpQl7K97(U-wW^AMSi>$Zbq5xza4P#SM(oW3gh3*; zhjIe2Z6Em=YvJA=#u1;spE+`X7?DSK&3D9z^gQ^=LFOCd*bImF(nq`zu2EX$!&gC@ zMysmv!l$%aRf(^L+IX!hm$tzZ256NPp8(4TYE>R>6F!oltv?>GdfTK>=sx11I3h(`uR+Uk{ z6@H1*$W@afVhU;j`f0;aZhLUET1i5tL7vd2q0i_7STjxDJ^l zhHyJdp`9VPbfi`ll4lugK*^;0;5lbeK0XyzB0XMs5cP76u@|0vwpR7vli+C7g-?SQ zqfUGld>m~fR+Vra3gZ26$2nTAyTq%OQCihHn)uKL;l43iRY)9q;1gqs5B;iy7mTA{ zcr(^pD^>cVe>-%Ze}c600H+ z2Vv(V<^f(f^8&3}j?advlZhu@_%15I2jDm}a|UmMNmI1kLnkKiZj?j%GB|ZA>G%xz z6f)tf;n->PMYe^HBLlt?PRt&u z@Ze=DUictt!P}rAlR1qSev7K`J+N*D^BnJi_KUTu6fb=262=8z0ZX#z7hae4EPWnl1*RmiST38^EWXnBT(wF^!xVXWCU9gbLpC%+MXk20vY7v8#<7~+fJusewxJ{i7@67fxN zWT{r^@F~!RBKsIScmQ?bBk;-JF;`ias^AS}^q2Gk_y-iA&CB5d6qNjM{ZjTpd@Jk{ zPafg;yXhC{>2N9X;g`X6$c^_y^Y59Xc;R7Gg;&d1D^L^Vm|^@qtRc)3{k_Brg^7vq zT`Sv?CjkHS0Ndi5;rbPPUJxJaL(H{u>Ls4SnUAtxP<}Ri^D*{c%Jjo`DwxBR8GsWi zSu5B!9qz0rK5QF?7kFqh-VE!#%uhZaJ@7dnai$y()W1wRd4$zX)J1z7P`$!qSqN8eAP;p_ z!rAYze$k$M_$;!J#}0?Qt5t>gMEDZQ!#Bax0?b>y0d7L2)YT5p+(^txH^L7PAF?V4 zTi#=RkhZ}q{=)c?Cl@xMG$|8Sw=p+}r!et-%A{?=MJRe4r{kCZ)vj!&fChmM0ydt>@)g8{%jc7Ngm1(c7Dw`(l+7n-OQ6P zv4X2mEBPznKGclwffK)BT-i1g-Y%Z>5;${@R%KFGHf%x;(uEOJg%@7g&77zFTzCMP z$sd91zGaS)#}8lHr&V^!Z-Oa*BSxePSEDrYSHihHte@m5gl~UG8|ZH<9QZwJAnAJe zoMOKx-417JSxe|+HZq9!pr072X*DZ2r85|!Al?TzPG+6J7n+GPYQjfg=@i<97n-LMXT0zl6vXGjO4NZDj+#ci@mcWW4C0S( zhx0R8|2ioX?wCPe@ZIpGi)kai32L(F2VMumC<`x~Gn0Do`S5X6fUksSUrJx`Dexmy zif@OLFViV2-VC#6(MP;6>k9gax5IU)8SjTXuZH+A%(;fX;EUl^v*`=I2(Cswc+0gq zHD!*ROA&Xt2qupTAiJ#ceAeZ+_1*y|WCya_g55Ai-Y?gr+9q{AoY(nfq0+=Gho z-Ei1%C>x&)*P&(j5L{kFzwpB31@uYsz%>?PiLZjMqX51I1{Wf{(0d#0!uw!Kv78IW zxD}tUi+us=OW5b}!g-5{3%&>rT0;EsO?Tu{ zEZ5QROc!RJpg08jKQE6qowRHDcaCo4|1R@1Uk)w1D?+rc5KPE9E!* z({MSsBDSBvxl7#9{$)k;&5!oGgd7Xm`VOh)X#2&F{>e7-i`I*yt?$n}kzX*M9Q{Su z{=5=5>Cs|1k2d|#gZ{Wkxs{v+b9az@3!=FsiY2sHMj_TWdG7q@X+~8`f5tNkQ>b$c zJu*edLwfoDiw=*KMSs)b$8E}^HS>s^jLtm#ZS-7TQ~6DxI7T?uR+%-@&;EHMf5~i+ zf9v;ldQe1!ig=#~#dsMJcVna5-bGG{)WysQnR7Bmv3Se-vgH!Sw)964{OQTm9p@v!ZRgmUQ{I$$q{U$Zs34qcYpv|547;rPW@n+(;>7s*dyvKna+HtrM9HDtkzm>-AwUJtVouMwZ&RmyYXQ?Zzv(;7Ax$Bzi0(BjA z;krnjzTQxuT5qn;uFtQx)R)!U>Z|JWdCpOFb8iWhHP{-eD8IQO(9qEkZiqDK8x4)A zjpoMe#{5Q0V_BoEv8vJC*xVRs>}U)(MtCk#esw#U|Lg4rd#c@R&$j2=E%q|I%}!$C z0M!W!Yb-S-HB~k4nm|psCQ@T?*qv^t&)MwsJ8f$#)>f^xuXV3&uJ_jm>Vx$i^`ZK3 zeRqANUU~GMM32E^^rU)B9kD4tvNRws+f&M@Kl@nae24JSuUPIjv5cv%*>BjKwAB>~Myh zVQ059;#4lZE74_e8C|I^lgsSNbY;78UHPs;m(^u+Rk*5Lc9+}bb2YpCu7E4(>Trcz zVOO^+;!`iR2H250~(O$&*5NHfGh8V@}Mr9fhU9XMN5zJ%^r5~|g d1nsFW(7ofY;}JL>f#VT49)aT#_>Yai{{qZ3fX@H` diff --git a/libs/dll-binaries/x86_64/Old/fmodexL64.dll b/libs/dll-binaries/x86_64/Old/fmodexL64.dll deleted file mode 100644 index 463628c6e42354e297e42bea65bd77e96b4dbfe5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1527296 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Μ!RDzm%>I0rvx1PvV#(lnBPdBV)yN%pG>baXn=Dus>Ht4y3 z9GUw%a&h(142L0#V%tXWm>v!DfRQzV;BsTgYm@91*Rbo#MWJbO+qvf*@U{o6() zr_O1a1#c(0d+(iG?!JK+o#Y;#5OL0;$EH@pWU&3&TrZ zeoo0IluTBs@X~zR^|ylsXyJZ>rxqUFrH_$L6c{4iY7C~mL+#5k=w1s1hyk}?9Pg#O z%1oFn)X{&WbbXLj>B#r0FLUIf3@vO$1N&#|b>D4d8)NMW9q1Y@d>lQ^_AylRoHerWO$Pa2feI~5j-&q1@rV}Y7%env8Ku`U1~UZ#@iV{I@1R9U8MkVy z&Iki+|4yA9yNMlTj3_e1w73dvH$iXvBFPg&+TcfdxVSOcr+x;5B5~wpB4h*(bn%nD zs85$tY$-1$uA-k(Rn{T6jgGy1;l=Q=6+R!W}~2zedN7ljdZ zB#43xG}f-QqcIjZZ%~h^zZdH;8s0>NU<4Qq@87|PZyw`-3DIB1c^`ZvN|O-h2%>&g zXXkY)+3o%B^TcuGBQd=WOgd6x!XoNZj20F=vd)R>J-9n|++36p3J28+Ua3&O6B*zX z4H9shmIp*~8Gi31J9MTIvq?=&FuNAUKdR@u)T$9EAQXm{gKQMRGQJ%rF-c`>t25Jr ziHZ^xg2Q_CQ?Q6|nZxQ*2nI~f;q`I40%d$C8ytZ}#^gjMtbHbeRc4qudNJ~{X*}Nh z%Xxi42>o%hduVTJMU86J`#Q}&vvXU4jA9X$+eLP6b`c+YQxU`&jh#wL zAGIgZgshgiD&UPw#`N!j;r1P{J+%9~gQ}p`FJ%W+DSajFoy5X!OQt^_?e9f1>#RC~#JmtV~B3~<6C?2z=P*`Uh`zk{Q*v4Rw5(JGld@bkUH$Ap5+RLj_(6LO1tFM}EvBO|a zQW|GYe9arX3tCTa`X#AtUGoEafYO)HHEIB9x0lFEedq~#R&ry|AMYePMqMAuHwkn` zp2B<*7*Op$V7GsBNj{Sz!B+P331Zumdi`NR>uKLyR z9g5AY&SQwXWLS*Nd~9;YJlyGw7QDGRjf3axP#pXxGO`=08aB;2FJQKDUQf1WBv z!TQZ;jCGY7lO}18B(g+h#ClN)s~)Z_!roDf{uT@9T_(p~+PXv~$DT7aIn_7=Su!Q; zq;ITkGZo!orkvJer&Emmhd|bNuXV<@Tvu!;14j$CY)WIni0zV8T?dxh;rn#D?*Q9( zxAMIw-S;4pMVDE(PWk>c-S=(V_i5!jJl*#t+jqY5%}e)v!uGvM`R-{;qq)ZR9j|;_ z(tWS9eNR)qzfAY_*}j_c4X68_X#4IXYIn3?Lb`9R?fbg&JvrU?6YLI<8-G>4xN|gh zaQLe2`-t-WM{AnzUu@r5%J;=|-$l0X70UO4bl=-;-%;>|ZnxFC5*h1hj5A`#!$*vL zV?Ml1UG&(KF4v8C{s&JO&usgl`;U1(MYz1*9RB9Lx%PET6oeD_Uj+H3eF{Xnf6bKr=(4OUO1HH5ZE3y78 zX@p`>D; zZDR}J)Wt?`d{!4byz%S1*xij!z>a^fKQIgI_;!70yD#WQiK=Y3?7bs@%609gh929e($S#Fj3Pk!RubMiwD;z=l+jrV{T zn||+d?Z&eoPfvXFq5F?{Zb7)Gx_C~7TREPK?B_=OI*${c-_rgP>vgwd+84VOe^R6+ zb-nxu`$1}d*Zo}T`uBMdzr_CTx$7a^M&38eWr_M-Y`Ag#n_pP}R*rk%*y`SZ4`=;b zx!;482&{kO0~LT>-G0c08lcskhqr-nMC-qgVU4`i{OP>fZQIM1033{$hMt$qA1>@r=VTqG$kCNamF5G>C4Q{JJQxJ7 z9~u)t0wBFE4~RnB$>&P=K=Vu-pB}pxXwHG^_b`ACUxK!WbK_nd=EfF{Ps9p4fLQ0< zslEedCV+==g(8n`HxQ0OZy1NM*=T?+H_zUU@H!mMF#5scZG>)Ti1H=@eg1=EA}>{GStW_EP{^hKy~UZ*@cd_B-9N7eJF$sAp*DQYdL{ zv9n(9#f=h;(_q|U^`+7-ZbvuR#u+vjyz2_R@G&!S#Q+flu`0oi#~cR^dA*TCxuJ6+ zhw@=ScxYg#AaV%vFfI|b*0}JOQ?2+g_0EY>e1LjqLyGrM?+At_5P&ci8e+YqK0HRP zOhqDhmAFEEnUy)N#E|{_7%vo&%r|w|F3gN`#QFnBjYiOuK{AbUtMH4f@cicIzS7%0 z+QL@&2aLxHYv9fm`YHIu9dH3ec@(cUUSYtzrl|HjY#zB>cmCXG0<*!KI9yt;*P4C- z@g#--#sQlSV;Vw3yi*s|l#L3xu^$oM?`yzqakmtXtgQbijFVlT2LM=PeYOtm8Z8mV zZ{ss?5h>2BdmYFnta}uZHCzkVJ7CK!K*k&MarvP~TQEZwl@*x**lLkRZt#iwW(QnsqXyZdQrr2HHIho>?*X)Jdn2Q;c3p7}}*~-vOV-Onm zks^$3tzz4*C_n;Z^?F9Yh8Im&W+M$md`KczQo|x8Yk-PeBUN~}mu=W9jY=I#a2gYS z6Xo>;OewD%)ZtEJxOcQ1n~jO%>@`iI)x&P9acnjgtEn7_MlZ9gjWVinS)b)*Q@X+f zT62)Mt8oA+NTvZAk{?1va({Oo)_Y=e@F#`3)c)*ZRB#vjPsEq-Fcs_q+vh9nz0YvZ z#uJ#ms1hu$vIj|wkU~)5Qj>lduVF3!gqHu7DOO1Q4xh$cE)VTMF8EX7G7;>M` zPj!V2D3&jJA+{=bRst~FK~1;hYdhS5t&MD((3 z>wepryKqj!L0=2}D)(34_LM>g@V*RlZ%hWBJA}y_8n+iteynCetUt%y^>iA^b|uTC zTlmSt3IDP~V=c}7d;8sEeRqryQvVB)yS%GMN$a?CHJcUdpRHpRhrZA;9_#0SWE+dr zFfb~AVB%!uOx~z2&XM&~c*4?Y^xTQE2A)GbaEUjviYqA{;j!Mjj+y14;~M0Hf-J=k zYBz(qHhzvEGComtG<%|LV#|hbST?e<7wCL!VknZJF|M(q0dEz`GE?=HUgwckB>A7HFtL{mb-V5~(YWG<#FR2F*HyiH|NDIYYk zQiyQCN|E|_f0@*WC`5|WEzkz29}eA&88TryjAx0#dnaDr10&QaAUy3Kj1gaf`(iwg z;dv6zGW((Xk9qbY9MkRmybAYSc=*fbqm;)9OSh!Hd!8E>#K%n6cWQio!|zhY=T?b~ z&vAhZ?Njao-!Oi@0wFMHr@c4E=V$TD$h%NEw!*R1eF8r0@%j16eVe!!-~(L8sC)+A zsHs}rx8jYnCJ6B-PfJpR8RhT+9F!igjWHxo9M7~4-GEwiPJu#g#H|0xP1vL&e1K)n z<{338r5a?Hp)F~4PG_Sv%h7E7daV0-M-5Karp$m5A4hR3a&g0}*qk3HGy&jjgqeXR z+pYe!drrYPKS`RDs{$#(A#Z@#(%I_ zpu~~t-aaMCSc0fN1C?M#ByG$edj*L5!mb4nGxDp5PV}eLQS(=zs?4{b68`<7sD!Qf z(HqZ2-mMkHH4zemb)+ojDl*NXF_Ztd`Q5IC+bYD)mt%ACuL`6#1CO z4>RwUk?e(xDx_fL|G7K##xI$$UV8U5tse4^(cmSM9c!5j5Exo^B&lk;3{=VB;jP~! z=m7>GYEN17^i_d-O5n?#z|W)wu5tqZ^BhU}y_HP)YA5hLX@RFWfg4re=OplTPT-3r z@M2OA8kdOYRPh`KLsMW6W(3S0yn`oT;K~@|Vmy5V#$A}JEbuHR z{6ZC80-B2_lO8+#dKLa<2|w2ff3*rP0nNoyrFQrwDtuJJN1X7dtMIDs7uTeuf4vHS zm4t6_!hgS1=$C-@z!T}yq0tgV3drqVz%NfwQFWdtYGTmpG9h zP>~rN;=Na5E#n88&v5~xF~tL4s&_USjI%FPqYNoK1$MEBiNNw@2Nvy>p0YS40?U^j zn9E|FQWmE~VEK~3QTI*HO0RwyE3cz`hCJKiuG#GGHg?LjiRM^5G2rWPfp1}~sXPQOu;=V?W#NB2+#F0y6^)x50 z$+%7c?ou-DbQOp!b%kz%Zxh2O6RCnf^aK4XBCDCSD>Q(?sN|BtPG&Ny0t1mo%7T#F zz%D(JB|zAj<#&G&x>zwTt&Xc5OwW^+?OOR_QUk)!y>n|}o8!t$5zh=Gvs1){{)Kv-~EOiQ*98b-| zlp!_;f6~WOiS^PmIe$D2e-86c+7CyR?Qp1DZ`S7_?4U!TO$0k5##h@nYb7!_1c8;%Wv)7-nwryRNDvq_sv|aKV39j8<`GpkzPp zN~nL539Q;(FvAYOCE6IR4BxrsxGabhDF#nW!i)prKMWrPyQ3?D`A1gI;Is+JH8l)zZLOp36G4ZWz84nRpZSU%CrHR-a2kg}hXu@Ddrdvth$vGJaTm7?Ba)Ad;=pJe=?ZxQ zX71s^a!n@`{B7~_7$)N-z6%Z0PMSgq(W>3;f-4Mlx~jMg4q33> zE8%Y7IAF#g-^lsw9HqTDtu?ktc^@_7v|#CcHrUV)wbz^N_F9b;yU#e$oUhs|-pAB6 z&n&Ms$#iPGWHXJQgRp~V{3Ipp(Fi-Bb68rArZr|?sR+7OPjOFa%wn>{#!Ljt$f2$q zb36P}8}oL2qcJ~HrW*5PX@gxi=9{``%$Ii2m~}ShM>{p%>7at^B7cn zmo51;)sk&*w&wrPh#jGT0Gz-^HA>o4uVkBw7mkwllyvgM`;4Nh5BErf@33vlpP+Te20T?PDd(dAEd80rOmFo0G^RU-83IG5ff1TZR(%^`%3?8cDdff^9MXH z?FDAmce?98{ z#qTj;;Vjubsi**NI+rA#nbcPtqqXc9TfGA%c3Qkauvjo2Xn;53OhKF?I0TFbc4dgm zG`O57F8Xv_o0A;+2w6WsPxk~pttUD39GQy6pLL?*H*iR&VyU=*3gAFrriyhKJqrJb zH-ukC3?$b-c%-e6`zyoHGsyN`cdi6*`>wuy7&i86Wng9>znRSAwm`)rEDmmj4q)Xg z0L)*rmYtr@oL&M%m1<);K42bRXt!Hj_H|ncPSh9Dom*JbdBODuFlDR22~_G);Pp~) z&efj1Dumk=Xi7r#+7}8N;2ALA^qI|8`EoG8S2%(TLhpg~1U{>K123_MFecNrRUZ$~ zBJ=4nXFBlD=HSirhnPb&jO3)^;9W^DrJv=;$q)`IJSc2snXun}1UrN|5!_ z&lFj_F1-|ivJtgl0Pl_Vd8mC`Hu_@u#D z305p{*uy-io16W#T&ivf6yu{=KkzR|QP%gE4Qzw)E++-Be8EO#@ml~f31q#;S!R_U z>B!LPe~-lcW$%a2M{8bqVHN}dNAb&HUfKpcnY=}~>qA?a)8HGFG3%?!YE{TU2X4}O zo7eu~B>z>R*g(W$?0oz}I@0Q!Y3b4NNN;>$OI(DM91P61(EwfI@5m~>Cc(!GfurE z-U~K1*<(ezvM*r?KI~Ki<`6w^tjY@ok-VOX?Lm7(VX(Q19UZ)(Fk_hSHnzi5_D?1M zO=w3md)B{GsLxKNKB7c0_5flt6$8Jl1}Xnx{69wc5Aqksdz72m^Fh6ly_m$~CdoAR zE8^#;5+4aa8#_ga2gzY(#)%7Vd$0b2UE4_9uM@q!qkjL)GjaRSfnB&Q&)f*dQvy5VI~KhJ_& z%#<=~wlPO9^Yce1@)We)(2*BNTt^bo;?l|W zO7qg{r(kS^H3GX+4i-)h;^;b+g7&O5UNlo9Bi@ZI*~r1)5dmNV4TI{2SxGkNf>{ZN z8v51xRYcat0ZZDq$$bETt#fQEibd4!ydD$Bwi4xjxrXUs^q6vn|V=*9{Dym ze09=m8bkMLi1ydW87W({wHc!i6EGTD{go&M2=D%=T3-jnSYQ9s<0O0%4(_F_ua5!Y z=EfKmGr`)ckd(ISgYH^{t5yR4N>kK8^+PsI%otg6sAXm^qKQP6T7EMG;>Y%~SrIVA zf)*7$5$VchEcJ}pvO5=8Vab%RtyY6vtX~|>H3dl=@MA!m06y(mzs*pEsw;-j#O6Vh zf zI>j&kMpm<4<_>wZ;NernSod+9&`CAc-37P|?b%(td?03kblLL9oj^(Fc-S`8O?A80 zw$x2^tAwHMyOKOC2%-~G0hknuf4n$4R*EAx7{rH0C#2#oNtnIy9P@qj8VbCh%*L>; z?rWSCP0|027D~y1lNaTBVjMs+%P<1}8xhgGKCOJ6b;{EytH@6?Visf5CA>NISG>L{9@M==E8u=2WPs>uWh;ml%s)lMVaU#Oao7%F*crf4o>*;C z7!r>0pWC94bh*kFgro}&1>Se1Bzu?`WbKH2a4>#~Ed~9XAQ=xSU!J?7@5$vlMI4PhetmB0n*drbeYc z4r!u~sdAMz2E53o*Rg(pCyM7uJb$$xy8oD`-``y>57wSLKW`v@9M2*9(GbpgoUr`f zjzzwDJdfdd2G1J%q5F?{2BJNdcJaK6`1|m5*iV0iaULf;zd2!NS2vLRlO94&O((ZZ z_W{n&l|kziarx4GU^*C#PKnc5%njbM`t5<{u}?cezj~~-7m5w*kv*NyW$L z<09MPT@%hjFR%n}hU_!$kEounI|{>|FWwU`Rd^X^X7APVUAS5{UppBVYud@MRLA|T z9=Me7V>+Fuz{QJebn|}wFb;jc=qtQSI~jdEa-NFS9$ZYf?t%0 z!=SP6un2Sn|NnHJV;DP{q4<*)AM0CO+foSM?Hmo%e(GW6nC_nxI_p|{g*|!+u6yut zG0Q!se}N0bM&N7N_NrI~LgmOgEgueQ1#wUdpEH?I)Lr!p4dZ@GS7)|P!51`e)?%vO z-!f&{h>-quP>|$oe6^GEA78j^#!vY1SQc4*eZP?K}`Xu(W7Jg#eRv1 z0SG47PkEbU-2~KJW$B#BTAiO&8Z9_o`VfpPLFHEKU4>XzC!!NA;Mi0b=mL7aVtdk_ z6@X&6D6_*Vdx+KyTPw}K<80N`MHMD)LhWePR!+?6(9i6nty~Le<+a+%&COP(UeoTa z*`4X@(F`Zpu*1oI&riNLw`c0xtsZR%Qu9G>VRrNG%pPt0vpI8M@ppqEE4&wm-C0u^vXlGR4H*P)A8VJp!Ik z(^L#0huw|v#4gP~{D9w^7cuB|@H=IIf5XWbczX#`Ch}IipT2*iH^d^&5y!!BL_xPB2{7mn_XDIk zS;TQgHUep^wGSG|nI8dF4*Nmcyk|(HnRi!y0d!Olq)cI(ndVsk^{uBp2y7cBDv#;7 zFe5hr_-KZLwd|ODUCjp!e+|9{B7soA@MGRF#)IEQ_$|Wkqt-8Q5FMR@H(-w1I)}z3 z?pFSk9Sog}^^NGHfn0c;t~av%TDPdcKMR-_Am9@!Al3uHsM^)6U(!xuCu{T8px7ut zlP1<<&o2ajniM1-jI^gCB(Ik7SetNYkBh44g2b#lxmgiopVBcFMa~N$5&Z?|4rS4I zR$X_OZ{$6s^lvcl2u5fY6_I2 zL^9oX&IVr%STjc5*UKxe49L5VZ@ASqVC347j4G74n-k5@2coLrt$Xl`b8LDMele!Q zevee8J`%sEO5Ix~;!b-%$=sMZBuPfsbb>euy3upPG;u}D+N`{#BFNXv;K&PO>*K=nyt|Nts#KVX-fHKgH$8!1B0l#ae$YHfsfXb! z5?~XwP3oL}iT#n11>AkCdYg><(2x18CLG$17fHeOnXA>V9f9aj1?Sc`;4a=KpfQMlu+OOk-y`83e3MF zAOD&|JQ!tjoVhI3FVg;NLtL?mjRe5Xd0;TK=@s{3fPC@`vh4;D;7ZvpYMMswsYwsy zGgi>vK~?*^!%(5$`^-0WxfN2!CBmpwDY>@rdgv02mQO3I<={L2tocZ2IJTVj=_@kW zNnC}lxd<{An&?MA0hsiV-;a(Wd;wnP4g=XF&CJ(%cKZ@^EPB~%p`N%!92*vT*{0e5 z#2?)E^A15iVD933Tjh?^%|Zo0d8K31k8joLOi(Y-AoK77grqDiPx|ZL2@OE4u@Wkb zUeFL~3T6~`!%!SmLe@rFarx0j=SP~4jkLELiyPqN%W7BiA8#lhNGL^Ri`pqNeGcKep%~ZXtb%qy2>SGgGHa?nZ><*R5iFGGVH(bk_NIOxf=%^woraiXxC`RObrt8r8X=f%BaJ zq3vtg8XJEKZ_Ia!bT9$+>#>eL4w77n>|^&ULI=<2s}k)giE4EpAc~9yv5137VEr-# zrefe;LuaeLzhglGKNE_nA_HKVGk{z34q3b6%~E?UsD$gY3&> zjy<=VGuNgcOadu^W&0N(dy8B^K-zAGG!l} z6hYLUt_52mmI-0BO^B68Qv7Zd@e5A%m(D!@j>}<}cv({R&S9?-Ey%w&A$x9U6}@p7 zmMYU^?}=j^+3TlB8azW&DdyH~(hT0kN0Om+{^f{W@C0%R&(g=(&}pQm-2w~|I3+vq-iNVLbn8?e#|jxB4hp?2cXO= zuoe`NAkn}`Xy7ocq__Ia`eua2GEc`M#sjP8a{4%JzLe@()FIe%E@;#nCxfs=sdf%Q zsRkixEC`}(M#97qZDG(1WF)UfawD-aN{D_14FJHmwDPfd7kBH@3b zD?xGtXON(CRJ`qm5cCI$w}t(KqtnJD;;mNku(Qw|CE~_&_Zc}GQ8K8a8VB>2+dk;* zr)0|zo#C0u(QG;nl{V#F0O7uxwik)XNNG9@a;?X< zWFn#*%ux3M1ZrCrfj79G%37F#MLBhX0L7@<3=0<{(k`C%Ne*>!yV_v^Nq@@{k~Ypm zNoByY2V^A=WWG0D77>I1qqas8QskHo^2J*?--cQb7y++MRE&0&)KXex0eFo}rm0M> zMJ9UF_fEMzPPu0>6Q|t4car6%f|GL3L=H8hrcK1kMYxw`L^50(-IwDl!}<;rOytXu zhcTnpCCrdiqVCa~Qkfx+Y7%X4H-XOPOkqY7MiYt|y-~SIX6*R6Fhimyn4uC%GUIQo zYQ+rYg~lQ?069IQ6k!cm&|1@sTIE}s{*&D<2`al?>k;OM{MBxlgg2HCB)ilB4PW<0 z&b-z51aoZ+BP39yfzG+{0!+L6*lxAr#@ZC=)#i0W%T}3!C(mRQxHv9V94TwX==K*i zP$Cny>rE$tJ(S#=UgIf`$l84CFF0vvR|nY2M&Nvz>Wh62j;}y-G;2ueLL{X(osM(@ zk@mez3(-W{6ulsz7zCJ$$OzU6GpR_+BwtD`5&$zW`C=x1I}@ghG?yd3DczS|wrwu^ zd)AK8pm-*+t=piJeCB(wVS&YkWB;HSA>&eX1vu4$8yd9ehosmcv4I4aZ>-BW4_xTN zc~lq90QCEN0CQ!vmSYQ%qywMd!UsuqPRe*8qZvMld>1i1%sTXrb%C3jSp|XUf_x3@ zE`iAIy%n|MRADU0ccD$ih9fJq%A>S-{UCIB)3kZr)!Se#(pL(Ux2B^%YcznWSuxjX z1t$Df5hz`>)RtRPTI&-#ldUzu`pv02x~ldNCh#?(GU%g4sBKJ!O6b6T4yyT9D0}Gq zG004Bd>k1iRP2WXY@Hv!f_of+Rb*0=4~s0;G6T0an5JZ?qzvOQY7iR0aYE5?kLdk; zCeAUa-uM*D7cF>i4)Vb|^Sw;`IIvhNQZo^P;44{BE23PKR+1In%bLJS^V+ZSXhGls z8444h0L_XD9g|ekptxH@uE=tY`gAP%#0iIcc3hst{%9sT0QUbN2Go^+;E$#Je^BKI zi;9?n8a}^M0OYYMRGzhCsqFBOtiyEOL*L|4@e9dO_oVfyx=xkD(L;)DomJn4@A`u> z_nO&Gr9aO~FG7i=(%<}klZ(!F)C1)P6RS?UMWs-$lt{DE>DjPPGj)}YNfq;<> zD-EeFU+HQNylp@boLJCw?N`l!IkL85m_*p601Pt2g99BK_1g79IA)c)`Fcg!{@G8& z2t5WFyBItaV@pWjezZipWxRzF$97}a8l`;Y8yQr0Kga^yJYP-|)w@*uH`cJ){ zZ2E~(Zv&aC(r#`ZV#vhP`NUZyR+x1&=JqHTqu5f6YcC|gUMReW7EqNGL2d#UC#1hC>two z+$QtYt>zx2R{v9SwHnK)y7{W#{0eu1>-Y<`hML1xW2qby)D{Z!%i6T)aR`qEQBF5t zhpUz)&eF|GOJIF|nqGRTCwvn2X@Hwn|JvN%r6r*rY8|3%^XxCnHWQgHfTf6!{F<*_ zH@^>LVZrvm*bp=^{?K;Jzq5V_&YopX%g^HJM7 z4)w>}w$O_PuyLkhV6^`RB!T5?z3Ciiaq3R%?WtfQKsm@JO14_&Q{N;jXq?v;cMFBE z3|z(anW<%Kv2!~%P_|ZEaP&UP38t66ti8PP8+Y!s2%9=Kss*e$81I5%u{W_<1_t}1 zvkNo1JZ)k>3^!XMTkedho88UDT)qIuP6z#cKtE{j0owJZYUy+;a@A$_Cn}mb$zZ=w zW;%Em;}GwygA(txJ2j_C>rJ;Hx{4YndV&$L6-Bs*T7>&M5lzsXRa+JW4AN)Z4Y;Jw zLdRD`<`m&bk8b*L3sR`RUh4ORdmFO4TWQ=-Wo%kHm~F>R4L=vtrBv2O|DB)0c4&?|aem0#Py6_Zd$%kZwb)@?qMEuw2Dr zqO;eCaSph^niVd@kamI#H4vB1T(Ads5n+K*%O4b6;+tEf>;pDBWw#zDrS+#Hj9L3` zqU@&Hk2QSX#slnAxRv!R-2TCC@mEoXYOH^gMOB(j=)p9?F7_^aw`o@>@xNqRvh*1&L- z4uNfYixA9u>19RlXq#T_%tjg|fw`k9&Gn0<3PkK3%{Tn40cZG^muHp=qIDb#Z zNnF1993mo%%?N-j`l;Zb&LD|zbP;@BBA<>FBY>p+z?tnBHJ^q*Y5V)cKLO0krPrq5 z!R-13Bg1Ik?)M==Q8zRo&c)>2jS$$`_wgs1cf%HO{2%#p?_A4}d3*U|xKEald53%Ip(gDAl+4jamw#c_`){E#96GoyaLJ3{rQys0F!wJe+fJT zT$*2r!&CT+DK)$@5DPU7O7kwpYpeS!cr9Yf#QhL>#Q~=zHVYXc_DM8NTEtkU`%291 zZPTP0ad9q~5u<}w&V!pZ4LhdjIqLf{UA55%@YfBvfMpP+n~N$h6fR@z#8$~!$Eqm1 zAgu`72AR50N@g;OwGq1`5Vbr|*$>VLab0|%85s&cEWO-8N!!A1q4AGM6~gcY`?qMp zo%l(Sw3;4{q}_&WNZ}y-+7xo1wj=<^33XLA%@oipl@zZ&4Ve_LK3V>rzzjRQT75gI zS4C6S7NL_=0eEk8vdk?^)yonmN;)1(l+5~bq@WdHff)8JMuerr&vEL9nc?dv>Zerw z==jn4MEv++FRtR?4aXYE2fWz{;0-I_Bo%K}Mue&1ZK4rjQSdfdC5^W$jmTNbZHf_* zeBd|@>5PJFWHrgjnDY~G_dBI3#-I-cUysF)-uN*}(1Z{mmE(qC-N9WhMaBo1l4q9C zkkyLyWiSQBgkg`=I?Q=$7!8xGtM;HN0VQxbziZc1$kHv!DtExg%%} z*-j)sa$e+64+2K^44qjXotT-;?W8gsJRf8B8aOWM z8<>6MRKlwQMiwwmLs@H?SKe)xk?oJRZ*#nV(W9LIExOEOjk;28ACxFo|=pqa=_1?sBezpG~H z@;?5Ib7WR;7NX+l1#NE z(;1#b$tR&0J^v*>$>I;$@)LMo{|kJQi;k4SQi{fp!AQ}%Oo5t;<%|gaO2WRdFH}S< z4}a3f2k^&mx7Lk36&?vyXYx>P%J>4iL$TBFCp|ul4`4F_cwaJ+YeTP1g?13ovPHLx zo_OvyYTGj~V@c`DUdY10Y=2}m`v@(3qxpU5jFEGvOkD(HO{V4*8TbFjlXBO0ilCn{yk0tEx;iNb^s^}r?3j+gn9sd79mPw`=d5=w zmG&vwm{kd=wEima(-Qbb@Isbm{vv@FGcZzW5Km6+0_G24l--VXoxF9QkW`5(NmVl` zV+E5EjI!wn^J@vCno;#NY({AqVm0tawtXbqyBwO1RtYJN$o{^AIaZ~@@BTRpe2)|U z6ChF|W6lbZ{-gXs&p~Wij|%^sgs*eLuTtS9ppCI+hu<3$dTJ%S;e@|Wg`cU?SMywj zIo7PgUnJodI^i!@;U%E4VmWjY$fE8t1X|J|E}|m$m&gw}k%y|tGILX1gRw%Uwivwu zb8LBv2fo@R@grf5Ie|r0Cj!gY;h1AiVCv#z%JOwM=9m*WKP|9)*@2Y`X%6*ErX^0| z9d*BXoyrW=e55x3%6z3i16a{`?T%LfiI47q-z@z0 z#4koBcLN4}bT7QS^~jzKyyxM)8-9D^HwV93rFkF2A8>xqXBIZ#x@rchs9vuiWX%4xxc-)#$}6$tsyA`C1}vQm zI<|(+z;i5~zEF_+ZY8_dU~e?`q|9*zT?63Vf+~YrAb7XDBXNRv%R5QaBj5GV=3j$I zm^pp0|ND-L>J2zx7-{aE0qmf49qqUv6ycU?h<1m1_a2M)pQ-nQr{Mi+_1=Cu-Y-_~ zHRt1fjCvn-8Q#xT@6A`?{dD#2nuB+c$n?3XK@$01vl{Opk?*cMGoaJ`STwH7!l&Qd z2Ycq~H_cwB_{T(lQ600N@LA=DLCw^z*JwJZ4i4+WTAYz%mQ*srk&Vl($$X?d% z_{b~lhI)p}m2pa}Y8yA3Vu6d4WUK4;@72y9&3lb zpo`GG7_k`EVi_fB-S~M?f4^ZjP;Gz@~v+`u$G)JYD+TM?Yjx zmB;|CS)rpb-T1Ao0$WswUVu3SNqD_&-9G*&p&#ZOWoL&^o%5xcWx z{Whybfg+7^d2!foU$OmZ3NTiww9DE36>65Tf-T$u&2qqtN|NA3y_HTFj?8hqXdKKb z5&kf^B6ytvEj@S|we-i339QF_e4})fdoZ+3nd|O7nB!_Z4ykbkpn<=U^PKTMzxp>ClxfsvYcz%ZG4m|VlEX4B|p5Nhl4(((Yo~<|q&^lGq zrOyYTse2Kt83Xy)HZ1z`w-vv3s2_!A)cVB{@QnVVJbnPr=!kedPrZ%#n&9>P^b3rf z6L>vA6NeM0L9YO*#{uo(Y3bF}(v=qd0!m*TAp_?`2bbq-`PB*ZRq%brXu#aWxM42U6) z!0!+Wng9iYAu+@=B=wFwLmyNA+QYyC2n+jWJ(GP;_Z28aNI^RBRgX^q=5u**R^UiD& zM&JOz5r~}>K%tFb-4Da+q*Pkp8=XqCF>T(%I7?u4?zWSW0XFKsGptTZB7d8j0;@CH zj<*z*4VekI9fq;PnA}|Sq+;xd5Vct!u@Lq)1gvrFwUT%>ebjzsC%hezkObb&4uL@# zh$NWQ|1-QD5#S@??W_g$qF(-Ycso*n{{!BRNAPN<8Y8-Z+xdv>AS{kufG**7{v5N= z4m-i^j3xg#-Ajer=?(ergtuc;-wAIAvp=8({W!dxp`_n!j5rK#XHS>JcY@nl9xE2& z0k?ApN#<1^Nw^)*`{VI;hP|107~YQX?f+N2oh!HICGmFdeMa zzrovCf+JF0;_alaasU93mTlNgRLe^4-g}&(#3Huw;T@Rs`ptHq`AGnWddv<&@ASot zJ_ULw3!ef?LGuj?5WA|8G*RLzCMe_L6)34wIO#J znJm&0cU5wjY6t`T*NXwNL`i|$v4a{lNYFavbuQG4li%FxH`fC?#M*Er@OB6*P)E!> zj^BmDW|Z~FjlH@pA`h(R)Db1)1=!X?podNl(*UwgLldOo%8`-U8g!F9?-nZRpXp8(%kjGzwqPKtYcu7kdl z>UdM5hbdR5rVyV<;1$V2F3JoRc7ecCqC<94FnByV4Ewr3;en~%yK%_D`+yg`9{Ut$ z>Iu-D017lH#|GU2R^sf!fPn7&^(vUjkOSQSxDyC(#RTi(3zgl&6(afzeoC3&+&v-l z+>*UNp2O3TSHaSXz4tZ5=D8daBFm!KnV!-~Lez4pv<+KAQ1Qx9$-*%^L>B0jl!d11 zOjqm+03$>W_EKocQn@S1MDyPKBS@pTr%5C7QjRLG=eOr^XnwsO9i0LD&m9M0>j}ik zz-sPCB>I0ll7gV{mENm#m)xWV!^uH@?Ly#0Zn7Ra117|gbudQT7V5@S;~VXm$#P^& z$As)8DTk)jzbxc0l(A=$RoGOkfrnK9;)3QA^hNTzI^=FXJdK5g?kHU&doCwZnaI)Q zDr@*|wfnMNOfTUK^Rj%O8Tcw*$WW8zfU}inhx(%(YBECQBGf^j>7Qm^dOe61ie$&# zdp2_uhh!;=i!n{Q7SW}RY+)&)1^ahP8+p7_8)>W1o_#d{n8_Gt-*y8@IL7a=TSw9* zafhrEF@7;|sgBexvNlI{AB>-oXcp48TBlIN|wy?J*gy0eFh>jKVX)e(3&Vp5+L)wTtIg zxYglVVn2Vvuk$$J`OPJTF7b!%eBbVt>k6lcdjHy);_s!b0>@+%fqP2ObER0%6j>Lb zp3o-as-FUb*1@Vx}9YDii2+m)s;sR~RoUk{ow zZ14swH!zO${q-C%*Mxh6u!(rnje4r93bTGDImO=ed8Pq89}B44ak*xTxdUb`uxj~a5SO5_#F-sBBl5LdZ4~&UJ{R`_ zhF4TKmz%xvy9yrO0cgm^7VX<+{tq139W*yrw8U_Jc?;2mDyt8{5=L8Sp&ii@o!~A@ zg*1$3xJUJ{BJM1=xJU6@p20A^sYY<)vNeEP!-FywO=Hi(X zf3!R^Xl|=8x0W+IO76c)pZfFB!gHZq|Hs3r-2ajx7zX zDA4(K&9^5KrKmk<_-mpU@^bm-;DEm8ODJZ&F_%fQ*Yd%d9gA_3tuH^|Kzxh!*iO|k zo;Vl+WzwjnRt+9 zY}sKYAz*Mn`Xi!(4e<%g`z)l8lH2FI zk=v>4k&2KT#K;IQBAl1#103u|tqk6bO?{{Vk5tm~DkR`Pb3e^&pF5ux3CeUZdg-Eo z;a`eRG7u;;Q0)F?_~hnm0%vA995{8*{|aCeeiBk@O8FJa#u!*2PTp&UK61}+rV`hHr9(;F< z#X{v)ePxEVZB%zK<1^pLpNB#NFeLPWxme_LS@)I++)RjYGs@~s@UPTbu+{cm4!Wrj z;AW=BmSR5#_%fL4-ZKSukJ4qCW2ZTAGd04A)zk44qs1nUeIOJ+g}ezod`&lj?D`|Zj9q`a7q6=Rbi7IZ=~d8lRb|q)LIrS@ECWo{raDmob1Q(6GORn!6UNFE zH6q|LE;&N7uvLzbRH60;SK76gJVNpa>QDxzkBp#6i()2g@pv335XhKqV4=_4qt||f zm)uaUxtg^T?`4X8ZI*mNL{36B!<&)G%Am?bZ+aSOn>!`-Qly>+D6<}$WcD}&*ZI(# z%?pq&8%O4yFEIzg!~spx%-gzAEM%@hvU<~BM2HoR%niV-^w)hxQ?9MnOh^x=P4xpf zcK9d^@QSC%{m@mWShNPs8)_=DCDd$c|mBhCYpLs7z{< zNH9)ii@+KB5gB6k4g*fp72nh76FgGgGOD7h3 z!sO{)8-%Alkv1Sl)v>IPC<(-lik>Nw@F>%!Bn-knF2^;|QPppJkJX+-esc$h^1y|D zi@!c!sfekz@E~S+u(0J_rvUpu6f`Ou1W$Zr1|evIph~NYK#D3sQ4wuzLr!;avvdbx zz*+C8Gy$1DcQj04$%qPb^CB~Y8}HGcNL?>m7wU_%Egj9+Zvy}fN;bPa-Vb%7$lVmm z8Et0I!?`?AEZ#xX;dCtK?8mXJeL{v0xd(9Ndf{ZORt2)Y7OZ!GL9QIjG43q~!enZ)pnppR5{tmBrD&sX+KG9c{SXR1e9b0OMV z-5*d<@!l!tpBc%_KFY*|vwg=GBvsa@&^Y#Mb=3%sVOnK0bW}ETo_{7Y#Qn#wV|uw@ z-d7iJ2?pyUgl4b%2?Fbl3lSpjAyR&wM;v}Z2QAWpYY4C(ju1~t8txg8A4uwKw)kkl z%Yn3BdE?tTu9znenMDNl%M~64$#bn!+K7VVq2NJd)FGmMstqk1Nn1TiL zoQt~vL)wqD`kOFHlM1zkZBB!dLx>RWV_bxCF(u%U;P6p44+7!%;RIM1P%@1<4Tb~> zLVl*(VxUFuM^@A~ASTA8hJ@;yb9Q%^f-sp6oee$F%SSyi1)0Qo`XVZySKt$j;(_j0 z$4PzVjZLes0dJwc>XAtz;X)*=146t6$=ZXE#z|;|Agd_$PbhGu=%S;>@A%$EgY|~4 z;^`)ZMWYH@)-tyO8J92?sJS1N4H^Q924f6Kor^?MMpz4W!}(0y-(*l@4@*E(J!*fsye{)@Xe@5=lckp%KK~av|{dP___i z%TEH$bOPf$!Kz%4V=iWc#&rpigT1x+ZBUefN6iKEakv4EYMY>8b?i1x*0(xp?M04d z+su{(zE0UT9IrOyNMXxvAS|wD`$|J7Apq$}K`GJdzQE!L8qw-kM12QIThp_kjSWda zN)-CvmQ!UYrcg?rc!Y;LD`XI~m#u&e%8x}y>#KX^m@gdV_m@PMN z8p(6e!gwRn3|?5bOc1_E@C0s);*hm{b?Wiw2kTP#A`v?CMFYK{bm?e^FCV1y{^x$rzWz znA2%mF>=&XfGiC6veu6xh|5Fx$goCU0+Ch+LJyObmsSZ+Bo(xuNGeanu`^G;c}Zwp zfR?5RJ&S~Lrltt(NkUa-Skty;MWvMF$vl?(zeI6iLj*zyz^!^UL;RRz3Wm#(d{Yoy zd`9CyGE2o(uq^W+%Qh~;1k7ZV)nY7&lR1SwT)<2yn9L42rS{SvjC6FBGP7#MaD;Ba7sV_y@GTz$MB!YXDG` z4}i;rEk_J#=iaHm#7#W5Z<`kt)!T@I;=}X-$eCDcmUTyT%2(p_2aozW#F`GqbrUF1B}R077@*3v}r?5Xmul{iu0~hasP#u zXfsW38jU1W^pJ`!RRcX){}s|n43-a^f^jPL@m#SCv39spM!U6VvylJ~fMec?Xwqmy z4FpmR7F$sj~@A&+EyEs^Y1EP4XzMy6LoTWik4C&*!J z`n1+~@fYXVVeMix($n@Z8tDOLnyCu37@7!2MeMpsX|sJ<8bxNZ<7d+7GHRF+2Z;t( zz|ryBeeOG0E?3=?MF2_U^7sqFw$qRc>pohQuQw4qOL6Qkz&cIl;gQ5u8O;aei>=@U znZL;_jE#XU!79MAW9(Ms#s;YRMh9fX8!#(tcx^|O&ln9X#Z9vxy8P*cIZ_UEMOA(qbL10*`B9i72WL4f_(j}d!Jbk<9nlv47OCJK1IM1xo`)WW zHzEbbl@Mf-_2NYwK$B7H2{_^_TPlbn>td5geFAX=@GA($8WX?}t$w6X{3B3D#v~}- z^NB+-Dvil#3%^9Ns5G_So?c(XA4#n*pOH#8!=jQD{z&Xkq%N|WEz+gc{R)2_VGZte zI6Y-4J?m@m*R1_?2^3C~2k)yO3RuC%sWEm{3frb?DHyYGro-to5_E4XZDcZY&&P-o zc=^IM2QOtBJks$}R#C8m#;O_@OCoqFj4gO6pO(m=>Maabpn8uMbvzIXT1Ka8>2xS? za}#R3`#DB(r7hmq6qAQ~el^BhTJiAv;+v(na0-fK;XzON7}d=Tj1%_v;13Iaeu z>6mCfD;j%^Lw_fGjYaTZT@O4U<` z^*cWN=I^#MGF(Sv8P9P)^UMs_eb~WrzPp_ZF-+`d{^mpMH~tEL()JsPpJKXChn?TD z41%?081Ca}^cT$=_HhcNO8wI)N7Ri=RSA@GU@LwM_dtZec1Z<)qVBcIv8R0HU9W&r z{`>($=KYU^bRYPqq`Yj7I9{vb{gFYUd6zJP;r>X1xc{o+-K!Ftr2Mukzb55(JN$4= z@c5Ce?Yugb`(F{H)qOMm5@4m(eG}ezS_<@Cj8`D8jK>cs>W|p1?&tA=X)xZN!P_$G zqewcy3b*sIdtbot=G$Dyp6D}&_Qn@RHFE<|y`$3Hd;oWUHV3L(#ziOQcSL=Ic)MuD z@!KnkU#mDCP$}7cf;?&0!&kg3XcTNlPUHAx3~ePX7$M~XxDbDbH}m{y-XGvviE8ut z%z~%!j(zjFBcpm&Mf9R9ESMv0bWz_{6z>46_W2j{ff{n%e2d4CF|5z~>KW;$Z#}jTbOeuhvA4Ds9)T*YBP{==qhgx7)FQf;a{Ixia_6(KySQI}+mubFKN!c*B>Q3)?vD**0JF%08MN`EW1JZj2ro z$~`+&Kwl5S`*KTh6KFZiEwbXh=~xudURehVtkGFuJxm`W&0e#G9=K%gm37gHxmlyN zmBHMvAp+)Fy6@r`)%ALNv{$)a_OpT7f}7Atb@SqURHV=R7^#3K!5vvB)kyj9MR9}@ zU$~C4{aXxx7839&V16$9vlV9fNPyl2j9x&D#%nY%8fGCyh^U))mzX=ES87?2O~3)X zBscQmxAh%!j{&rM%Kn75CKJos!L|T5ZrZ|oedd;%H}wR|Dvh4eD+l#fk&deX+>35r zQnDzZt;rw)-ObHC%e6I-sjOz))f%?Ikj=LaGia&;8nZMIPQjnMqNY)~=6m3PH=1quqrv7Z zK+SxMD+o%1=6jW9xmPz^I@XQX)=bPQ1c$SLDZZ`<1odE*NM&SMKC+b2^s>wQ&)y8% z9$f#4tKtw92^S$@5ZjUkQjzWz*tN9BPe{IKj2X-rNVpo!Tno#XaSS!i@MU-aU6aAn zFLRa0DUL_39j;>|gXJSQcEpPGvfF#je%4%z{5(Jiyy|MUfdo{A*JswMVfmLhs7{le zxnrRPM-1sBn6Dhl`?zF)xrz&J=rDH-M%!#0g;8qC`uwNOi8Fv9*j?iQ;5ATIhD;ft z8Yd5bho;O`zUX+EEa09FtLGcsybn(_jw$^$^PgJ?nFdGXd18E4akid^Kd zX3Vc-SVMNFSdU+^PT@fm!EX%b_S;JcHP#HDpsK(Rb}qAE`vQSF7@%E#(l;bj=s!> zT+|h+(GT+m^9xQ7y}q)2cMJp0k-71}z7ANvwZR-Zz_1hBvdvT5vL5DG6ZaR(FARAp zlUDIN*nBr0FWkjURc&sijoqUxsPRnUB9eIr_Uu@(am27AD(s^`bV*?iYFBp7S)1=- zp^qV35K_!JR5mn`h)(LTUdF~My??`m?6`KFw^}7_C?zX95M9VwrSV67oB+ ziWBONg9+I!UuR~0V*ASiwKZ;EmMd#r%fZa74SLze88;l3>|3p5-a_(HQm2LQ(@5EN zQ%%A5al!#O_iujkJ+?qUbogQMrUj5)=Ysx?ea!MIda{Qg-#G5EY&9QdgLil%U0Bx6 zV(Y-$)@JNY>Sdp6k!KJO?N0~+#;W97{GGKK=Lu|Aa~Ic~-^cyJmx6$-c-i}NZcEVc zr9kF{Z%%DkJZE6%sT!85jYQkJ5UZJJF6X53WD1+thK-3#nZXphc`Zb?q;=kX9{o8@o7`qjJ(gGy?*MdK>m+|Ka{_|+RIOj0?MTNIm&^KjrFzpv8 zQZ(<{a%{jxhu#I6F~IJL5OBN&jKQe;pMCIU=H=oqHWB3V{?F#i3`nuFmIM$eiz7|Bo{Oh&3S0}e>)6}Xj?`v`OTqXMIoM(Rz+qk*bLsX-bSrFO}J z9p>?fjsITQp3TfRW)5ui(k2>7{kE`*NdeB*vj+c=+8G0 znjr1K0PM&Ixdj7|W$8#@F-Dp_7+969oxLyajvVR;mm-WCl>>GBUV(_$`~4_hW08Uq zFOH8y9q(^M8*B=|Bi4-Msu0;GZh%*mY>7Xr7Z9 zuEfg!hMnK6vrz7*!4#DHWBh%dxUpbOYyX#Ig(I} zo)fGm!&|-C084UN%`Iu{Z2>?JE%!8I4#W~n_CTD#dpw?`lRQ`X=y$gI)#o743n`|IJ!dVm)RBF^{gP@>P3kEd@ zHoDP8Q9waZv9S~@^`)|_*aqCN3CVi0fE9&St+ch3zSxSFLI8yXGzp*xp|yCa;{9yb z3wYt;h5WzI%sIOoytMD{{r!JsKcCr|GxN;MGtbl7loDUBg(2HX=M52fs`OW8w}@&|4y)#G{gDSr{NZ?(@8BxTDgIZvg%)gB~1>L{ZM zAAR2h)WXGnt?$mtJBRG81I`#JiM-gW8;SLA?;))zZ;M!rjz?<#UWUi9K?@ayJ0l+x z{GLYcDXGFlpPLM+f-Np`ve?$0ul5Oz;Qgens3@#{nXvjnhIJHkbzJ7hf^!8=j<;GRk@#bQuJS4wi1IVk1uFIyw#&6^Ch`C<3pfF`C_s%>E8b0>MtSw5oJ0 z^0o>N*x`kR5bxJIOzmbgsv{BqTmA?iYc)ilzCv^?wRODSngh{bFE+O3 zNT*Q_I9BZ_avj*>vzAzkF-tLj#60F0@&6{%Oqdu6&t^cK_U?{9A&X+{QSZN-#yUiA z)=lsR5*6=FJ*hcpeKxiE&HSl7c2*?HawxCRH@!n!3)0;|-7k=xD_=p~sqKi@mZ zKog%gWEAaysk)CE`wks!cqZOh^)e!5!uoHPxz~F<4M9ax;}Xr21X|{m@n57yDR+#} zvaXyc_~ApZV0WF(q&-|YV}F6#i}ci&+So?nb@Xd^9lbsLelT{9C;YAye2R2*9v5e` zDuk;YsypR@DUl8{v=1+liO1z5S&cgHTCDd}k2@z20XJI%PiE>Otzvo^-w>?*pxyipbZ%haVH z)Z`#!uE`~ypcDk9Z3-n7(X@J{QEE%0)ET2*8l#SlrLP)uqoi|iW2!3pIf~T&!pCX^ za6D@|_#3!&$7j)h`go_D_oi++h8ulgeCrW`fiDJ#8M_k@_}G_IWzo;`XZjnZ^PIZT zSl4E@ziGCA9;~b>t{0G;R48|MAm@Gb=0*ATprGJ6;yuF=*;KYV&HA2G%S+!i=3YS! zGg!2s;gR5eRDj1m9hKoNSps8MwlQ}GZGk@kCW@3^z z^~lhdd0nz~pgiU^D?CcZglWlDYVuDfeF{mB(@DSGy;IU3babVI2jg{;v|=2Prfmu_ zn9+1-r82Aylio8W#O6g2W1DW*nI8TBQ-An{^oRGI{?Mj(8)|RY{h>_thqoW^MSq}U zyzlf0-5Z{PYT4uaVbdReMRPc$KeXZH_6Oe~{lVZ3b+;;me(TTs6271=Vo{Z(31- zFKw$Dl^Qzd{BMcEgRcYI4v93oXMC>YYPLiLEpPOWzw+gEcu_%^f%ndP2m;}d^-GQL zCa~DdwVUcy1VmpyUM_S`Fgx19Bjj(0{P{R%XIYT<{z4WL^(*LvH*ETHRIaDGdE>87 z@x+x+^8vrHvN<)VQ3l-9$xW~4me;i3)?Iy`+DxO7Q1s*SXhUIyI+1+?a*i({R}R^l z4|IvWe$d<-6C(M;Ik|#X^*Kd7u;xy@*OR;5dMf29ELY{Uv#-6-V-GrH?|SeJs1&EYFB7jt6Q z2d@7$Y8S+ss2P8}I;^5q-zU~1>Z^Hw7wt{O&KhRjIh~-~4YB=YbH+E8fzrSYsS9-N zH=9knRP`6AZ}Ze95NVRMQ-3g4RZGOFr7F$a3M}=h6SkD!zMbjZ?*-D#*-&3Cg`no8 zn96NN<5Em_ouzA6weM=V%|QD$R|`%`JApLeTjXydf02H0&r5-U=Pabea&GB~&wY>7 zXkou6z<5M`HSf>U-aN~Tucs;$u;%Up%*<`#mfM^kl@DwS#P5)ZsYyJA1W02OTcCmA zDtR8`Yfe3+{R0EF*Y^DZon&f}u}Y;iwN&K=8Pul^wUi%ZaIt!j{Jkm(OZ}fKeQZvT zJlUX+D<9qP>8EPh>5@agAE4HsY9^O!N`2vM-BoDiNS|E(v)a|IJ=sxn&gk0MXc}d# z3VFT5yN6F=5$qkAZ^S18z)i&|IY#XzI9o>wqvT1B#Ld=u6nCg{a`7x#Cxws|oi=r$ zIs9inBXJx6asg=yPu%BpTAx)^{>+!SkR!5!p9hR}gA6A8D#IJB+(!Om&E~iLcwC?3 zrHXQzcll8^93E2oWz`_{JX&=1IH{J%cg)h1zRJuJb5eQyDj)O0xLj|?W;1?7>V7Wt zP4R_KC_Px!pYV&#(miv2S{}bh0eLl0Qq=Bp%WDks1ip?x z3o|~_&tTm;Qtd#P9PX6If1Ho6PfndkR8h(t-aT>_eAJj^7m~yK=f=8%u4eqAg4B7e zd^j5x=g@RO%gEl^t4J=K1x;i9$nIuG4#}cf+~GL$qteQyQsC337ngCAcdcw8iY$`U zv@ARNI!s!qI6q4p7@aM;0#+huy%enc#Skb}ZY4)sJ5d^1x^4DJ6^WWLj}Z)g13BKn z@Yo<>}Ol2 zBJuFg70O&uLv7Qls=@3!520zfh#Ivg@)fckZ-QnFI0Z+Iu6+MOtN6d=QStH{-dbKH zu&56(hqjM4)-{(~Ju9~FAD#QmC@V16cSDm3-?wLIyVWK)Q_~)~%}9g~ZQs5h?HK6i z+P5clO1af#XnO@|1h?<6;3O^!e7D3`a7a&}$;>x+XnSDb_GRAiBr*&c>zcTp`^0?i z^sBr_T7kOGd5^Swb>EzKfOZ-b?!7EPgWxJ^Q($0osvLxn#gL>YlC;JuE1fK)Qcuy- ze1rMxeH7rQ0&X_Hk!PZRo;IVZoNqth{$)8v%__PW{#F;{>q_?+4G-}hU8{PYQ7c@p zM9L%ZoHnD@19z9MU!zu(mt`vFdcKe{mdbH!TIvY(OZilaQPYd?q3sZ;d35F96md5E z`^150i_=6K*qpo?MsS%ge5Ii7Q>a&6ESTnMOzW;7JdJ6jXBtZ-gDsH+koJ4AYQO7x zdm&N$E@|?~e2Gd@(z`m^hO4%2)GUP*9w0Wk%JjgGkLOrm~XI+gr76mTGZ zm-H`m_elFsXQD=1OS*_r8YQ(K|fQ;9-?svA+kT{2i- zPDr}IM(xvJlP+}aO1{3iYQk6jud1abRz{h;S+%3bj^uh4e*Z@KzA^so#Lq6Q1DGlE zH2|ciLgffqcS!pix(PPOJX4s1qhSe*8fn$aF;_bxM+7V9hNO}bg?1gx>be49R?Rbv zN19ht7~v7d5WH_^^Zug-%oPqzf`=ly=2Zcf`sXhErOk2Wl;9y=m8PZsJI&$BC&Ro} zuaUf?;Idjc3dLO^m6g0r<|zdmv!f@&1Vm?d>u4(!HlU+vwZIQ-+kPNPIF1f?)W@e&FRy8eocM3y_8VfKrD9*(DfS8J*x!ucsKrDsQju>^ zk!1xZ@x+z}5L0Wg#Ha*t!xh}juY(();9_e9+B>_OE?`m0ooylg`6O_e*n!~-zF^9X zjHqb}AJ??Yx3^9&CA(1{i^!GLLA}b}wB}wf*u>{9#0m`S9`03Me}^mvQ#?nq*$#11 zMS^FM@Dww;@vPW-N!JrOrM%|luu)$BD_M=0EpvZ~l^dv(EU#gYb)if)2=o@8Z>;2y$9EULxAgWK9X$MA5HC)JGr?Nl5A58$fsUUJL@$Er zB~DIwfD;E?1mZV91Upo`k??QoyT0a_DH_}t9+&~wN&fbb2=YyYr8+`>`0`8yN&j~l z@N|G@WPMG}gP8!8u>g|JF49ro63%xK7I^!^EYtatP$EmY@Ga85f~@#TS@12>zJihX z3W7rF_$^HHl8DNJ0Lf7$itS>QybK_kfU4N^AY9MR`uHnEoL~t`-li#zU{A0zUeJU6 z_}YcE2}$UTeA-r!t`y9jx0@yyjF(4wj`oGH4;PEbL^&fC_;$?j#`W~hj1Gpi;w=v+!Vn24k7*JEpWB|Y$Apm9thTkI%*qHxee~;&5!++MY zPyJ$_d!N_=!=JYR2ORJBm{U0WeSaQuIGf7P+{DV{4`;TIPCV?B3K5;_(*pI0DCA(G zn(gC{=ZB1yubI(zji!{Z{{AHdnbG}6Mv9}K7e zrUl|rSwCxcy;|&mR=J09?uZc`;hrN7hPxkZd(2y3cO5Y$$V*V)gKQ?X*Vj$KFNCI? zY3iWB2yELsPsT-GxHtQ*5(rf3JdW9kIeMGK&Sj5BW6>$gy*1yP#i3hNfv{=WHll0z zJ0l9h$B0KxN87p0kh`kuxtp=(!jxQMqePDODk@aetYM7XmP%<-}ULL_jrneRyQeftpQsj zigId$k}`CVZbC@p9J$;&jRqE!i_%-|D^Bkry=y_Nw@1VnO^65|*Tg4{_cr>RikalD zPKMI+_;85^@_!?X(Kj^d8k{G{L#G;{EHs-eG~2CcCNrciP)k(NFScGJOR9WH(=PgD4PI9K6UI~RD_(U_5(_mwoiLNK@ zO+qgwR@KBdQ~9WaJ+6Q|Mhi$Q2z=336PysgsGH0W1Tj?mv}Vg{BXDE8foyJ$Z)#5TDQgLDsDz-!EEPo zsgL^$7Y*D6%Act$B@^W#8R>pS9#?kGV+gy+MOg{<&2sn7au>Uae^a`$&zFU}q$^t; zs_Y;)B+ET0%Prd)iV7`r12{E&Ycwcsw_~?N{pp~VXi1j4EbS(XF?_h$g>W+zEA~fr zx@PGB*+Aw=VrfmDa9`LAxIB*C+~!pfUmzo|=2*hLhi(#i-*~+&&4U(FL#-n3OC>nx zBU$bo(#qjUIJm6l3hQqoqwzF%WZi}tbg8DRA(%T~rUT-5IwI^ulVnR&4bvexoj3Q+ zRTEpd+umwDOc%1A67q23B;mw67%4RMVxO&F@e|IZqb;_-uTfWvR3s-8zpF)9bBPG` z?7!Qqg?b#`*QosgAQFX>DOky5m0~4-izTc0@dU~i>^u)6VDdt~6x2oyRfRQN@rp+6 zKsOo9czfgX`x2#e9w(z7V{~(T-f@yb9#H9=ZFCc;oP%7VM+8gYz3hh&fqf43Jxsk( z5J4IZj+q0h|>W zj7MS<+SqifOs>PpqS?uMDPK<32rKPvHdGerocA_=bDm^IE{f*qj6%)YsoNC7RDJ&X zGexKbR&o@Xx$CBI7D;NpN)nFW1uqG4%PvHq>>M|nUUj&vsOSJu>{H1?!|pO_pXY!? z!#lvqr<6~fq&Q-i5qpSFmkhH0xsAxRzf>?ynJkiZ`23qFk5`eu3FQG_hw`nGtEyU1 zK2F7#BAOaF*&QDjN2B&rG{rF?xdnJfeKvvn8Kfd8>sV?Wfbf&>jWx=|>YZKSuwu#e zL~@3m&FqdelE4hsdfbS^0&J4Aifeou8IE zwefRENBO9y%k=n-+PC?Lu2-8sBp)fZ|G0|`p2s(ncXKD0@GEw$Ah8@@x8&bp81(U4 z`@xOo!B#R~M&|VoJmlh(N$M6NFÐ5RFba8S|XBn|tbB$PuYpOCFSK2vka+S8kQ6 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 _jFj8q>*Rp=I~TfGv?LY2DZYNofd6)z|vt1 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�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 z

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

iupRgpXnO_q0yYD0 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

HVsofPh( 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

d$hp-v$#d5qXG_ z@u(X-aTgQ`PrSJs&l)`OIYjY#(BW^iC%g*uI*DfuYYJkG(R@{JCFn z{7sArhz|xkrr{bW54iUZ#u<3;yCz)heX$S6gINznuLnCn7QJ-_+FXb6$`f-T&@|H! z56Yg4p2)orJyCD)0a@tVFAKn8hJn;b(46g_Ix419xDlp|8+5|rMJ&x03 zoQF>Yy>m^tB6#9gNY)c|$TQ&@7owfXgUJw$6&JwvMYuM^tH5nv&?n&&!6qemHv1tz zxS7MT?M99k#Y%$*MUu|it)DKBZ$h+02>-fg}*~;34VkqUJq`oCKbM^ zCV-8r!=oH)aBvMNXWk2c<_9c=AYseeEc3tF! z=v>5l^~Cy^f`3939}4aO0^US53Kg#DCO7Umeq+C2a zv97h0+YfIFE`z8IW55iE&P7aZD#h50J_*)phI)J98o{16$Pe!WMnTkW(cp1gsqp`K zodAd1p)4PaC*T^$ANkjVry(jo3CxDZAf6c1T#P3UZGpB$ygzsnqWrR!QmzX`-UV#j zO3K9{k2PrA2G;^_3LdbR;{S<6e*^O&%3lC}Zzsk78;N#kkG6uS&gS5FIoc5KyNTf9 z4pPnN>n!Db;Df*o5S0@L)^d;v@6Fm^Yl!+)TTr1u-$H)k z2#Dsx0pL=Dj|M+?!L=Yy5oqTumN^krxk$Mah$rrXH1NB@L|5Dw_`6KXy@aR^*`Se1 zyk2849MU5Xal0Wt0kmki%?fHr}@3tIdpwu2@32c$!MFlgi>75+SlF?e*i zlq*0y(PkvB7vqvG_#L9ZQ_PK$a_b=Scfs3Z&<@CR7u+!x&n*0I@EH^UuLsu$q94N( z=Z_PwQ4P8TiJn*rO++5;4+Awg&1(B!E3-Ov&8tSpc6#zN(DHD zJnm5lXfs>%w&34$;8CU){0vc`r}(77)!#p z6k?5NvXK<;(M}vC}{wVkwqVr~hr?#Q5;@Bjx{dVzs<=_*D_9b=T z(gchn$P*26JH+ydJD^y^Yr%)RFy6uwC+!x?2?qP^k#bdk!<+%!wpWZ#052bgM|>*y z;t1{;d=@z2Z!ynA@cJn!7m9e|zS9^R;rD~1&f=W}KL$K~4*d*X3l>1ec-L?mv_B++ zw+5R+rtosG17r^08Jqx7J4^)MK$eJq2To2FeK7dR;EOn`9O2frSC2vOfC0Rt|g4G~X_x`Z(Pef4PYCKQW!Ef{!Ny!Ie)8AQj%fK?x2{6`+* zEr{NyTJRM_&qy|S;*og2u7gz`i`P{Z90<|4=L_aR^ylab!0cDZk8;%6C)<2_0q++JYtVDKmLyhO*(;#^1pzK6V# zzXV)aDCUU;|13hEM|>!F4Wd499c=SOy!N)>6o|%(5b(6YCxPm(=!b|W#zNHo)+JJI zB(xv#W5CJZ(RZnQaA2u8CI^5;oQ%stJaLAR4109Q19}zn3*w8wPPJtC zckt0y!7)$>JaIKdeIph;Z}1nue1kWwE#sb=$hcVK*MT#nGU3lZgo1TsGA;@6rl4;< z8Fw9?mnCF@FGeLFVwg!HW>pp$Kf5v<=|#(Bb< zgZ&_(&fus4Xlump2M_%w)-4e%g(wgHA}JRP34d-D^dBhZSA!0NWZZfjs{p4#G`|V~ z*Ftpcda#ABjEh5_mSDf3GA50@22ZT)FP2ZVHh7|!!4ua&R5#*DLp z67KH^8P^OVF9*F1J|28!@LWJ6Zs4d!oDOU70C3s(MqD<03@Dk@h%?3*E(6yDH{ulV z@nHP4MqCVeP%)zsmkO@}zlS#BwD8K@PwB*j1-v+S_Rf z3-%%ob@8&5Cuhq7rEkraAR3f}fnLibt?iI&aF(?F1?i&3I1SEyHQ!A-q;?pNx(y}g zONW?UKxPo$*DO`=GAp@QKzcJO$1Fw6p+&AI$aNJ*8huBtP+mIXE}~3d%P{)A>H?&n z_gr`(^n48Edf1rbgpjle)zpl_ILb&P&=)1jQuC$5sYD%0%EZxE;8C|BX&{yU2r^R( zXY(}+5;)`z%D9WXDTcDu9Db+)g2eL80zlk}H`M9{f}f|w9lM7+R&2kJ8r1K7&Z6(7 zrGbHg(k9__I5)j9&M4`Q-0o3EQXu>DyZq9(zGdl@O64Q@A6u1sl)J6Bdz9HB++GhGtu#EX3TowSw2p3fxKUNAqGSdF?lxE5oh1|D zqKxL@cXX&=X?S>Lj&n8}FJxBWNN2NAf-eyd^guv7&{>F%FrxCz+980GxjUPgQuK;> zLTceoylf;*fu6TB`&3ExS`uy>kG9B@%Ay6+GdbIy?)W01jJFcHK6Lp9 zttgNG)x2)#=E=x?8<9tl25V2x0}^Cakuc;cV(cQt6srJ%L!Kl4k(lOd=P$(hT6GrF zGQ~9C4DbU^aXwG#dl6;e;t+Eg&UK?bod-8705L_LxK{yz()O;S5iMQ#9<`^?SPCsT zCtS;`*Lb=vAObCL9VM6r!QHYp) zx*3fxVy8L>CtcABT@!unz8LKh^(abG4DWX5je8rj0?HEk56&KCbQInu1${z|7DAuY zQm&}0^V_253;s@yhs`xLISm5@GSu>%ti>y$LK`dc=3Mm{9NuG?ui9yKs>?)@7IS3{D!}suHz)6&xcC zpNl*BYult#{wT>JAbUeL+Gc`KSU9o@2^)|gHq8n+X?VIAy;h74v3EAxF2r{zrTcId zZ`awBgfWq#qr2erIRo*Vp?+pP5sk|ehB;UG5I7Sr9O?pE7jqo_CRg`sAUdOVayIN&(CMR@C&%`{|oHk%A*xJ7e>+*%K* zN4hj(FrCFsI_bRdyyw&s&Ly@lbt`w|#d|h6C-1B9uB_NU#QK;RP9gQMst5bF)sOZN z(?8%HNDYem=F{u2yuHdQdDoD`+3YHup^^_^(T~JR9^p7HLNmQDoxS{cT=*2q6=AiL zAoY;Y`}U{1fD5~m9qyfbSUNNi zhoVI=Unl|srGwM(x=1;Jf0%8)dz9AQCe7U$V^1GpWEiT!3#qEDXOyXJ&r^5`=x4r{ zO`6*Y+<4COgt@)D&)23o%nOIC*eFEdH~gq6YOaGPilrZGA!wBI8jm$zBU*X|olY;r z+kHqHgz%8N^q$JO^dkdB$|Q>(37P0^i?^%HevlX@Pw%TY5Z<`HlD=X*-h#gN%>?gz z18LXj)s!;@g~s%BPIEg=bqO(XJ59C6`REiWUe0DQsETxACQWbY4rO;TnWl1g?z=@<-So*WsTd7AC`W`Cs%5`;vz{ zBwe--SAxJ(1m<}m2UQ`>-9|IL2?ADw9}3M!O-1!OpW{dmtk7SPY-BDbn^_A)^EW`U zw22yJqQ`2a;q*SEj2|BqmgW>A)@zBSt>>~>VTS3oOq^5&dP?UdV|inpeLXk76!TJR zuP94fv5Vl~Xd!ddj|mvn5Zz2Oy$=#4JH#p&ZZJ)uWcE|UI5dE8lZ6}nhZrZ^U^l^+ z-{7~SF`uBq#OtA+BFxXMvQce#D%2=R^eAiyZkewnLkv@aR*8c5MJo@Xun{MQlPiuF zx3i;C-E7Vm-gYaz<7RWMR`Nn!rRf$Z87qUqxY7P8l)HR<$-@K|(;a%oFx^pc*{ciC zIEDyB{uk@P!!Lf;e0LT?SjpI>*;1mtUvo;FiaRE(2j?Ia zZ>$KQ!g|oh&X&q(Z`X%%FW7~OV6-S-0`5dAEde)!nELK&ja-H$pdU)c>Hf_U&<$l_ znI$X%Jp?ba+9Vb*s3nzS#>5<$s+TPRhe)E31LrmxE%3is3X1&|S?7Z#5X1YcqCcnL?-;&I5o%$LOVV{;sU_1?#37_IL={dN85DW=|| z)Dx8Y)B2I-y0m_LPQ?1LmvC}n{kV&cSVTwsSL;XdeekdEg1eRJiUy~7MPW7lU%wLY zJf!~gTA1I09uYiPX`M7ZqcGUZ?4RGoU@{E7>8Ixf<8z2H9wX!x#$>O1G$wzhY-QsW zCFxLOX;UQV#S?M+FE0KzE!eID9IGHdQVpR4`ecQjR z{qcvUg?9f@lvb=?Sy33UeI?h$IH9Qc@}dy-w||&M$NS${sHwD2S2?6Mbt;5!qnbF? z(B!h=k;Y5UC8oAsOMGl);$8XWog=(%hP@SEH#9x*ibB>O@0{>|_s+ptggY||wa9sb z2Qb_8WBHJb`B0?Lnpl9#J)?}gFmllvT<&R;;uUq()7hvCVx-}=co^_)K|%wYv!p(N za;+v&T69bFRy6BFEYz)BC}#0}q5rnG;wiLfw~+qo1xCa(7+JlRS^d+NMjvtYPUYk1 zvei37ZOT^fLnQV>qD)Jx_-bfpLz~Hr#)t{R`A`!(Q?V4ZC%xx{nFQ{a46_G%C;A%M zwxF~4T3L$u5btZJ7vhBc)EQrTbh_d!xrQ+tiCFggo_Ck_y;5Q6@3qY68y$j=fmJo0 z&Jt@e;9K=PqI|2Sgmmj~X=WLL{!|e0l#wos8Dw6mPS{=Q~h3$S8=y zcg3(<)DD0v_$^0^jJ!7gY>r^!t;X4)If5G6O4>ZW6xS<4GafdMS*^FKyecsU`qX+&L4`X zoZIM`IDc7-;bg)O`saEWeAWxGRe6fv!*GmF{3eExOA{#lYIOV_gBO9F`)~WzUfs!PFLjN`NWg7c^tu6@hz7nziLl7tA!ISN4wO&l4{M2nR zpOe{F70aP-ZaMVHs%o<5GPCv$!bwc=gb0&)yPIt&V#q6mF=6*jLEBL?hh3mH7v^s$ z%PdvMOR?;#u{5N`L|J%jpH{6%9!^PEQ-?E^Jr?saP z7i3g;14BJ6l!WIM_luUBG9w+L;mxuIV%>9#vWPzw-oKQe?y)5J=8yLtjipv|;fb7dS2TgcT|EAW2&>UU(0xL~mv+(AVBu4AZiV`Y-Oa%*acqi_m9L7WFOqZ0k$k ziKz_w$eNPV0`)Yk&wiaR#o>7ALR#OUG^({#YoSDO4g3ANaK*o_VH+Sz*=(s1{C_uF zsxB01Si{yt;QwU}iz~#{`)B@`C0(I=YM3Q?i&r76WkYP}a(auGP`;Ke#6pey)3K^%Qbpo6J%;uJYa|59J- zi!%GWSA}vUNn&|M;R2~&%W!_7s#HyyEcn~66Eai9d?mAmjJ`(QMB2~(kye&pSeV;Q z6XJa(&W8L|#1qg&@EyvW%HwIy5g>|ds1W#2HrYlomvyOYa%tep%3Nj6z+}n}7PD^Z)Wwieu)v;4h)OaIz8?PH*XozZC7t$%eXe z-l49XbrkBb(G~xJp)038j`&NiT+CfpPXFAMljpi}0i~{7Vl^KBK?IL~oSf&>jd=Xy zmpmtL#dG@hhq?&FJ)YS zjNu>rM_OH^)nlB_6!)k;j%&a;xjD*fh+{2~rxD7vWL%;Z@-=3hwh8iDqpYULZ-eq| zaf}^~X%4kO*)4HwE2uTp2IpxD*+cD6UVBImp}+p}z5=aR(T4sRANa||_UezDy}sRbK1CZqQYiFtm69Y zKNZdG4?Eqtxl{4#&RfNe7he@A5f2pHym^X?tMU~KYut63V_~c~a6a70Cg-~1&EPz!ie9N>729joQ`EmTQ+eg8LRpY@Uh!_& zbmh3CuM{Vw{z_dEuUK_EL-A~axzg*kz0$o#d*#T|MoRbhIf~Rjf)u+pOi(U~tD&4W zW1G|VN41pueh*fb_6%1j94aY;QtXvB1wE8=a{DPwGCh=^vRf$=hZQL{jF_f)Y&=oP zy{e&{yy2+R^-gt_>2KyJZyYTuT>gTE zmSi$Tu#WlXJY`qLJz=BXK4vB%kJyn)>C7?q0Sjw$pUu8}mq~)|u%?nU7XOcyO&@cM zEvdL`in%vE$*MFs!A?t$vyrv_VXtc(V{WyMveDANS-1K}*xe?F zS*^B->}i)n%+2c{YZGvQt(vi)jbE{kVfHy_<#A+|7*I?_w7Q?qtX2?O?a| zB(RzfwzJ{YwzKn2+gOJQTiMq5cvkb_78Y1%3p?PonWZn;#4=OkSaOXx7VPyG%Z}N| zY#wZ27ELy=)S&gO`O$T(U8QyGQNOj!E`ANGkr&ItJYw0RjjNey?kZ;2a}_(fZ6!uU6>L_670e-YIUDe38N24XjKyt>X356UtaES_%YV3(6?I+8+zu{bmo1jC zC6SRVtZ*^gH*PUAN?*j5_FlxC&P6ce&JnD5PdGDf8qVY!7P8587cx!s0@l=c0b3p( z#;R5hV`1vD_jq}asQA9GifALK8dM!JhH5~+{Pe@ivmN5p_*DwcuRvk!5#QH{E`P5h zprS+0(Qo)AXg zWzO3E!Ex+icKddtwGZ6>X3V@AtKR4s^P2E-X`22Y*7UCq_dU*^V59H#>hi~`Q>@!% zzZE{ilh~`g)|0BYILl7IdE8;;yK`*Fa_yXX4>T-(T>E>ik0&#mPfdyjtVv-ZD;isu zOgYaQ&%HLWO`i))aTKF}^NZ~6>RrL|(u>S0t>J6w{Y$Jyx~%e&eV19CE7oJ<=clrx zg9_q?4!FWbAA8;;$>u7{Kd0_{CI2eBAC0#|$~D$(VLyfpPS5a z2;LU@o2(5#{15Y!x0svuXsn$|%U;Axdv3d3%kK3$_$A8dHZ$3|Z=e6T+wALx-;>v; z-e!R_Z+&%ZmBzL&dRlMjk~G%AD)ZFy>@+rT?)r^SdfZ`eJboYOwet?k+O=qryy{(+ zGTbsHYUEwEHT2IlBhKDs_C@xK4_Mq|6Nh><_;bcRcD07@xih!#u{D=Z<}GM@pB*y& zt8wb0`z&i~o4w0*_gQuA>CX?857@RIPe$xm^?;o}w7|LO%>&jTs_~=ST^};PuE~o! zZG6a5M>#HTocoY{t>4r#wnsXP(lrQMvnic<}}*1sSn26J_l~>df=L2Xuk~hHb0`)q09_+ z?=3g)d&eh?Z@<*;^};7?>xJa1xPG? z-^|Qplds^-xH*&AxlCzt;(R94s)C1)$j)Sw_TepA`#I}&?(743hv)2C;rg3?1E1qL zSWp^#Pt6wmi61-LadBMI8nlip}`U}=|^6hZHuP@lasok?zSY@$s zH@`gJ!mas&SDdSDqXKv<0ad7 z(XY9E>z8bO?1pi+y3?R%Q-2`a7Y7SzexkUnNXmbiUFGR>E|euqxF}N?2jF z*d=YAd}Z2G$);cSe`Qgf9=T4O`<3-;lzlX;?^l+to~UxP{>oY&+M2W|ub4FozGxAA zv6!75JwD*$`eOEng?4A9KZ=<}f*XDnv&y|^eYsP=n5B1;ty%u=3#+^}tMBcUFKpum z`uW19o~T`v75s(ia_*NTdVXQ8o@;x4wf@42&Er-ie<@;j%;n1}-6>*w^Cw78?k{4! z68Gs}E-GT?i$>yC5qom>$gFiP2n#<&Of|pKH=}|=R$w&OZG^Uvoqwk@Zg!xMr6z=i zc`Yquhxc^O${1J3x;GdWa@(VjB|Ysvzol&<3l6L0ud7_hE<1IbP?-6dHJF%Oe`4}y z7Bls?+b&xX4hpLu6!w{YY1V)IyOE#Sn5MOcq;~zxRHG{WS#0x}RjcnC5N7n5y*AUH z@O%A<4VJBL6M5wm(+sUN!D#;{_TD#4p0@lG>oURH<^7aTOnhH_VsE7do;8%8m|4;D zH`T2`?@IXfi77E*(Y-8SlMdM}K5?~x`JEdOfB#Sc8>c<;Lb;}Z%{D#QBXd>(+j#5K z2>}&d{u|?er*y1Ml>;mlzn5poC_qP^us&a}wLoX6@VM%GP? z%wrBM!cKTk!@P5qI=I>JJhsZVCw}FzXGt4F2X)S4p~E=1}V2Vslwt^RPPRVYzJP zw6064P0D4G7Sl&G_RD3?H)@)U@XTd(QXTLsmvxd4d+lq3uzVVTq<&Mb=vnF}yLYdS>)9?@P|dKNdgfE3l9H{_vv65gOu_W*Qelsp z&8O*E$)4P_KBM%kYUc-q>-y`Ntg0J+>6yjwCdXFF^~@L(GnF;sg`cu{L>Ygcg_MU9 zf1aPjAJLSheP7UKY!9;@KhnkVW$lmohSu( z(f631_4li*tyC|U&F(+f<;2unw)bREhsAeunPSxRNwXArEc0oTPn&Sx&5n1d`Mp{` zySAr`)2=D`tXb!}UOS)WGy5eY1C09?uokTy?>#zKz!vn|G^kDIPpp-X=acIDKCy^_ zT@vTner7kE=Lc?%|I9*0yvv^6q>wGH^mdx*)q@?{M==T84kdhNDvwEiGrUV##rd+>R%LVQG757?YJY=-IdUoH zwPl)5^WJi4;LBC<+Zg!@b7&l|frKwt>M~+-JHMiSoYrvq|Np*^J;nExat%1_)TN^E zT?*+W@u%MS1xiv`INk3lPbv%3s^Mq-fAIZHHO!e)XE<{jTYQ5X>cXia!EGSE$EhE{ z=R!vK_Ey)GQ#HZ2xVG>L&;#u6%4vqdkB4SJVbEe|8RAz#>yc+Oj!Qt?UW5-Jd<@~! z@EQ=`^0@1WyN&RDgfqZQ#Jxt`J9vEG;|dX90?*-FSrvRAGs3qrW3*{45a0Yb8CVxI z0~>%Ape6D(M*gOt4dR+3t|feH#M#5+yP&26d}nxkAJiz2#~ERKC)6W{eJ5QoqGn!$)43i%^`I1~VlLOQ-Hsso`Q1&|1&^n~Ahc+O+yziFvQTOGu9JkzE?%3Zn#qoZf0Zw(^SUU}Qo8$C)_6er| zyK_$Q>+W?j8n1S0;%lww+^Lyjzw>gZenB$D!QnQ;VqaPWM-MDR}b; zMZm5Qg-;!c;!M{!iYaDZiW7mS6wZ%cD>}aVpr}(rt9W`gN>SHnsZ;#rScR~ElKzIB{Z z71~s>&-$q1$mK7JGgay+Cv2>*jJ+*UPDyyL@LsZA(JTD3(__ow%92}B=q z4^_&lk5)eD+f`Yqe|=?BpR)>0;%le#+J4Htdp{}yKkasMzuZE3FM%nPo9&eczgJO2 zH?OHwxA|S!@2^nBTzL(pWk4@w#=KV!e<*l`YsfCe`I{LE-QZG1)TZjno&BpR(@zyD z7VOh1=5Ai6_z>Dqky<}gd8D?RGW@qn%9h2W6=P)u%B6vqmBmZfDo;wfDf6SZDyp}7 ztE`>5N6EG9sl5H$P(@+wo5~}XXDT-g+oHJk@upHaevI<3SrUbJ-~r`{^EH*b_oOQ~ zEcH?Lb}3YvtW_(Ay7qQzydqLred9Q%ies0dKm70axBvbARyH(nzs@HrYNc>@R z^MBZXYs%+~zwRe#(?34zu3D@qI}CFL`uVjym$Gz``d`w2{oY1j1}pyPRTV?rb-ku6 zEY3#&TZQZW0Y0dftKjy(&m*ivH7M0J3ceUL# z*e$B-nR$0%NA>lRQ(_a6+P z^$RGc`%me#jsfH8{!=`yXFwg@e+tvO22|7i2Lot*L!|o;>S>(=#?$==Ia==kiFE%# zIjwt$bpJsWt$#pky8ocC4gwSD{)1Xt4}rmS|3PnB7lCrR|CCPaBTz>79~9O}pqlPK z7(nYKP)_$B)X};L^rrg{2Gjb9(&_$#F|>{%()|Zjw4S0c-G5M6S5cVmKd7el6&OtS zpVDca1$xu{2V-cxMe%h1K|QUzD4y;=sHOE6XifK@!n6(pRdoL;OzSa_qx%oYXCK8v_7LS-G9)V)@h)+{Ql#=n|_*+%zd25x8@&gZL{B#Kf9<-jMLiyerkt{jqB$B z&Nt{HlP%laowqpmHo@C3&$Y^ez;k{B{@}lyJ^5){aS-3(kC|`QJ`3d4e(GHtqa6AB zR)6kqcrk$gwD3mog*OxVxSTa1`AY`#9_tdrXV3THr`vM&wPXDFeYgEuPZ~XjmuHPB zK5pHO_vs(kde<9&-gfft$Me_z#@hx>a1XK#;{7^?Z+SkI@!H21RJ});^UJICQ{`73 z%nvu29=H3U4?pVG(Tzt!hVs(ZbE@;xhw_>ufBnAY?od8p)!_lVW5)BVC!cB>adZ%0 zWp0sgN^1#!i(g_}XHQrDY}>9KKb8#PFS=z7>wGnc&+LBc_1T9b`SGW|HQQ2S2p_il ztYdB8etgXkw@9U{A75vSnO)q5QM_|%rF6R`foQKMkE#uH-S+w-TMs^gedv2M zWg=f=%T4vtj6i-~&71|293}tj`xX5HKl)OUWxwm^mpPF|zoeJH@5I;Vf8I~}_5CZ9 zhky6!r=RlTC|Xx>|H);h13uYcUGwvg>gS*^PF0Ai@V(~WRv>_$hYCOC`Nj9?ybo*egH6V*X#g7Zt70lokGsHV*&gC-KMeV*8cOFU#`Ehe|y5BmM5BQ~3V7>}JxBcr>r02Fc2>Lm2$z)u#@EzOruYEbM+3ckWGp5M`)Qym;pS@LIALE6mxnD*U3^@J7&h{FCGC|^HaxK17I z!y#<_`L`p)7}}2m6EoT!CCX`E4vhD$_771_`*UExj7P_bTH2=rRbBU;B+6;O4zx}U zJxx^8z8$Eo*X;~3fcEb|)Z-jcPWyPE%xs*77)<+lpgN*QGEqzWdXzr7c?wZa`+F3A zP~|*P*yjTiQ=SRo0NU@Pe2%9C>S*5&VXb1dKwHgK6Io^bTruov5Mx zLr~@LSzrL|BO)B1lq?YKb5qD)Ia;8G_7&;)ngeeU189Gdj-O~E^!pgvXQcEKQv~X0 zzmdWd?h4e?z9YiiVn>1TwEu{pwPd|O4ediB98+2(P*3}j2+IP7h@^cj}K=VHZdeeR-!twp?2~^X*CBoJpI||g${w2cdYB2(1Xde?{`MP&v zJnd&9tl8!%P)7Tj2q(5q5J~%+2;)8q)YCpEg^vvpD5L#Ogso5iEij(;JrUM*l{_Ho zY5xXPHl0Y@>k0Pu&eo+k5J}JVwahB;s z8SR&Xs_jz+s%hU8VQxaIKppL$A{d~tdPEfVQHcpt#W3xsBCIjLEKpASst9w98$Bil z)BY+Lb8M1G+Gj;rtxFcewBL%bev4@aF`o8aL0v(hK=eO>!MYOyIogM%e4}eVAqLZa zEEqH2PoOpJ%OWgy*e{Ty{aH$nC=n>5eOiR$r+5hrp#55e1B(9=sHJ^dgf-T01$xu| zEy9T}l>+s&kBhLpSEN8S?dKwF-S56Yj`npae{mh*JrGa(y9nzxD+I>SJ};%4ju7Zg z`@IOO{UZdbXy2F8XY3QGqy1lmHKT6}RMS2%!ZO=JfibinOyLuj0%K@j7-4Jct^&2R zKa4P*BY}yuPmC}(DOwEEeldcHK8FR$Xx|uNz3jd~Z`wabShc-apqBQLDZN$`fm+&6 zMmV5%H-Q@3S4Nl{HBO+6_LnK_9VJjt`^*UH%?=6F(S9?fA59Y|r+sGxV_JU}!?gcQ z>9ZONl+!*mf{EK)1jf*QG{U-s5n?>;OCzjTFA%7u{b_{dPCEpuXrG$WFJBfIK>O7Q z$8>rlP)+;R2;;vu&m!t*{~8R4YbS(9f@wCs4u-yKEKpE|KQ+QU9Kn?ACBdkeiDA1brzY*pRbP*Up```$Aul5tDrTuV( z^@HaKOr(8rgss2E2~^SkIKuL|X9Q|#pPY_=`b1zn?Uy60ZTwxJp7zZV*7J=8{xp9= zyzn!$n|I~mk;h!qCKc7WW&O(4uGgverj<)w`##Q}IY)iYwat#1yV^LsalN-CVf=+b zrLJrHe;m>M?046q+zniyzBWHBHlp-MkGlLnl?R-g^{pP?_@4QmD=VAuSMQkTPP=Bz zhiHrMUtVd&d);pNuF<+o*QJ+j66*hB#!tC2XXMUNTU}fIp}DYfbbbEB1#R-D?)Lnh z&$;$3P22I3z+PQ@Og88F>3`~$dD-)p{nF;iYq#U?oEg1%>!fCUrz=kD?q9XzD=jhJ zVE4H-uRU^q;lxYky!7wMf8SJ_^9c>EUfR3HmXBU6>-upSHj9=YZ^x%gW=_9x zq#-Z8cjwy6fo%=-IPBW+<+i>1&VF<4amjniwE^|{=k0DBvD~WU>qTxmTys-XzK(f< zdh;1u{@M28wZ}|5@+WGo@BW6#`O7W8?I=y{z+YT@!#QNdP1j3izbP-S|K@sR*DaUg zwMyPee!KOdG)vyZy1|*P5-Was)XrLN@=maeX7%o%tnz+L+=T~y&zt?->IiZOw-{ti#-%kHn^OjAcE02~p z=L6OyE(#joj<0fK<%y_zF1$svbsjve>_3?k88VeO&l<-#tsy2AJ_l9TFxU zIpM_rF~TzAoqa1ldauR6IZ0jk-VPSiRL30ok4q+0al6xzm$vI-ab#mZ{>+xI7K`I- zc-7~ywok_Myc_GVca48H{)4KeEPVdNfv8nK{(qKdd^n-*{dfzE$NXrrmVS zd5b?@u9MI2$uFuKGw{`*PW=7Y`5q&W*XH+c8oGPjAtk>h#$vUsvj_jlH^6%F#b$i7 zxFx>lotyF3Y|{QIn%#$gJh$P+#v6L@4OewJ{c2_}{vsdvzMEGUUQrNkI^wZ3w?^-{bZjd-UL& zcHLCG%5eyve)+5YhN1raEJfwaPEGpq(N(>2&-UxiI}g8F?^BFBziFmdpF=yH4A0SE z-ZFZ=Tc^W=dDF2CYHxl!f-juf;k4ZrH-5m0bF-Iz_TY0{&FmTad^qpBNmfmF)1UwQ z;q3S@oj-q~f%*EnCWCox6^HbHTDRgG|8xGq+-tu4qtIG4zZLi8m$$qyZfeYMe!6k! z+K(NE@!kj0N+jKE_%F$R4FQdKrDI}$uQ@Pb_<+E^ z{F&N$o!e`>@{#|iy{nIJqP*izSi$JV7RsuzqPtIdF)*NER*4K_P+n3*2{2d?wq0%0 zrrMU+w2(SBZn$BDfx)?%&9}?TC71VXe3%(imN~)b91GiYaq1S)4~wEKvdJ<;*!Qk9 zPs=Jpo$e14N-lSK?z!jry?lS)=kiT^Yn5f+Z|Cb%=4s#l?!#B=pSe#S5K66cZU?aZsX!qfA@;%UZJ*!>hSEfFZ6AnMfG@>h|{jV(#j$Bgf17y}$li z@q^CYRL6JC=C^O0w1w*VHZ_jke~+2!`o{6ouiQC_>if2A-E{c&x85%6{JyStTHbk_ z>ix!_RDb@G?^E61$iur|K478xzkQ=}3ym|W4$xos+>GnarFy`xy6)Lfc%JG4-#K(g z{ly8Y4_x_@cFDnwR42G_v-O-gU#5CNe%zirrc9-}!CGE{AF3amX1(QthyF-)gnv>k ze{DjX>IqM#w~em<4%HRL*S-A7pRcC+!h=)q+pxER>I|Q8DXJHbrh3DxXTEvc(t}iY zIP2t1+`eB>{o(z0DvqXqNOg!myF2~Jr9D)S_}Nj8$H-!;OXU3<6$__Oec~uJ%PB@t zo#MrdZ(K4F_u~ijit82A@7}SS>K3>+kP$jHUX<3)my)vqz4Wb&gG$Z%qp9r+UY$YJKN5{+Q|>(^==N1>33q zv9?Wd#Y4AJ9i(sJ7r(Q3Db+*%IlVcx;xej>yeB@xy5qA{A9;M*DP~ zyi|wD85MOSom7w6%C2nK*GYAmPpy68z;nx}KJ)s+5$&b3s7`aq%CAn^$xyv!tL4-C zH=aXvo985iYwkKs^_zQp!`q*GhUz$%Pagjq`zY0O)@5$fO%SNAbDOgD_jOyTzVq{jl!v~y?<-XAIe%MTM%=s_ySm-RSlEJi24w zp!(5E70<5UVWm3KpRC*d%?FlIJ?Sd;f_op%_#6g z^`?tb8)pCGb*ejkbm8>2w{lc}x-viRc-Zgs+fhOM8zn(9}h={N4&GL`CB zCmDkmYHO*Ul~XBpzkLqXwR$J+IQGU{RNp#=-MD%q%c%>5nJyWToy%cfwO z>RxxgKE1m>LG`cf?TNti4^SQK0ZZ?W$akq8_P}eY$q#*<>SEun?z?~I%~T(|skfUy zjL&5Ubh3L|&VRbGk?LiSFWC6-ULDoVzB+l`@fHo$&(6GU$rTgSR7cAZ#fU0pQMyln z$H115|NK0N+tA-;;F&u)@Tz}n7`i*`UV3Pw^keCPW~b{P`t`V*PK}F@VLwm7Us4@7 zzkgf2x}snBIO`XNM#D$3S0!I$g#48|2KNf3@9E)-q?~*hPyO#Jb9@BaScf@& zE>0|WGN>QvxC{Gy`XW+=@94eKe*xnE)kWk+B<;X{)h8OzY6V$FzJ}*{WGP-XlEvf( z>^I_hK3+?YN2~sJLdtfjn@^Fc6nl7JcE1zXY{w1<}UTojcpUgNoO^m z48Asg;{ch4{uiNbo7_^eh7ER*tl2+jB3o$aF@}UN*7sr`2BXu;wx1@ynn5m;=XVVm zjq5Kybv?<0(s&1KDDCxoqZQjVu#g27yF#9C3)*$aeM})E(T53rNG*EdpPoT8Cg`ny z&QjwB*`7n&o^I9CZ8{g{DG<3$xWd55Xmk-WL5|cf;aw?)>=;$k5PzRrm8_cGWVc&7 zZ|dk{9Gx9q_N(f8ySrxDo2{14Ci}F`_U7(2_BE|N)0)?G&T6uEPG38tj_GXbYHzjJ zdsbMw?d@y2uBw|cU0bIgeICQi?&YD70U2E6eV(G49dfVqT zH(TtOTWeE?-BPEYU0?2d=*i{&2etT*tIw_J&&P{# zl3)^sgek!$YzZ#mO7MwfBAv)4@`+*sCzz_q9~9W~3~%6B-o|shi|6?ypXRfCo-gvm zqw+8wt;gUod03Cl!+BgD-jnpCJy}oQL%fVv>os^yUe;^#a$c90_a?n*Z{Az<5}(S) z_zXVQXY+ABmyh?QeOX`LSM(9T%Fp->ev_Z|bAH~R_UHXXU@$Y2z+zq;=9Ct)LS85e zB%lf~0d2q#U<0-Q7jOmmKr)aHWCQsC395oj&=6#UT#yf@gZW@FNJN#$h+5GgnnYH# ziJa&Xc@bh0F)QZ9qDVrj5EIgd3?Wm94cS6m$Q9y4$xu3!4dp|{5DBZoOjsK>giT>K zYzuQ?SC|hc!|8A~oDUbnB%+Ei5pBc}F-6#jEy6`y5k8WPq$Al#K2nU3s4B`twNXRV z6lJ5fC>M1_`Diklj%K6zXfaA+su&Z~#tbo2jE&i1T+9{YW64-LmW}0O#TbdJ;!Io{ zH^fb+eCdKWlY{)Jf=9Jy@+n(Q%y22;Rq(17el@)h&lcfZRoS~)At&IwC#czkWOzKe zs)56ZH;>W72`<@R8QEVYcq|>y#7l@gWkQuuW3(EKSBDWB5r<|(q7|{|Kr}iLk8VVy zh?q@793r!T*eoURds<}fL3kx*qQ+cEK#6EjBOWw}2pwX=7%&CQa%4CV8%{)r z8}T6`LQ;s445B25I4J~3ObNTIVR;Q~uY>iCu)i4|u)+rpc)u8X2cS&gqbKM&z9tnP)}r@g5PG zmqPAkkbODiU%^xKl;9~Pe5HoBG{{CB^3jNlG$SXi-eRDHJW(Q3q_Ju+THT=WT7$Oo znBB-BF_;WG5%I(Mj^z92KimjRVKcJDihOY(W27G3$Qm)sN5n`5nNdLG8{$U9G$vlG z1{=XcPzowRjl9PpAe%Gpio1~!B61>y-o}Ej!KCpV(5?WyD}C^| zQ{nGgOC+=$cUoSDEHWaG%*Z4wP|^XMbOI^eJkN_j%lGO@2XJ&aJD$mtHm?H+>jcKS zfwCfSHU*^342s4QFjwo-0dtK$lg|v~wE}w`Kwl^D*9`;~eMw&mIGh0z=YYippmExt z@n`)xU~s`-^p}9d@9r0yTyvbrcsFuh6p}&;NSy&z=aBsc;B^W4uSAyG0**6gWbr-6 zrIb-6bvIC*3ps({ZXkCF*sTP5tAXDdAh-?~ZUl-CADPK;3YeY&s^@^~ z1t5C~*scV+tAXztAiNG3?~1sA?jrC#1%#I(IR}(40Ow0UdL^)44Ybz)?{z?YBQW0# z)VBin9YB63u-^^z7lHpNRDcX>Kn_(v%7zjuf%1%)lzbN)QpMG%5E|479jb&8Ib}wr zu%hl8-W$F$W62{!;#`Aj@nJ-|6P&^QzR=5dRxz&x(@=wJXof`p>5;Am=g|1g;2c)J z%kKv7kfMG#^f~(|R}WK*tY?h!FW>0j*Q5LtYA3~@EoU{Cwxc*+ev}%WWacG;5>!@QSPKavitxxYsX@B z-H*}3A#iq>>Zlo18?9ig#4uLoGrS-Duw&)>1rny0;!3a<4H%0NY{d$u;si?(!B8?_ zCk2U_Ks|`R(Ta@{yhMYXG4j~q#*(M8F$}7{A0&Ry4!uiY(@OB^{^-{Fb>P)TFzfy} zxA`4l*v?b&F8Y)H6xjBE!+T7^RD-)Sgp|OSOTbkL8zsb(P>Tmgk}$}HI;;V+BWw+s zfHj1K9@(?zG7eP0{|_#Fn0A$FP9D`nssO4o--ID;HFB(psQQGjk?(3aP?g=N$SG9g z94c|ir-TJo*)}_Ax{p zsDOnCgX-o&6(eBKHbg-_rbhK~Vr^mut1n7i0yMLUO03OzV3HL)lA!)(P;Xf|=3L<8MCN^3WF#^$TSE-E4#9P> z9+9hy7HpRXGk0K3ra~>|P;-k>4LH6VTwV!_IKUYTaR*i&Bws_4I9-Lz<-p#GyapWG z?U69Tb&6j}^+c)_Ja|qX)_K2ZJdi^vu#FsIqZC$xV`wlxW5gV>!nRJZ3=s??19nkB zo=MChEzKA!sC@rgs8~Z*W4sL31vW7DEP9gik3YqO(^zq3-zNvg@4zH1`j%FF1@Jc| zR#+OWu8de&SrHjdtf@q-r!rVe72q)?RuUSlB8-R@E5_msy0LD^ze|l`5=3>r`~i>l zL*W)54zDnSHM^0SIiK1;6jM2@ZpaXhXvCcWGwuaQp5)-mp_~zhtvo6gs92z4fr%J?^}f}`e`Wo5D*wIdp7Og1ccLYw9)sbIr!0o*f89GRkv3qs#FmjV+F#djWrmo{ISMJKlGepFr?BK{w015?h82co|$zna@+vb3MGC{f7eoMtIjq!{*S>h z`1;v~S2;%DNyS6oc?NYAPtd-s7Z_g4G8iJMR>SyV$>05GHP{H>H~hP@^3Fw-$h&?I z+Ds%<+erw9{j(Vi^RImPj@v75HyBE$Qzigs;8z9guzzld%at0K;iDibou3WC04uJ? z@34P>i(I)t1LSQ)TMerLFnQcCC?Lasojim317y8=zQJI_ulXE&4gGT?Rj<~t>_((V z0Ea|_{WLiDl@Bj`xExuW#|H44y7`VX!QFY^g8=Nj1o_~-fduszr@<8>_5X=~a(Is2 zA~CO3Vp(!|lTS(AH#OTJntDYxzNSzyZ=zPZx`icM@#|w{7EgWqW1~WCahaiDbA7K+ z_jlwVwQ`?FSYZ-{6&>PcHFVq}EX{@pi1GHy9wZhSS6KijIyyG@Ng0vQajUTOFeM=W zpOl}nillHTKSx;luAcua<(pRJjL5eMOW#I+l30^IA}(1N0j;+NXexl2}J{&?JU-r%w>k526(vAtOZ!kCKg|MGOrZtF91Pl#(0~{(2$0 zWd$n2PU;_G-^ zV(AjwHc81eiLA$4-tIwF$4zqd7-;HCpD@eHW?5z9RErc&4;?pF{Rnh}6h}9`oUfSQ z)9C0+54D4i2%rRCPk5G9WW1Sqa%i1xUVg=2c7FueWtRGpYn(xLu9L%c_BVOTF>m=cnSCKEKD*7?D>l|4)x&nHzrJg%!Q??!vYsG@kG2y4n@tTh=;X>#S?%Feh?ewssAWo zrmDU1W}oW=VaX&C>d*;e<&Rc_F2kye@P#IU9*jf~EWKb8>J=o)@uqmYOlUrl>p!cW zzDyFxp;ogTZ;|7h0&k!P*%GZ2oEy~>caAmql;7ARsNBnL&GWK*^Sx}ZIA`8%&7du| zIU$JpuY0CAL!2qzERqbmWd$8Ahv$~c;lOM;Ts0p(eY}8rdc7R>VDMZV_UqTJp*3Wq!#~T ztU(gi7Uju~KAH9Ss8%oAq&@@TmxZ;{ua;Sd#M|i~LnflQX-IwC*)}L$lIO$(E>*(oM z%x5{<@Kw8eCjL3w#IR***t`*qyIOK}2Wxn9e99Q}k5dg|BdJ_3+o=Au0=*=xEdet* zlVn9kE8D1*opNaRfXt%mCHGK6cYB1jQCX?9+gKMm1^P8oeHpPxxTuEc@-nmC8(L@a zI@Uu)rN}RbGoOk_T^+$sYM#i~G-KfLB4vglMa{aN4RXH->VF z#akW`;}N+$`zds=RG(52Hc!(U5DD(0hfu^4>Kl|?5kdJ4>Re5Rsb0U#icr1{%XsC~DF&>ZSJf!eDssaQ5tU#q!+ z%NegyhY0q$^Pl*sQ1=?D6xNg!P;p^-oB9;5eHWT;L(}sFh4he*eIm1fMa;jk@;0%N z#<3)<>;i&`)mLGd-g_;+rcY#D(3`J_M+ZH^@)rD_g!&LxW>2cvyhk)`s*o}|yz!2} z&YC9*jNbB0JLt0o(xiq=V=T2o3TMjb95cws6XVU^c&p^v7F>#2QF)a$CUJ%-nFjUa z3ycP~74+p2eN_%0Yti%xYAejYKEGP3*BgqMbx!BSn;>By0!PW!>T3xER*vAx zg#4rYBw>X)-%}T<7Uc4=z+sg`EoP~~Y$UQcjvd4&)>R*=Op8Z*)WGqYe)DQFR>gOS zE!TAjE27+7zWGIH-98TvV)+*U%t-SE3-Dg36o1v zj{5TL818Hr37w#%0pl=zNAw6Q7GCEs-+<{p+bCVPMR=wcRgm~1(-Ih62zJZSJ=U1H zkYzVSn=mD}YQxnM?dPKy!3|AW5=IA~?iZQtPD8}Gc%r63`A=;lpqm@6`?&hPo zjfVKBo_#dBN4bSHowa-TNbVMeHBF8-E*G2oFzVbMWx5d)90-O9kxA1Aq<(WB^b{+~ zkuy5c-Ptm4&zh3!P&(V_=-|`C<~@?DDcC|xh7>>qge9pEU9iN*wnDE9OJ{*8;+ptk zOqoixark^7tSP$A$L`JH){~>n!#0SUcZ;l@G+C4#Bu&<5iGFTz4%B|ad2o0TzLg7d&pvR#)Gm`!Bo@fdo(eG(oQa`S|5q@N=vQVLUENjr5)8V0KHpIn zi8X^Mfedt$uQVmP+ZszPWWHr)%vz5MR0dOEtC!1JFY9D2qU)r@x;#R0C#ZtHb+$!6 zF;{ppx^$h}DY2-oXvL_SA~_?8x7t4HF(kkO0JSt#7Gdy=AlMW3&4dx#>~Xy>ELnRp z9;fNipCdarsk?83LS>lS80I#HxlOs#Ce9OY6X%L^<|fP@XGCH6dISUq5;C9p8B2DRzKUYOjzC_3dU+)Gq`-kn@Ar~6}^Y!aZcAq&_DpekUXyf@Kf_#+pC0l)1(Ib z4e@4JMNo?UQo~)>a8&Vi(71o?{|ZEdzT!N2b%MTOb1rO0ZO(lInhJ9+AGN5H6Q`D; zVyMQuMD`^JeGs$9KY-24cG3Kq09BnD)K9qHBziAN&^rB0H z+Nv!Lv#yDmqy`6(MYdeCYasY$Y=*FsIPd}b;c8T;Ruy^K(INXViN5)e&W`uMHXZ#r zgdV6(K+Umoc5DlFi0{xO45~!-t{O&3Hb6$(f2b>!8TRo+@54w=ys&L*IYDjsLa<)r z{ZueO!NxB#u+7oq2YiUDw{S^e;fcs#-3laYqvYt@ZNq4mHn zknV1H^rx(|{)kWq$Bh9C*KzT7p^lbeltyNo$kxZK!kSqVNla85$P0T6G8QUI<^>7M zaavpRy8ITdy5>W5-3`^XK*)t!Q0~k-O?{2jCug+he{^L+m*jYy zs9`&7c#Eja%JHxRB0K6~N7cJP0oN9l+`3+f&R$L40GVx2OOUskmi~ANd#tJp?{fKI zxGFmok5_i{-a?j-eX81cLxj5HfR48X-d0Le3BxEPD+{0-iedA%K6)zue*`t{Z09CE zR0BK4w)^Wps-CUeiy~XcdK|5lWAt}TKY&jb^`98oTtUc~T%GOE59d@Y^Sa)La)=f- zOmxLtX^gc6_s7BVO%gkTyx?;1KxBt8FIZO77$E}h1|o^|K~!jvz-l(Ew&__P96;+6 zFWvN#DC9(;MB|l3M)hCF?Ei?0eM377=Te{gEoiA$PMKr3sryk3%I2Q>xUlptv_ocJ z$w!B+m#G8?SDQ4*AMq42*3>tV!WmGEc@OF)-V%>AWQeYoYOK}G?Qo6E}bDQ9MS{&yW{RTyOPRUe;T&43qPEeA;9f?T4`FUpxkO%3`Y+Ur#f1j~L%X zQ*^t;?gZJN2}`|T611_8-EZOZ5!*@&)h(Z)XW|3%e_DBk}g3~1fZ;;C&^x0UkO3*{ia;Paq zgvn5VCR&7*nO4!&_J|t$k+AmWt997SdXPK>A2qvnRE;KZslaS}WWUU&aIBkQ<7c7O zuC0qlsm*9NYmSWu3mWmrmG>Nbp3LsE=gX|p?$+FH?&;*~s|Y=IH3t9o>hskSj39Ic zoW0$!rE`U~=2C*ZmAp0DL!xW>uX`rS=Oye!n0x`4d{ueA@SUh7bxLkRw_~y&kTsWL zKY3Ny252<38k9l1aIH>@EFaBYWS7BFldy+I%d3(ml5Q5gG@GWx-9DHKHn_dwm1}Dj z7Z_z$Yzw3pV%27Y$&W?ae3}o%|3F9#SpIAiH}9oY=OupfsBTE;Z^#j?VJ~gkybngQ z7E^qU~ZRLgA>eR{2KZ`io=ZyOp z*m7M=58*~5{eDQWntuzYZM>P9Prh5QK>DpF5#7N)uj_;0e} z;A2smI}U!u8L|-G_WYR>tD)QdmSrW( z{3&>Xx!)UK2bP#$20zR%i>@Pq(N03itso3f&qU4D4Kdk3C0$j9;O{x3xW)PQRL-c< zGcT5*n_`-b$o1_3GhVT^V3eU+U`dtQWbCuVch7Bmrkg&Psmdl|^(Y7%II|Sh^UkrU^ z7MAP)a#1Nd;bZT?jo>%+#v`m-8P8Sw(0HTqBc2d`5`9<@e$w=Cs*u|hv*2~1Nyx?O zrVKp10oI=(09;co}^hN1(*FdM%eT89J>%od@Z>|4>blLqd3_}C=JPV5+H z4e??VKnz;S5k=P0qH^Ytvr_Qwr(B2x?)^n~!;&6y0*d|;=e824kzEV(MSs9+n z(jjHrgr96D2JRpR?jQzkCkAdu_WK~dnHY$IgZL^oqjp{xZ)Js~wZ3QR!&KUmD2=zW zLd$oQhVmQGS*_DBFB4eO2#HX3OD53)%D$BX?6tsS+GN$+fueBu3iXGeo~aY&K)xVc z=mZaI);a+-oKGDghdxL1$}Yku?Yk=hcoV=mv(VFCteD=U4k}Id&5ysmZ)#{bp>Ezk zg(s+O=b>u!&z$ec;gS7Av=<`j`<5QrKj@mWLL_}_Y3d&|n}!1K9}LDa>Y(CGt%rU9 zBq`sCqt%K&{-*w!i~f-vUw9qIhI&b`&N=7Ap+Za@f*jgsPH^hGYCNc7OQZZhv@To5T+K!*Cb@7%m7m){{4x<(K`+6{3fYX8S~Tu;=UO z@sysEV)Pgmwu|lXx87%;FVr>DU=1zKH3)UfP=jknb*jX6$IfPSR74l zmK=Sq<5gyMFlKcfU`JWA;QP|GS(w`77(f{;+}BHvW~|*=vzHZHL`OGv+py`ECYSg6 zl<^HngeNx>uj_qE=CiUgX7wh_xely&UZ`F6^K64N;#2Bgp{KB9r!}Fw|7rN2u(RxO zL`By&BC9`^ExHChOl8fW>j3DIqml!A;)B5pTssz@3oz_PyG=I z_4#Ndp%rMCj7Fka$Uw_dsM-Go2eG0t!-&j$77Xwy*$rT`EQRl|yCsAuaj5`va!IUg>f=Y_ zu+A&(v-@j?y08WHW6`MfVYcMz;+^Obe7lpK_~GL7MAxw(IJq6m0d|0RbyV+BxtTH*z`;x%EqZ3`JOE-nMK|djBX!$+g<}$AN#w#f&ac{r@<&A{Z;<^cl+!7_c!)#{`-#o zW&C1OzIGjHA8}qYOycA-Rs^tY&xTHt6myE?6317kHC90@HXEnqXa?*l_AB?l$m}6# zxP8tzyUl`K4)UI)zRwrp>5Y$}bnM#DSH|kGe7)22RlF5%i;rqvmJfDvmtG*faS;Jx z`*w;Ao&xOXPGjb$NQ+_>H`2q9T)JuNm+2I@!=pQ(J}=f*u3o5Ho9?Xa^sqto5mW=? zJ&Th=UI#dq5ixRWGsYeXT&eRj+Hk2H9dCpGjc>_d9je}_Q76>Vn%`Ay5tO&^z)CQZ z?z7LP&X^xAvHQvg$W;JGLFNL9eHJds6$|dOo2zBMo+&S~%jKC*gXOG;0vMo7xmT*l zBD2g~FLz92KZ`I0Oc$9G)FqR#OAuc#ht^v>E?^0+aefwhA{SkZ8Y{0$G)jGKN75bJ zslJ34Oc#L*I2UPf&nK>NM@yomp89wt*u&}c!8^^0bKx`!V2OhFB1*mC*oeh zMQ$G}a?1$22p8phDI-k|-|LQDK^VUsT~vPA%XiiZMIJAkfwFlR;1@$k{(m5#BA>&K zSenYN`4`!rz6Vnj@@)IUhlh!Uppw$iO-zJPyQXl6P*C|6EeX<1#ybU|i>c&C1oUz$mY$#<84d{4Q}h%Kr)_WAd=XQ*|+Lk^X2IwtI;DtMsvzqfq<2Z$r5iQQeJb`xPW@(8H(geO4o{v{J?HjrvpE66A@`Jg?%5zp*G&JgjBy>tF zRcZ+4B9286R!9@zcJ|~5%F86yD|{1-+}-ay!lO(4GW&q^VG_&U_o#8g$+iaRJcNa% zqePBLboq0FqiT-Dh5DN`EV&w%c+2KK+T9umuECrzUyQGlTziEjKY-xyhEOY>1;zyX z;*oH1zPcDGYyflbe5qh@UNxeQ1ewi(%~_n67*FtBjYbfo3?3GO!J{P8F*4xQBE@&3 zS-tWo=165KA`yzM>c#XzQEJ6G>bT@{t~v_Oe3xyPhkc4oMgZ7EcA#Khp0KnAJj1T^ zS~LbGX^XhIm3q=!z6teaLkXwL_x5I>-W18Sn+$~o{_>A#OYf)Hp1r^fe*{87sBQm# zmy3cGp=)D>mDs6jt(r)2#q+@wnk`yVXtS?ZVnBgmOxyUu7ik^0RMYuFYR3v+f$hL-yCt`!~tYyf`L4;{Twh<97vnB=)Kmip` z1Q#(~P0dmNdmJ1thJW}#NKHY3MU*2cb1}z#49LkTlZ2HsevXjVU2BL19)?}6E(#`b z>iR=i38{%xk46|tRVv#qA?U~zt)kcJR9Mukja=ijp|K(OE@;WcK32ncGoEZ>!$dQx zM!haI*dQbD50Y`WKDqOtmwC6%ZT^n<6Y_rx3H=Veemt}x?r|Pbrl-lQOTBS3xSsUp z`pQ+rd=z;Vk06FVI)S(otJk%jVj2-si@1+zZm#gX>Oe1a z(V8|W$s1hT1>bhWa(G=|26qir!J6-lWE3irZ7lZ3;>~AL0Kmfv~5; zo1cQwmVGhaeCcu14*p{L0>0zmhko>bCNj+VlxmA1NPG)sG!Od(oHcbbk3o@2(`h%- zXH5<5KA}iiw3{d?K`Y|NKRqFZs|;8rS9=hGn6qp$5ZyrjU({=nOb0!#PpU4$VoG$Z zW7{NCA7U4X5g&JJjUAu{@P0WMTqj}YmojtF%KAtnbWL0mJcHP(1wtE55)Tx7*CfHj ziQMnYjSYO!e1To98K+JfZt^d)|m#H!nv2!tI)>T;BL5<~l%iZ}ByRQ~| zr(LvIva7!V;fU84>MzFl5|z1eXD@56-+5a6K$rS3AmK_6o9)OZBR3W}POZCz(%YTA zYba_%L@j1G5^C^FK7l-h5x~r~75Jgd3Q&d2JQltK<~)MUwJSig$Kc1r0*|{d)!-4< z1XGRSC43cvk&YcQn4OnllJ%uxme`7j=QP>mv*)Vs?j_X>yRh~_xCP}M|m;H0p0FX|bx_k7sqN1JjnANcZ5 z;>iZKO8F;o9A*h@!SR!eS!NyV&dkTPoomstK}4_;_OK;9VO!4G1mkFV6c$}(Au?Y% zdW@pR&G28OnBdjOe21dVHY2WJwrevvUz$u2>?8`V&2U_7h@Io;L3lw-I1)8hS`Zt1 z?CADbO3yLHd>#blogu=+TKf{JlnB&FO{BmXzB(p|;qmWKj905GFj3(4oR_WZe+C># z2)_P%%KA~?|DZiMay7bXgRFdy$MK$rf%pNB<9(4evHn*u5#T{`c1Vs63Q8 zng2wy9nMR9=3|>_f4Y1Z*6XtCJwf@J3&VQZ0o6VTr{_QU``5A}{R#ms$K}ugvm8B; zLZYH%ulAUt9#?bF;(=Srv>|4Kdz(Dv=B3Dhht~}!bC!GXTS2hXkmWw{Z6I)cXBo~6 zAcrDQT3u8XJknY2!$SQ%P*!M3)wSN}o)oWQUMffTri`EyPB*WK+?xj2KPW2wifF($ ziUpw*Nl!s~bBTWt`yhN!d{!Ny&NjNIC(Pb_U->iukAf!vYRd+T+|LFJnR(eOj;5YL zERy}ODeGoHhj?C3RGg-;3UB>(UIqDFYk<=k7b%;vIna|-}-j8>Dk$BL%8+!v;_)6we2g-*7 zD^Y*d`8u{ZNs+{O|F9Ft34X%oY$&mOQety&Z3amcla4L=z7#dxi4Zdcqb75Q2B8mK zgN~@QAaEWmtfB4j;XUe}K1-w!4D@{&KD5b;Ai==c#>FI14rNg7Tc|9}io9$>j(J=tB5A=7s69x(OB+ z#S0Z+GC~(E%n5$D8fRaice>Pnw$qe>SQ7iN@_O7}m-;+%sbm}i7VmuQ(`2#7k%928 zaETSiZPYm+hkPyYN~ooHhS4Ol{dmnQSZJ-DyDW*X2*u!)$!jpfDOHpQ=T2H(yU_3| z(AOMG5tNtkP}g30HfA;2tUi2@gG2Pph(IdJ_Z8R>~``nDr!V_gaImB}w|U4a|&$ zi?Wr>8X~H7AFV77g9a|rcxq8kW;cKNBE%wSWpo=Z@g^VMQ% zS5r|5$hV;eOZEL=YGQq*8#G<&p;pcy8?T)+wM*TFG=w}%RZ1}jcB$Rkt6M3x&}&pL z(IAb5nNehe5s_wem1M$xi?5?4kK`)11b>^X;aR}L6sk;bd;;u^rO;##$s{EPPZGp4 zDZWF)f!kx;1qhL#cruEH(8PZSL|+&24eB+(4fTYOZ}z3gPDDRV^B`#RVmhybcuFiY z!KH>5&>NvvA>I=Dbigzyx()|-E03CVhHVIaazg#Q1tL5M5k4=;A1jyc4Qe^E;$4p& zNPw$N1p75rS*Z9vF~QO;R4Okv0S#6CQ+@rUcjgB5d4S7oGs&U_q0K~(ndpg_;Bf6b zVHyw-B-4|`eh0t_Hx3xQrUW}pFr0adbQJZPfHg!xof6D9#n%HsbnOrBN@BQ#2#!F= zlwcPX$LjBLHZVlb`XoJVkRn0?AUWO{ct43^7hr&*vY1+h@-8;0_vQw5I`WdpCJlcn zpcisR5bv+R3#Pt6D^xP3EI0Kwy1X*c+i>&ph@U-rpVNFr2Lid{+Q%M;N$A6b6{a(y zkOMj=Dq_zLLBpaAn#_w+K8P#(DQbbzJX?1!Y*a5p0!FYYmey(lmm&M8k<*U29h%oP z@38vyI+7c7M%`NCx1o`QRE2>B(zArL-ot1TR$y7;F@wfoE^MkRs6){p!a*j4-8PH?!PrG?NX4(~ zm{3Qy4i$C{3JS$Cy4nP#pVDB^@lm!gM_5vc_UfLNjp`496m5E@8BigYvDzy#zgab+ zC1?oy8f~$N1^1h)uc}D+vo@-SnmM^}X2AzjgrilN`K}B>sR0UZIEt=-IoQK8z>>y~ zxiYa9II8CZ9q(&u%bP%veEEZh&#K`=5PW93=$dM+x;hC_n}Co6(jNfvr5gd0T{V_m zCaozhNAM5MNX&#OQ1_Xm--cvo9zQs9>+so8TfgN{Z`<^(k1r7GhPf{v0dIWoqf;G) zdeIS9WfuGto$B!>^!98Vm*dMOUA{Zjy+{VsWL=VR{sRdZ3_*iFnDS_n&10&_uq1Q# zj_g_!=K4#oq zwG+4+Kv)AH>~u&XkK!DYRotg#Vs3#)AFE@PVej1UrVaMppbWv2w29A-d841CczZtg z9^ED5oJ8n4V>Mb@2(dTAoz{j&E7p0Wso-v4VxCxoJ^jiVGV|t7W|_Oy^$1QUIK3rA z->IRNdwz^Fwy=1CAKn5toOocSqi-rRz_ZsPycluzhRwgl zqTohsIa$>0x#Yy~{j?@8-2{&5sG8|Nrogs z?Y-~@E0fK%-f$q^4}6#Oh(DZqNW|ZGu}-i`qY?Di@yI0z`g;TsM{}?i$?}ap5xWY3 zT3AicGrq+WF`Ev-Q&B2L5yw22m*L0|LT1ezO@J2>(hT4u9OlunD}atrn@8hoRO~`M zo2O-tj*Zc?I5=VPBESf=A%^cX+RVdf15}o1K9x4JP8)JH+6bA~!Z9Kw?=*~-VHg3G zC0b6!XwfkuSHoyQge_KX2nPBWd2d|1s_tN0{f;KDlKG_Q*o>--6jzmLBxYPpbrN%< z+?!yG{e*LaJPT+m*ul940I&mzI5Is}1JwD)!+GhT#_LeDLiixorx3&(k$vrjFodej z24U$E3=qx(go9)~X%$5IC$!2W(kj`*wMvSiG8>9D-_Oi&Zfu;) zvU^pT^eL9W&7!N?9Q+5bsrqu%iTwsHiz0#xa%Gl%w(7^?i*H9aV>|i*bFhz$YQIdr z&xh@#HZ(oYG(FEWJ+ItZnsBY18jijZwl&3*i9vjoEy9=gdSL>Bc7zE*s8eBrWVa#l z_WVPVU`;*xFCGZ{vlxDb+-@N^hP-RG^VB)}!Nnd;{H$Un9`+K-JTTr%$h{NsbUSLu zx+foB)2hORhRQZkii#|Ff;4ePO;&L{zNXE= zSJ`aLif$nngwNiO_uF#-*MXOA0?Q^;NU?fn;OQQsW7-^z<rO3H`Ho=Ss zVZ05AHWI1p6I6huS%gbthDFHTn4p>nz{e_P0G#8nv-=qD#6gF>dc8^BP+-mDF<0zX=MKsYOc|42ZF3o zYJ-s^9|A;jo6F@k7jg^ZXmt$`%W=<6HK(|KaX#`RgS!t)yH%RoE5$_^A`A^J{wC0{q ztB<=$4xk-J4hak-AMU;qaSqKF{nM7NCY$hz6F7@At zGr-m?o@ZJSM}Z{Lf;ROZUr`G(|A@Xf_#G$wY|~^V`;VFQ#@_Qe+7Yt(uPMsJ38Voh zE9O6v7Fh*r+~9R=^f}@_1ec=wx#ILWy1b6VvZHINV*iOu%Qw>|pJS`+IO|4#g0u9|6ajt%$qIMP8ZvUF4Pd$oAkXQcGe zkA!5vly1`@F%t{3w%{deI^PkHH7Fy8a=*_p88NImrVPMYODWMR0RpwmKps_zx`q%P zCIFxDBZ78+1ocry&;XOw1W6|dWQGnxTNP!cNx)&41__1C33Kn~h|+kqK6A2h9Hev@ z$P5icB9I}Pu!RBr5#{>B&(8o~c0Nt1&;#Ff0l+Eyhe>~}kNtx0?&8L-k*+-M$FstZ z=Vhw;z(27SoE{oX5uT}n79l5T0KdA^W0N`s`H2?_^SNQf`*`(Ade`!uAhHi1wK>wjmbALJ=D4#D+O$#FrG? z5hc~g@e)p9>C-@x^zS%#lDB7Qyi;jm#ReR5P3zrvq{&!$t?rQ8q>88kE<=jRs=7%o z-+!dB zZ;@Pm!6%9E9m{!3QnekdZ}QnDY^V|QMeSiQRe-7X(2Pf8Mbg;7t z5q*TEXsEx6gcTDfq7xJALAS7?1^w5nzHS^A*K-b#X+5wDg5h_49Bd^mIuFUXG_gK{ zFqUIl7z;m4{O5D{=yPNA$v7~JFjyRxJ@w`wtw)CSNA3PsiB-D4k3Wb1{W>Lu|4YH; z=$qf}OY{xw1KcRJ2%f5Kn!7KT4pPF);l9k{?8Wq&gEO>ge%6oh*izY4D2pK%!tQ3e zv7ntl5rLgJJ0a$>%qQjY`ZgdBSJ`|xvVqViY&OA#hg)m>V717K#`hew1ZEbB(}j6{Kf-lRkJh@Dw3}nMvpwOFoKL-a z6+#u>_mww$6*taOM}`8)EF8QKbz+wp{>QM?Ip}q53U0v+nB(l_w@r41XQH~fFrxkW zV*a$taXTp;3OebGKxV=oGtR9FOV6Y2yI!IGOVH+J=g7*GlOXky7AY@|!>sL#>|WEm znmS0z6M96nAGr_yxp;d6+;oq9F7hj&{H{$^1wQ3wL=$%S5q5D|37gS52xns_aQIE@ z67ooHJ|0UeS&WZ;fxuc63~s>5XEeAR{snjs;Nsehd3xA_jcZIR?7Cc#LlN268H?E+|J`a%=X+BdaB)0%Gm~g`;+_Slr zxcLC#$sN$1%haWCs*|duw+1Atb0f582_76lR}qOsHMK(vLW0d%B@0U)#c0M29WuN_ z^U*SDpx#zoT7rYdCU9mQI$d&AS%f9y0gaKI$4j0O@u z2mwv>2wnsI^}i~`;7|akAG--t=yF+5h?NltFl_Ft>#oG%#kuf5&n%_*z+5l(ySyfBrZf2e$$Ub$7>`auRErUWf-18t<;+P~bCIl@_lDHivq)b5{8C0XkH zy)=8mUs7i;0nS`R5+!v6wk3Frk3}cct|Jm?>yz8t`c~%->}&DrC&{5z zoJ)bUR;U6ZHcap84T=R7S7s%mDe3qYS~{7u(2_S?#26`eW>eeZ;a(ag4N%gg_ zA}?TVJdfiaDulirf|KKY2}@D?9imra;Y`#Cn-JUi7=n#898s70$~yE^=s&yxfd&c=rktgi{KjD zMp1DGfp9D?q!`_JIcVv>88bFGN%{~vj&q>D5NW>f-|cq;TYc|iY3wi5x7cy3kMIr_ z1?e*qZ}wjNSA8f46;YptG7?+*Dqh7S(G;O>0*bhgw3>xFgykTs&Tc0pfUWC7f?U4D zZbL%om>@j8h7u6p_8c~@>V8@G5Z+8p@jiZ$Q|xRW$%Sj3asU-eU1cL+){IEA@^;v3 zrnS`j^3j77dbW*E(QI44i0Pay`QN@iS3~9Wz6(Ia~!zu-8nv4)SSrJjSOrNCLww8{tZY)n~g$U6i>K=ug;!}HdY7+ z+Bv`>S@_Wg;noPe4P#n=Eg10I*8eP_IuZq=ey6c4rE+hXw}w0s+dzeTfnpMGN-f&^jvHXOGAg1R}`%91gS zmwBJFbCgGSJLvN0@uNd~2a~O({!mITI3v_R5-J5yv;(YjlcVb=^BNt6-rb8Q^m9t( z*d%xQ|DmO!8`tA$guK(@H^ENu>(R%-t3}Ufy}2;ao5ZVcl67=2q#LphF^7=H@~CHd zNlmoT@v-p{kf;R6~jT%w6yT%iFuY)gtKkACG+d0QJv=7d)unbf;d zeHRYJlJ1NB2xbbR{=0BQ9$W36U_^(K7K%Jz92G0pt!f%k4pim}FbI^_He9C}A z@33%%PU?xyydqZg)B6pE*YR17&kB70tA8l{`+SNYFc_wv;d2P(Gm(C!{y7s2rK$Mb z{h-0ng5O`__wV|L(!bB=@&yLNRcH9@0G`9ZVL%>z&IChgoq#)2{gnQFKL5A%H-Uy1 z@cA`9zsKh<`iIiL&*uQ(zB!&zLk{Vi8FfRV0F%+?bQNsY07D zY=9=N?SaKGe5@N`_+SUBlnxqd*3;Zy!Fs~AX|lMAE`(^o85Kn5+yR5K{7uZV5KxC4 zhC{$@@rCCjkYaugJ~n*dQJT7`K(kR7r1i&=^4c zZJoUaPr6-&+eI7bNWElVgd0X-!RF#|0eg?zvafH2xdk(0Hf>DIr;Q0Z7Ut%GOT4{g z&*W)$gKCBgYo+ya-5+=bxVaN25#ps*np>AqQo(xWNqVfjex03fz5Q>^5I`LANiwsEr>>Jm9(dBRE!Y zoB}6OVZuq_MHac>FK?nrLR}|lmkL&`<1bOXa4UhLtguaItysoBl+db0Qo&kMJArE? z_B6rD>?JBMD^v3+*l1DwrA8ECDtc@oC|@MLZFGGY{@q5v2*n?=XQ(iHiC%HE#MShO zneA|FXD{(&y0ZcSTqcguYwA=RGR7K=zvFpN)3@tsDhSI~DC!DxR5-zuX~fQx@tzRS$I@{1BaFO^ zZS>b!qMuqaaF2m#1|WY(O+2J$3?kh^0Q4}5KOn|_OnqKDUwhCMvUx5qsD>B-Il|{!Z!X<;JrJg|Q@zYXIBK5?`)OZKdP6qy$o!hey_a4Bo z1|j61(CSM$BlO;W8Y-bgK7Yz2`A=@zHTUq2V(tKaJtMw{iS$Fa`ha%;BWKbQc*M40;Jd2*+dTQ zj^po#sFus{$3zSnZFt_3Q@aQGah?KJXS8K>gi8ik$zkoX)12r&4Z3zWfdLpL2@Zpz z=x9cFMh`0)3{TgfbJSFFKfeceCIH~0l5oytm8ArttY=Kz*xh@sEMJ*e+e`CIoj6$B*H2BtMD}<-#wEqK$#^gf47&C zBE+py=tVdWF5RrJL+f7!|0%}Qc?1)AMfjfs1Q1Rw1YNDQ4ameh68=eZT==1UIsA}Y zAE)$(e0n`s$Jt5s-6v>eFVvgT2^n89`@*l;Rg@9o`GDXkleCEw=c~9Wp*~cp6=}ov z3UbY`yjMW6P~faveY=T!3M|T`^ZNe`03D~eiZ7}#0q1!X5s~EBM^STiM2i83$TZ0p ze%n4sjZntT1wve5g{yKKsUWVy6>C3%xEZ930TzV}abdEG_zMyl@TMay79xl|bt11n zP}CA4b|B1i%+<|^B3MOdVc^{PhXO)ra#yC!;WWHW{l&U5PuBo~ER!EAg^vD@uoVC@ zItiSxYhN`G^Qu*20JT0T9pFJmR8vhWJx}R{!!w`MXAhKr zDmF)0DcR*y5&P_Pant1Qhgz~vN#LGgpPWSQvrhrx+8>nzcN)|%F6hE}1vhS|YYR76 zz#(C6)l-y$BRrMA2*s_Hawwitd3h*q6Y6K0AT%{JhG_s0l(5!c6Xu71`i~%4%LLS^ zncI_@=+#p*=?~**CGl`-COJz;MoQHWj+{b<)2YOQhdQ-# zvd$rDhjQt1ZmsMPxkI@$qE4lEDED(}gEB7tm%94VrR*nbxEuy_kxq=Id{SWv@mBx( zpf;9BRN)53cRX+f4JvA+tUOOCq3B>3e-eop#Z{wv4eS{j+Qde96Z`PP8eYdYd>Dap zaiuYau`=$#@JM=o2M099#T7|<oR2F!GQlZSCJ@|JTmOk~Tb zi8x*!7=^!ncv=50z;Yi{4<2wv)>cgiZ0mmc(UaJ2BqyTyjuknvvEn=2f0!n|W5YYP zg1qG$lTH;eTw|q{%oO2Sv4^NAc~*MI!n_m1%XnS^w$`|-@aUdlsh8f{J3hJ(0sb0L zcH-d&Vk<|9y5LFTkK}?msMmx;Q*KskMxDa)R@`EhPPbT@!nG8r(OQ&GrQk15<+__3 zDx{X_rZt*!d`z43WTw0dI2rzxUmP7n4)ZsWE6&56Vso1>K>JPjd{%2Pe2LH3`iIiL z&*x6S{q+o=T%=u#k6-`H!EfS|fT#E21_IgU*fo%~F66yM*R1-K3m*=mx3H|vSXW1E zdLi@EBXfXQd`FAPFj{Gw!5nv+IdGR4Xd7=4sTNjHZsz?m??+?J>Svj ze;@M=6D^HR(MPd5J)_MKkDKOU$~y$!ec(v5{pr5YwEx8VgP%P-l?T828Pzu zKjI|?cw19Vmu8cY;puCnX(nCj;{+QX^Edhlt;-#04v*N6dbSaTH8&2{fezSk53J(0 z_FW)RTm^Z7u7Rzc`@gW=!vCQWiXSR8%tXfwKIU4jSROCN62%U_%8S+T_vbAjnYIF{ znsg1`z~P@wz(+NBY8$HI@Qm?Bp-(c^hcDvklrUl!Yy|reAA2)h4eN$U4I}=xRxm-^ z0n9@Rmdv;-4BJW3e*Ec)NTrB9bY&*uY6hZxqZ|X03&(~EdvHZYbk8W$7m};xk&9{k zW2dBn)F`VV{f)9m58_Xd3d?(9X8g$>oZjM_bBNr+dYd3bQ@5z#mNoVa&08*j7I$M* zsNMR+Lw_TYJ^eEB_W5- z5syg3s#&=2z}f3p%#*nHXh=SVm31=+2c1c*5X12A)Xlg7?|62na9PlBp{Oj^9ycH> zxPix|_tX4H5MCvF3WkebscdQ=F8}yDB6Si~fIwmVp-U+Xcm6=YG^9N9I;vgCo=gSL zluwsGe_K9L`wjU(DVut{wS%Oige40gEREEHm<=64eT-v|>f>(_^T-G-a%n0Q3kVJAqqmT<1M&YE-`6wjmOT=-| zMik_8Nd9jk`S#;$g#1!I1v-#tB|`f5?3%^_^raz?)lx$bM%+uQJz?Z?e=W^l*IYPk z{u=y@&tJ9honZd@MKzzl9Do2|kP^cerqWw@%n!80yZAiyC5{#7^Ve7{{Xqb?rhbfc zQUric)6yU1=>>RML>ePJW{Q@6BkkCnw=Rf`oM_h%z+m(?7_n=F8Ll<&}0T z-*kd!T=%WPVScI`e203&?G~uFZHax|tK{;fR$jv-w|q}KH7dqoLHKI$hA<eaArtziu7jFW$`sw`gi17#iBAko&*;irm zcohx91o}k6FKdzR& z!Sm|Y5xL5^-|Ol6n%|}8{z=OXj?BGK&u!3hZyuQ&{|DrZI~r+i{|3QmM0yk%cY{4o zgKvn&hvpF-fqNk{Ti(D$>^vJHckD5edavc4Ug}VB6)lPQzGW%NP*@wEsGzQI4Cbt= zt;}x%+Z4%SQ7Xq;z&pCEEuH@O9iClB7g}&Su>Ng5l1}5a%=|Z!_0y?xz56O^n1_Wa zxDk9@=aO?oTR5+Vw`Jzhp@zJE8*j+(hkC@Q@%(vi>n1y;hQkT1SEaDza+C=3l>Q5}!cl6d;@_ngevTIw>c0jR z@epks^nZazw6IMBjO&2+Xtj)i6@`H0nLp{b(IljdyJsX=p^k4Sv7?+3MY@_6SAp&L z%go}JNuKE127hFMs~eqt>Tl<0oO*!>8G!>`eDR~8U(-@-2`?tDqCbtPWa9|mn9YB~ zc7r~AN&2IEOzJ$G>Xgf$*GSQpO4^`6$m3`}DU7HiK@@bLK6kAd4O!s4K|O~4Ud+R2 z_}xSZBtYkn_piLG@)!q9sQz-!d;dKV8ia`Bj(Ay}mDj0cxAkx3iQ~>0i7Eb<;p2ZH z^(mx<`46nMqk0$a0vwl#5<=mi`Yu38cD5q}oFX9sw`qDnB#+pLqC=V@(JnBX%+v(4 zuew!3@k46W2oz8XdKs`Hn{WwrTj0m6AYt@%v65%?B)uj*&n4H7w z<8=ATxhU%#fyc#QM<)Dv27*;)7&&?|{DNUT-uo+feSRqYah69g8*{a&e(<_Rvj@4~ zli%P6?D)1!z1gSmMs?hxVZ0a^`#;AqKvei>Kp)}{@ah7$e9x+=o;*$3zoEAOmT9&9 z3l;T;wAze%ZF&=r|5*c}6^)JsBQG&WeVQCX>O(rNy9f>Qe2T!`N5<(Tl+r=1q3RQu z$r47EChf^lGGZ(-PfW>nW01YW;1%-{f|TIiK~81)XsYLTl4@)UsBibb$DXD zgx<-bOwhA}b_PAMQ)DMxmqqeT1ZoTTWOrqv!F>G7`uJxrSP2yotgf1+b@1{*$iQNJ zLE^rAc!Wwhf`g(SW5yv=i+k_ zK0nl=?x*NgNvMU*G=+}mK7!z5eNF5(hMKmix9XGX#Q?$H*0>O^Bdw#QCd5gody_v{ zg*q}=LW4P#w}%F8LOpqLAad#WL+8f8B}wIhSythzWi2ZQYqmOEU z7k(okL<78_H8$76!pfPWbS{K-eLJKdnI}V+Rp>?wF)^Wcv8}dp=Gj99N$d9ioOZvI zaor0>2*>t6Xu?72(}%r=k&3mLyFSeblTvQO?*jsioQ`7PuJ)U5axvBa9)h082byd zsl=^5^Qy(re<1-YA8Q@a`)apqTca(?$cWCe@Et?1i?hrJzDNdBXj%o+!8JKp^>>wdhU<4+>(*Guj#ph zmV4RA+^6*1gI{oN{C~{734B!5*#|t?NPvVJkX1#a#u|xB6tu(uof{@F!HLF-h~h#U zrQp({nNhTW6DE;d4+AJ#?J8E^mR8@o76`PMuqB`(pjFh?23)w~h~mcLLcah1Irq*? zLa?-Nzwh_)<7VzX=Q-PR&U4o1`JaxPI^}t~o&yaJvW3W6rYzzwYDG^P3C*gnn$bUuFFh%T`(G`?!Y! z4I;=3kTJ8em%6G$92NYQs0&+nV58{{(8<9WR`bKR+rM$fw@yp2i!oOkFZ;bCEjdrO zR_}#4TdQR?iM^@<`}}GxNE}T-Oy!Z!Ze*PY3P;*^{Dz)@c@^#WTV2L>)f{3xA6-n+ z&_&Mb?e|U`CH8p|N9ZrSLt_-Ch1?l>!Oab2-p=@#i@(q@rINY1_bKT$02|DmeP}Ro zdHs_&&_`g$h3drwHzEIUeufi)fZ7Jb+s2zwE?58|w>hw^#Dy*3ma1##57bBt5-I^k z{rPY+)jaO@fD%9@mb?dQc2ufzZ`F*qxJ;Q)vtTfLzH;@e!5l;6ICl@LAUfdDYs9GG zrr+X=XYVUHVst)ajV**zHwUxvJGwcMjbGQzX>9yroY6laN#KmWyMx&HnVk+{<0o`? z02{|yYg@brF1$CMe4$d!V~2|dQ=XxVr*P@oJ!F!7&1KvVYXkp=kk19OeJb^y{KOep z@tSW4n1?MEG5JK5?FG(72CF&u?iDiSwD? zVi_0vHU7{!@h`bQw-#&a*kAD{;l~%YCu~z+pPjOwUGzGdUE(};*K`Pml{W@2iq4Zue_T1IPDE#4^6tywqYZ7>|Md;LKV ziRw58>AHLE=s%VKY>A-mR0$%?Re@hMvi>Ro;x9{G`}zPY5+G5u@O?`VSOV5@h7W-1 z>q}Bq9>o;l@+x)jQxZOgOOFHUO<0^8FuF$T^%NjekR7dltj>iw>iE4t)AZN8jR|q+ zQpg_caJ?{&#gU^=niWp;uy6ai{`RYM06*f2E1JSK(!AenoPfF3Sb$zO&)y01)BvuU z*+d89$&ImP;6~&?ekh>hy#Vo|p*k^A|JR8Rr$sot(GlXPXaeqU&@lpkp;L?*&GE}I zPY+E7qU*l7%*UI)(scVNDuHRge<6-i~11%7v!>iZP zZ*@Wl5)+Qx>`5}w2^r`;y?&aPA}BOhrLOg>+lck~Mwjre>f=#F;GT~F0!mv!NWbvf z_qk}6brRjNw@+P4bj#?SOVK$SOWghUwVl-?Ui1PnX61A!r`W&U0VyhO$1r!`_h{Ps zl-&y-l@7>fBC=tD#{o!90LQ%E$ibZ8cOwV$p?7z1aBx86Al6yj0%{GjOXgB4ezJb& zLMT2^zf-W{z4SZCAQFBw&O%G{kMu`@RVPc0$eksgU_U0MCX`rmVjm;GyClA;!*O9^ zTmv@jM{Lv@os29~Beoj9xVor9edH^>wZK@|3V)u@hvCj0_^J5Cojra8c?ho#9-LoY zTU0j+heICE?LYA;*u<-e!$p$4w&%?}2<`DOlgFXLxW?e|-f4@&Wut>xIBy8;^EKjj zpPLFtRyDjEg5}OfegMMQH)BVSx1p2-@P&)xV3X{1A#Jd)QAE~ouiNavRhI%RxiKG? zRTUTuYGu<{XVVX@E9Q|$`piDHu%wvK!eTMyXpz4dgX7y!jdkl;rNsJ{^A^Wm`Q8KI zRYE`HID2W&Oa#?i2-x23dlEh^IY)yl+b&O;sNZqggK|9ePz_I+#<3fu8p+PNXmpPL zh@(xSEyS(W>z%+89@Cxf9r z(Q+IPCd`k+P10+Jvg}!BWny!g!cVkcSq*KJ*^0;h-;XocT0#R`v15bo6R_?mOd<~C zAo(F#NRCI(V1Fj|zxd;3t&9KnQDNPj7ioKZeQN9I!#ih{q24P`W%ANhV9Se=oR|Rx z(M3zmR4C->1v@xAlQXy8ajrsWMBYo;zl#KX|~MrOFmScM9(6 zOFd8BhvA9h9+&EJ`jz^^Mr79)y$DAJTDN_s-nDtCLR0@0)De9hP-bwjs7{idvv~b# zSeJC_wd=w_Vw`3)C=lcImVnU^)~~nzz-S2R*V?g0!wqcq6=;0e z&H)joL-*0*y3M|356|j@^-iq|JiR?b9F6)LMWS?b$A}43pDfuwh5Y&P{wY?(foNX* zAeK~c^1_LmUD#nP;+_|rM#5>fY+k;=&k}r|$xpmvPLj3L30Yvjp2f;C8V;hhKmzO~ zA_0ITh4`?RDL$(>ffZHy8FMH{2|fD3346CLj7y3t&xhuyO>*H~A*`k|ns8mskeBi<^tMx$)A9763tVf81MY8A+S%l?;r@iZdio&G_IZ#Udm<5`Pm6P~TkL-(V31|v?!+x7Vz z;XQEYFP~hzyN^rDZ?_Xl_D|`YPk)0`0oP0SPkO$5-Z#f2^%oDkAoFEl?@<3^*VQs# zE(QhX%ZPybAN+#;hjttU$JVSbzJ@Zi)?e(S-A@$v_uvlhW0pJ?&g@%Svqs~Ms~CvI zDtIHRIDZbGP@$6ob}OdH3G+9*(nRgKR(25m*mQqRvb?nHL~oi&8z6KxVI-Gk+~4e4 zzfu-43!91G0{d)U_7GX`Pfs5JDiJsP&(H4L-Q%(AU> zuulx2A{gaSQk`wk%8YIHL5#4{=@zYXJMg4draM1-qqVLL!T1k50Bm{8bswK@(bx*8 z-Hb|55s4dJRxYLsq8&E{5FW^rYxk5o{?*L_N1gE-t@;K=S~_cT5S!^uQ_1YoS+G~c zN45T_mXFE$W2$^i=ZDIhv)IS^CrIMg!^>6Rb-oy9y>}fD&Ec zOH(LhlQ3w?(Et8zs3H|%Fu<0fLbL)*$3h`qD#Ta1#7&)ut6k#lnz&YouW^YNbRwSW z6911T9w)>3^f?g-|V-Om;f-&uRM0gnq6||6@%rgldUYrbAz^=}#5APKqNe}i3g*AjrSGHZg|PD!uu#))5c;S~|28bq4x0ilMHA{g1>C(r3g0M! z?{@<~q63p0ZE3HBTE-8E!%2Q?Wr_#B^th==#?=k#P^NTUh&?P~f>^#BV(E=K$1F|> zV)=52x$V>?W^qao%NL2e&KN~rsbwbmO$C4sU}Yi8MBM>!S44!<6Fd%ZJcaPlFg)18 zCkQ5tvU4#R@F`UUFYfDyCG5-g7aY+dtEV$AhE)vf67ZCcVYg}`vd9yh0pBLlCnI?Z z{t$NhS4LJdYEN(=$=C@c$t*^rE5sjJ$w5?-Y~;|JND?5>O!8`-BpK~7>bX0>_zF5D zTdI>K&9^1nPbVvN7Fo%OohNvfiZn8=CVuH00<07X`;3cm?olygleZEc$c+683^Ls| z5n0LlIdZOlPuhs6qc5sV6uHmBQBRa){jdo+e1J zP<6+`V>MCO&2iVNm1gk;EFID7{Kj(n?elJCk2Lg}{T#Hll)q#ju-Y3QVFaso4ybhqxTP7R zmK_`i)(-MVo|i6TB@**Ap?3z1cuPD8&q1|k!INU(2_7%rmZYE}%*l<-BdrL}ed8Bd zOPFeW9K!Uh^{Pb+5JcWjS5n4h-cZ)Q7H{y_`c1P28msJ{I;Xu6v1UTNcS`h;)mn$A zfr>RaH)Py|IeZJ`k%K*r`t9=4J2XgVMC_Y#EG1{qHvD{Q2{S0i0aOjZvhMzIJVCCv zmI2?ZGNYxVT?6CRtktU&DaK72AGed+i8)Vx#KZVdmukx6sEJNb_Re(2>xPev({naxw^h-^Oa`Z6#CWn_u$%=t6Poq~T*9)~IXi~1*w@U1m_#o;fzq}MVeFyL zvlo(>!AM4KtT4w|(q22IIKqlJ(v!?Zfo4@I-6ciVlEJAtAeYauB5auet{b3)xyUAo zfUzJRP6Q&jx_pI+dT~>$zofIg5@7}>ipwCb&*Rlt)!tcL3HJfVfwepbNqa&|1h_Pqwchr0>uXrC<-#n|lPLb*C@seU1|1M~ct34-$ z_E^vk>`I%9fSrWdS1JwNXkc?s5oS@@p)kLU5Rrr33v)aCQiXXdz9G!5m|R=`oGhDFP3O0hgT1VJb6OcPJh9E9ZDV8Y&dCSgpRoOipza^ ztkE6-f}jU#EV&Wjq|#~@U`hiO7&8Y`JqwE+FIKg!W&_xB1|J3{MNlY*cL2vI$Z7+7jq`A?MP02ba@4D zg*S*!BIb(cA2gxDAZTB@20gJHC;b6SM>$SvXg?VS|8+7Ea?Cv@0}0d*6fWLnj~gTX z*a`9jV^q~~knyRRB{1l(v1Z}}>d1wToZxbwTX5g?{e^Vrk;+Wm5&P zG*-Po(1^^Z$DEnKTbhG6RS{$g?RfP^A6N>G0l!k8=*smQfU@*)zIRp*4|N!GLnYz@ z@Ndw>1(c!kN@SX|Xt`6*AB{2!gs4#KsO0L!mpx@ix&(ld6*sX)z=)-#JsWQ&u@%TX z^EI^Ahv?EnW8CN}qGQn_+}ILPHNSPls01)--SB<9J01YhKwdHyhLOBK`q!oSQS0b| zeX#FT@t%WdyRhx`s*FwGoUsD%NiDbzWE-yZo@SYcLVH*_ESJ9q*Nb1p-EdsGrh`?e zmo$eG*}CI(oh@Fc+L|t9Ec{yU%c2fRlxCCks%9O$%LygITP+HUb|2nHbT@zARi44$n-(la40?PbQu$JU#Ga zhjBX&E>R4)8pTROOH^Gis&6*#{ucR>it2ry`@N573yI8B)sMX2jFkdprIP-QC{7W4?v6N z`Fwm*k*Neb1TZd82TZlOf|@loE&gJBG@JWBLo3QSgxUAYP!{DR9GV%b*ge7hZ&kD@?_sx@g|xzGX0951aa^HP@Joh~I{3ei#Hby_Hhr1eB>H{=b4!J$5(Gos;J6vVTXQ zX0O_a*4G-SX%A$)Lw;5fTJ3d?XZJPbd8#tr@7QujTr4nM5vnZy##Fd|?a5ZyoEM{p z5N~Li)X$UP787NgRc%bs%k(OuH!{uZkYPm@3S?YYI2D=O%9J@}#I<#_x^)B{ zX(5a2m_(3u+FWYM9sXVroH}(f0jNX@Pa-OmH4^q2dN-_EBFr6)vy}20VnRVz@+29js96 zsh0ROI;0e}#NXo6QAC{;l*F`ppz6ML_C}bsm#Tq&8at|ECFuc;#w@ z`3%{zGY1e($(V486-FxdSIfD=mdJeyefvhBRgQlEh_#a0dYmBRvJ7-|$RXxWGZ3fb zki2(_tlmaxBkwc=2AtqDFo#j|nPnL97*F0W*~sYM=rZC)45bbu3`FZPp!hS{-FcTM zyTH*KAi{52q2yv1S5}G$h;g?8`G}(lTd_|{&}U1 zQgUKbfO7rj5n%9@VTSy&fC&4H@^$vHf8fkSTE_d(jx2^6XlPUHGsFg#530SB<9_I{ z#*lO5#z3#mjRCyZj=IWo{w!5ar$m)M_Yfy>%tifFDr!>m3+W$sr1bNToIbq{OJ6(c z^c$a(^y!pH|J^2+3-#?h`2GwvCN1J^Rvqx)vHc6^t@bW0Vk_FiYkpXF#Ogrjw1t$3ERPIYzMEp z?ftOMAVmOfINcS1`h7TWho;34WF49o-(g8Hn-$SQm-xx!(j~IrbAZh;-}}Q09?v8^ zH{+?p^MLcv{b-)gKzAC{)w@1_hWiV6-f*6e@#{V=Ex(_A3E1Lz=HOX`=Mm?j`_VjK zfo?b|vFr0Z++W4B%X#+W*L_@Cesic9EU=k`dvV5uL0lhe1xH~Xa9-}6iPnXwBA1is z-`}uLvC*?6RVoYYTTu^Kv|orlEYjkvX}UB>EZls>nT?oxg@!>PfxUB&Pyy;i1bkDl zZv`xkut5oJ81&-%Ke2iUn%b#dYH#=-^C0%WDr6Qb)fB8MYN2NNPG@a6j&GM^rCs;o zUXWpQtD2iANwWkz5UBYy5Unp3e&b-5z@)kh< z-@r3;0iwixj6?U1&{5AaRs;&Mj2Q&Ft(e#ppieZWYzOH!xC9D=#*|GR-^ZD)(Lg*m zzsg4P_ZQY9VZ1CTWNHY~Q9Zq(nQOAMjfO0ti-cL3?8n%JOu&vYHA0K%2qjS)G*l|( zUI>>g7Oq&%j3d@IAx#1!@i;xW1X(dQ5f)Fw02jlS%@(XMAshx4C=wnu>`Qmey#2|(_ zRm%3MFR}mR#jFGq-mgy4%8WC5F%d`g5#W(*4U-X!D8HN^nSUuk)D@x$xugINg7b^c zz_yOpF$_WszS8RoeL=uOjyoon%^1;!IF9n7wfgJ8^F*I2$5Xt8UJ<(r%BbTi!U4ew0%^=gI_bdurZyyqw1o7>aPt#+?Akc4;T6lON> zOz+jkKbzAx`FgcfGy*EHVzLweRvr0&9zP;3%uJ2Hvh1r$qv{Zo;pJJIjfP>|4pk}I zv(AUHD%Q(tT&5X!#do`McI*sYOTQY7S@Mz+u)OZeG*5=7w%5wq z5Bmun<_5p|9_at1>9K!>ve&I1k(3Kb_%%2Qf}ITtWv3SC#Yo(hKm%;G7IoZMkA&oyt1P4iaCx`$L2`9>N+;PWzvAD z^sl3yb-eR-#H=H~Lb}m=6S$rC^)z(KWcsrcdU|k%L>tM{)nrp>242X&&{SvM0rHnX z4%NLM4~KX{D>K^v3sesUs33Tv*~Fb1djf19T~1?KaY}T2ag29+noZo$v5U30R1Eoi z1{|x10Mvqrkiv~fL02-;>EWbfHu1(MF|CZlBr>2d=u-=v5yTPB(ZEXW|8?7_#FPq@ z1@>bD0VsiSKX@9_$kwG;b}n1&?-4W00#bWT6{uQcPzT3(KkK6uBS~-=g1maY6g(tB zo=6FTOT8V`;g`AGb#%T$KSY?N2ovqklVI}f0t96`X447;=k7W^?Bh@#rx~I+A*MB5 zr`1!^T9uO4iA<{)p<*>i3-^VDfK;s;B1%?{TT>>NJq+ZArB)FNP+Xvj`G)k0vI zXwR+-g#e9gYEr~C;#D$-U6$$>X@A%fSL5{O1ee%nt>#&_sSZ`B*H(34-l-=~zEUZNu`qzD zz=ZJ3hlX)}nSb7>a}11|`^;z4*im1Lv8xDd3r?y)UkzmEU{wV=>(F@It=X_??wL^E zB|B8UN%Pguz%;XLd$2byrp2DPS+;5RdpbFta@i)_X7QGZ(@QYd@Vybwz*J8UCXx1Z zqn^hK0(Wo@UV!?Nfy1wg`nQ4uQ3;foN-MVqUdc?KRoDa5O>mfuinQWFk4wfxnoo?h zw_8gZNs!U5=lI@WKF}SC$`-d_>SHV#laHv)5**$SG3ISShVeGon73ZP4XgzOyE$eW zl{$U7^{5l@7_q??S{vKDG zKP_^{nDpBOUfWt>ICGw#A+M%tSca%6Z1Y(fU~=TvRhD2N@WgHthji_LAvkuuH~@{~ zD!h=&0|gRFJ76yZ84y}5hAtv9d8vpUB&ixXw8pLnrPCFix*n3a`l|npy&M{obmgUe^Mz zHfup87+3~PomRFsbfKzPRJG*)=WVDVCzK)%ts2 z?P#slDORt^mWDQH1X|Ge5=~B%@$zciM&LHMp(#zQ?=&+qE78U-Md}pd^AqhWSj@K7 z%dGQD9Z>RJDvlQfq7_eJs)94&S6_!+g_?pTeMCs2{*mmS zVJNu8ry8C@6ecd!T+DFD^IaHKq(MW^3VL)yYKxuD&l}2HRzPgw0^RS)UQq1U*n!hX z^-J)E0E2IRAAhm`+8godmXW;?@j`gQE>PwQumFR@h1beJ^kFf_u75xTIi{?lQ0Up# z3oyQ5j|e^bHv6NK!8YW1BSsi55#eFf--vaM{rSptgcS8`jgsxJYgx=Dt+v{2OR=?~ z^^P%>xpNE7>8(h+cslyrGJE&yooM7~#Wj+r$;gu);dUcmVlbui^j+pjCx$>_iAm>2 zHOdz+FMG8oQn&nGhcLF9{UP)djYvH@KcsSrPUTaK1ZLAAx8wzhl5ZQIQu5DFN|szC zmL-Q-fG0fK`zP3uhjQ&(Zcp=U%sLleY4!sP(wIY19>$KQhlL#yOEl}omr~gwj(RbZ zWXH0rg&md1sAfkWOkz{mQN)bu#FFgLF(uitfz_?qp}o*t^^B08S`5QrLTk7g70Wj* ze$T@fO%k%%Du)B2buWhl>p|y;XzSs=`shHYeb!Th5eu3$lj^yWiz+<~Vi|?eN}MB& zbk2znz>2D`<5nkbtWjyh#=H#7#&wdYzk9Fh@8N7lm{Qh?DbZ=CW3%Yut!C3{V30JG z8QZBK9$A}jXN*f_5=FsfnW~d7R_IcZ-ev=Fy;a0!aTX%-N80yFWMHl|dYxh9z(5Yv zV)B9Y!c=|@Q%E;ntB#$x`=#_3Q@OxNg%Kmprx0FA4_fx}T#i%ZlGUhLCQZohfjzql z^>!6bTcj@*efY9gD8c*6-Y}vcO5>Gq=z^HX@{RRrqfl}r-_?0^H_pJndex7mlU_>e z_Mzi}&tvdGlwG14XFZqJ44*^-i{m}*a1}yvhk)3-h>%^(jT9EH~ z3mZW=uwh3v$e4GmOhtAY#yp;n!|gaDa-0+>@5w9sOEuz7y{rpQb6dY+>nE_V?hJzO0cT-sGU|2vn{gSQ(I1XSz8n1TwWGh2U1L%nCigAB6uFn^qgl0^QsrJ8 zIf95t>MV5a1|GRWx`FcVxQuv)j3`1zG$T$LD{W7rO7x04;$%0lhMbjdAVM!K_hf;V zd%o$m2!@fM>}4bHa?4Kaq_CMgVmKQf4x@B?MEyK|ssYq^vuOh|CHVoixVl%%M&A3A zWmTB7?Er+tUvt0?m8a%)C8Bm2uj=HB_12GhjWiqTb=E)Pr@-J!DmR50+sS!Hf*_7z zq{8?ii+2A`3FtYO!`3?aVggTdAV30G00h*2M;yt5h7M!lgUA#vTP6&+PwjH|&zx-f z6z*(U@6Qms0G`$X>nGE2JaLZ<;((co7~Dex*f5P>H=7;J_D4RLpR-MchWc@beBF8} z0H*WAIm7ntzS$4QPDHw5HJ%rmiKbM9p(ZQZ`V`{?{$F41P z|0K!rL#MbcHQ2eO-tLv!m#~SJs$)vF)c(kdGhoq6Nj|MQ-J%kU)J*I<@KE2`QZO2> zU|Xue_L8YytWclhE>RPIabkcP@)cH>ig}H(koZD^S5nqyL}?g}%_2@7p;M<02USy9?)ftIGK09Qp+(r#u~D!2=U~PMhQ;2*MAt{uaB!L1c4pmfiipv$ z012ukTpNN-XCdPrWE`1(?gYV{36kn>mR1ym z`dG5DRb^dYRAF6@l|8O}`lWD6&p zEtP_3ht_Zjf_M=a(4wTM0%D2%?hBON3yUI6`M-e|PNhHusH^+YW#bJDD!|_c;9-`J zfu%zmWX%IY`}oH-bin3M7=COK4vAsSCQ&Tp9h+5Zz1h^4F`gL4U*u|RQODX!s0Cu= z9}Kz)%9nP4vjBD!QBk(_S&uZb0G4RgLNyDt+#z7Jv)91D`f5o`rW!cUG3sN8*x|(7 zUMs8c6}tc=UHPE{sE9Dbs^bq>z{Y_Uk8t7b%`O*gUXo%ooCX?I_jhnXGeG8V4b3pU zLtpRkVFyU<{(sbbSi9Hd!{?EeI+BIE5LKo6TI;WI&_rnw#;-CQoSmb2uOM$Do@cy&<@Wl1_eMxKL0CzqIvIa6~`0k7|pu8jg)ya`D10hK@ux(g7$m- z9dUe7hr3xQvzCiv-q}Ku*Qmoa2}#x}?KcH}Kr47`D0z|hfTWl88<4bSU4_2{CID_h zl{j3AzgU#Q>uJ1Uw$1d@5kYI#V{ll^77BcByh6b~X}eEGh`s<-1@z)I>q9IO9aVua z<4FMg%W2{Bqu^$@W$UA)XDDR)Bmp3O8vuYmglz>odpJ8>#?Xmf+UsG?ff+~xmW%}S zYePl8dA!szgV?{jNXCWUDl!zGSh(NTOV{Xl&@_f$sH;WZlCr4Vwgsn0umJDJ~;^gxDiHz-a-ne{}LpXtb!q}PMcD8i``4vwt| zvx}dT^bZrm*E#y9RR5UxG5SU-@Ph%xtHa<8_Ax9S-kb>VhJ8F{6>rs6gt6gmq7{+O z6Ng+nYPelxMb6W{Q>}=k1IOuzXEaKmMSyt1>^iM`})~E;Je`S}xfwU1p&_u^h*+ag%*rh)L8YIj9{M+o(@6^f4 zu$E$%&Q9cL?9$6R1(%VAZ0y#W-q5+`bhlf(^p8hLj_LnxIc@_P3eWMld%N`CYXVNG zG@1Y>)o#Vnnx3^bPZQ0O%n)**yNbV>L@KYxh0dwpug~g<@1f^6aU3}BZ2rJ5y)dbN zz}-;Vr_X|YdX9a91W(wfKR>~V<~E7us{f{adPW09JAt?IAK0h2)E^;+rC`xf*~s73 zZ46o>OK9r_ytbsi4f=ps9{zM5pW%;*L|qor)b{A?@sc8(4F7#>RmZCEr*nAf!|_f% z-1s(pPo#-mHP)?f7!AKb8&F@A&KPMdT*TLJocWa;MFmvFaT(x$jv0xU}o>XKeI4K+MU!gGm(&+;H^SBH|DzARLBRau8C86s3`b&1Ai{wA34z2j6QO=5 zp`cZ8^)U7?ose?wfgf`5=rJtMoo*I=I$q5kIU#kCb*|L(wL;G;)b)OmrswJp@jt{L z446dv8K&vS3Vppx|L&QRZy|JGgdF-WDG<_xR)Z^U*7Wc6WBwPq z^!1uv2(8DTVmnex*rQvI%MOT>SX2l8odkZs4Ln{4mUWpPFs;XB35)eGkad=&c;KsD zB0mzcj!P`#UxHY^4oB8;i8(?gW0tSOk#$_+{7%I3jH3kX`(8(n(dW?Kn;>_6sHM=lbo1o5U7myBPc?Gs(iogNt^@SlS=p|;tH4SHb zc)bO$?9pz;FFUka{AO}DWF|g>_{f5K0{gxY-h1HpHvGaItnl^#ux4SGx}j2ifurM- z{VgA5or=!Ny zhdhov6?=xJT%rK*h;ur&1W&@#w_}UZa4Yr=d>U#5_^kq*fM!MfR(VHs#BY^%X2y(s z)61AY8iBAlJ39kggEbpq(*re$G??bE>uARvaG+a?^Z)p5`rUgX-fz(F2ZrJO8vWjW z7T&+F-@{|@K2E=%JPGd?==bKU@qU(m_sqdNvdH+kf6pxPJ-iz4$Rgi8SYQDImfJm< z_^eQ$z?4bl4)fu#UTx!Cdz)=WcBMH}Zf<^XeFLMo`X`;=U&?RrVi-mm4Nv34SQ8kQ ziDCGhj!nT6@btExEkxY02jG`9#*f{d`dJXey&Os3{P>LukyvUl0xI9I91R??e?GOu zJgm+OBhPba?j0)E=lHRfFSFI!7W>4Etx*zFN_8j60K!2k_? zlvgzD}!@O;-J}_pdlKP-U%?9*sGv}08n0HZFpCUSSbLmc@|1`aCEV3 zpydLvo8KhSY`EiK35mdQD5*?pD;SXw#Jj#3`1knjikQ(G!Qwwmr5^84f3F+rTvCrn zr5@r?_w9xnQs;^H&}bhCR2^y?;bIUL&@9_#)E@*<Y?#Xksg{pZyuT@nm!CuOw`O3TrohkBDDEw|))uLjunw5`f5Rj334u zpWZ6q8-*ZCKsgAgi~8cCZ`|E1 z3f{(%Q8tcwybH?4$#Ce5vQZ!|K-q|9HMnsfHQvTMcVcxacpIf$Mbo-T@HTjf^}W;4 zg8^y71>F$L3^39~+^{#MU}wOF0)yM(&>4#n2XtCt^k+Xf(?wV?>bZk2&>2tTC3X*b zUK3VO?5?wohHL35@EMoktsD4^QP@z254Z=-?v~wv&v@CcjAtj{GpH&-17k6$9^v9$ zbcWA(ITb$R_y;t&1g2Ocr27`63|z>dfj2rKWxSk#r1%+TPE1BZ-G}_BR`qr&HpX1$ zG5Y7F;^kmtoR*4>@tVfQSp2Qv7%%*5aEz-k*f1whqQKSC%#T_2)@%iJSpZlFL`DiA z$VRa4+hH+MDs9(~-AZ#XDc`-4{Sz9NNjL~3~3zBgTulx8fLu6DQ z2_mDi6GX;ykP1R%T!_7kg;TJ10l*1YUm}S&(O2&$b-~M!7Lvfr*v6*+-^a_427DyE zjJ3$UbT9uIUWOFl|A3cKAb1ngtP$P7WxPvv5Z1yeK(}xi{~NO*hh5+@#!Pw_H-_2U%0jF&@4g_prx{yTUXQfcTP{~f%HS8vAjpgX(_ zZj&SoEGJ_PfwRwLs0A2U?ls+sM3@pj9AF)Lv4Zxg4+J`+mCzYfGf08X*ojXEI)itu zEJZ}zSb2!mDzB!!EOc@qp+LZifv~s8%vx` z=5w4q=5w7b=Hd9|`f>z*xx73Nzg%6OkKb%lZO7|(iA+*b+45nwS%)+1j%>5#-7H_m z@43FTUjTH6899^_x~M$b|2q!q1dc}SPcc3@2nSyZKb+z~WuL_X774k+Q^Q#|32(_Y zJ#**0UCn3r?XRh-jvVM6x{as|x1dm5+>2?R-gWX>OPLEKD;{coJHH%Aj*5x@8jj

=l>5M#77dV$?7ie27voILh$S1$-m78Q9UrlT{PVXnz2gEMoHZ z0oyHkLk~6xl)-`9_=F{n4jBK*A%ZJ3<2IiE7vVNM$1wWCKo~fVuvVV0`xaMmaY%)65pdWx z+2HzMspR6vMh)he4FtIMMVJSn|kxV3HXZ5LA#$>V-2MuF>HpMYI zVA4m@;Jwl!Q!Wz(n#dMErl_t2#r{J35bizzAM7yChv~_kknTL^(X-$Pp4Y<@up{B_ zB_d;UWaoiI7D_?uAdqyD?pOgmI-$}q;NC<)4-?tKjv)30w4+S`EI1uQ>^*#I1r+)S z@<{9}yiHp?*huqi=#%F8JD$CGGV#ra?nm?d5Oj}r^Ay7E0z7`_xdy-PeLG zWc+fY^%VSa94y2y$H7za%W?2K_~j-mEQ+uWgW4}!bW1FI|Bkwy91B}^W)-)bMh6!3aR8{uxwX(Z~FqwHhggW}|5GG!MbHE%!A8BPRC{3^` z%$(J{S*3(Y)nJl(C7@zBu=d-hzK;gEuYoh#aHtP5HW6>8)xhqmQZ>wCzk%MN{u#yr zybc?`t_D<@820vn=4ylu-$xt zXdzWK2cf!SEVL0F_WS%qgy1xZYkPEcdUBD(4{`D+xB1EegZm>WrecT@lOx$zzKUV zo)CnVq9yn%RS#byu7JhDy{IBuo*qyy!%R)RlF$WnkVio4g&KP*{D`sOLc~l65T{1lgX#`fUPVf%#| zujFLjr#%#Zj^JO8K0Y=Ye~#e)eT>GjD*Wl>4?Ge*VJ6z`4j#l0WvB~e6rp@4QIj_b7rb9Tk9H8^E{vkSbx|7LZ3AQup~3QfFJ?D-5WsYBbKb+ zz7-aO9PnlhK|>Mcn>xXmm?uHy#GG2~0qgNbY5n_xg94>LE(-QlR*_2m zx>ZFk!JAdF0~3Uih|fOrJECV<|Gw17=-=E=CDPFk;-|8#BX|<a? zb1LbB0l-y&AheU`|0vLKUIS--)(6>#GXCYW%qA*s3J8RN2>i}~HURq{>cl4iDQ4xz z?!tG+c$@>j1p5N};hsH#AX3(&wq|nF zK?QO`SD!#m=;|}QiRv@)Ce>$Fqh}deCT%`Az{#NHXRJ=H-2#BG8@<6adt8n%7G3BF zD87*?+LYqQgc5VLw+;#P>e6TZY}IFxfneOv}XWjHS&a~xQS zs#mi$tOUA(yr)hPO_EJ}```raPtt-lti+Fc=fJ3>1Ln%=C3^ze4lpLn0obkC7y41@ zv!V`gtrB%t;wjIp%%Ht4n+DdkE)&_x1@QqW4^!bNEyt--fPPbe%0xCpXC$jynww=# zjt`cI5ginE88W^M7!K@*SOo!VtQQ^1)L^~~;*bpt2MEfDZ-a0^#W5ya9mVt3Anpm< z7rf9PnG0JEpPEEdoYAF|3PK~nmv{#&p4s#+m}C#hmD+p=u}Gtz z*GCGjwSuwc!XCy}h8|U++Kq)Z*lev-ZM;_*ZnL;s?M=Z;0x$$O?Ms-OSphYvhbz|V zW{*{w^TcorsluCh5i7w17#R3=NV+~X5f`%Kk6%oSz7(+G!s*8H@tg$Cz%M6(H{h3( zz#CEB(-w;->`_X62=~sdo{ASUvM~qn zEA=>s!2%QeTA2gYUY}~;_K_KRH?0oyxDJ}y8}-Z^<}8)b*#k4NMPkgq8PQ{{^+7w< zS_|eipX03lBZq(kyrCyLwC^B9(R`6@EeB~Gof8bXye4z!+!jBgH+Jc1WH|{x1 z^#24pHX!@Mp3+ztP8!Q)IA90kuR$ky zw2G1wzP%W=i0Ww7I(;gEb;A|H#KMWFifa40W6_$4!`JW*)}_f-S`iJNkD2YeP;A0f z&Zn*qp@G-DB~*~Gd+O$N_ak;SN1xK;!D0ail1Uor=~k{7S_VPZDQkKSvRB{b4Q zIIVsT6a>-1q92UCg4J`PPhOtZ)1zS`{)pb5eWDA_(g`(#Ng9jRpnq~4aws$VN5<2K1D(Ht)tiDOVJsTR9LN~l(H1$-$C#hR0Vq0P z-aig?_#aw>EO;PpdtGr;in&U{a+GaR0N~gd6fdv-2SfQVmqav8#dVB%P<9#B|4CHZ>t%jwvkyT$6xDL$rjfMZ6~0?y$7_Fuc@(lLIlF1oVxvtAr;KOEhbbmC6%w?8=j2IMrWvdokav(F<>FkF}SVFdreJd$j!emw+FS@9c84rf$u+gv$ zeVuGwrod%RNDD+C7Mu+G^$Z6kBRD8AL@xOfR;nkVHOA(%d!JY% zd!fw0VcmPB+&lSoD?ZpNPmU`q)# zn83{#-6^Xpwd83Y)X5hs?_N4X@&q?SA%037#$GptuDBU~q~hXc{QXcWFSKk*c>?Mw zesNh`UxEaHlm*<3&jae?%E}4Sz#J>5Q0BS@y;3-v-ppjWUCgQN-Qn2m%x$$hq8z zx?RjOch+#*1l~Hq6LBevXXltd?V787y@$xEycTg1akIp=;D_)(m~Z|` zX6HD}PLaXuzLs{!$dWQBUnw%UlKZWYK`l+a@umBE`!zk?x=SbW5E5ZsMyvD9rhbW9 zN$ZqEf#gdUQQa$F&}XQ>43R?5nXM8g`+%3&wbxz-^K!vhOEkCGA}l5-Vw5a26d878 z{}#~byn1M)&l(GWw@ty5{gFGcgK-=%7*QSlOU;6i0mEl5nFH1jihR}&u(N?X6wu$I zmN?WPlu`dFSn0@yvFO(z*4PWO2>4InDBgRK-D?UQ#m9_O;3!}gi^TNBv<=Nr@JvCY zSU5e?Sye@$Cc#z#Jc?4mqc9defhaJF`l1*2rO*Ejg(7whVgm;}{2>S4N#(#V!Iy40 z;LHZT1%P7D3vRg`0E+#L>1Y5bmi)*q`h7TK&_(~eR3Ipfg-;_EL7+gEj{<*Uyr1(? zu&5LMMC?Y^b^?83DGHo|K4CNjB&$b(Kw(dFv${L3vkDA~Qo*1w781w=Fchvno)qLi zfuj&be&m)i>Cx6PP6M5r9Mso*iax9g1hHolrJ1^v0UD@5tLi>X;%PuGv8xTkBo0fu z%~gZcJ~mOBA*rQdG~EDdOoubn0lpnjgJEa4CVJq($R!Ri`z0K*nQfecUWe_u8 zcM#EhRuWF7miXmVstCpBsgztdg#DS50oPQ5hreU+1e|9!*3*3G=f3{|@8hBG#>aJY z-|sy+&GXhNN%zkR(>xO}MRDl{!{~(vQS4Ln`PQxP;e6_5{ONQ)Mf?txHOAK;8v4YE zOtZ4i!3Q8S&K-+wYTT210Ohp57?08bkDK$xXx@VwO``}D*zUiAKhdloYRBW`EAP5> zq|BN_3=k`Cu25!WYrkdn;&_V=cc;LF*wcO10G1sl-$`3< zRy>Mwg~Y!-=tn^=llb47JIZ)+b5*n)@o$c_WK>4lzpg4?i>vOK1Tve30+`Xv99@FJ z2y`L8tf2$Crs3FEsC&cYI?zwRF>Fxf_3tg?c~wh3#&c8+{D8W)7!vXyPADS04%KPZswJ9Ri7RwlcJ_`mUyji>qq9YX_tF$Q z&y~}0Drvt_iMB145NBgm>!&3|eIY^iMT4<9pmtSQr2%Dnc|G8=Oys>veL{`Kj6J5> zZ|?s>*_=iH1RgjaRExNV#tt9uhPe2vLpYKRUVsxfuTO1IjSLJGpvq`}oEQqBT?`uM zU2Vr=%rxr;d z^-qFOp9sYq!F&PW$F#-RuJw1UeWe|{mA!Z1uDZ}i>On74DBc!4)`{FXMm(uSNBJ-hWbvhSoaKSY2$zYMf%LE8>2QPc&TZtmlW26&*9n0Aq`q8&> zC-2KdP=`CeJS5y{Sb~Wc47$G5nh zp!d>AuGR0#Mg*~6U{5El;Uuh%oz^guakJ7bsa&p{Un>%27}L7a+*@#|A}C)+?XqHu_%Qd8T2ccredM?m9K3sc&_(3CdNO$+#0N(+#DI5l)4 za)YMbzy*Yps7{Yb&qRCDwcfTulgSaTE=cs!4xUrm|5&5F`Y;9tN;HZ`-v9&I8vN0P zoW|O_zQ#EYcjOy;W0a`?GFxvmIx)-B@@2X&W0ylE_+R$zeL6ZaT3ZgJn;GlPvW>M> zoul?MYPC@IvX}zu#P0u1!cEKOv-=YcfE=zs;y(3pY%y9DlkR0keWN`{fjHf*N*LsF zfXg&b#w)(!_Wf_#U;i~5whZqZ5sbw=zjD$gpgg+(v-oSfG9{%Q1Y!NBdc}SfV(-g% zr|h3bv>nlPs^h>iRRT+5dwDTGpq7BftUgcINpS|idn^Z{Ic>c(vG*ou{G;dd~g;5_c7Z2 zE^!}#4~PTZ&)4oh!f|D57SlWq?yXtZ;!R{On)UZvCE}Y&$f=3f(Z63=4aE-o1om~( zSp~6_bvmmOQTfRFZ3Yg#Rjg9Q{AwmngQ3#;sUM0}!*)}_VCYyzjQhUv6DZpe9N^#s znx#J-9GqRHj)P+e^m$Vd4OR0OBUb9^cqR5q+(JbimpQQFHKUi0G@ID|dF?`hz3D?P z&39ls!KnW^*Qpl%d!ZXLE8m(mxYav?t%6!WentghEAU|&y%ZlYnw6U!W1-Bj#s2O4 zoOQ=&O(HEj>zl{G_~?LvNV0S!;N&CC1%RL|TRZy`vk40(PmFp1k%JwuYSQ2J(&?Pp z#BenS{VltJZaMMn{6NihXXkKUat1r2nOKtAlYHP~jqmKi0sO&!WdF0_l{wQML-*)S zg)`$&$2$X#d2P_v4JbesydEfS;dwPo+H*$YjCl?c!%1LAOXSP!TVognqQ1g|{^(^m z=Y|F+|DdOX4TcZOS|bQ}EBK;bdO)WSC+haSuR?qvH4|9!8zD{2u~_MI-~J0T_DTPe$Uxz;<`p^2iRs(@mSyJieFGD%?m>MOc{7nx4s(n zrWZI@IzuF>Ou`w_|pIVV9!7 z4`YkTuP!Y@p>b{TbgB9Ie5}y%l-q7<&!^t97w}gv@)g zgX(Ho_Mch7KaiAl1y6I*x`=6U;Tk(uLTs@|(M1qa^WlQ^B9vDUeFD!-WnGC#)j{?l z%sTBz2wT@2k^=94 z&W+%2Qs`Igki@aYzFM;D=0L9%IwAB`;U4Yi1V7d|+%iVDG$B8b(T1O#i=w_90~=^q z4DH3bZ|<26zEycXZW6o5^0giCtMVM+l(QYmH{X%7D&YL?0F1{R7U-N>+X^Gph#A#f8r}2U*O+2qYs3E)_KP9ctczV&M=2b34an@y}cr>;i8OPVm=AEU=8ZeGDYJ$6pS?zG6Xm zgpc?oZ5=yXan{MT@4D7>%7VOLwxnMQ+!y@Pr5K^I@#Nzfg6CxCq5F}ZbKu8^{;3nB z&izA4K%p3)$bFrru?C~zn#pOtXyu2~PHFM0FQ>J0jT)h93^zPZKm2B zu*BI^`4R^s*woQ>3bp{?>Fd4Yl@C@HpqZG%)*`+}Nj&^jwh?&{j?s%coIt*^9Y#Yl zoSgiP%D5HNq(zdsA!=RZoou4Gq=hB?H}Q*+AqbXEc~u6&F-v}AX{%&O0-CCCB1>(F zEOpLNU!9|lb!BfG^TLSd(7O2S@K=Dy`7=J6pvmW11(Xs`@s?M<41bV`dns|j#cjvJ zLIXLzy`Qi64Ie^A?ga^EYH!88;jeOP^H)-MhOIN!w3*xAF}Hu^ufe7ABuS44GWPn? z_W<)KjBk(ESpE{iZNPT(G_zy9+1O`VMcHm+-Xzp8nj@6K9@H&$d+@tx*JmG);pnM9 zas17dp$OBk7@G9(xBS+_B#rkCor+r#-pQ%G$Ba%%i$6L1EnK41TD%vd!K~m|_6gHt zD|lLzj2c#^d9Uu5s4wdr^+HD7?6>AKY8lv})zwTWF*F^tQg&-2DLqpIP%0}(wCkiq z|Gy*;_p#sIsyRm5oC=b6tbLb)uZE$ks zA+w7-7`UO+m4~mp$O8{T{~Pk45YM4?v3mT3zv^p5xF;Z3@2j9QDnRe5|S~^%!p6(Wh4ZnDmr4Ev0}qC z)2P6oj`h<_tA`ei3%eJM{$EJ@ec)|08CkzZ>$qOs?2(Rku;(P;Wy zqQ0PW)U}NI|0EhBB;lq9*nRmG&MfPi@fv`7V*@#_?%9F%T%j5l!xeY=%{gaZcpuIh z3b1)(EDzrg*LV)!>hTuMt+RyQRAJJWwap$IA3pbc-x37ZniaQo2{fmVHIJ#98^g?2 zTKJw<@s;MxEtz3-y!ZYLUdV7j{aj~w6LPT`s^WDk;1S+=A`SE=n;mVzQT$WFKfIqB z%bBd3Kf`3daT$s?W79WdGdy)I>wfbck0mZG2lI{PE%7r}vcrv^+PpKPqJBG!g7`VC z1&xNjeeeg%=D^{$lMnplk$V<8O&DQgYYyxb<8q9`8(>w zxjoPDnvL2q+(b9e?EKU3u~F7!iPO4#>psmbe?Vd7Am#U~ZO82mcn)50uRJli~7UJ!yz@yw$?J{*?hoZ)ShcQf3WQt2%3FNE;k zmG}v$o+#y7Gu(b6rY^Z1n}d_^T-dQWGyq#C7we2Qqh|80x}XHB`xSqll&_WpJ+w0_ zcGgIB?@jQ^SQ|OuoqO3zFS1m;HaWG!N?cb3|{gn2^h(!T4ce2eyNHZf0PZOSHm z8~4#{WOU}$=}fws<}{!L~@q6=!OqDm1U&M4tKqd^`wmCv`HD9 z0%TfKo@uIs0kvIBOzxB^$yHqG@K|!Ju_BO`R@y6giYm`fE6*{kD?otzhNh+)4Hx0H zwVV?rPplm8*rpBRJx~M8IZS)32s{o=o-5k+S3q_RV^hr<6tv+R?(w^UdYgeXlD z#R#Z~D6472(6Px^))Ks;qIh>O&n(^mbgr*Wt2`f_b!#~nQ`pe-rd3!sXE~1$~HP+;2o7RNf_!z8wa?|8>IOw&<#&Xz4(6=A}6(7H8JYU|+ z>_|tnxyEv5#+eglE9Vpq^R$}^y*SRgmfLCORakzYmbvU0>`c-Eg*hpQmk_q_QQEY0F5%`Plh&q1x zq3p1dF2#60az5NUgw~1>^TAmkCo=_v!R5_Xgz3QwDq265iJ&^jX=@1+G56IMvX9U4 z*E~zI0QPJlhS70pmC^faNuIKPNA>~((H;(9)2K4~#7`y5SflybP|n7_Y6+T_n^7QL z<13(^Z3fTK;p7gis@XGM75ceY0u)7swX4xBqJmUiN^xx<)h8IF3J3}+T9?J+ zA|!}z!IY#l*{6XjsJNcc^;P!8UGW6vAf!dx0ty9BsJvR0WuF)iRaXwKlJEDMd7c~q zUElxrUH|3Fbxr1(nR{mLx#x7x%suzC^CDH!BfA+wl%+d&9Kda7yqB~8tN7`aS}yht zkcPVBfIA!ey(#c6#usq7rvz;?w!x)4U4wQkw|XZdLyxi{szxqwbm7XV$a|#bs?W@O zq-LxC@w{DZ`sCg#T-=m^e4}enbG#A=sWR!!Ut%jqV3n3m8dC9>(bH^$@mF*lF!>X} zoy{NTIH4{WZAMf%+;+I_%kir4YPNV~m6i(uoAR%ehNt27uM<5FO5SB)AP0fN+m$*C zxVvQi;*Ly4<=g-l1pHVzW=*q>piU!SsPXBA@Y0- zs7Q*vE74vi+PV^422xZGI_T|PIj99HUNCGV!lE-#cQ88@e+dEX3NL2=f-VNO|70d& zwAI)}lsZ38pLXI8mvjU{UKLduO{-GTPBYpHiaiZckf7*BsNmcb)|VqBSzx8^6=0Jr zblobre!ObDSN*@LmexQ8%4AKe9XWQyHe%uTGs^d)@$W|b^uii|sWM-4`0*X&TmH!Q z2OTlWD(6r#2gidYP=ajL;$y!2@by-!=X+R5k-|waFsmC1$gDcgQJ!sHgTjzUs6z1m zUCjrM8#tdF8iPwAT4EIen)t`X&9Tj4@yXyJR*|MA{xjxq;ge!sYu7SwKX6$?jzVx( zil;qxC+8^v8_@lyfeG->?UraSBpZ;3t|9!O_8kXfm%}Mp0I?q@UT45~cojC+PEfTq zWc!_mwqosNI@9URbB5+`q&FB( zVOu4XCM;3fRK%AM5$`}F;w48$9GD)_si@7#cmWn;c=H`6F=`;{N5BjcL(D<8FrGRW zXstl%=Zn-QBvY>pMt!IJEZiPP?DItIYcpd1G8y~F5ghdZA{UFuH;Twy!7(0fHh_Rw zgGEL~09Pj9W*rS~pnwakBeZpHH(9{qxH;Q`^cNz5%V@jG7JZK?(>DT-g!hkj+V<7U zrDQkM#}ed<)j>#P@6_hsKy1SE8)3PIb@%qF4E>Rd!8mSrZ_zz?cMS=ihlHm({hQ7U zY-GAnjl?UyN@eIzT#Yze=ks7T-@on+pl0!%FSD})HN(f@^sgmIU!>{ltv`j=^CTxQ zg!|*yZqk<^p9~*^BQ@l|0&7Y}A!P`F`FhA>AVizI35w+vf%7<3{wzy9FK zg_gAa`~YL3G2;M1#Vurw&dMP6SQ|OnK;X`Cp|T2xHnzp^z4HV>c7qrmAZ5f*!--Ro zcDx$`Nj`B{1iBGnnT(L{y*w3x>Hj$eo(!;z3l3cvnfX#^I+-pwg0Ix-a6u33$JaHYO)#Nz^3k?b zbR{)=K^K~!8m{y!!J5;t`q&`bD`e*Gw-5-+*t6B@1^I}t;yN4ZJ!_)1Zjmy@TaIjm9U?|V=gEm+8y-#R0yy2j$!oDzUH;v zsmj0?9mQ}f1J^t3uwBZ)paYWu06z8rV2-Qoel}ob;g5#;nA=;L$v|5fNaSzAcD0HO^KkT#4(?ogoH2NKCja3mZu7#kY{M4VqT zPJamvg)GpIs{j;F**|ABaviO$-)m=A)biBwHeZoic6Yw7C(Ae;;w(>n+Q)*oK(Uyd zF1lU_4aC23I_jghuaDC|H@mmDK&$t{ZLJrx2+@bYQ>dOWuCNH=aprVa*w6K|{0@o5 z4$!K!V4UkcBH`^h;*hudq4wvkq5A6(lR;Jl^*e;kq@AJqsqpiZ0Vi=#ptw5rE#SCl z^A=&>m4SdNUyu*%oXVIE#?HnbkHjJ)%YDIf=it!IFF>$q**+rA`->3;-V^DOm1w`9 z8RV|XyI>2fc{!Cs_r(>F?@B9%k*-R`)x{BL0+KK?hK7PMH}2_&E2W<7r|dw$#H=>} zjG{ES`hmxcXJZ^Q@3|h@99nce@HU{8U?CgVu%M$CAeA6j{i>#@cttt*4Zg9yR#q($ zf!M~m7RHmHAmCNo0m{0DNkY^aeEbpzZ?N!=$YX#)j3UM$AKzN*LeAFMLVP3H zj`%1fu@gxQt0zkFLO6E_C-L{)B(j!?iCv^Z>>^Dt5{Y}T@5JoY8+VcjYWDpkLTfG8 z4LIvW&F}NSjc^E+n^8{KH{XI5XY<-kpFFw8Q><#;SmZhdY)xfwpL`pebYM3@h;KMA zgH1;RQ?+*}U2xH7-PyYmd-_-?Wh4Y+BZWi$jy@M25c>z#M~oRe8^ldgdI20J(SZD0 zKyJ*9QCWivh&<>NBxOOfDWqAKpc!XKS)f+GpkH7kTRg51i&DzXxMJeRYyAd(PsIg( z*Gl~A<^!HP8Z%-Gj!5$ef?@l3pI;KHz{pbMWagW9^ejtdmY;n>lKA?F?BXZ3)(ZS% zd?Es**|wL$0EKzLOHfD?y*FID8--+y>1HdQA|t|6kVaXxh`mj{aWmwynjVJO5FX+$Vr08K5Hxu;QSSa&_KxQ7ay0pzj7++bDREnCx?A%TWpGu6;Kwlh zH3vHHc82{)0J8$7ApHhM5z;rPJ*Zju^r6qQ%?}1X&dY9TK9G$K@nl>9&=Ua3Tq;hJ zuy+#{n{WOD$UNRV8Lpn@42S3^@N5+`PJyyo%p1#XN-&6mgPh*{<;6;nTDc53_Cp{h z+qrD@;xN`|^ZO7FO*!A&&A*ln-r_4mcNgon@O;6|kQSKjEGG5w{k@3>z6*purm{FE z%EK~}{R(+Z%*cR);7%kQw>1P6 zTIaj)DdF4vD!xZyEBz$MEei92As#Xijzg{r@2`_YF-uZVd+DbRe*qXozWxW;XV`4v@ zr4Z>V4Zj6SVG%uc6+V-wE&>*UNZ=QHgzCe{)1d!av8q+-P69ZpmLaHkhcZI(@puv^ z^O9?g_oa8&h%O)Y<1uO}1I2VGCq=Ps0*v0@-3QvNDuC2I_yQGxvj79*5!noVO0reP zHsBMBW+Urma2Z)cSZQCgBC<&4ys!Dk^F(IIMbJE%k*8UH$~FaIs=h8D1Dt+%zmFw0 z3YnSfCT|)^f=7}hU*g3Ov+N`S%8uh^r&Sy-3n~J65j`^CPsl>Tb}Dt-?II%J4dB?z z!l$0VBRZA9({P$(0Df09avj!2NFtibB32KdpNaAW5m{h!6qE-Z4ds8lmxgkG5uZhL zO5j*`_?S2Bk05hf(F0DFZq3fvz@Dnwbv65{{}zZJfLCQhu@xdjF*7TbtO#;_B6 z0pDiPE;DQ6csbS-d-Fr}OF*i4Zb;;)iRoQ*;F(A`T;Iq#iwrmo4(G5jSQ1P_a-l`s z;E7GfXA18N;NnPj)rZ(g9+H;nB<%F`2tCF_WKos8w%W%P+Q^-s)_Sq=b67|D8h8FB zf_A0u?^G|fQEdJod7nf7OD8he4&PMX%^5J>-Fh97SOH(NSM`n*ILSV$YE+svt)jZTx%z&;>52&x zCSZZ?^nar4j~Ogc#CG|hc1RM8#A7959VUsH?=41No0>aw(S|rp8Dy728?hQB?AGRU zy5kWELF4C}F;D)9h`98T9ubfvAlYSXwnr{__nt!ucXm_@)|0I?SxMtG;V{oZ?M^92 zk%`(z1<9IJ>K6Xnf%bWT8>1b&=>Ne$`%{BnvSsFAw?9_L!_x}T! z`MC9?f4v)DbMR$0$>Ca7L&@4j`Ifdz=3`;Kx5Y-SECq8-J;C;_#-ertUsRua3IH! zBkE%YJdZN*(OawMzd7-J{FXWKEyb5H@ezO%Uk4`puvk;XUd3mMK2O7CWSu$j4HSu| zO?+12k(uXh$vho0Ph%Q1vgI_$PdN?RVxy5+k}PKtk0jH?_~H5*0E67`yeY}O@C3j} zo?QgRx}_5Exy|N*ap6VAlgyksqi@5u9SX*fBWTKO;uXg16d#zP#)GLy89V?Zq>*Bv zz(y1QCi$x+&cOZzd>Q0tJd*!1q#IsDSL`BuCTTDb4tHR!;GmV@NpP8k0^<`6*Uv!= zQ7%n zdxsv=kO;>31~YY}%e80_n^3*6!b;I2jOZAu2uN1;F5$#hU(1904`Rzo=om#f(_?ru zS~~C+dI;~hTXM^_9;ejJF8ksn=gS1HQQwL^UP4zYU^ zADWQvGbBh>{Fm~>7VjrN^5cs9u*Y+EJk7XiY~fFhR_XIj`k;ynWXZKj{-Ju(Cw3PY zag&ZBn48B+FeY|)TFTqKy|8Jl)V&KgYO!tyY{8_wzC*B`3t*Y6 zv1F-=V`~9slm{c%;}Z5NSW4X^2=afN9eRL*c(FwpfO90^IRemY0yYtFS_a@)379Vc zFEIhv5by%H1crko%$|uod6N)ZjI@;*8~|9{URdlSw?Bp2VWGBm($0^{bdk;Ta;i`IWH-HTF=A z1Klf7=!NH-Urj8 zGxSI9eV}e%g*&!2J;vV-i&4!OZ((K37*<5Nmr<6cNBP5HQHC(e6Gjxyeb+L|Z_}fw zhei2e8yZ*eX6$Yn(XtV(gwf7UkJby0RAJghBpdvk{wKJWKNQ=KHk2&o|0JN_ zh972SvGR{?PKTDgtOY9tIXQ_fPGIo_;`!GI9s&d$&s6HjlZR`$yOlN?q>l_0F>iX> zSBhNCDd-ZoaJ&)R>AeQb=9oaN&^suB9fAS-UuWW_0$4JaBKbByxA#DsMC|y(!_xNu zV&4GD;5h8Dy(vdU>|HoSuX+nPAftt_%-x085f&2jN2~>(N$UL<9KoHwUYaoW1$UD;f3^!9R!$JXi8pG+OV~f8(Q#B1S+c* zN-LAS7pcYZwwl;SiJxSEr87GMB%Rq29-8L-INzyu5ktjS{)|btYzz zqXcHndRD9f5>KYDF?~LXy3d$CDejv=Fdy!fZr5LWL)_)xu!YUK?|xXNo1KYPH+7U_ z7m`=J=D5mNiL>5@3qHoNROwFt%OMa5!;L1UZH8g;XbIQ(>ATPeU!DYK-P2Q^1b=mx z9V^>`4UR5^<70`VQ+_<`=#U>zI->Z1Y73rCs*(G7AnS>2*yTb>I7{xk0x9rgz@x@T z;XU|J!x0`1tKs_^Wirn=R?3eT9n0hgUa!Fiqh2uChaWDhb4li?T+-c?6dkI z>x(JTqn+W_=Hi))AC%y4I7Oc9M-u3j8wEG%(SAKf``DM~f0~k_`;FmI39dl%!RqsA z9^4#uAX+a5OC`7%$@n+gQ4tp3EL2{DV*<*Fy;!`;gAe!w9al)7C600O<6(zIel$3& z_`n^(Dn4$@L#qlGKAB+$f4CDG4v)th?##Qj z-UZ8wA}nGNijnUU2lw0ewOGAA|Hcx5;4K2dzsk&mj%V;85ajd*l$SVG$d3lcBzzDr zTP9x0s`mtLMC&Sm2poZ15t2{GZ4_{$xE^=rt=^OU8^vz9?>J-<;ZlB#_KIk4;cR|do zo?8;x_1wxb>-CU-qnNO~IZo}pc#%`9Bj@YX9^tGMuIDk~zIswGUkR>5_Cs;CcFUN$ zJ>E+z@y1fV;H-9vvwG*gs9&kz1vli_G}$JKC1v$TcXYP|HgeXp z%>4!KA2Qt8M5n6dYnP2sBV&sbTlBUYyBp^ne-g z!fd-GKFUlenF!7tcM`Va$kZ59rpQFzVw6EE}4nY>Ba+CjK zyRV@3ARC+#{2c#WQT`ov69sy}L@BtR3S4pSn9Z}qtQ`6WKDv7?FN%Zyn}ICO8bysw ztGl0qC*JPFzRQa$%jeg}_yU0@ZP8yTKEa}tbdY3kIF-R2vvN`DjySG@4c;*uR}o5f zP+OEz(t>DhD3nkZg+eKVn`h@Elo8+LBhCfr5MX#X)c}Wm=oF=*A>fAcf*}kOhuzjh z)pWzdQ~el$m6EqdYX!UT>Xybp*-eYRPF$ZC(a?cZ%;9>j`7vF#iau}AH*W2YjmJZB=owS~ty1?t*c{X9{31~~ zD`{d@GBiden%#IBLC%oId}YjDklJC5HPj#hmr^1pEPR+#Scy5QmB>jFLFTksVoszb za%yF43TrWPF>EShq)?YfGlaY}DfdOCCX@q1Qb8fqr2=pgJXB~onF>2yl5F?ytd=53 zm0ba2y%BE{-ek3Gg?Z{`tL3Cytd?ak!*8`(Zo18CDTV5{UbkBUSX*S+PglUA?1hWt3 zEX0`%Lm@tK-(&*r#TWBlrk7WU-&Iz9UG^7>pDA_skzCcaJk!HIRES%{;aW1_{`L7B zA`kgSCIWP8;=eq=v&NbM6~k71hxp{Zw(2)->5gC?7ls9pS}iR9`hFq>?}ki|gl`Z$ zQs7`91R!K2Mf1$wj1^Zq6oUv!QEf5LEbDg8DZoPm_)0{}JACPZ(#}5R=$oY*L=Z;_l9W!kxg_?QCMUHF!`bX>&-->LRke}=3AlJ zkWgHJ>3iM=uPRbV_@-!!iJC{2+bBn(B`i=U{~^nly}7)oy=E|PBZULR-=HQ+CaFQc z@Cs%T@5U_kyO9ah(8D7UV0}^Z!I10#S2WoHZhn*r@0vn2yn>$L6@=0PH=vTNf$3yI zaS^Ek{QyFpSBr~gras4a_3N?c>(U;=GYjeWcW}pn)eX+*1lFFj{EeCcIM|gnD-oWX zCnVu(-bCPB%GAnHWs90wbENbJusSmL$(yFN1r7i^i&flfH^oeaygSt}82VG#Qqe^9 zqIQm7S}{gQG+YdJ1$y&bc!gKc3n9BIVZk3NNvzLf?5jYK@Y6KT;D-kZzp@n^I=$Cw z-t|*_nzLf<^_(^HwpKRv6lPUm#@7ySTGo49!7MX-Q}t`2XoP zQ%TKvCt$#R<1s3_5E-atD=5vR1m~l;%!^`9^Tr@Awm*$wDswwa)ohAdRsua3TE3Ah z?)g7NfYF-mWHnp@>I(4inRzBUOsu8}=-jhfpu=#W(<6yaCDCz7bVOurG36g9d5eq+ zuR=7yzke%lZeIdep&+S9!V5t3InvmGKSRQ=5b&3o@OvH=#T9_s;*vD@?^cQQ{~+Ke zn(!}5cmY_pf-Ob~1`P7B3C_C|jOH{xPw4bQ`zl;6QyeH#yv|JVdZY+qF{#nv zTTadw^s$$}z|;hNZbvj!7XeV-_$_92O+yO0L*gTvZe$%<(hWm_PNP~j*gF_|gRBk} zSNKHB(h5%#X&p~eA+5)dmUGPvrnCDI&>_&4uO_znHnFZb4bHnzjjZG1kM(^#30aI{ zeDsna%=IGj9J3e?F@f-4vvwK12CVR6OLnRXo|Z97M9jO*nAeGzD+Hjn*bnT@D!W6% zAGn!l)|v3@)!z9=X3zG+`MYY&o_@{NZM)O9$t3qQ&+ zBK#-^EH&~dskf2T6ZMy^g4IW_1ohB8a|H>f^6h9fvEA2+(Lm;%R3PQ#liFUbmcv!W z&;)cEy+5lvGP)cYRjjs_J<5PtCm8Ej*2^~ibZ{9mVCEMU*jPVRS+#+Ki?Zrb%8(P} zjZNJx6(Qjp5}rrqoWdkIBxUH567wg@AoVR1pV%1uC1v9?!&@LeAA1>pnc+}ff@PXi znWu)U?9j5+bQ2f-kZZqeI&L~lG6LIbgCHSh-V57m{mHL~lV98;V5l0tCxnl-S}J>x z;M^P#L0YDATwr33_tbWaakb4)&Wb<%YtYcYj^wiVz}BBEb0^eRy>&mfQ?$tyaw>6J z1B_(=dv_DU+tQu(J@-lae~ z`k1qVoC&T+`nh@KscvLr!{$-vOz6}E$dF3#CP8sb8u$*6a@PUnQCh>|szx4oY)yQ$ z23;O64?vM1tb#TDXyvRahUL~;q4gMrYVOQdaS!x2jMr$!gEH5fqdlSNCVsjTI(f<# zelm>WksmdGnyt0OdyC-yIBvmh9qo&FFQEW*f0wE)aj-Hp-M>!EXyOT9cyN~qTTQn( zCQ*@4l@dGyLl3r)0(;mr&(7(XZpWzC7oOU>sc6)A9@e9MN7capLV>9?krgSfTPN$I zEhs$UZ>dZ8`m_0O)qk~5DqwjN(KL;-y>>93rEMP>u?;MLb#@M38y)m|xIx5ZU&y3{vVfqhC@D*4u@V9s`GUib&a0}A#L}Xqbtrv)1;#{L+2y$!hw7DF`z!}%=F7Kyx zp(^Si$On#uambNWKy_G!Dr-&D&prTSl>FuGLdjKQhafkUTnRNjp6X7lidayO@@%KO z`Lpa;6b_-P{^lrVOKrsAW9#ea|0WTX8a^F&P2qUkjEy^cV0;r@>XZP^iX zMI7DnCgFkjCsz^o#JNwZ_|~HO`3Obt4!L%s7~<3`75) zW1a!r%SSPD;TM8=*f3ASHjN2S_mzvRmd_SiE%~q=FcpTO|Iab60&d$;%ryAb!8~l3 zb+Aoi!qd$;$Iy?@@%q-o$7||aRU^+h{CLlz$q!LU{l7miFm$e3UIxQJb>Veg5UYcJ zm`=3w(tS`RHVxyG2YOWC_Jk|D!V_Lp!@g+Px4a?*HBYz<4MlsHW-YPdLm2U5y!;&H zsGsxsU&(_A72j=Qt&SsnjQy*3A*JvgP#Jnhg&zK`Q~`WwFyk8Pz$bKwiL)QO+uu_G zB3*r=5#zN~fD78VsG(Vn+$VS%AY7~`u9hi32{;7WpfaT3x0rh(5yI#d&&XgW7Bs1h zUrS|t3)9E#D?Wh2TURTE{fvVeG(yEY_Dy=GMO_J7B zX-${b3~9}gmS0*SX*Eh~skD|!Yq_*mN~=j)QE9bHt3z75q}3@cU0PkzIv_0z8V|~V zw~lGqrPWVbye!D_No$C-hDobJTB@|Fq%}!eQ>8UsS~H|IM_PVqg{0L;D^mEc&mqYu zw%h_+aP6{wDZKTk{*FGR6(;_ht=)}>4>0`Sbsf3S`|ZY4TbNRc^?6Ikv!nX!SwCPD zecf=mbx`d6Gl~7h6&iM!vD8H8P_>B_&>xwPPp--?F400lCnHo{R(6rY>;=t`=<9G_ zToD$#Z$=Y_@`lLh6J3#!V6eu67l}O3g+%mku9A&?2D6gAEK-%lE~DpPFM}qef_V6V zhNj5Qp5XIN!5a@EUgQBr@DERTb9m9d9eb#W7H4_1<};+sCd6CL z=6K)t&$!CvY{D3Za~Vb#c&p(Fje41p)2e|2C$_Luv|B#zBZv0zgeFyNoERSOf#G|UvL2c#Dvqou!ui!49;X1E8XVpi2EVIrk&-okf13YLIUD&a0gdg(tOzlEI@howl6AfM3Q3T2k)1)s^;f6n(F0Fn2`}SgM1vOc3Cnb^ zG4)!B;e=(WlIedEA>I>Wdw+!>lm>IUUT1*sgkKUBmh^jr1ZxPKqH0!%BFfQNni+!28-$QS-cseJS$iz3nRLzF;`q;{J98J$NUkO}-@3h)d4{J95@sdK((=xzZ`ozgH;AsS)$*Lnp`L4mU)NWO& z`)3}8j2g%2iC|?YPjR^BLOHHv6RTU*$dY=>7wFkWn&XgW zV3RG;if13tmuj}f`h&e2QR#Cshs%_@ds8{or*f#lCkWw6tH!V7j2Ya`jg9XexDNuP zP$VMd22yT(Dyv+M(IbW^4I_kOyyFu8cW|9e*M?}Mz^`m*VY05slWG?wy#wD5RU&)A z)YX0$L>E)$zlU$I4zD~RHpeQjv}0KemYbU0d*Hqg#W#xeiyFu`=$QAFU^^mEr&1DC zD56p|yp=@2!f}$aV}LG>x&7?Lk&DRq#*wl+GNwWw{kR1A2dESHS3eLJAMR@GY6L%& zN7GRsHYEy&N{n8ZL^kGBphBe94gs*l>3N8asNrNB9H5^{n0CF}7i6a!L}I+1R@=N1 zXh^+s`ua}_fITYFT^lC>+(cpi@*F{gjgJc=RER8xn^|)8E3>?iSwgol$uI`FxwQz> zSgYVq4MSf@q(OYC{N(l!9!s>FsHAq4JZ4F?u_f+6beMieuL8lA94|^BG3Q2*6AKh< z&LqJn;rn8ktvK-XlQn}%cX1HhEAS*-=(Shac<|YQ152_wZKp_291~@)1pwf;riVXm zgoDA$UW?&dgezCRZA1?l!6-uZ+Uz5OZ$vOcm}`+Z^hD}L%u5mETyrNV7%Q~_D$;k) zL|OgLCNxcpUip}81n&W>z`u$i5sMFZ^*>S8{ppS1tYxA`{&oc$L9JOMsYdYEuxJEk z93{Bwmqe;vw~0ps8$`enjbJtIV;t59ik10)MiJ5O);=b(EEicWHM1-R*0K={XO_lu z94c}%8v)Dpqm2MS+(|@x=!f9A%&3rUVq2h~<7`H)aIZ$ya#3O9Y({g~W&}NgAo_y^$TeERHk_=Fvx{?d189x`gyxcK zv_+ ztH!h5-!m&ARqroh=*;N+8%}1~+Vz4@f1>km{P1Y?PLV6rd&?st%TXfBugok_CZpa* zGE1ZLS0OjE-U|TnGwWRpNg4GnM?ACMe_tr;9sBsmN{$0Z)VmSo-;M=St}yF8`U@r} zI;vUkW=H+6^dM9P;LM;u${^&w)9n04MbAh@%BP5WTBHdG;(&m5lx>a)Y(j4sQO`5N z#fXDJmr>K2&~XTMu5p4pP&J(R7M}gEsFPOTh{Wuc&woC*({Jw!EWeFJ$G0VAm&SCa~~m zTi13IXm7`EaS6w2vEKjNHa-cb)NSZ5aR2a6f}B$?Bi-&a=*9tfp7YhaNC;*>9N;kAr77-3UMOP(H`LX4YBU4k}X4O zO>wSyFj))k*Wg3 z)@?@mMXB_$%)V``ggeoNiO63JHq7z$X(gP9BL z@i?zI&dA{@1ak>d0cEQNevNQe>CQ6UHtDvR?kwrf_d@L+;lW#)x`hj89|h5)^9R`zB@jx5Q{0`tdBKuVhaf84jMx(ghBkQ1gtDCTivbW6Zt{ z;1G-iK-R2WN#E80WuKGz}rL28P z@2dc=g5Il)7#F1{Hs0aY2N=1Wg#gmqn?`Sz>o9uXW~6hdFX>GHL2nYIRVd!gr1yme z_;!G&(fe6|r_-D6bb8aBq&K<&-T5LuB&pHN>Bbt!Z00NB)ZfJFn=|VT$SM_-&0%Vd z5#-JYqE21?Q6uQ=jG!C_1&p9R89})Wnr;LgDEfEwr|wFowZ-0QavWfS^AKqH4ZI-0*O&N2ABdXsgX#+eT?5!F%C!uF+M# znzOCa@RtLSqI-bbrk?QA6o`U6&UxS~F1uH7BRf^Q1sj`k%OMY?mt4gge-QJx5TN4x zjh#Zw-%JJb_h*Eep)5QD7!X^Ds4g zyBaQlPFDe9(naf^r5&dS4Z*W6+IAJ?{DODW-1?yD+`R_`nZ%Y=C9NA+YJ9hVmV?oz;O=! z3d4Ud{FPOs9FU$6t2XGLzOOmayxayU5S)NRupb|;<#uo3@`??kQ5;N4`{Owq+@y%v zpvM*Hxkh^Tr}E*92o8n^njKge$YP)El;ygOaFM>@6&>a3DLx6N!j8 zk-9DfnOvR8nUb*sQ)tocuSmwOIF;+@$dc2#z$oh8i)2o=R2V2ys82EcKNBa!f+F(Z zL2_FYR#s}SOI+ty$P`*qkd=|jY@}jO!dzp(JbDC7Q4(gj0drRhhObeIl=1;ZA(~>n z$bcH34u!l*2$_WX;zEhj*@r=$nE};qKvB6&vX*kPcJ@J2tIQr9DOx6uR#46xkn^7m z==X5amxLZSL?2pdlt07&9Q{PY|GzW*OZ6^&GBRpjjPtu|pLbtjHRU&33UP}+|t z*p&J;sD4kR@a{_wB_I$~Thc-~k<_A-mxn8h;iq~4h_|V9NYk}d+6f-6bhyI5Et0pXdd-xp{a<4H zuwq|pmM<6oHm^eiamQi4=>b6?SHzQ*XyU@$rA67$oQZoWVvhzuZT2%%jYFQV$(eXn z4YcHQ9OmL_h8PONz9v`svm7#&hCNW+p;f--u6`Z;b~P^ahHZa@E@N(5xx!Cd0D}{> zd1vELj)!J=<#@!QS$)9Fme(_^CO?7O3;e z_JJpIR>3AL&eGmDaB35foRCzg+v&Tc%~o20A|QioWB??BcydBcB@UpmmVt8HE+8^> zl|rf&v&kYXz+zhvD8)t|O|8dx8g$1f+2rd}-h4>*2K^di*uO13V8T-UBE$cRl)rN$ zr;kXLtx{{#Pd5@gAK}XC%B3XP4Z!woryUhh3iMqXjvv>!1;6CZmne7OcvqYt-hebP z%m8;|%r>{%A1#-Net=CVK|wqn1yN7CJMgN_RsNCEfTc4orm^CX&_}NF&biltQC6Gx z+RXci+GDH-;4&JxIM=)e4BBkJAl-n~-~QM~(vT#TNRu8=cufAFX1d}fW6CNmN^qW-`E7WR0T2Ajb6W^;Q*@@W3Al6e z56lHof)m6PEM|NscJCq+{BErv*No9E8N;oOp}-2BIf_(115NKjcp=dkMPj%dchX9z zcisdha#s_pRjJ(N+*j$y_nuHYx19ooH9a=G1AoBSd^sE5=BHMKDOgNUY*G$m<~$dL zWmYb&(hp=hks)&$!g7q~R|$L%2=%N2gVLRes$t>0_C!S|t70d`>SGg)p8)T)~RqyuxNT79P&C~*cGmF3(Kle5a~ZY%rik@%p8rQ_2r6CZ^B1U`wM!Y77HVccw;q*X32@0dLUvPV%2-{KlYp9NyP zUowKDRudN39HOwfs&Bb9PsG9S^<|xanE@C~m~vWJ2T*K1mdGhe_uPcxj1o~IWhFQp zibk9f5MNg*M;+xc$IYjHecQ^iEl40l)JUX_|kQKY9p zUCu-sp9)fu1SGCq9NjsryUN8vO=< z`#joQJPe)i;+pi>A{_nWjDVtLJVlQe@2h;Vf^Kg?o1Z>tRTexHBfin2fDsNxrKp*d zj%yRb>@sLv>{@E4(^{=$`8NOvR=Bks|MsDSZ~nKzYHZqXbhrf4N{Dw-`*R zx>V(htn-Ti4h9swFtq-pdHq)Kq#0h93#K%~>q2m)^K~=fHjx_UW=s5Z`R(BMiSnCS z#CwVs7VqT>KhK;s5yOdFv=S4pHvvX&REMoU`ZDDJ$5yn}*#T{_S}j^F3kaU?n=-H( zbs~{k7Tt&%u4{y&t?ps`quE;Y$$k=QY>6jQFRpW8M1eOH-RsV;dWhzIJEj^*?nozM znVF}~A4NoY2I=P+Bo^FEDiDgok)E-VjY;m&*bZTs1iIE*=rw^J;o&F zor0kV8lM?g&0a(pZ;r0lTX7^*E+A??z<~?Ak@DvAIVwDdbhD#tOMp9*57+bhABK)o zfeI1P*WQTy%;ToHuI@N)QgO=!BF4m-%>DByE=2rf#EHCu&6BB_0AmR0Mm>np#98F#zY{(Cxa5B|^Ux2no2vCU@;C0)^TJTM)AImTU14O5?lFSuG1;{tWXHOq*fo|8vYBG`rHHn7xR92&N~(XiiTv zCOrLqzusy&73O>xH_Q~n(EsO{rvbO&D5eH}A($nGSq9rQCOqBdrMlGpj-lHimUb5Y z%phUo{xDWBg}%>vi;3X?nvb5pngf1e^F6pf9LZUWHll_L7XtzpG;W|3Dg2gU;ljPb zm6O*FkVv8ZUV7%Z1!Un)8TQcYjGi+>#=C$Zk(_;vBKm6SIbFv4rHt@io5*h+T)5M= zq?EHx;Y$)E7oKf7uf?&+h{*>JI=qa}wwz7)&qCX6%XtZ3=$^!FzJRskA8b5=y5p-8 z(;Bj`2NW&`mEeYV?RN!8v^ZG82k1>^V6ivI%s25-9DxQr_X~$Ct~hv^7)E zsY>@L193SFvCkXi>kF3_s_p)4FIM$LPs zih%9O^QdWoyKGjaWSdggg5;IeSr=%q@4)*u!II_gfFEk8dl;6Q{d(dfW%WoSxQ4;w zcZuM0VaecpdQ=fW8tVW9V2lyJR}{VU9jWlqg|Ip@MNseY$Mu(E4u@#W3WsvzTLkYd?CLb1;zNjj4x z$)woQcLl}fz&eI0){m4jd*PmQNU2_dTTpT##Jn9IDe{~uTGip?vHb{nhCqA~4ax!Q zXboz&3|^lMJ|-JfsZ)$u`Mz9;dbP*XcB}j3J_B11-JzakU!JO;3 z;xO-@L5&WGH_cUcl})MJo8BeQWuNoEFDN)2meGRVrqVmn=i+&({sy&8J1Hl2SeHF> zw}@T<>p#!{kI(F~S3(!jnbE_#?f2M#Ww*V6-S*cbduDXoiGu}g3r7k2%EDj6*0;RV zk9|4kbm7@6!0|TKK!+WL-Z?*?-W`%)O(}x?ujpO#KZ4#)Q1?&H+Nmd!0Vd}e>= zjHYel2skN4LFc+$c&l2=w6Y<-JT%ftHg6xCa0H?S;I%hzb2zUlZyU-a}xUBv}lvU-62Ow3R8`pr0|q<3g`V>3ZM0p6#n#xF=NJu zg2Izv{qHEO)N}us!%lzfCZLkOPbG1zQTc!|ZkSYl@>@ye&Lox7MqcN-ZU&Vbf1)Ly za|E3sFO|`nkEC@}5^6cD|5IAu@{ypm2i7q$%wJ{zz*L4TP zzoDT0V^RDAsp9|45jWLZ*UKaxhINcnaHzpcc#Apdr?FkXElJ}duwZWn@6{_{FXBU(+2{<&yW8^kXD5y>0)xHDbiW?2$0Ss$bXsz+m+<$ z@gm~MlBZXK+p%#(a&2mrPk(FM+*)$+nJw7rS`ww6Zye&sG13k-2wi zf^?$YegFcpBFgRp^K~TsmP+C@!1^)zx&AKb=YaJeXnIFk6J^k^*jN)`ki<6XR{d@~ zLdL0x3rb1C9{*p`YqumuN0Jyvwztq;L9gks{(nHPv0qAh^-I#L@F(fjL$t4l*fr(2 znBKlNAJIRHam5d_Y!R%(+t=O3MEsfrc_s-`vMp9E!j6Sy_g1BDK&pueezHF<7qW?Q zTO!%hoNIf+DbHKc-73p2Lw|b}#lUH|HEjdp23-(j5-dRw1Uu7rAnY*_-ercP@BZJ} zfp7-y6k8A&f}H7l5ZPTAuH1p<0+kQAn%&J&dkAIAhu-;#(YS&|P^&RY-F=E2rMS1l z_0F|$Lvill0B6$K-P?o>h8ue)Qyf#N|7huu-LyV1o)%1NNe@msWM{rp9Hh zR?GLVN+WjRaGdcU`^l{FZ?T*NyozDYf*B5T3Ct9jTVVn)*e=V;`%nI|Mdr4=yqw&f zZC1c znFjm!Ftvs`mgu<*IQI$%D6`5Go4xF1XO+ys0UZL?b1Vef$X#4yJaJ#&Fy z514*1r@@>Lb1}>$nA>2EC3+6tZngXi=3JNyV8$BeSfb}l;B*H}5au43CtzNHc?IS@ zm}7~aw|9V!JFJ%3u!&%&&Sc^&2h zm@i>+fbX$HLkg6c`qST)+GGOFkca;lafKf8 z!cz_7qVFgG^-;qkVO`Qs4Nrz1+>@XWtjUR!hVW#&xO{U7JhRpCB)|YX+z-;Cfmezr zi`P2vev1Zu#FOwi#tg_-)qd6p0{PcaA_@XkGjwI(oLx{)3<;`=cKoSL_^VnjTa zd03+iZl48Nq4qZMN*9u0Ngkk#mw1V3ig@72shr*79fE+zxa|kmd)`x+0PmS0hYka) zH@;DbS+7Mb07UugY4e9yl~`^Rw*t|EqPWUn5q!s8YPFE{4t$qA_qM=yR$pI`(CdMi zZ5sJ}BM?s{i!?5WB3k6wAd(5ol$Xl1W!7nVG|yfZ@0XUnCNqaZP~uZ9q^$!7v+>>w zgjBDGI=vV#`Kgg2HxgO$08hY0y_7J`2S{doG(2!vRS3*d)gj>UI`ENHuG{SEX;jSt z6yad}Bv#7TC*!$6<;-R&FIe!pkQW>gLQXj+6;jZ4HA#WziYd1S-$fLCK)b|?6ZpTu zQLH>0#hz`KwqQ5m;BblO*`!3;KEtCES#?$7xi&QBD|g{z4?o~*uYV2cL2z*<3Oxmq zYFFmu4zVW8VmD zWQAuT?tUtZLX;9<%g=w}6DT8OwV!Fg>nmTOGWfg_3cbq{+# z-|>Ers2$enc|xaFhbbqCH#wlo4sJXO;NArLn~{pWD4+~}XZD$>gNM!q3_JbF^!Ehv zVNLM_Y_dzCvyW6J!5Pn!!8Wsb1-LVx?8E`)1hi0T_QjO2l$|(G!q2nYyn~q&4?2{y zKNMY9grL?B@4_0R<|sn`T3(y;+|5vu?kg%kRGNm9Oo<|bdQG(VC=p_J+oSSDqz>b}PlvWT3 z%fzY|3lzS~t|>r$$s<@xe1aNjxZJ?LKvM>9pN(c{_iFhdfL9}_ze3Y{fkj4VhEJTD z^%ZwcO>LDR9s@nrb|E0U|FZqyuq--4=ea9pA zOf)aqtB0N-dvyyykeiT0)33(k9+=SJUPlQ^ykDWxGWr^?&1zQOx1f#(RI>$FQjlfN zZ!j4mi%G2<1e*D`34c>s=-0-)b4DN+${*@mSN21Cmw?t+%3e#)y`9~V?TZdSk`(<_ zTnK<7GzbJ;0nzFTT>dFmBexf;T1+kfKnZ?;toZs_6=ki5ps43P zjr1sMjRM#&c)m|h2!^jCTLM~@%ePy3QvF{-H(g~v+*t-(ZOF-R&d~u*H9TOXtuMqC z5L|lfN1*}UZWiLh$q0fL&51ZmM96Dy}gplcG;PrOt~n_-SstQ#;^-0t1h>#aZ4yv#52H z!`g%^<;VdeIvJ~LH$`k^(84_%Pof?ebdWa#d*dZ)Pj#DH+pK1f%hyj>SYWaK0n8a< zNM#-4*AWc@X=Dm;t2ht9Tt!A9^0{uLymR zzMRNKgW?li8fJ$MvIhUa#DXg=xCo$}V(58y@-gh5D-4|n#7fPyb0E}DuY=Z!b-CsjkA4Q?g*!Q#z9z(wI3qG%e)?_%>ibVC&P z?WI4yPfz>qUoO(Dc|ncTll6CMpBZmHdBRieuCk}|(FK%+|IKEKsu_Z)P3#oaZ>cx# zY($0OE_W6lj)Ll-a5pu~YsL~F(mzWsOVAVbtS{Nku$s`aJ>fsgmB^pHh@D!bs9|*D z9&(-G1YmMa;(^u_V_jmbNubXoV^vcAtU$71Dtf5wOX!jy8FU{l>LmKc`%wmlp73>c zFurZIQ6Nx(g0lJ)a0K*l2d?`L%p~oMF6{=-X+iF+h-+~m|YM0@QYb&zY zJ(1#pw%X+kM5BT-%39oq1*7tvy+#wS5J8Pd5X6NwNm{D38ep~6v(+&o#}rleYUdQu z9;P_@iT5%29+eh8V8zW9u`%A`QV`N(*jG8xQZ)*^Ae$A zK>4o2NJ&55Aq(|mJl+fC(|+_tPs`1MR$A1RTf>bxKU4vrX53m2w^#u>^T%MNI3|3O zJA5;mTH#+VW)EE~GT{Zp8wc~^+6v(guULi@;aX0sY{eW{O0X71HQvN5TOpdWo9!MA z>sw$(7~HBJBHq{It!Nb)0IA!p?EVpA!)&sUO`;7NT}sN=F^!s6NM@u_*iRzFbP#Pg zqA`MVO(UY}ThHdOgeNtDvS`H^V9_xOKe+mA8A3m+v{?U$#UQO>ypV@ekb9QT4_s z+a{RbUQ6tuT;{z=sCwP>TI&AVe6HW-;x9Rt^24LG5X1&%p&b}Q$BZp9^0Z9`3Ty4G zS)!1Y$~Upa_n9-yJP<#X{we4=F^Ugmq(4U6<$`27vdHyB-0gfsd~<1(rN49xTClrx zr#lj6X}Of4K0~9t9p2*-QFnq`U}bULfdlrr$HzZZtGD2SEsHx+Yv{(pI>SBE%1izS zx%Fd#Fb;>=5%pHQJtsP03CC&a_k7AP4P(Yt)QGcP^D|~R3rRyON6L`~%TMgr)P5Fa zS6{<{1dF^?J6xd#$1W01d)IfOR@(%BDuD8rY5Y_wo5KNqsNrWEodm>Fyse7e*L@$T&1IawIw8v^TLiwEj( z1H<<#>>2fQX(OSiW@ORKZmlDsB6xwAYe(h-%OZ<-7xmoJgOK9cZ${WO-hjZJ&^yF@(_2Wyx1kMz~9#uI~f73e$EBf zHb28Ss>Zs(7trWU1PR3xJEZ#tbL_%(^;IU~J1O5jW+No12n zafOx$s)y5yqy%h$lf?q6pR#C}dn-cP^Rjpzl-{jnm2T#9Tc~iSb`J+xD47`U(nK}6 zwKW`(jrrMCR?q7`J_V}{&M;;5uZDl{&u z7%vmJYl&I0*b|vm>@IIrf-4abOGFol~P}$;zt-2J%rVJE?5g9=F+?!Baqk)9o?x*X@m#v z3ZprA9g_lw5=!uFlmk`efsPrWEjuKpB5FWdh9pVj1>i$LSFSQt?VgoRV2atGK$6{O zYqcF`)#^Dv0ysEP059SMicYTtFNPaM9-#u|NwG4xj%dREb!;`Lo!?;CNjlDf!>#pn zmv8f)+^A}0m34c(JzeFG*8tX+qn{x(v~PEpAM$-{A}6R9HQ2wspHV*m9K{~_{&+jN(r7Q{!$tI1wX&_X#bE% zgOkZeYUdcK`BqU;%2c(sl|wOfVbX%sq(Dch^P#SIJ)P)sA_- z6C2EB_->dB)i$VT#Lunedct?W2VipmO`u`nXW6&Z@M9rb)K~|70V=*RhKivhR9^)b zUT5q;5}|tTCID(kxSksp=iu+w>!-rf%QwllG=C5(53qihI=!lq8WZO-AEPs zIj`8>%@Vs(xC=ksuUPa6fdWg6q~hJaZm!Vc7w{cFH8poAfrl`krq3UQ!2FR8GUqUm z7bQsSOOTI4{3)43yc^&dLp+9d586m2o?@#kSBqwLceYkwR$GbaZml981ALLyiS03G zxB`j@SG5EV+^y8#i%>X%*w zirox+T9mrcaF~D{3@wu$;lOUX2AQr-x(1l8J#;D3)lJMNxUj(4A9{?G;67A4Tm4YT zTBDVQIRk06UGRl!e5cU{z!MtnqqbQLwPlxm@3R~8kFsiK8P($RH64j#9D6viuysTtBPukD|z}Vt%&7?!`Cp zEkLV%g(a$mM|!LL7_Zx=qf8*69G`NOCbVOrjmB6Y8e^b2YPQGbkMer7 zhc)hQ^3hev+j*#*L!cztKNbFh9fb0ZPWsor5`{H+Q{!Gd+k5x-R!aqhvLA%G$d+Z< z2XiLaz7UM%Fd1y?VeZ3)w58Z|3J3z!8NZwiS6*H&-svd7zW%8&=fI4GVZK+xz8U6D znD1eZ2Ts3&IS)qQWi7xjE8A9(lWVgT6xi^ikNL}k(`L&T|3?e&#t4W1WaOl8_a0_y zDccN8XW1*p;gRUt&*q3`m@|(n%Tk>a_Kb6U9{<5f)fw27nl!2yvkw?{Z4mINlX#2*9(?|Z8M(A^ z*s<(yspKimn9RcAu&YSe|)o&F!Xl=;;1ja*-^jdh_RD#7P)dn*vjQ-VHz z90cn!2oOjFs|@Ua#sTm{s(CMp z71g$&DA`{n+QNUZqd4y%!)A=%cc>h@^QwA^vAf;|+nv2V@loAAUr!92;W`(n8>1fh zz#-f0(~-7;#8P-gY`=D5^AkI-Uk}<32QZ2G;SaTej0VlM+?yT<1}%0Yym87{$K4w! z>w4)c1?L2-wn-4Mg)V(2z$$ru{TrsB^}uAy_eh{`8k-V6z^?^Y&m|3qVcNxjv*;(? zbSM$)Au{cIVMeNYF*EMMV1T*+AJEs1U=;~g=@M#?(8@9PiI3Z zVWj`BT@YvxO6!|D?cq8<>rLxH4=3iTZep9*@EDnN=`Rz-xkg^Hwf;VdOym|Mk{D%2 z&nO?oB{Lgy6@tYkW(WJAvdWefs=f6na3x29yX`1&mZQM^{wQ#}tViZML&C+@BP>PD zzriJ`8M$2oWE5Z#f)6ji%%i~l?kI4xjskb#QQ*81E=F}CDa881WgzC002zqwL-#lw zvDrpK;D7aya<$dia3YT*bL+&pJ@ zj3=-Vn87gHDB!OEm>gR@GD1N}VqAR}1JSlo5nDfa#784K#xV?u z{#ga+m#<@@xcPLPRAGR673M9ff-eqqDilv~vO?vmhoUgmZ%8 z8jBMU6z9nq4XVA|w+Pi>vMeiLzT;j1?z7l(a`W=L^*-vadyfq7f(+Nu9EH7m_k_P< zKU&}se!X~rfwi62VHbyTrSIcxtn5MVAJ6-hSnpEFXp!GI9l@DK2bMSc!K6~j8^LP+ zM~ytjn%Q7SE5Z7GtA5~PFnP6`lns` z9=*gqBaZzf*Wtl#0@i8c9rkf}3Eny0Il*~_lc=gVqQVaSca=C&(^lp~uQWU=z<9W{ zzflfzt|5x$fFk-tI(W$lG z9PNpNkND|$a-peg;U~kIKg!+zQS+zST1&jQ2=3pkL-4|>eG%`*N9djVztwbYoeD}o zl`e7W1adC4+hxe7u`cod(DpX)Q5DzU_$JvU0TOQlK~X`YU2G6kELal*b#JmOyRgx; zf+jU8Hv9xDtyB_=HQ+9rK(3cXe5xga*pH8v%Mh2pxwpx!4%7D1`yn7i-Uww(aUt&fofd@7u zk_sMOF>~kZtI@kyAilvlnXh`{CqvBx%$qzfA!+Qrh7ymzYAIV2ji@a;3}7^J%O^(@ zY?h3{c6;((b$Z{2reHbWw5Qs{dw&ccN$>rA;~r%kTmCrd8W@*%+_;XLn6p2bGlunY z0*?sX?T$2M_3`gtVrLqO^>Xt+x_7Emd!;(i0blH@b2>8V{8xMGQAKNLv55s97 z^TegozO;^DTBknhYj4rV+Jf`Zfn2<-K%^lZUJA{Z(`Srx%NX$M*Xq~kSL>B-&hwP!IOsf0rtc2|KzzEaMvH_ITvAtcuMW39KXpY3D57R zb5b2XJlElwhv#?p!|?y)ISoVP?BhHyA^qEU{%t?GfJr_{cz!3>B;0T4&%KKFotTQ+ zU%{Vbl>7>RBfl5}^8o_)^G7RMI#S2(F(YI>-lABwXO3I^HPa>o5`XqH+_|t8?30t* z@4yu!6iFlUe&e$8-ItU_-71l}Gyh1tdNg`uuDy8BdN z!V(Z0H2%Wu;tTKXiXsms5cCY>N?<9N4Q_o$d8(ZwJlJFeWpD6eY@!Y&o2clH!8I`_ zsB2>2rki^c@c+KY_H+v<5P7BYwQue)o0_cb@H^lzj)B|pu`hcBUL8#zWejYhKwAzu zb>Q~vn_$+H!N1ex@6R$YSyV#CfAD?i-Lgi~#dh@ob#22AIMdf~i_y>G5z4!H52r)L z!_H=%aAQS;6B+@g8IkGs>vSVB6R$nJ-nxX>7!gk23?HbQi(Uo}s25$0BA-U1Y$9^iCk{x1NKb!>t+%om6WZoH>`{v=547f5eo_Zt(Tf^k(b#Fz-D zz^-ZP6~=-s|qv@t|w@s@hkOxGT~852)J zUa#S;VdAM)f0fsO#uAjceFVr`hC$Fhn+@2Cz#yh?5&k~;8Ct-2WEq;#Z%!zCgf2SI z3E;;cMXRD^XA|6S_?E?e%hB@K|2bNHK9sT;829yP+Jk2)vhbT11ES{bjx4{imRJ*u z@{kNBSp0D4FJ$1aR{t51VhUw0xTOUpv(e!eBe@Vk_S~%5nVF7A=SemF^{B6?eG0bg zNc=(kVn6+!?+u7eA29@w+(A-2W$MhRX zn+2`zXDE|DihF^3)yO#lNtMw-d;#l#{|GQuQ;DiRJQQJFL9SE&M2D)-{6}5s@(Q1w zSuVbr+zx;`Rq{l6Gf-ZA^#wABLqsB_MVXfCMCbuyiHPP^#t-WH*jdU(34$Yh3|j@+ zD4U_|7)ZOzW&18G3@Gy+4kG07Xq##iWk92^E<$dqQNGe7btB+}@_&ZZk+n<)8ys@2 zv56k{y`aroCX$k8Z4UKECB*gtzOKWIFB-?D zVk9I~y+x?CBa81f<5oIL4UR( zD0)Q(n6dTAUd2jVMSCVONoHHdOQpJUyzeyy_!I!abEkX@&kgSrj@y>q#dOPr>4L>h z0gL?gHyrC=x;Yl@8>$aC!|^lIE&ps2yl zE)vg&V36M00aL;r*;r3vDk73-bw3mht>3`*hMFtVp6xGcnv=mRQw)$npL+*NJjr_p zm`Xpm@jLDvDDm{XYT$B@KfEpjneh68l63b!utJLfL@V}a(I=^lvWo9R&M;RR4^Ab?gnb}eck-G4KhD~f{@+<=Fu*D!Hr-M zAv~K=*3+QgvO&BBvo3Piqz4OUU6fIi1{z9$3gY=i&rn9FZ81fHz;3HZ2hbgFqSClU z*-VPrG}p3N=5EBgHlp4uu$fr_8{2YovBc%bFZhLs9rZs3zu;aki%JZA<^Ugt7&{hCj3)IK zu3*Q`pW2%rvmd<$qtkJ>k7+702(JKKuyAx|%@DoOk9YHR>*gOQ5Awsh(W1!{@uHPP zT8sVitjqGmvW^H*&R@NmoJMnCK4zt6fND55Q);k?-*}vm*6N>989e0dJpgCCwPHA# z&}2{Chovf9p~#gN!D!?_3M$0yWW#r_sV=?1q>sH~!Qr<#XbPVqy ziMl=jrJ>2NRK5^Jk&Ca;DomGwV7owVxm#OCUY@SKOo zId)UWl~}M$90r1=)6tSNN4Tl^!LuBOgftz-uEwU0F{`mubaaf=WBbzTHr<*j zpZeLG1T_I*q?q**@E}iQpGo6~&@$wWyK|Qa?DFT)T$c`ED{x9?q@k2 zA-lNpJO1?f{YQKB1{D~(gXj97a~2II^84NIRh7c5n%~TU?t6<4r5~(VSxG(8mR5a% zo@l|XE%?))f6f{k>o~trYH&7d;H%qnYo>hbXEy<53rj6kIC5&T3Qktxjt7v3_EbyL z;eJRn_Y|+WU@r?Eb!J35J@bdH_Mk@ksFsdF+H(?f{ivo}`{!avDo(gU{A2>o(#O9(2Gyz za1DYPG8=PUY1$@l!__miry?1cSNzL@QFrLFwCODw*s=w$C6@p^xm>=#X&+<-XU4>W zVX4(aHbxGEywJkf+Gl=xC5Cy)MrSIH5^d5=>_3$L8f(C9g@RaHf@MCaRapygExsIS zxTIVrzt6iH_>1|3vkT@4{7@4#8*}UhO}k)3h0{6HD04i451h`!6pABA*{+Y(CwJC> zoUD?;S^eJ2f`p#jUjdhD&PMgnj@52w&?t@LkOvy$6Hn*^O^Yj_`im zpNC$WiRg6mF3$E|bG3Br)Z1%vbzBCMmR_A{hS|$0VId18eoMKsZC^ z3O)GZMnfC&*H+!hp@bpe*2X*Mq;Fg#12weoKhH2x|s&mJ?a2FCvZ{A6q zMgyBhzNg-9EcAH$Bl;VJSTIR<_TUmBhx&uXVT$s_;=FHc~kBa+;p8`07B4}cl@qd;k!+D}m* zxI~jSX}G)9STq;#x_N1?c|YHz_-U7BH@%ZlwBzQi#3rMGL$`f7{uoQ;^}a3~8+|iU zyoNaxgjf{eMLxP#3PbH-_-^MGF|yqNLEEFP+8E7+?fu2NcG(W&9>RlD!5ASzhCwA9 zlbC{{P~Nr0=OI0C3$E{V8J;~JE}C!k~OuZj+CoPWQ&;N%??dbp?^Wr&|@UN1D=fM_}hLDf=Z!v z1>oz*2chPom3W09)Q`wJQWGsOLzED$&WCttpUC(C z$0SCCO{CS0VocTj48oa%B4Mi9o!la(I-r~1RGDl?n|Z>P8JrV)SU3r=5erC_Z2p_= zZvnrmh~|lX;7nF#BZ5(=txfx!?0hxcgn(q=JKO&ZfMl~M9>Um2BL|5`Te1+*@sNDr ztphhtsTLe5?4}#kG4EOoC&G1H!BDRu82D-|O%6{r5RNg>=0lrY?|zP zwkD=N!_3Ad|w6SQOpqU;76VlC)OyOxE;;+fnZS=UaFs>gIZkJJgl595yaB+;e z1(aiLbq_%LE`ZeP3xS3#G7$CW>1k3^=v^S|W97Grr_EdVXA{x_XY-qmr`)n}L-(Q?4Voce3D?>1rQ zAR!ziiL7^lb})|_h>8yBcd~HyZQz+o!|zXy*@b)19uLi{%3smJp= zp8a?TpL%wxV+fve@NB{J4jzW5;W-x%-+zMVK0G}I@SwSO>Xm`$jSoYXk+N2WIi9?x zAwmjHH=vQwFm)LeW?;@QgY9r>T8y_W;>JDjxJhZjbr52PLAM6uv{GZvcAxoq(3pA? zZ{A(vKybi-p8#WyRchSWT58lSQlqLZV4jYgXTaK3#D+yZ#fC=$tGGB+TUCmc*iu_On1Syv^w7H+f-E!$sAYyH z_KDLTr;)=aXp4S{_Muv-e4ITS>Y;gHWDBogyWM#NwBC5d)TvVswVUgjtkcuBN1ZX3uqaGx>MJXJHg+csU8An+wjWJEA4WL>d}l^d zmiWv&D&{r9$zrOxJEeUaij7=+0^7y+S&>L1IYhy{6XL=u3WQR9Gm;5^+b5x#8kjH% zQ7tX9#fo9`rhSI}G58BC_vq4vlf+*T!#Vl_7L>K@;-$!4*ynt`n~!$mPHi6w445yg zVd`DVUTE%Ot#(SsymWL5ar8_ka~?8|ey)yZen-aM<7fO3SPwHE@$DH8P$|(~z4GRq z$4Y;OyxYt1!5Jpf-e0SumNC+vrq#WRB)qihA_TBfg^NfZT0NI|%+Fu6x#j}Mn=?w` zUWdNhw^_}n(w@KiR1Am4Tng^4U-8EPu;IEM0|eB|CJN0v>Zm>yNWJb%BRLJ(T?LOn z05@xH!g&4>WlSU7W;dK^_L3EoecRopoFMJcjCRg@@+|@zC#Mp*Jfla3-LI%ZvKS~)%}qg`Ciczvj@fQT*KBtx*gp33 z(3;&F1AB+djF$xZZ)QAGX1r5xmdPiH;5%o$JG*AQ5p#N_`fq2vgAevf-fPDD{XaP4 zU6!K-8QBQ0PMB*8N$Oad9YwpWOp%@u*^&rwz%}t=PL3s5R zJ;!N4Tl{D2{>yx)Jdk@h-<1V%j23r%KH(059BA3W$&VIhocwrqWDLKY>@YJ{yXVS` z$2sO&+!t8{8TS=D{l=s^^6^}Nrx?##JQto1`>`LWXA-`X@BH;5uIK!v{9i>@bNnFB z-CF%acnPiMirG;;IJEjJzSIn`s!kbzQw?}G!<4J*V{@|&nd)$x9=@q+Hp3J>RSf63 zxO_9lazSAfS>f82LLo`ondL%UXb& zmy{p}D~+?$M2bs9SdT)Je`~)Vk5IDXzqo|+ts}?Q2B;t@c4Rt+a!O<-{-TW|-Ojnt zP_zfJ&yO2&I(oNNaWamLn`R#7<>X27emK8_W6lghOecAQoNMhqNiJbHNmyY1yYO*N zs`H_?Tg&+r>w5y@*uES)$41k6vUN~U^bFx@|Ah?(b@{D2X#Jc1GMNwDz|FFaC^Hqb z*0|65u>=BW-lOi5Rq&G({GRoMe>n;7RPX{=`1k>oSQ)dicup4YQa|@RfLzosIDD2a z=gFay&+5#O5*UK<^(4lp5A*{O|AD9`8M98$kV<41Jwt4@jY!snWT*=PFkmJlHA}9q z-UAF)HBzJejARiwYUWQs3yB0{o7uE=0kCG6lqu)^JwHek zwQ6>Ah$WnjxUV`$s7)%re8yhUDAquXZ+2u8O6adiK{ z6nqR~4n+&O+{fr%D5G1#j3=481DmK@t-s=WBy$N@Xc!h}rY+$hPArsxy+j7~>Bf@` zGo)%5&{*(i3?EclX^R55Z zFLKW;#bi&WG_YNg?NRrIbm$gq%V2Wj#NN*G@yLVk;d+(KH+0iZEKHhJdZxYIyGEMKSW zgvVcOuNZsS2}?fTVkg`y?or_CVJF-xj+N+PC)_hm*$LMsb2b;d8T%b}!i+wSop6s- z$F&n?d`Ev}Cp?|rS+-h*@28`q9&j`28%Dyk@(!XjloJi<;Zks*G@o%k4>f=yf?$IF zAdY~SQLQ49W@LT2eofM5xWL-|9t?CgcI;T1J3iIXUXR~GoB{Ro^k-i_ohuhD1{3f3y zJip06y7~Llv={z+UwdKL>(WrS9DE%bpcNu;xb8mzk`9kK)`vj+a1Yl8dIm=if}hOA zMkKyq5mkP$DFqwnC!?p@=g2fvGKSkuEkH8%pxF&fP1d`sApfX$sG868 zMlW@GqnF^=J1uj;4D+nJo)S~4!8TOnVbvpT`$qqHz4KD`$YX*MO})h$#zt+-iUT~SeL1&v4|p{V{vr75zXna z#;K^GkZ0Klk>yf&)%c%4LPe63duK$Bx*chG=Cl>R)@MihIbH%NRyZ}e!RR9tGxfOB zjUPvQ9*_dZE313A!V5@qJaDlPjSiXL2Yku5fUiRqz&@i7__f~z#|i{{3<`WqAMh~> zJS$mtW4ycLMxb@taLH!OP;kSfJ3S56?h-qNH3;^Iy5V$pj64qhWwir8}SoY;xcTSLXfR)Yc@4-3gxF-v2N#=4Qiwb#^wc<@NXz zoABC-rwxyV=K!A0npST#kn4r3gRbFq4|j<$4!L59N2r*1<>lbTahYeafWCNRgd$l= zTsB@$N1fu4*(eeFCmyNB8kFU$6N| zp)3)#C4WUB(DeD>4S}kou=JfKg~O=zoAI7|zGGtnqhG+dBm+-29%z*>$-|S62a}7m zDopNAq!p;O{PBLsq?N`&XUGtV5^c2X#2))cp~5_E6*d-NdDR4WBn^6^W>G-BPz4z{iCZ$OVEa} zy~H%8;v?~~{u>hoX)%A=*VtnQt1YuGUD*YGEx@51%XJ6QBG4{2XUZzRjSU6VUh8Mw zu<(nBwE+$xGbX6R3>&&K$;CR-4VA?L1l>Ub`J>MMMaWSrZovUG_*GEQTf3qEg&st4 z>BWWfa9K2yzIu=@rzn0)hPiFjW`1JPcT4(PH0BY)p`yS;_P#F4ww+1Hr zS4ZhQ2REixj}4$ool-~?7LuAb8q7}kq9v&uh#)hZ=DM3oS(`92RJDRS+B<{w<4dNV z*nlmdg0Tm^MWXD`7XJ?>NSiq%J1lw+*MZjAm{#l{QrZtd2w2&^`lL)B^~3N9H9!V_ z)G-IHP_|h^#=^wO?s(Sa#Slt{UdNOb_CiK_e}zi^7D^1e5Kymezp1U#idyDpm`#Ss zP}mFlVbIua<4Oo9vcFH}I<5YXOn*!-9Os@tRs2Ok2XXiit)5(WfM4mWy{JFc7;9oE zp|t96_Mtw|G>Z-1)v(FwNb{Q;1MrN)6~rSz2tzg~4)vn(?%I{+)72wnt>8Ey#pEzWJnPXwV?=x zQrs}pbCIdnJXk2)MqBbDbYIZ?K)i(ieN!&TwgZ9MA4|5yvrvpEc z!#6JJn3t@%WpGiDC=fmpjUwWZ;*6!nSICfK}0Cf8%nmO;9=;q>d%TCkg=J=fH= zpB<_IBp1R`1`AzR!^C4m zSJE&sQDQn#eyMfQ0d27d3u4jouFobVtJYh*Sr(p(=b%2*%wyJtJxRD`4#Y0jbh?~o zs=2yQrhxfpnD*n@RZ-l?1gr+ULgS`-R zPfOe8g*Ex@HkD%9v&Q{h=80K$kS&bS#|ftfDwSobpooueiuxkUV0}kfhDv6NnXrWv z2^F@G_narTkd$Cy9o0un8ijIn{3)`Q6#ylDU>|f@azFY5%nZk;o?)e+p9q>KmeMYt zCp`mIKfyw~c)To_pFzrCG;9B}vSzz$=#RN(+mzTxTjQ$Efc8|Uzv|-6e-C$WT#RhgI;XJqGM!3eO^t^Tcewc>+jcrX&}`M_&ls z70yC_;<58F018`kc=0TNT{yc(TYM`B6zc~i=we{+dy)e?2fW3WdNHCe_+pScNYuqM zn)gzD3&|%EV)h);E>gNWQ&OoL5gu)zH>|njZX->9E-Hj=#jdjq7xpF^-E3~31+IS( zez`mZtImvvIDj#y)0w-xgE0XoR`*enrxc6tdEQ~N$ErBMl3nEqgqt&voPG~W?1K-w z0k!$%9^;t?Lq8k795yUa(B)V>77kg>1z1KI!oD z;~jsPdc5Ng9^z_E;z}NWIJ?L3htt$MGwB%A;{?Qs#?#!yG#BtMEdcD}57E*tGjywP zG|hL1O!_-TsM6Wi$WO^?Cwt=cT&?%AK$l&G=+xOp{k@3kZG$cv!+8BLWQ4AFSnph` zEYVxBgk_V1GU88=GNvG!Y&~g#j&3AgIUb-a&|wb_c4XX>Et6eV=K(bx+^};RxP@iB zDYK2*qX5}#MFx?zgmugh$YHA<@*l$ei9l3;p?VbON$U8o>X`ZY%3vW@1FtMhj5x<_4en zLD2jpSaqmAF~25xUc?lbK-Cfd4T%;`r*_R<))`;mNWF@N`MY$b+Es$(DtOSV)^c1k z!9txSg;IFnw>i9#c*2YO)u9>`3cvtLi$1BnckDro&T?%{+X*+Hhrby&W3vWB3yTc2 zlOcYz${`*bdkA(I4%xo;ghxYX7F%35)wcv)NMjAYgU!4WbRsxpf(F>LVlWt9 z&$X)#cEQseZ@oG>6^H3wd5rdZxTWTrjn+RZhk~W&xA+qqFd|`?7e_Gd`*MO$9tjkE zT-z+}wlg9LS8W5zJf!i@(sub{2RqitL>Sq3;LsijNdr-VVDv5z#YH1)b@q33zlf9%(y${OL96{&4#d4V-}i7mvTVCiT!BoJkB3 zO&-zo{|+qPXfX~7#`<6a9zE3A3zI64^E*(P>w071cc0=YBpKg<1m#KjFUpho-KbLk z3sl+PjVkTGK$ZL5sGR==D*9~wHVQyn!TZ{G^j&0K1_?nI%ax|Q@K>oAj@se}AgJkU zIW+Zf!ok@;3I^s7?*#g&c%;**EnbV*Mz}+C=xb%5L?@;q3glV_R?uXnCSt)+t%0U@ zQ@e@vySf#$IRbjI(7bfmS+}$$Vv){XggfHmuE-c8|4Y(?sGl&mhu^WY*c{p1#&uwK z7T<~g|2jy}$lq1^*mq+84@NTdZ~uMi^+*hk0bE6OV}MdZ!Q?@ zU#1U&E27+G?5Wd1P6NJ!r2aqklTKFG9`Z*%LLr2pYVV;XlNkC!^sMA{FSz|`Ou)Rc z05@QHa06D?omlU7IkJI2eL3Iea-KWbp?vm6+Mtnj{rQK39abAe322>T)DrQa%G# z%T|XDrrCXN%yYT&0tGx{g4kglRmiP!s?y2N82Dwfy66FxEW>Wvb4ca`* z^IL@-#+{h;;6;SF&!lZNh0-nJDZ<(_gmu&E`vEgm0n8|ETag?z*CGd)R2>&BTFD~a zd_y?IUyCvtjBTXgS(m&&2}iG`P|(C7z|zC!&m{pnw1Bs^SL0s4hgI`wnEOc zPh=Wlg4%fm3s>+btLU(186d=Lw<|=&@|MK(Z3&|V zBtpxE*aEgi(TDF!vd)K?Y(_HK!z!5o7Ow3?>T0a$6%mpYdCbh;rqviZ6$MxsEe?AdyFM#JXi zQi|%~{oJ0wVaYc?Lk_ZeIZc*(Vb(inepG6H2BDw3n3~UmsO5!9y3A)3LSUjwWEwTn zTxq@paGbt@zM6j^lN{nN^y|Zw7d1VymLo59{@LhA)+0~_{Y8`Jzai#<#@i1e$e-5Y z$MFKhb+`nb-Q^q~)08R^3K$wVnPj=F%wm+cD=-l2LQnA)&4T}ma7M&ko0fCP!2E$$_PIJ7eKiX z{v$=j~E%Kj0S#P+<`l^5Npu zyV0B0=3iDCokf#=@bRMMEC~*efv-dw6^WjRHYJHdMGIXqXC4{8+(C-U=z!w%r>9^w z26K!UhfjDtM^V@Obxn_(XwYIf42xzdFb?(gSle}){$c)*QS5`Ld>&y{31Kqq(~i%lB>KZ4AEaH{jA?Zn75 zTe*$xK`2Z~pm%!HY(8|*Yqr$ysXp&um?WRt2o9oJRP${&x0)LPwrSLEZ_#F5E8gK9 zwOM;=U0Q2LKi%BxGuIzlv>k~Y9#G#oaP}xHr<Xm=w? z(0qu%V|Rk^4}I<{cw_ND*8UIJEaxF1*Fu9 zo5v!DtL6=oz}+ekml*Es$YB06ey=&qdQK)JJ6v+NOIBNzEi8qde+8Ca<+!)3A}ebd z7M5Iw`L)qI>Nm~T(_ZhGz`9(Z3e4tz8I8H_(7}U?q^WWKq$Ul`qVgEK6Ngj|9iTSQ z+}?pj#jCh`gnh4~b?g-CY1@l-_{}>xl67t3c8=yB+((Y1df(OtFF=(|$znxnP5(%X z(~u8z@^#7e?u!o40LM@shvk@}x3QZhev`D~FEE6y2L>I(0LPwh&AAvTc`{InT5ooa zYGujx1`8isi8A0yg2Knv&SmZHQ?Q8HeZZ44iI4DS>v}`Bk`OU?O!ZBz@ zoCNX@ujf$c?E#PTQ=VLfsIEQ<&|T+l6r=7rRL&n+&BY1m<*)pL&;nbx>F#MHYI8r< z>*X|)E!WK>$@*ddGX=IKybZ9Q3Yx+6JlHaiQ5GXGr()&v#jzYVHuF&hYS`lA@ly17 z22$3(Ks!(v4Q{pao`F^b`+s|63MN`x3z@i|6aQu?wyh_c*(*}6M^wfro|=VcLWt>m zyJ0=hN}+H|tq- z+?&F&VAjvZhp~vm3ghS>ts*tAyO)E<5@<-hH^xw>J=kArR%faqA`b^}odUj3fd8EY z{tRF1StV_?WbY#A=%|w%}p4%#-dK5 z2KTca+7$AWlRxIvGIWfNi%cO0a562&ClVY0gtwt_JP_IQAig-K*<)T~f{p<0&M=?zu~J#&#zS z0CD7tJC9Z=q#IxlCS-zwPv^I_1-GJdVn|0uFRg+JfQ`iofYc0ONjL=f{y90q_sKz& zkc6{LkW$Aai`mF_v94Sq1$)X4g#-a9!lP^vRnc82I$XL{2WTG53ysEewA_Z0bk`zT za+Ts9EM`#ItU@HHN%s~aN%cTgjrPUhs$GrXI{$7G@SPJ&Zo&aC^@r7`{AswPx@UD85!w}>Uv_-z?kWqjFd6Y&Qs9gwzV-&Hh zdKk2!wa4^C$u9J!2Au%t425Eh(pKNsCNKPVjTL+l!h3)6L&!_^FurgR7t`8 zJ1m?d(2WpLD!J(SPhx z`j0y~0iU+g56-%pI_siRAhiiljKvi`yp#!KXG_#sTkwD_VJ zenS}f@kN}CD2ReDKQ4G=Gq({)^woJluqGRkiZ73PUih+TUAp=5U65nC7iEi90-xW! z(qk@g;!RpJ!?=Tc>@vC}XYDB&QfVjV!xY^R?iTq*g#$Wh2vM$T?XUb7DSK9fgfVGQT8X{!8Qif((ad>;MA& zrV~BXZ~$VWEdoI>3IVs3PV-Ly^2l6sM$t;5sKt62lKJfgR(pR4Ke6@)u?yVO9{p#y z8mawi{OKjH+53gB{iMf!p*0XpH=5NX+;RBtqv$FlYYQL{So?1bW@GrD`DJ9ir~)5D zVBB>dKDdpC@F!LHQxaZ}4-}Z;e^KFAN;vbRxQFluRro^^-h_`lj4_12F5#{V`J;5S zxU4h?`F>|j8oWaV)m>ZxvtcEe2*%F}{AjE66gW`mufsEmcOXo^^iEO+%>G z+~GCf)Nwok2WA7}9-L0Kpi5OhuMx zvU1>vY*dSl$Pi7G{Sj%L3Fx%yEcJqOjMLC5$t(+(Q7=b5FD`v0pb-{Do$4S{J_^H( z(CYJ%4mmbi1CUvy6G#6~BqmI_W4yR_0x*zGWBrV9HC{V%anZYJu;@`Ibcn_s4E0AR z{Cdezcwmje+Qe4BRy8ojth;l2GwyaWlC2@Flx?@tET-+zdYO@Zn$a-3PiTK>(Ybv> zGbFUOPiVi$zBHpD)F;#_p>=&i(*#39pU_ktYCnlt+#LgISlay+X=Dazx^`c)o@hq@ zmi3Hd@g3EdMH=~{1iQPvvH!Ia=YRy!Cm2^KWRXl;J5Fz0ehz+XS$kA|1*X25D zPMXjLbhU0pc~~Zo!KeoL!M4A;Bhoph`h!SkLG?baAokj6Q>q8xjkR^uwD4$Brf!B< zMBPZ~fR2+sbjic@!Ul%IB5v(aPWIJ*fFhH$Z{9`9hl@JidI}>}&xP(4;X%WWMMM+)h`CY|$6?h7z z4D(Wv4lXCqJ(1X8EO1adUh%BRB*_p=;T_O=rqzr)*pxvz1_`i%3%82LdZiE;+%a@( zCSud!bTJv*O#n$oZvRrB1nZGmZkUf$yNAk2Tkuv~hI$yPCD?)M za1KAx?C#L`+7GWo;1(p(oCW#w=7o?>8riK>WWU!!*)n-iz@HGRttxS8t0ogX1G5un zs*+>LmxR1fh@1d3{_3-}RcS_g)Aus~lQJ+p`I_4Onl>;Uh@7w*H|t6E8$(=SrW|Z? zR{xN;c%UFb?vHS3tT-asj1?jZ#HTL>7 zzs8_Gq5J!^Gr^ELlc}UQMwsN^Rc1C1|8dKp5^avw_p|je?xsNp7UT-xf5GLy6FIJykNu0sE@#GAI8+Q!;Xng+I5o(#utgmVcQ3ts3#?@)ZE6 z^w;8V`P^D4>v4_w$g7s&PZcb&au&PufDk(e2zY!h3WMKgX5yEr%H}eae=bs$Iblu) zpDmK407(#&?Z=iu&b{LITFY-|3V$`j%QBg6W;N0Y2$Ur`fQ=Eb zp?DwXP6ACApy>o+M9`g?EY&n3DVxSp4U-rr{!YOSH!MP45~@<5DhZV*P(jA~-2yuW z1wTvxe>sahx18B93fHs2Zr0h>aAd<10s$MbJ_0sqd%h15t=CP_xarfwG- z1ix=fqB0^VV{Cbumk35{`Rfo?Ior>_{8Q`)9mX!vVz*F$RsrPY+$7qJ*c_Nq z0I-8d*?eBN2Y-{GNW-4i^4Hr*UM9ki2~0YGHd}y&8no=7dngLDPC!v!8+`#RW!}KE zpQ%U4f+lf}LWVSOih|^*X*W)dFIyRlP{Pz&!AyE)6n?B}i-EP9f2~+EKB4ift z0k7~3Wea@B1~`I16ao+xb4d|6;YHl91H&vdrj}jpMsRkedko6cjAtLCAC4WP9EDh|8JoCe3EsAjpC#&??lnaC_8~~5 zV!cFqBvMg32%Ee~+6F)@Ij9sE5RLkmBPL11c$y6MjU-sW{+d~3X;7&C;+jQ z5Tx$P*BQBkk;EhDI0Qat84j{@KgXYJLIF7`sbV{U@0HR5(@tVybmiyZ8H~5f#%4g- zgn(2^AP`Qtlh6YCDvF1_M-(3{74Hy55Qh(3^`6gs%6GEb+mR3Y9>rvw6UE!b;=Rt| zeF3P71Nf8ufEolS4ym(p4Ez-pBy_aQlL|_p{GVpl`@t< zV8UC<_Y+PfCnB$#RI_?KsiyK>6c9vPu@8x1sDZ?S0*F9rdqFe10rWBeS^z-u%0?=X z7m{sbL0VW4m@b1W1o2uCV_wKXWdsTXEN*+x2a0kgAe*Sb1CBzHs}%L`Ojk0l6TPb!<)27f4Bn)voGLAlk@!%A7@VMLF{bhjYgK0Y5@_ zetr?U6Pb|UK1CAJ6)29Fgp`3`Ke2F3RFXa`KP3383XG(lo$E$A7FSWBkok7>5vfUX zmFyIk{2Em87D0~!;0c?DqcIfi0Xo->inXHCNv@R~_>i?Y6j0}BNb`W=;#y8JF){_< z9smMMb{+s_szTe6-D~+x$gSc%DNZ(v^Qg^qgtdZ5LA^>`5CoMl24eB1%Z%!ElaYc1 zkvS$o)QI$1zE28N?j9D@MhMD8&*CZ|RgQbtWV25C8l7Hfu#b0sYpgpwF2Fpy9n-hF`tXeu;_ zAJCAi0ZEEi9Rok92n7r>%0)(SMvS%|$};drwK9PafH*awmy4jg6=B&ZBC(faeklJ8 z4{Tz99o-E`rBF9K@$?=X>g$OjnNPo^8Gz^$afN{~hxTzrG!Lz1oRqAWoA zvI zIpL6<4|^KlzYE!gQT(p_4J3J)5qE{`Qgfa~)k!F_chDQ(f+QIB6PfJyA*}rHB6O*h zv*{7WJWv9*ZO+}v5=DiJ z!Kgv@h>z!G@pt&}Y7NT0PF+qS1*&%IW=qh7r-Lb24v*UQV&Zm(;{`{EyW7JW{Aqi- z*ZXMk?7{p~;^g1S8TeZ`RAaS{)< zWT!8X_=2wZ@e)5?;+Y0>op#=y6YvWSu7v=?MAL zcHxE;t$r62o*`^ zcDxk67==f?%mCk6SdhRuJ8#Rvw#CJP$VX6Hx3Jjoufw|n7MoN_*yl-ExF1VbOaEpE zjVKhIf(j7&U+R|f?5lP}Lrj-kLoe@fNw{pV`OS}@+)Ol3hh^(MBg^@L zO)IqnXD;QZ&-_Y{e2CL&aVX1u(Q&CzpVyoaEgk{Io?OR_iVf!N+QUi%swEB^@whu-UXa@F(hkZl;#@(%!RO5G@|Ac=gWA4zPF)eQ@4HEs) znb?Ql&vwNz&{iA+ZQ*&(M)1~?o3Oh)7RN??ZCbu-&oANdFhA=({EUqmzGlO>6*he} zG$x@%6W%xB9oMqSMLkHcnF&S)VOfZHICyZ4EEw##KJLRD0zA)4EQ}2S8N>TV-@4Se zFYa*U32#Mz*UA@0e+PEBSG;Bzh$`?%O#e<;0WXzSkW?PflfY zBa$u$NY+pRdGi$5G!|fTp>5-M7!43d>9hFopf#oRxT6}k$(6=>&`Yq&`z+ct_+?(e zJcd2b`4zqG#oz*ISYfI8cG5m}B3vS!j0-H1--vhS!1D~Y6w(^>quz!eA8V*c1d6uT zz8^?5mln0wz5<^)fuhdZf5HbgMjM=)9!rz+tP?7KVV|&l3bUF&3MF?iI%41{up)Zl zRFqikAyB^`2FxRCSudWCf`RoG%&9TC)&f^qj2=AHk=O#iERYNZ9t5u3y>%-@{05 zCuS0CU?N@pp1D^FDs#)Ow!|w*G%W%1ZC=SW2B&#^^fR^6?jIAIOU+K~be*J*D8meT zH_I8>;M87hF-ni@}&sQ?#jPH)rH>4l(a_6vY!P=PrL6)cn3 zy;~9TL)@G;63@w2KcGxT80prbw-O0sqO+sW`j~I&d_Tw9C+{7(Rx4h5KyT{#InimY zCfr0EvyHC&7K&krD8}py7d=41dN{@Vvi* z=e4l{MtPocPB+&APizYsGjYOW_V%DLx24qF9yFV9Tnknpe)Ds%M{q@%walrv`=i5e zJ)gJXk#vJq4LxYrD818PC4`M@#~y>(#7Y4Ajnb#EO|LC+QnHOM2qAMs-w*Ek5c|ic zy)+f}C{t&^P+eQ{2Udt1V!M&y*?FxYwH~_O4AJ4O|M#~ zn{NcFG8e)-pTDWCAJ2b9T|0(|j6AL(00$kfVxI`Z{aOI(Y3so?z%gP;77?=knT$?b z4~X8;>DK*-#kD-wqW(w>ddNi6^afhQinXuBALM-H7@W9=1a4gY66*N|LjH^pe8TCE z52xK+C;mV_VHE32_e<$@bJ#)v{0q;gcn;x7Sf|_hdd*g5Iystq)ugm3@4p1L_$4l% z&{n0Y+BU<1Tb(g6L^GhCA?dUNVy8));9$ko&(X4nz*63h6THSlEV$P=-D_MM;!Mj4 z7Yx+6`Z=xs_G4@`-$OyO^nS02KEnB6*toFoY<7YseJTK-hs)TfI15#e?nB4ck3dSK zdMs#8#a#x&FF6mC5S{Q4f2w?U0>NWJoU4icfkZK?>9XjfcZ8U+;k#c=H(mD082>(U z?F{7Uue#(234x>}B#;`=UJBMba0dqr@bBcvHH67mVLSdXw%oT3Mn6<}AI$VOeF&nU zQgYk^a|h{R{ciBasWbGnc+i}8ZNTKMwn7qcw*VpMD1?2^ANcaRL)LE*gP6fif8MX4y~E8e8^ zY8M7?i`|l07b2qUiiJ9yvF$k=K~dK~+0w? z(HiCV33p6>A9c6jSKOn?@3U?me;{wpU`N1^Y2IZRBe*7|^eJ8W9E;u?4gn@ODn|YW z-Z&p;7uN;MO)}rW;EJ(cW2o0C5BXhcJZ`G_&>vX`$)%-cE2e_*`ZmCb41)ds=o7F# zMuEfow=+-ERldrWJnCZryI#BLoLi=A{2ei0{kj(77gX}lD46S-O%Mt5DPZ{xCmc$; z`r{ZOf<~XF5@+3@5)Jv4`W=2N6GOIzbB5b-<`RE>+mUR+I7v1p1IdsaZY3pe*H0zc z?WG|AmP*2GK;L_TKo=x4@hT`^8`0sMBvw^`I`_gsDEI9?IMTS?m&ZS2l+>-}BUH(C zs!E7M28hNkRHTu%QIZNFH@OC?_~}>`X}AAkDgIo&9Dn|2CH_o};ZJE9{`_JZ!w6Cz zQmOyW6$-xpxLp1InFLUsE(SauBjHWF8ri`33C3<^d`sKuAGIC!A+!0>1ZRqA+fDC% zG1#IWV6R|hW;$Q>8(~U$ruSaRml9!wIgxUDkH(MzXZJuGX7})VcIMU1p5*bV@c!}) z#G9_)Jlic-N{CF&rRD*gvG$scEDRl`k72G+IT~@;x&nr@;GFgEFbfQhWlV^ZpJn*P zB+mn%c#|WZ_=OCoH@(+SH%_~Lso5NiD#1gLLXFwf36FMycN-T#*6(rT%pb*$AL8hO zvCsX0Fl6_c+hFoy+vS<@fcYBlrnsyL2Fik=5tqA&9ljZ%>7Fm;EPv#a5E;j^V4CHJ ze6~8#9Qis^Tl`B|`aS9v&o&s0EH%$CvK}H3;nxP zIW1gp57NQeK3G-zWmplJZz=f{>6@_y3Sq`NA1M>fYUzVzPxxys55|?;&(3yjxklpe_}BxG9shxlfuQH`w{?u3+0F%VyVwb;`;5eV;VL3+;UV+AB@3 ze16_1&5-_*M&VC3Q~*H8VEAV{@QaQbvf^5`2F^NfmLixDZ(dDaeaM(P_*P78!m~2J)~Jx z16gj^GD+3GS@+A4K3ej+*SKlB*LaF{;m2!+Y=m1w1=W||iYf!BdN;wZ-;=7JE?BcK zctg5u!tzg0bF>XPVp2cSyM7fLt+m;z^4$nApmHvQ)?#q&PBhSjGX9XC{(ufUsU%T)MxTZ`!m6Xk?IT!Xt= zOnCKr4L7vRKLv7_=^PnZ2Lf-(C^qT}Tdg4u9qOxgv5ABm-T9*eX1Bj!VD{!a#eOyh z)p^qw#SqF1_DZ6b+I`qXa0bFn99@CLmYUykU`$wil^Wy2Z^w&neq3t4-%TH0?U%3l z;7I`NlWbW=u4@4Rtsj3f5JP*rmQSsE`F8ExArDQ_95p{A3kG0ENxW`+=+P4$aQHKs z0o*jL_>`fs4~ICiT^CILq6B6$;}7f@;^-){IrnC6$Vo7hG6j7SY!HMhoQe5XCkZiV zKH}FC<3s;K!dN{K_{LA^&ih4h2PDdgBwz+xo4z+ zHd(&{5MVm8nE58_XYzS~4f=f1@+Bx7-kvS;{8AP3YeIcNH&M+V1ruV7z&LI?(Gf|c zDtSR%i8~`lVZizYY>jY(}r@q6)N zOPax$wBML?0BKT<;xB<(s%}g=5_JajM3XP-^uTC8tM;);#=RHkbqs+FwCPgg(Tg+C z3AjrVNB_|Y4Zv*om*lVa&3{sN{>6RsFIM^Mz49+s`Nw?GOkKw<-YWlmZ%-xf@Ba!}pv+O3li~0v2?8GQLXT zId9Z%$OHNsc*wzolN^u5X6C@g!X@t(M4HkMwKsj0D!1Q8gQ+P+TeZu!LIICeC61v5 zj?}!WuQ@@|_N)(FvZqP<#HQmWkE!JTBQ>v~66;ysaI+=F-U@d=m=MuLP{p*s0h{Ri z#%}7PGM?47;JN3!pc3$vAS zBy(}ru2H!-YabO?6g}GyJOg|2s9$E5qYUS0HgQt9Xv%K#&RCXXxx>NlI`CMtDZEL2 zFTSV&-vW=cj4ua#WK%Y>NkU0%v9b7~#Q-HpB~il9Vr>-lLxV5ExoXe@?j7yb-Y8(N z@8YOaS{xki&o2AFgD7xN0AU(FImuVtSFs z9UgXGZ^wa{ihAzvV3TKZ41X?Pi9c5@$DgXD_;X{38$Z`_>qoEbdFZ8&eMV3JvU%7A z77tTCb6=pU6+1uHr5mVN+PcPtVi-P0Nh(|p$A=Z6R={ETe?P0 z)MD3V*LrL^$i|tngzJ z+}Y+gmng-^H&4_oREf9RhiZIvG0ixF0?7`J^?S)9^S{qSTD{lNojw^s2^nhwgPE9Z zUBK32FQE~PiMiGYezT+Gd#G{kFl!KkFkB=QBix)g3x|^${KjQ)nYPvXve`}mkY2Hs zjC~!kh=|;t>F5+54MdJX@~lPxCO#83e6$`Zr-i~ao|x-qBC_Avu{UX{pnl0uV5u<6JrsM&NwbnX zzxkC6N!WPUoWzOK_(nPyNX_LzQ|LHghE{TD!QTXav{l&{ZSe8HkDWMb_uZq-?g(ua zj!LI@WOeP8o`Y=0ehfxIlan$qD6jeN`aRl`Q$SR~DkxPUy;Sy`@4EO+RScw;Uvr?LWDe^B z$>aI|K9B#L$;7PfFZCSF>#Z2RjhkNfN3V4n6I(==x->a@tw#`vwN3`u1~j6=HE_Wi z8P4R+n%(Ba=eaZXFxUkyU#J-zpLjrVkS~RUtU#Ug$dQajs`*#{5PvjpQ+%RCvU?A- zFGQH)F&FhI)!DtiTdY&~-Nj>Gwg&LK2aoyc#Y6%-mG41$YcmzUxyzrnj(i2u>WydO znt-6`1g9Z`IbeDt8UFah=aIhyQu4$v?Ka0~!gl2UI)}+j{J-HaoQF$`4rzId(>m?fQ@D_MC@f|mG~g#!-cB(rnYJv z&i&5H$cFP&Ju){twWc=ey#Pis>~Wlrh3B5MO}f$FS2#Df`g^|Uj0_rCZL_X>K`6)x ziwmRVNX{sR5$vyZvm_x2WtErjAzu0(&58}$ypw$ z%5VFocixf~qw`Omo*t?{&nXf~oi%6RaH~pE)s;k5A?k!*5S1Vops6+A)6Flj-y!w= zp$(ka%IbDRy?=M~1Wu{>eo|gl@cp`wtETOhAkM*o8M)U~fVrX9WRRQ%zDu6uy>GK2 z(8D6oXPiXp05t?*P!!F2ZSv6sF1FcW`OHVdOJ9S6CxdS>(b24LvNW8A7Fy8_51h!Z zGraDZHA8%bWx28=x|&Q+^EENpzYHEE^%rD>H+_^zHwck;(*05Aq(Jof@a#jmm}0)v zoA#$gK1i=F2wjZNk8T;!)gG@0Am1EZgW<3Nec?p=X{*xz4{_fD9#wUPJIQ1qK*E_Q zQB>5}MhylPjgQcP&IvO*gA)M-4GM~lQmv1oP82MGgh@;ehXJfwtXidNt5&VHwGbXH zNx&q40)kZ(tAMCy93N;c1Pjdl|FzFN5>RPx?|1WklXK2~@3q%!@4fcgWw_TD4ab}I zV!NKvJ2p`At-Z_bHI76mXMn4+$~tH4qH!2Dd>(~Is~aO;M+Vm9^5E`L?v)O}(X@5- zE3|z%ELakzxL*~5^h(+$y^S5x78wcGdB3vv(6BSEwi5kSHFpD==1Y{9eq%g#rpJzn zx9xckh7FG!Q8zch8Z>s4Ue+?J zkJ*X$;cuS$o47~kKt5jP*o-Q5&Hq-znjm)YUQ%Bh8d{9;dl1~Aho`$U zjS9>u;CPqUH^Hl^E>Z>75|7Yg0@eX5F|f0|#;vAr*z^IRVOV3B6WAZ`@ck15h{qR1 zjDR_}g-b6L<^wHU{Oa(<7z`k6=34kk%(`Wu-c+H``0_+yXEB{Akuwf6pIL;pEHAAjF zFbWE^ew0<=+(nDHYe85v0&0MDyQ8A&r`dt3@+|DOW9%-=@tHrs;w!eA2i2Js_p^t_ z`1yKxzq5KU4O2RNv^9bY#hL@UnX!2r7eZ(@O=}lgFPWaHu~T3)z=WhZ9Ws*m#z9{%UtW+MS7vL zMBG1f@&0(Ass&5Y^>vO%9pur*fpURe15(f+_mcR__5wfWG8mI#x zk}yaMG}Z9@J`k@t{(Vs7m!+Uc6SN5TaU@A7mfGA~5Ff5t2>khsT*$0>T9%WN>o??u zSUc(uZFJr`q#!xMLFEAG8UC^@TKMa1hJnZ;=bnUCo1Ss75X!pLtRFhZnByOzt@p|<7_U>G(Ra6GRNn(+#d(T?X7$s0WIR}oSe0(x7Bs4#t}qYSoChTf<2gY$dy7g!5KhlxYYm~?k!3Yt< z3_Rc(qBi$rGVh9o#(2nyTTR=ZFLLf}BXRp8cxX)pGHn2!bfD)m2VqSy!Osk*sFyj^ z!w@&?i(uL7cb=$+@5u&vm1il~%ns!eEU`ATx^d5Yu@}sWk6|eIxH&%NHGQ}_sp6ky zYi0IYJ``)_+Gx10u2_kUlykVX04a*sQXL7r+UPdC4@c8O$AMh@H?QeWH&bT)JkKph z!D~{vC;BvWL4+TT%OV+m&L%9AGJHP5A@hRTl{Bx&f51wozof%w5@xi2Huq4>K|GR*o`a!N z+WIC8jYXi_o#WCDa(FGJu5 z=CMR{Wb&g8z@j5ih}IAn`9sRd&p-eO=%;6k7}}u3&<2Phr#AO5Nip z-;pkV=7{|9J)ROW?u3vDeV33)5r!>g(&+cQ(Jdu!66m&s4MJzmxd5E=@I}r=5TUR~ z(B`!QLC70KwS&ZetDfA4OTNV+vW8k{BTKndmS@Sw&l*_g2k)Uv@zZp!1ZE*c#BLR zk6qG_Yhmu0r|9ri{Y9&l1+`+!o-I&AaHGdE?14Z**^Q^XkeVa?Rm)rqmWZ5vp=-TqbJ(<4Yz|uxq+fgOHMkCW`dYQ<^UAC6KQ;ae{fa>3 z=07HmVwkR{=Om`1doWKNqno#91*^v2U0gjYU|c;A_oBgLn(^~(6~@gQsY+lfDRal- zPDlVu;Fb|Y*lnl7(XrkNtMl@X;ta_zgxm!&# z@n0sFAE!+&V}|bwA6(ToTn)VrCnti&_{T4aWL<{YWuqKk0wxSA+aJf#p+bGw*a4w4 zD$J+aIElohvW=6<4&MjFn-1UmoJe-~wyMWlGOa9NYPHorw@v1cNXO)uU%tgB*eRys zm`8qGVYWi*E}`TN7Pq479csM@bDKcKTMKa;bn)oLac3NX0|WO5;E^)u#1V~(r#Y20 zvD_i)A%y|;DtOYM&QVc?)1N-9MPNEP9JbLb>f|J%Xm>u&o+x`?$$~+-TU0n0QhSX_ z=(!iZ$c$ST>fwJo=`z|g6&BHjU`Gx#d;_1ce5i6;Dj7^VVlbbe(Q`1D48XtG%E4Iv zo_+8#)4rg5(LiYU4{I;#O&Zuo2(Fy%Ep{Gp~}rl@4o zX0!*ss0#vBt1v@+iw5yn+cDh`p2cm>T~^&QP!Uz(_NGI?T)-^|Z=_Pgc3)q8({}9s z8nPd8n9W07yyvLESHA|UTJh5T@#%xLBKixO@PJGN#n80U33k*Qulgi0 z0nbTyKuA1S5+jyA0g$p1DUqrjsi?}=zkrtnWbG>LZAxPzyDEV0xn+6SeQ3p&<@6%7 z8#7O~TvUQ@X?g4n^n=Y-Y3EAXo(+%nF`WVzqc^}}osWeU6B;Jg!~D)JzjF(8a;Q?I zTFmPjF-l(54QPwW;o9`O?-?$T>O7SE-;Ua(MhseNw7#p)(O8esI%KD#ugGY9)@`(i zkin`+kPk9M9IX7Z^DxVW%3cKy z2>ojz7oTuo%53B4LGuAGQe(*3_soBD$;{V*(OshSoh548eJ&!xH71ng{oo!AyR~_| z!y*XIRD^Zlaeik@1^6ko8=tl$Z;B7saTxaid<)1o;_IjV#76f26$|NylUHp?9-?ZT zc7MzjZ^tsPGz&*c3t`*=2D3?r-_mNdDPDa|PtMwtse;pT9t(a-7OI;*2l*>b=~Q(J zFYOxuFV!QLABgqE`rDRDnI#L;6bTdGV9$xyZ0^z<+O&G!O%h+9#>KRz-y`UIp~2R} zNZ~MXhzJDLiEc~MITM$i`o)g7F$Ofv^TnUqzYg{FYf1U zGZVkLmasK3N#B6FBUwD?inA-^A$Dt0O+gKJJOOQu_be8fHfP$wyb&|iWHejW`VpeM)z zR$~349Kil~RK(i^g~99kSTu!g&=lIBQ9Mq`Q2|YXAjb;Gc*x92S-@8_(`VKIQ&&Uj z_Tp?cjef(gWN+REHq7eK1Y`Wd5%+*(wMYgENGJ=`3vcKtU)Rf^xRjr;VC`&Uob$dv6AA?fq>`qhesg}7W5@f!T!^9r8#nrly4aXODgVC_RfC3jbRn z4|G2Kq5Ar;hH5=hQMV}sN^150Z^mo&|CjNC*bkaFa7ru7>=gAB@_!Q{FDz)@NwT(q zElmkt=Lk_h!DnH*|t+ zzfLC;9k6*?l^tJWT-;@j+-F?8uR4l6Ph%-uIrPHn3FPFCVv(e33B|CNPoB`e+ni-wrZs#h ziY;&E1;yMLGzS&pE{#C|ChQ-41HvsQ1**mYUM6lNBW$yJhra>jKF0?p*zQ5Uc~V8(xHsP&y7v*?igTvDi|Ornx}u-1C@5E z$gy3-zg<0Y+PI_RSSG9h;HFk#^nG0lr}VDsdVvs-@N6LAFTGAAv+*#ids$8UR36Vh z;vx1xoozg?B#8JK5HYG_@i7g2`C4Q!P!U&tEXUb81-?M>egKd3?<_aRov6T<#K#`s zOVRJQgD>Hq@BbtG{x3oIWrBwFx-JhOs73YyT7fFx7{M*B(COxVlukmkNf>nsiam~S zo5v+kO!2tU2l2Nw{OZZy{-5I4LHzAI@rsV=28yK`_xx7dhTlDJ^i~F(1Mt9oNWDaI zt`d_x8hv>@@y=;6e`J*0{dhBAx&Szx+x46}SG(wbc^;!k!F?UzB7S;#fLMqyf4!aZ zE=eh8NjIZ}32=@^uflnGEbaw6(Rh^za>9KbNHA3tKHT|@cB(Ub6qRik1*eiI>jpbj zZdzGjuc@-gYx6I(Q+@mkb|BR(IGU7ZjYXmE>vplgfs&N@-L4fXIT|=oy2u3idw#Eg z@pzB2+=;SKsQbE4S=L5Ls>%xWD2oa5U$o1*vPW415@n%K_jMM_YDz0>NRP6ZApa+J zS(=Izun%NsA(;Jfv|sg<9lP#PmiVKz65qQ|0F&$~6XYLbm)NQzd3K(qUI$jF%G!vp z2@kQXub!3sILhmG{W6(cL5&IW>m(3`PL-IG&8Js~^HK=StW;@_H2UgfSU0a`^>8qth97r})O8pA5KfMDo0w z_+K1E2Qaa=ou0aNp51C;43rUfU1bn}}xVQ5+z z1vqt#*e_YaAS8dFa2NW6Qs^HZcRHYyfh+|p_G}-qkDiO&0lKr^s}<2#I~`@ab@BLo zJIdRJB-@!JhqX-~h=ja~f=9%1zjPCXJgFu5u@W081Yox!jE$#ZJ}Cv>|h8X5ISLiNs97yz8ZDxWGIjvq1mkNBQy-bSicnC;PgXP`5G@OK(ZY4 z=-f?T(^UqNqo@fdcjAjpz;cYZY=4#Rlt08jTzml+?I*v))Ob1fNy!G!+}cEp9kFfV z77^zYSMy#1omX(s&oy#>BrmK26;6yY6&gYJ>F#r{XEFGCgI~~hkd$z*mtjS-u9xdb zlnW+&J|LU47&CO~UHoJ>37)a(UmRugu8GPm9BK6B_yI2n<(%xsQ-KUb$PohZC@i4Y zag_2Zg6VmDLT>bVWI;(zR)fxaQ4P8v$XYKgL0LNxEDo~?U-WTkTJtM$ zxdS1A7JY~pablV18v4i$XOw_^sEKHs2uk!HUd#av8EKVGS_6ODa%%(NHAJc;Cd%bK z?YzoBn}FFla-mmTs^Spg5)Yyzeb8$YcOee6!Drqr^z`jUwogb`=&=M;#*m~HMfx4^c#bWG%#?U zxC3Rq&S(svehVt6LwDY7MizN`ZkK%9B3zh$0-M!hg60#(!uHiAK#$G|DTD^4o|d z9nL`gnW$a>IKhjrtMCu#gx26h_o`QMTVAP|$yJBRbkDP z3!I6tAXIX_QAFRoIf9PKK_V&V%@%q^*jV6jhZ*4T|DQI~tkn5f908N>{> zn9vzTD$biDJ_VEm9KC?)NhjzWv6C$(*K0vIke00$tVKA7TU_lUsm+YY0p!L7+#KLz zZ3$)s3Lrm}VzKJSVy`1P{g~o6?+ISk&C#UF2bGQ^$sq-8y8{5XdjjB#fvvpVgMapL zV))b@CNivljVU$d5X1Rw+ehk9<0oU+ecXT!7&L_xdN$a!=(3f91bGS-)PPOqu;oq0F@e>k-5fH0 z$N5M2`@fH#A!vR{o?KD&_UNj)4>$W6v;!uOxM1KCv39`Cym~P%aL$6s{}sZ59zWpa%omDaV* z`!2ogR*x3hf!HYv{8g`DFXyN*b|`R;fSV#XERBmE3ed1ut!wti;}Ks5Yr-~}l&@+; zgHbDTzKiZ4>1wM4NpV90T_ty~nzhY%C?>VmOqD9c_VM+g^Gm58ojX+Bndn4X-F8O_ zt3*Gg-mN(A_wDsA3hytd8KFGidW&B{eeiz5bIJ*O3)%0I-EAYoYs`Y}M6?#y5Yyi+ zJ@v!iEtk+H^Az=s^r0|S7So2NyeK3N&e~6&_e`Fljyzvj0Ef)Y+fK!i{vGqNPgT6l zZ@NmawaslCHlBhJQU^e_D_a8Q7O%O84piYsmF``GCWLQZ!$t^p-m5XqABntycfEOE z9=D0S*e1G>7A4oi)$#(Xbq*?sR4gjlq&L&Il`@dFevjY^`zqYTJ>LU;=AY|P0q$Q2 ze}qffKSJL_g?<=SdkYba!gu3NaB*adaF1Bhdd>AdbG1J*eo?@DEp)Uv7R1igWNQr$ zXX6;caZw*c)^fDZA;CY!$yEA$Jrkh;b*(OJ(HDiA-(U?jE|^DD!x;&D*4FaEWZ2IJ z2hXATri~)m!N>!0$1)Ozeqh_ZoA&L*a%Hk!+zP+80p}*G*M0pGb);RhTm?@tD+)`C z019uRm)(MyYppyDUlZL(Oox#6M{2%?HO`S5wle`s><`Knz_uS>t-hYB*2OJ28x@TF zb^$)T=8D-o*i4XB@*fT~cc>%IM(>iA@T}FD)hD9HAksQ?Y{_|t-Q5|=We9;I&ed?t z7MSeuBd`+ifydrxPIx;kqH=Ut`Oe`fXSJW9oA2wbUpT`b^bVa-vfER7{#}F2%@_dd z$eA?G5}O}z2sz}uYsOAF;k?T0+!Z?kuQ01WS`IIRZP51I++sc21Z;>DK8kbB{x~*t zsvpCCaZtL_?YOg@!@33Oc{#!Lzf8_C}*yqTDLlA8P8u^3fs!$ou+2Z14SjOXC==I`k*}4%< zKw@Ws@t{gH8TnW*fpEb}o_@wKL~jN(7(2$IzX&M=9fQY^b!aB50g&MH7;S{-Tiie1 z-)^=Q+la!k&->uUejw6{Hg03>4wcwVwKLm^%_for$^@ewio#O;eQ-PaySo}ly*o6} zY}|?NnWMihYrV?_j}ka?GM^zOyRkzy^V(olsL&h0-7`10Oye2kiLPf-`=|cM10x7d zz=9o|WU*WIBQ_2o-mOOv1yq4G9^94=DwHE8bwQ0@_VtXGn2UW!@jj1SN&`<$%&VLq zuO#Q|eqIuukacr4jIiJj8Fk`59QF$$$9iHRO?f7H{NY%wZkqIrY_^J1WWN)~VEgP{bufVK zFGc4a?HGH9`3;Dz0AKJ|dS)*NwlqTh{0&<}y)u?hg#Jf1kG`%Rn(kfeRdt_yTKOwR z!F|X#s_2tYR-#OF1nwAJ)u`8e%R29z!>yoa`zNA&h}F~W_M>>PFEZ*b)>OvU?=3mp z!T}|Kq>mKodZ)LBGvQ-V0$U$lbyhD2<1zn)KT#npk*hwl(+lHZ6K5Vft!utj9Yk2Au{LG) zg5&YRp~zX377ujB?I5=l7SP`iTI0bsXUS)11p`ZiY|1<6`cTvYj&WZXo&*X=gyNAI zt%0*L9R`@)tdbEmAdBk0#+eb{$x&`&ji{D@=3*p|K8*n5%y8HKP~YaG81PF3kWv(N zz+YeW6=rXEqmq-t&8#7E31(hPGVlu=fMv6uiMO#?Q*=W=fH%Dt-!k#9&lI1bGkk0> zQ-cjuP9UQ1^E=o1%UbXFTWo50Z+7*~iK6ekj>RVYMXJ)rvKqUJWa)jS^h7;l<&)|3 zY^f1d_hPl#=FzCpjT_gb(z3QYejkWL2&nMdxV3zGCI)<$?BJ2>ntnIUNNJd?&1+&G zp+!s%f?Q$t@FDc0UIBAB?55s_hm27F1+`@(;MXI*s!2btnReInQel&)z&7mq#(Zfg|D(;q#s#E-E@?_k5kep+u%V<)@N$!gdx;p(zU z*FyGFZv%qdNTxIu;u{_H44dknIn(^yYks8UEBvNq>*3*9j?e@@2FM&#gr0_S59)TA zKXOS1x^9(udjau!gQX0G&XQGxjv_|73C@|`Q)|pU`ym9Y^OTszl|$KOce`gqXu5<3 z*(xO($?lW&NVAiiO}(J6MYx(K1QoRvm&yqK`#XsJ4r|ek0;=xxgtVa4*3Re?V6)L* z<6pND4^^JeY_YOJnGi5ra3KAdX0ptsq!_*K-=rV-Y7(Lq)i;fHS+M7Flvu#y1gN-| zKQf^+mI-HVxG3t(+U2`2Hje6%UehFprCwT#05X2dm2u_p=&t8=Feh@uAP@Bbn2nNG#+G+xC&s%NasaBI}bj` z;*(xD@d*XP^<#YEd>+2wBMJL_KoVT;;M(fN#SnEQ47f-Ear|)$8tFA|FAW;Ed;F%c z4WFczF`lz`Tes~af7BYz$D)ou;%o96OPUZ5J)O&PFz#+*C~NV7vRt!Jw%%OC6o&65 zMBUiogIP0LY4~pBCywJkgm=u6T;V^%4N3#yWhdB%zU z5>GiOHE%&QrKS}*jnpsg0i4*n3Zx$z944iQPDRFtRmPho=0dhH z0kM)6>tqO8`%_;EFaZd-Lf#kA_bU+o{VO#N>oJJlh==2F9x5OR&#?yTY7|DJOmFGA zw?BQPqdLcGyRo06-BpDTOhAC!)yF4s0pi$iX2iz~B<}tkMS2!z9Mq&=>{V4>O-zo= zC!Zw+lf38zi0hNqr89_O3kip>xB=43wnB)|emJM^8^w`YWzN-z7@jO}bT*SlDfci2k|zk86^ zkQaeX>`c`&#$b?Ud4~xHtUkgn)LJ(c%9%9SYusH5_6u`fLXQ@~#3AVVL@8SGZk#T< zJ~_I6&9%x>iDE^`v&?TG&-Me(2g|caZvLJ;!A|boTFopcl8ad*=1#{SyC1B^$nA#| z2zPM zTpHdca}E)4&1DKBcRXvOV5S!0rUEjMlZXP?8bc!S^0pJ}k(J%I`7>4I$AwW=57!n$ zyNItEUJ%+gyie%e;eA6}hUbQG0$kGS&49J&c3=F9BwC&0$E?#885uWv5x%&4n+gUs zih}Nw89>f%kMi#+zW&gxp}vxx@a-2cE!})qHL(eL34GTD|-|x6H)bhhI>=34P`f`wj4AZ2bb}eii|RB({Nr0pHHHY9bE6p@m|d0+g`c?%+;R7}*vw^HRlm#CzDu?3FN_0t zeBax)3cGD#>1g-zJl2a+UaEa@j7q9~L)bp7XtiSi9M+Xsh?7YNr|MXFcm1@hf6|35 zrya=42^NTnOen4BE&JnX{4_cKBdyWWKCQuJ_jly?_V?E|gy?(V;Qq!x|8M&1wK|aR zp#GkXs?c9A`rECuvv+@6XR&f=?Ynt@Jh}!`ACbPi_>VLsLRFp-VFwVV;XA0Byl!@+f&o8sRH^6J;=phsogt5YgmNB?G`{&Q;pDz-z4djk(gglRDpWp!!B^Na394YkHeQPnjpX6W!A zhI$Xby83G2zsdTBT4$<6l`0V+!23eLt#Ey7GL^^bgH(1vs^SnT2G~4(LoY;2k?WuY zmlN2~z)^ILhdxVrE^E)O!jVaN&UpjrPL>)H^4vqgY#p!xlqK>LIu0@ip__O_ zkb!PX;MoD5-=H&CN9NWl4-HyDYG zLBXj4Q5K|$RLxmh0Y1Faj>YzUj+g)`y#nn3348H{BX%A?+}2?6U&+=hP@mq6PB}bH zp{y~Urk9UrE!K{+*@Wr>gcc5^07Ds^8?y1>`6nV@eO2jd28}(v0^}zY2`xzVs!v6SPv71E1Cy z)uL0SMIhirqX-w|MWa62)n8;zl;?309h`t-^k&Wktp49y!XP9jD5D<}V{H)aL9u!> zFTb%~#j-r0@*QnhmT1Fo(@JrjNGG2V3XNmJKEo1U3ddMB>YF17K9^UaKHMea3VmY9I%AS zvci2#9>P*qHm+OmoGdVdYgwks>pi>3!Z;By*=@jqBkm6 zpf_wOD*T`Q1?cTx*l_~A<&oarK!T*aOA(u*-4wl%hA*|tq+fk-eE6?dWuC?|eR8JV5v=Xsx_pG(gWk~kzr3cGTR{!9^7EQyi7 zJ^foSk}yic$QOQ`hLMa*GShG6eam2%qTp7)0Rq!r(IA))M#=+NgF6T*b#qm0T|y|@ z^Kl&2Qj@%HLO~mG7)ZKYIP%U96{fxbOigvdmIoN~0zek>1I9AM=SHLgJ|%JVC;-qJ z3zz{%`>Hjs>xuFb@rN)7F;d0;E=N5yYLTryWwAZy@&(!HMc94lm}P|a#$W!^%a1W z3oGU#N+P*yk;*z5QKGd|MgR!`I0y_#h}EAYwRgE(xH<=Xa6BrFE=4L^l0;v?djhz3 zpgdcAY$%q#7D~ys0Ak@O0pvqsQge!RSD`{%b}UfYE5AMac}OhTlY}w@i_+aX@-3{p z{@OG`5vogQ9p6eQ_kBiWs~(gZ>uw_(JfO+-6fcf(R7)ht? z_N(N7#HjU4OFLcPQ$(Ac52%4856z!@bKc;j#(DKUUJ@j|8Yh zzUj@pJHjdfpwOGGGHl(lFSVKU`>YrSN3zHgPw+>Zgg%XOn6g+>bZ{><_$UsuTd>+x zQ*O1(GEo-Rk->y#6b==;7Va~;rdUbrT9?2)j;HnEBuoos1{2AhE>%(CvSxlqRhf2G z1&6N6`E6C*!>V3G>7bZiQWb{FVI7%P)la(j3M#MHx*y_(tViZIq9k%{1O3YyWBvT@ ze$XH6oAoTEz~$T&d@kcsv>iLR87DWGi=Wlz{y%c zEY}#^9xrQj^@U?3q}w8$b=Ee8l;?q*dRD*Qs*>sxNO^>$$^RSRVk4y}Ymc33BPG`M z9%2<(^j{=T)n3lGvHp(v_Vb0ps_Y%|JFVSbtl19cm zFeiHl6aF_b;opP_KkOrA#U(N0z54w`p1&fGH}bPMN>A07whn~#uYV-c-Y4aQ6gYi7 zhV%OYb^A%5H96%?z?1kZ@eP6aYMJAU-m5B2o8$kz`0v*H$@c0Tqx7XfZ?dXWQc-$j z-075q8P;!;IeVwIM62Hl#Ih&)$#tc2YtOsM^_)bvuSWrx50+!1|1|P&K90UjqJ^Vm zR5M4I29+gi`ZdyZYvUpms}!=?si??!HP?6A`KoWS%f32v5rH*M=K8-CBuzF^x5lNK zn3}Y%1Q5_j9W&h!GQ~7CTuV`C-xi9ZUOL( zn@au0O`dLY{c{^Y&!BR9{UJs4L#@$otFbT;t=4!B+OJ9@PL9Q|?E?8`ax^l>6U0ip!VJkl=RelHX*uSAAXN@g zL#L+YSh<~bNRDx7IXWSFRE{6AjtkOq)TDC!AT7svn5C;6U!wY`Yf8?=U z020k3xD7*{@|>%I{KhpN&S5FqUmD=y#MEkAR z4r#v?$vye)wEgZ*7L?lWM#HfKeH>CCaK`rDkow2}Ym014_g8^GL12gLLxkD;-3J&Q z$sH}>f5!*#7%57SoD|sMIvsBVMF(;HUKO>Kk8rvvr%Y*OeHXUTZ>NmbOg%xgB!q%+ zvjZ^7tUg}nZDE~yGwZUx-T>Lx&$-5cm-p2}uU;iFNawKLL5vC$eoiy9U}S7(%n47g za1@;#LT#79x}npYO}z7(v)%HTL*og*_F`+vrof(ENW14t*uwh|pqsOs5En4#Y{LVK z{aAKvi9YeB3kI=lBJ8P>_u;8cd$1-jzqi4fR-BMvP1HI4#!_KT)4`giCwhs~KjtU0 zZfjkNGKs~0VJG&Q^8LgWzi~OzXZY*d#Hd4=;+%wJ#&Wg|m(zPfKh&0e*ym1nc;*?skfdwIqxHCd(bH;<``5J~mc2=bDyeUKihf^QQi-pEz}6fyABLx}%p|=)Gr0 zTIh*4ZyMD4Nme2e4z{Y)$LdBiv+1Uk%u)Qxu0^^jmNM|1|0`S(=WJ{3aw?k{KRRjr zyi}oDZ>^!79c-qtO(t$YtH4+EFZkCHCQf_sX4Wzi$DdlaXBy@+ct`O?!wU1lwg4M|fcETjFzP{L_GH14kwr*U0B1ygW6mNp0|vfs7EmUo&iFG$ zEVL>b3Y4Z&t3|qp5Ahp`u*>kf(f-|yXX2Mg&u<}q z>RU;Boj;L(z3?sk>xRFl@vrPF()rgtTZMmJjTB%>E8Z3UbuPb*+)Gv9LU7&=*U9*> z`PT(1{Cx?}#|NkENPnIRzZ->gxL7BNw!?KT-U<{qd-n|~xS9#c&4OkIC}Ru8qU^o} zNK*3yZE@WLc!9S&ASENrI!53wz23k?26W2+yDF6d=WU8{Q&6`oHOVZsO>ZD4j9Lp&Uo6HGj^NjjI%>C{7~bIwRmRtbeuUqd_+?>B_e!Wzg~#Gt zLKErtrZxLVIvsVbs~$VWVMs{pUbnWmH8!-FXK-SJ^_J~UcuLQaPyMu3ln&PuNT31U zkD?rYXp6IOR)6uFM^U}@VrT2#UV7~^w#hMLAo}|*8Xw8(8}9PVJYlH^p|~Y5U)NUF zGNQP3dT)5-=j)!g;eUT8UQpI-mZdvp+dY%#@DpeD8RF5KRGYv=SB_9pDSW8DPDT0XPYYgF6~ zXRsaKVN$R*Z!@-)IP($VU_4d02zj`mzzu0GC@hdCc3$v=1>CWakaT4*6$gpWz5Vt6 z_<;EnK1NK$2Q;{)#~*?I42I6nbJ4Dc-|Ej#%$NC@yJUM#`h8WS%tt%i=pO(uB@4}( zYOu*p7(&nT8~Ilj9O1xKtVpdbz9^%)|}o#{LRW|?(F^o%-2qh4oIm>K-05BFON4e+(SmI#1&v_Y%igxBG5 zt$wWn-TQ+u9~$PHRefPFQZcK7XJ0mR&eie5J{b7%8{o;e1Av(H6O0tb^%y|=d1hg+ zBd+V@)pga0fdArNiLUA9C~TCrfGuP7EC2L2_r=Zn*)Qq&&{l71d9DB?`eh7<;c}0Z zm^#K7;p^>&1L^0MPQx6=Xxe7?YIyI^fZ;hIK-)LVG?~z7A|z6s%dVZ7;Rp?90P>H@ zF@zIni%pVld-!+wj|R3DYQwYc?A;y~I;!2it9Gx4pTc997eFIf@m2AK-T-PQMot62 zVkjKcO3Aes#H;(+ITEmscZR!;)*AoDenj%m|NFkU{~>ekZ0jr>UU9CCZ%0vC9DrXV z0ia_vIxx)9`SNv9R=e*fI1oF3Ai~NT_o4f`R?%uS4q}>{kp|s*1=j`Ru{tuqAO7Y- z9e2bT3z^d^-9Xt1Ic ze8r{cSqiUWuw`p2+%PBSu!owQYEW2(LW$C)n3%2wTnofds43lqSKMd zSN~b4x3}pzGI(G8PObiW1bUmEq(l(&@Y@QQw5HNu}kIFdh&2SCn8sUZFx zGNPso*q$whaEt>IVGHMcrHMk&=ec;qMkgReVGl@!ENXPcyERl z>}+=2^^W6Ld-k$4yBSuWC%a`YfVeAlO8ZNYKjql9<@X-MyMHn39pzG^&*>$WyU)VJ4CBL74iP?O6n&dKxQ!- z$vn0CT*g%0&mbKAEEC;FoBvO&H7EAds^*io+S*MVx7cjY4mdk;xmr7Ba4N&hccQIg zE@}Jba>_;->4?z#zf-UKQ?GlXGf|8=pR$3SfF5kjcjF^Eg$;rTF$7y?eC3(&9eH_u_<@?es=bGs62tS4CrtfZ%?dS^b zrVF>bc!yY-=wOELZpio60TA_({Cn`w=I+EgApDy^Yr=o1QuL)VnO@hag$1#aE?OB@ zUqws9O8O#%bGM3G9KEm5kwr@XTkzItPREz{D}IT*d}a<+-(Mm8hxYq& zJTsApb4uPlkXT zPv8UIL`OaYMd_O(g(()ud24(P|!v6J>b z&}YA(J{vS@3c%Z`lcsB&{>aO=#wjNKPJh{|>OP|0I&n%HNH~su%dolRgwj_4lqM4c z#ulLexGJUD)|d)(oapp6HB*-1Aad;vE!>r-HQqogm4~o66W&(Fl^rb3pbbNi{*qE}%Sgo;JO#!w^}fYr&3MgVklKfGAFnQS?#T58rktwH5TYC8-Fo z&GsBPx;{Or7G8Ody_hXr zlVd2MlZ^2ew|I@Z#K0$DdJk|6Wp&1?4qZvx|Duw7RmoZaLS|9C`gpFiP%oYafCLBODS91t*9A)uZSR*JmRV|Ph7Fi;;X;kqdgS$81s9o-5% z)D0B}MAU0d!9+VKdYfHc0k*E}>b?u#wT6Mhp#O86ccCIwFc%Nv#BPuSh5-6M&;mjo zORWt%BrHsoiAg>O7NF0ZuJqR$o5|mVK8uFi^hp55mBRfnV@U_1t{jNY>Gr)ZR+EbC zicL*@?21+K1Kfc?ja|Wy*VX$dzQ?7!*afK^nX$7{A6c=&)JJv<`&Nl2xakA{Wi7Hr zEGU$3o|(P9hO7`V);mlBYY-+c3#gw}s2(K(^$~_J@ z#$$?2JCZ;y<*qA}52K>MZ@Bhovc3Q+^p(yi%m`fsT>$It3TI`So1EWzo0fBeo0#9? zlM`G#sMV($kKR=fEcFU3byRp6`@LYnl`IKZP%wB4IYT~H&5#QcGvrj7G$>}ra0mf; zMFFDLW4|6qy;3c*L-)jrlYqm97sAuVQ!$;)7#6tKS)%}brK=Zwhpt|b($%5=(5Tzo z5TtFqHR>qQ)e{N+Yh8WzPepA`lyjK6`rMnl<@!%`^+^l6WiJSwn$puVexI(VkDMTS zdV$YaE(>~a5+QCeT+kdESMP&uMefGFM7&%B4}F;jxauuiLd{2;yBNnZMEj$Aa_mP_ z`y0bucDud}9I}H|sd5P%)gHbjUYjtcFkEHEubh*?MP~Q-xvjK4UQ|b1~CzYD|n3Gf7gq#vi!OTuB#5#zP`Fkyh^;Rumq=B0jfznsqrGZGg~_0DFAgV6%NDsj4$ zxIa;1CQ1yNk1+Kp_eDnOe4}JmV9PH1Gc(VCgU0(gp`}AC*_j)f z0EnT=SSDrUCCV778lbY=Ukgwq(oaz7=Scda6X}ms>6s9?f;~VF5vH4MEa^w^hxRpK zzFRPd(ChYcPq@0EWRvASx{t$njEHSKMzl^V=bBa6N{17T+mY6+BSP}vM5*WOc-a=M zK7i0W`=W&P;LV;T8N(i93N73R;oK{S;ZDLHeApj|`&z@3Xs4(24b+N}SHg@xFgFF(dh1uPOf~N%vBvKe!o8P7JWSqa=*y7i~V2x7<P}r+*%MSUL@e|&tVr2Z}n=w4Czs~CY zVT${f9n5`;zMuOV!n?nf-R2m}Wz?iI(4mOWFbT*oIdU0Iv?xe)yuPmt;5w^3hin#m z>lh$VmhCyA+xb{H9twY22}`vipSg?1YAJxd#^p)VO(Lh#g35ZL73FXuqFF>ERUxq^gX-$<^!@) zWLmY$iLfB!74}Bn_3)Yqnua%79B)+jJ!1(ZypvdRhU@u1VOgZ!0szhBlL1U$$!9_H zn+9Bx&5I(v_7PBAzc`4by3QH`J1<(mv@nMZgt<4CX>KTwWDPER#e2#=!JoLR4SzJ zM`tYP?9z+>?JfIEn_Uhr5=6NVp*4n#a0NJw(`TGj(n4L*!=t|Nz6LCzK^s>YK`oWM zc@fGB4h5H56Hva{9(#Sk1F%E53BRfM-HqQ&`^WIZ`E5kH?T7gN24T?m=J*n`zjSPMK~*n(+Rvj?u)EaQBb z&xm8;_j^I(5vL#pN0OZCwt)_?%n6GEXD0&iC&t|v=_q( z40wazaJ^06HOiD2zO>L5HYjMUq@^2NB;(xvERPj>QCYU-NoL#bczjdJtyCA9W|tBf zGX!N@x}D{{R1D1rhT>EI8_I?yz8{XQ#ueV^Guzc%@V%#1El(m1oQlB`J^#5SG$MdY zDeI)&jASP+8W^o(p)gXoQJyasPUSPQL@l*GRfyZo9KvC7hM2YsrTEr(UO8x>Khv`D zbNjPn3g+#E@rhl~Ae@P%pmw3TR9HqgboJ2VQHiyPK z^*NOr1{7&g97!u^M`13J7R8~p{`h;9>m!(*e>lQ?bs6Sm0E4)3D@vZzsyLM{Ftvs@@DLrYtcMLMoH>aeh!gV# z%&~6zXC9^T!++)+Yllo}1KG=3&=hgjY(;sL1%!^p#!l;19FUD+FQmf{cT7~NMxkUj zsXbdS8&o*s#ctR$*?QIPFS)8$TSE8I32;2l?IJAqC24KylWIWokrp&Ah9BlzQ@mv} z3M=o_?ehgy^BJx!b~e?EK~`=m`ur}&#|?LWWK$n{t}c!32TP3o}#4{VZo zhm~pbA^;a$px1(4{gDPXI2d{H988YrSd}g*AHw`WTjDNR6R6tlH{SyWx9-U5@YR#I z`)}R~bE*|(T!9D}TEG~cjh`F8f%p~RSA-w*6Tww0|5??sIWRxB!y;pHLD?DBH+G+Y zmWm=Bjkm6|g~b)!BRp289WeqCgwl9nK+H6zb-Npz7Di5jNT4YBAY3whIMxhvv+J=Q zdDU-JQ{uVFroc&e*-&((XVNq6q;GUjN*MJ_nq?<_7D;hY`92mo1nKm_zC?$u1vc+* zNEHV@@{Jw(vs5U%a;0^h9dSi^#1$p}n>UsEoo`v0HWbcJMT-yr$e8|KbCva^9X&7= zO&~xZJ&5gCD2%xBm*BW$kpjmq&U_;I@BWTlR{Vy5j;z0;uihponmDq|Y(XFj9&+p} zd8~-sVGwY_I`fB$J3J+`C>i<48}{kOB!|9&i1tiYD95=~U%?3h*3!m2lNri&ZUq)50&s%7z7dgdGx`$d zLd{$7ZZ!<<=P-TsG@~$lD=;8mdm(|5Lf4jASotvESJd|slNys=_8K>=RwR1c=Dtut zw1y8ba-QAonW3`+X2qwvIes6C!0J?03$@ek#-er7Xln7jZ>#ua+& zahQPzIL-O8PEPB%6KNUXqG0ouwbmSm2@mZ8syZR^(Ed(;WRP)*bK<$#F&y!S&*|N5 z1)*Ehc&x{oW3%Bn1e~@6XS>X`bU#ma(=@_@e+3B4z%QEoskx?BvmyS-&k6RT(ZjxL;qBE05q;KrC?CEC0TMCkmL zA_%gFvP56usHFtLE{EvzI@WF#w3Ya=*4Ys8pimGeGzoY=-vV^t>6^&-1?o_Kd_gl> zOqv{Mr}LU{*&G=^m&pL7q2#eR@`sBb5xR({CMWX?>#FfFrM4fHcPTUh=E+`6g#B30 z)#@)nO}M~Bt1rh3>km&a!aA#g9)zb)&Zs`wZY@Mxrv7?Vxo-OSVHc1dMWEd1$wG%8 z>E@TMpJz7g*6L@VrEqYquXKQ|*xAkZ;0{gKE{03?2L&v`a)fEqkIXMoV4&&^HghYM z)LVCCf-y54Qox}+mO|Fim0-Y9{aGyr006j}l? zX*Xt8dShh$UQoSTd!U@ysttt*+tcfi?LoRjwdcV1wMS5Z%uCIqgs zL{INIDD~-ZNavRd8N0y)SfVOOj?eCgT)0kZwHlvOIEF}5;cP(yZ87v-^npOon}Uu5 zBwY;7$7*mMKkUJ=_18nR2fU(3d!`)J9;7*Rd*a{Ip5)+QJb07OsUl8N@`Qb(iriWo z%81vh(J6cVj*sCFD1_Cof8$i`bAYYQ3rInxZ!T;(7eTtpkYOnhmkM0w;Q(C?{(#F! z0^yD<3QxL}#$qNBm(p_^7GJ=Q_F}>Yd3oB?Vq!(QxhlE|Id=PMJq!=!bks5i z$b-Xk>YWM!B3LdqX7hYxtVY%~y9NDJ zmNUBrT`8-W-GaPWzcdy|!E5Z5Q@hC1I;7}AcJ~DJjtP|`c7%FIt&Z4H#-CWdDJgMx zN{h-1O>zOEsg_xITA!cDlVSOf|5lVtMp;{TKya9&Jsk}%;gjdTOgRKd=i=mtxEu(< zMgu`$+UFrh7wLb@FdBxU#*T*J_zw`mU&!T3c{@ee=*1r3#8Ie7UwRL4f~Wuk+*(2& z#-=Pb}yu8GZwmKwwn9&P9@-O+B6yCZk58I4d|mbQGq^BBS&~8(>l!e zX8yomwa$Oj8m9C+=Q9yDkN*_|-&$4nI1|l)kGtG)DAJTqG;7vV=s%EDUuvRh%ZgBt zbE_chYp{@Qx)JZa0y3huLbt5Y=8r3E*ihK+8LnjNGp9ib{*|2ryZ2%A>16A+(Z`#VtJaEmO zDVMeHquzucql4yr86k5%8;A2qI6?Y`_4DUcYZjrI(k?3q=I4V z4uJ9LMAss(O4pbfV65&f7sb%VX@k|aQ*AeHfZKBG?|ZYcT}l%Qt{l?SC07(_aUlzh zSWV}`BkgXvoCzl}vH)B1s25p3?^J}HgP+I#1@TP$66yJ!+AsW5l*L}Y*jQd6+xvxB$c0Th)_92pc(jKfv zM_kJQUcZt10a9SG_+>sK@OMswgxvFf%`ex*A0SC2cd7)sekCb$f1u)GxX}vv=Bj+Z zR%KqXTeA0-B)Od`-|dpbbu0^m|8~S-EA8dqkQL(XwJ56lBmh}??ym}>ngl;79c9(dg~E1Tb*U+eyN-LrBnT;YyKAqSN7;4;}(vvJKVB9U;6%=#YoNL2H<+UkW)&QllRQ+e4@~G8#^AFNW?(r4q8K!0K9{ zQtd}!h~g^uKNhi@xS+x+gFhV*cs5t+-$eqbAD)hI6AB#4uU7N*R?A(t1B+meej9N? z*LL^Gcy+XXlHIQrX@}!pNeQ>y&{jR>>)(=8lKCTYC5zv{>FIHW!#hN5f%Bp5BRxtw z5ttC!9-h8dhsyDVvtImCf)VG<=%hUaG%@plY{srbi)iWXdzR+fBi25g$NMl%J;-`9XD`O`y5=5$V$ebTI2b|+(0$uDB>TbJpEshi zys>yoj0mcL>wrNVkN;U;cyDx%zA)&Zz9d?H_&Am9OV`0wFeq(I0`avyhJ~=!8h!*5 z7Cr29VAuX44_5XS;)P%7#Fdq0Z_jZ1aSpVXk=i1oXu-*zgEpu7D>`#@RX-+a5{G5*Xd&gKJnm#Y5K&# z0isXT(bNFS{4#Q9s=y8ecDTml!}j-Zn+l(W+B#f5d{9Vr zxSqrtC31)B*Ld5A7DKon%d|%BCI5%IcaM*%x*ETe%me}?oS>knplOXY8m+Ww3mvRE zVW!N$L{UNUg3>2SvD!xq8AT14FbT==Fo2?h)+)BP((2=_mWx=)1(EnZrC}sjg zbWYRpoIY}h%B@)iR7HpL`73H(KNB`|hw~vHt~RcU4yEa_?jF=}(OwkYThrrLVo+17 zCr?B79bsDBs9|~=Yza(8{R|MO0Ju66nknCa=EG%&f#x^==g{Q1&`eB2^9IeVpn2`( z4BTwuqc?6Q9uAs!`uD;O8wgtdTiWaEp7yG0(6|weT<4aXxzErucBswD$WtSu^MTtO(XR z0v~WmAjmTFUr-sjIxJ>73VXUX_!s@umV?--eM1}@a?(jU?a>6M~%eb)3j zdQCqWflGbI(w+(nNk)QW>vfu!^hl5sxiTZA>8>*~5cAJE9sdCxKRa?pMtn;0x+N*K zc}31zH~RHDx;Hh@T*)^G-JscD#>zSC&E}8#`aRuvw)MQWyRUl!9feh1Guqz2Jm&ZH zP2F1*1){OM*(@(+_p&Kcg+H7{@zDVC6;{MSgHQ3>5XR6@P9 zr(U|o6wUOGshOF_rLp>ePO>Z0??>A2-AupX+V8zgzkc}HflkrOYSw`KlIE6LSxqeS45%QLzk zr0&?L(~#6fo1k6c$Y@hIfYC;eGT5)1+Nx&!#5$mu->KG!kK7>;bOM2ZBv70U6liez z9mPs{$5WnWL0Rr9O07R9nrozb8LJRZ<}vg)2~oM233o)snWt+sx@D~wh2@=7H9!Ht zqGzIrX1dzvNSNxDoOh&$<0?0G8|6sq>`057BxR41gkq0UN=4X1N-T5J-07zAMiv^+ z`-^Wjo(~t#Zr;@w?G=39l772Yy&-!tt+2`yZSMc9w5~pRC`~O`o#WI*95K@X!zOX= zQEP?BX)K0>Wg-IfBODV^Ab56Y)KFE6UHrA6a3}MMga>uK%O+oV5!c62uha~yphICX zchy^|A^r>q-rnU7@>p%ivELRM$f@r*OWY~A8&+Y6jYXHD^2r}L{oQrTI|SH)k5XZj zEhz(golD%5&l5q!s-=60%wZNeh`^(;l*9Np2{5s2y8TZkZgkG7p(s}o0Ac~SnT0{$(#2dWiEv~xF^`XB^5I2F zH}|-v=nf^KwH+pFs&sP=99l^$Wqd^$30=myZW*n_rHnpCy$DtMW3!Lvkalz+fshd2 zneqbZ9Akq|kmecV&W5$UN*mf!n$*ap=&m`sMw4}E)Mx^4Kt;!v8ZFPP(TZ=@=v_5S z>!wT5d|(y%Z>Lt-R%E*s*=$AHt;iND@|v#TZ`>l^g?mT^8Ps?1mac?5TPw84s17ws zNBF6m>aldHKYUv%WY;8Bwwvn4bSe>YKWtf;^^sJYx!W!*#juGp>)r~d~2Qw2+_vkI&H<&kdR)a71C4(>7N0f@s6Y#$w1Wz>JhJC^z4^WotCBWY5{xPrGOx2EC$xq^SQ zf**rD3jV7oHUs{vNv+^7{096#Sn#dzALqiac5N>FM`ytAbKz&~6!_Z@2mgCl_J)7^ zEou1agy6qj!9SCC!T-bO^@9ITq*m}x{QklCztsL#_%93?bu{9k?L(mw^q`}5N?9zK~l9#pJ-#VS&FgL$D()lUdGsdclbq67Q z+nC-6fA=O0iKyb1=%XtbZpQP$@bYKkLNtp`OA(DTgOlP^h8mV|Y^sd)I|ZJwS`sdH zbIeV{A~wT&r*h{!!N^)&gG=31TZpSMvVk`ibx*aSPjuDfwJa@PYJeuyin#`|QVZpg zPs%!^Tdk0{kpL;GinXb-q!gF9Yyzc~NipjOP0`LbgE2S^q4Qlc~9e{#W3pw&!n@cSHN!L5oha`vQp zl7)XHleOQEBa2wa;gLdHLpohKq)OUiuse5PjlNPDJ8}&(Yp6jm0IM^tx>FTdilsjY~3BwF-BeQhsxr@C+1WAAxl(9Rvd z-Cb;=GG3~d;v~i{s!We}jWm;3_8I~G9*{-%C{2!=t2CX6fENq( z5gwy{1+U1Du{RxZO$~&|q0lJD(<<>I=g1|zqmeF_u?P0Tw>& zW~aZl_*O3)<4j^#tgN^z-doocAbo+qw ztd3QGQ%{hoZe6CZ{b>far_R!~9ZzH>UnnRqH0sZi#IYe?&UI^Gu9o(47B;JTAk?Qp zL&K?vtdDbxl&zUmv4K-}^sU5(yc_ME{#>2@ri0S=b6iRNj$(Y;<$=mXveepmeOazoKIy+C4+AX^P?N zi9IL1x?iR4$C)Ff=UBO8nqg8j>BDzNW8K2=f!ns9zo@L8T`(qe2g#ixyr&7e4V`wIj z8t8!68SS~crz+HQ{_}lM9v{w6uK@(f1ChVDdQQf9iNob<{9JqX&(_j7R>5V&!1MlE ztsh&y(2uP>8}LLwHXkYd*xLVk<`YjFh+cLLZLU#AaZL%#q$(>|> zA|q5Rts&nYC#vp^1!9v6b@#?1;n1a8N2|_9J~yeg=YI+O*5BliOX(ySeUrDUZ`5AK zH)n=OC5%H$KKsY43@!QN(AuLrrG%%oX>Y`SjtN_pqAs^teOy=CTMu+~J#BPRi*-PDIMu6YVW3ZdY*%^7PzfsTrLFXbj z4<+er7hH_p2p0K8)w1}NkwzB3N@Cvr$&tKR;MDm0tdW_b(3AQROecRmyL5 z%XjX02xhqTh@>DhiLE+b{MY0}r{vtLQKDK6-30NFM(2^IABFlclt{GDCK`2v$%wbfXj7E8+Iy^c!6GKb?iAgSAv-6G^r-M{70@BOJkJH3 zSC;V#cwUF{Diz?hh*znEv1(Bt9*nw5>`fa$!Bb`-GE5soK^HjDL}J;hEf&Ps4GQP> z#59C(uqUP|%z+hH< z0RDd8i$+~gK#lJ67z{xa4B9Ty5s!FP3R+qTw>r-^G49878=w{14G4NE z0=7~$g9Hu&fTde+_Lg>_`(%^p+o)`ZNM&k2RNaL7r>+UWm+f^;0LDRs5S0?tcl!)Q zYT`qoYLD$3e7&l^9jKg?iadeRddXhEJi=-i!K>BKL`eOfsw3&cQd=H^fOr?hk{LGx zlsLXZRR%V#MJkpk6aS9*_^us9+Fp^SQoE^Xf;JR6ih#tVADch3xO`rBVq-yB{;iefEqRn`;{I zmqAvKuQxrQ#@FTI3E|i6mV?2if-TaHChba{_BNIFcfHd3blTOaw9g2C!fJR@MN)kS z;>?jsTS}rbJszA_W|tu@o7XEMOE-xq3>+Ck?1lxrS+zs?wHp?@zE5k7(d`AQo@nt|s*#*iKqSr^^2rR(U%mdmjI(GO`8NK45j!vvCE34YTM(${o2 z87j_I8ID6w(#!tQ%auW-DV)-pOwqZ9ekY4a;}Eht$Rg5E>QmzPEtY(%pOO!* zCc5Pq3uP7x*&lPH=GSGpW|xAt7j1IOc0*j@(SMW%ikwT|5+bvgHt|WrzV$Rby(c<_ z6i}eV9DIM(z%0);bIne|HE~>ezYs?>-N4&f{J7%G0*R=h+mPpbQo&a1w|>QfHGU36 zpqE{;U&?d!aor&!sWvPIU2(&(_Dnp2zRoJS8hZht0KjnoV6N#a0RZLX-zTN7m6Rx) zs}XFHR^oqO$4|_X_Sk$wX2}mgF)^4Wck+hT`rSa7Wz@Ct>$laY zhzfFzFLm|NZ$QkS%o+A+lGBDKw0H(fRE^ z$sqQp6-7)4SDIItQ)R@2nYp^0f)cOF7@_N9KdHtWgx-U`=9~HlSEFBB{)}L>YqxW( zjJKs-;TSW2Mg98`?&AB4OB46_#T;A)21E`djf5f7^dk8;WFrGvbWIku#xmQ>lpT)M zdie_2dCUVeN+*82=*&`+uksPI0rC0pyBd(9_0L==D#x>M9nJHK|A<3H-i}>X$>68-n@*T7X4# zZ17mqc8`GIPnXzw{uEC2#T=~5!ZB3aB!I(;4kp_Iz7k`B)GvMr@+(IWpTsHDOnCVuSX)+cr$Gg}0 zjEf(?eT>Erl#xP^8Xq-&LfpW^?m!wp?N|u_AG7W z*SBeA|J5Sp8!sY7%sbH6a${fnGxM43Qo43j=t?lo4p9*!C`WTTYF_jOjs;V5$!=hC zJjd>2r*L%5$eNm2*|;2>rzRL}^&*SJeUU!VE=Gk#ltUEsrzATfd*U^GO6#OLW%~@}Ct1*e&tl!p7v9`H?*N9C+~dUY$o2$$Z1D92t1wxWP!3Ma|vh5R9&o zF`MD6LB0^~n}S+HxOvm;|ImldmHRM#)n>S?QAXFwmxxlL?!9ZCI~N(pfbgKlR%1U$ zM_d#S71`%A5^qT^7V1v6`Tiy)S3e`S>h7N>+MR!=X9~&*TMw$~#d=hG2?Vs3u!N)Q z%di)0t65Se68OVw)ZiPLZma@NGFXq?INkI$MJ@}o;X{`E+-qfjxJ2y_u^V>*`$MGO zm8eT|dQ(+(PS_qlw8Cer?IF>|6AeD$!O@1UJ`JR_PKTPR^7-{t^-1~MGB8iQ8h&`Z zJ;v&orh51-b^E-PeeIxnt_U3*%OVoMuaEA+M*17`D%6Lm0BL=BkXc2JG9VADgyf5;EvCE6c1Q z`ztYUU^~VWam4&&EZX~N*lr3{&eOda#$}e|A3Oaw*Kng*adA!iuKK%{$-U-RxB+1| zCyrDbq(r{Dz05&Fkx+Ey4u<}Bg3ai{FrK(iM&wZCoswz5zEi%GI>?6=ObhOQS!Jhq zxeMwC-z#~`M{GiYx?Q2KR>X$&kG|KPc+!lG6=jUEVNK2N=mcE0L5o>qicGKRO zi0R`OQ!2C%aJqxd{}yn*jK=^`Gg`kHn3$E~w(cV^Gg;yi>VEem1)tPC7VHJznEug^ zx+VL>kIYz^f^ke!^G7+#>-h9t5f@I0EmuUo6nn1S_I%yG>JA+38=I8N`szwo@*xr~ zeWxnW`~E%`wOK03J+vYjCq|gQ9bEKRD`me?-s$*y8T-|IkQw}fd!97p>J0wwGT1V(a?fYu!kGESuM~fG05R~qTs*De zA6&(kRd7Hav4TewfAkFAwEt~1N_*}GK2X3T@jul5KUMLiOyS4k|F-r&NBL*t zKZEX!|M9BO+?ymgs?M7HB7Jb7y4@+W78}TY0o!4{j+mwzSGZuZpw-RnrYlL=&V446!Pw0PB9w(D!^1$ zq4&sd4G4Pn1U+xpW0dhyHRPQA+1dMfc;|g<7 z&>wxzU`RlpY-jVA9%aqr38}kS^JrM{dl^f%FqSlT=a`<(xGXEot=;lkC$E@xQC|dm zIuliVtB6f}{E80=llRLcqTNB*)_vmB;n|uPCwV5ukUsHKosZ7sRGo>ZMeJKAPEfhH zA1DP*XXEMgYz2(HZz%NnJ)1D%iaC|$s)2sr#?{H&sCBs6Z+FN#(XMOgWR?uXhUIV? zc5`lEb2hS}EUPrPaLAhVf)nZKqn^Zx$@m;osYIfuav zXn8`TWv~Zp+JcsCf|f4@EwA*TrCw~3`8mXz=I2a)hEOGJ*N!`Ydl~mG?%%kez20vHi-J}#??U?P zM0#q_-l}@4Tzv~#Ghn0Nusf)fsZQ$(TQg9udP65lRXgmu;u;7+)gS9{{^C5&?AXZg z=CyOoWCvY#hjdwbs~^uB!m*idk1Zr?7Q~@wo7Y&kn>fbG?r4&(yq7);%8#3F&B~Fr zd_X$#y?CbN)lB<`0eiYvDMBH6UTVPb`?_ZtrrplBN>f1^KbOX1XMZ`3{{MWc|I_FF z_KRt{Hs!WABKR4^-P7%#d+7g~ZvO_v-D>(;rQ5&W)9rU~)|=|~eotp_+I}@y*&eW8 z_%>YhboB233vl82OwppTuFcn0mGApBg$H|g1{yrwH+x4W6Mdt}OEAfKAd}b_@XY3q zy`kib@HObms_RN;_tM$@rQM>=l#7Ko6Xa?MgQ#I+&t^W$<0h{vT{c(Kr2o`^%7iX5 zYKY{?9h4EGC2*9C4rMYr1Z8xXA@@*<7znuGp>LaXs&Ro&`cmLQPuBUk%W)yxb-0^x z^|-fj_u?MJJ&fCldkVJ>_X6(x<({mmxEZ*~xY@XR+#R@o;{Jqt6!#?VBiui5n{hjE znG28}`4FY+VzO}Q{=!X+CVD>mj?*7w=9eSgzz|iz^Kho0um|ueVsRvattyt5pF?G{+wspXZO2i^c2M zU9g~-vw>I;vrn%0X%zrO&(SF1#E~*!J8xv13R=;TLY-f}Lh3wQg~P&~!+kaa z|4g8LG&#f8MLF}WM0}Kp*K8B!07EzTq3ab&bdI2eyX)*SxB0EfulYwGZ7e)jjp(1j zZ%|DZwAV^hy*WYxQf`Ip4bwG>oJ|unsv=_%SNr)GQ;wv-w*Tivc3?n#6HLn%vwf+P`(va<_rme}`Io#SwvAbkz-zv!VoBU#M|N_1u${I+-`{pcVmzzc>yjJgP&I_~F-mRLSjw}f*W4DM7LM1Gpaze0R$ z@;jOmzZ{<;*<493l1hPhwAz&TRV=W{@cQX4QT~t&;U$kvX9Zdkq77Tb40U#orn6fK zNcLoiZnJZvu!mH)cu3$Z(An<3ycfl6U8X7iPlC^=!hcrPHJL@dM^V|Tqo_75Q$@Lb zC`iUMC<;(U+k#tT;UlU#iikk&dzv51N#sx9*i;<@H@3D#TFIxPSAS?v-W;zYiS8&D z6uAYP(dPZS!|3MU91?WJ$7@ud)Vm4;RTUx^r_!z&BXx-dK7xec?M^l{jv7=R(l71= zG0{06jlup2@Q)6Zx`%xMpB0tkG&^t(wxM~6zfL$!ao1J4DcoN6`=zQuZbW8HcFxhC zC51OAP560AAC97D=jHQLt$YGSCOp(OXh*xGh(=+637r+I)>83xjh%rLQ>o%?o#K;$ z0rNXDCdNa&e*CXNc8A@=VuEZrW1YU|7gvQ#n1(J%}c;JyB(AvFdU=`aU_Kt0tO9U*@?a$kU^& zG6rK4iWr_zVq;vkjUZ)S8SBctDwDaGN#3N?t6^~2xTN5TO9!H9=8}aqWZ*oD0xw;N zx9SWM*j*GO8Ja0;%LN0@SMgI8mkX{Xz0>k_DqVKfb+#?ll#`|`kL~cvAy2rYu0b@` zSN#N?Ed?VkoJkwI1I)<-v?kLl>|7lvPT}L*x&MkJM!#ytTJSf4OzHY=+Iuc~g z-Y>ks;`bBjSufEMwS@f?IJGUJP z1IEL^dj`plyUAFYFLtP-FiAwJp}9LZ+O^-TQKl8Ms&n@4Ftzd7Y|~PfP6s%i2wiJ!<(%wD3egaVt(QH-Bu%@fKd1NJ)< zufCeQ`)Kc)HIjW+wGaJ^VgQnTIX0-~UbMOlU$e9+@r%`}rq7y9yL3&}w|QzaAc+>@ z=EQ@>DwTA)Pi1{`zRpSKZ!14+#ixK^!-m+16beN07<0nhywl1W)qBnDsyFu3-|g?$ zv4<2PU9|{H>CUpty#aey*xpuQcbLBQbG~OE5r!Cr*IwaiQaX}Xc_(ljeGb;)3(agX z(!Q>|znSD1q8y{Z!i6C|=ku&i&AeJES_oM$QsEA}r;M$#>qVRn3)O^9F{2-_FZ-lw zXkhd$-pCO#?@vr?rZ-ibY2}0}FMxBfs%lA2%zK0^+z1;R^RnYR!13K_6Zi~OGSRQ{ zN8xI&8aBa%{g`a-Ds29!(6_bfYHk=$%&9t3RK3seZH@FdYt~E>q*axdzEw4#wEf<_ zUr~WVHtFrWpEC}-wKfs(5ux94Rv-zUn@RA&} zt$Z*_P)8&RW@5Z#J?ft6ZlA*p^ps7o`02CJrZ1!2{fvhHPz1coE6(TEk208h*AueW#-O$A$kz~>6*xti%>^jQ z#RxX1a_`Ak#VwP#*_m;D&0JfiLPmm*|%H|=>>$-|nbhJQU7?uMw^!BGmNUS zjQ4_&^_TsCjhDa~YOj^)U64k=U|#Vl;!%W;*C0Dvb}EEf93n&vM-gmZrOt9%(73S>{Q7oBE&>*%Q_`0$hXz6 z5!~P!!M4=5jMLK;$3OZs3|%mo?+aF1Vv4aXP=r0RMPeBM0JWhL zq+DdlLO*13FrLuL-Is-9#Wm-8u4+Ln^(0~=)sh7eL2d#4AlSSMwHw~Nu{A97tBz=E z5JQ8q36HM7LD`-i+vd&AhKbB!kl&g*0w%zY(JEVG;p;>diQ;86r%YTkgsVSAblFT~ z5x#1P+Kb*G58>x?B$eXtp_8Lsj6Ole@b|;k)DBF2Q-?ieH6I#g)4#ky-{#0s!O@rH zMGAxVrl2*sBW&gVfOST~8?-89LiQJX#(1jwjmfRb4gC0%M8T8ULEk2_Z~}%up~ACK zpEM{?_emuGKu2SAnpD_UNxj8{3>lNm2>qoS%IZZT`Wo^Oj;KBw#^RuwAuPOMg$8iL z|HvqvxFBq!#6}rYuec^Dx`D%KnJZ2oO|z3?e`=PC?zt$ZH47`;cZXuB;)d-W{$U5uv$OXg1_H``RKS9nN>l&XlhroK-=(nO01NQt-Cgs7* ziYF4mw42IH>#WC!lju+6XLw=BW<1eyZ}i>UJT1-LeN9i3PMRi+!4L+d!|g6rsMRR= z>_JPOyvkM;rX6IxOg04J~fPw;I(()@hY%h0*_1wLZ^Ki zqj%wHE6lLV(hebqn7C@FZ9tyfsUC+XJSHSQxt!Z!PaV&!7$Ff z)q}9jwQrh25EB1WIuHpqt3hnh`mHC#@T^bSi>e;Tr}(-H+U?u2j*;gwy(hx6$g` zSddFrE(Gy?ddzG~c0{`ijD`>S3@(G<-cJ!+s>z;d?7(Kf0QYIcUj)w3S{x)L$NgBt4=^ zD@IpKdzKjsPiMQZrVOa#$MANTbf>71xF=nf5&I9NKuvyY#leJuA$LV6cEu=5t!5>i zUD4DtK-m@RGy24G=@SPOX{lFu!KuFcRnP0*_)enPi?TqHpr1{HwMcC1#zi-n?o4Bf zW*wUviJrn&I#z=ui2qT2b;=A7y(=#(z9^kW)t!wpD{U@>$ZRjAs}7bEpOKE1%2v+e z8ymhLUi>@>+@n@_EM3pmQRyyVB@}DuLj#-kE2s;b?#sLJIL1@8&NF>m=L`%+o4jH? zqluuKu-?lMu~;aFTBt~z9loWF5}d`Mgp zQ@GVAtHW_vLu&AnN(S|SeXnHB7S?Qjw@|jX$yTy`<~&(bvg14sFLt?g>f2x1R&|1$ zvE!j~U^i=)ifC##3-5gLN%Rd^e~}jtgG$AD>n(0N1!8F zBXGoz1a944DWvA&(-^(oji!lm&rT^-rVj9lja1MN*n^c7bH|LOM#-VDms* z8UKxcTR{l%k8Ein$L5I35!a*4zCS1nuqDLmE@l)FPrlr)8+>vI_rge)eHFxP?wnVnCuSjMn+g>Ce9 zBU|kSv;QOcuvC?^yD4&ZH%(UEGg6u;GnT-Mm;K$7^>^Gh+;~RDfw=2&3vf^2w&G4) zg=^eqZz-nJ5@O?bqvK?3~7)OO#qk8Jy zo>ECE+XLhS3Vz=pTLQ!@XpHlDUmUWZTQBy5E2Y8B!dLkeRdN^E#t4*BTMp-=b2(zlN&1+j95-mv7iaF zsaaOzTnQafgiKc02sAVH{2D&i%9$R&b)UO-zMk)|&6*F4o|WPCX4AjD?vmPAIbQ}H z6q#Jlw%{gqkyq8Mm60YZa+$Gmp}T{<$KAm$%-q55AZ_m*EYf)4*nGW%6)v5-gO#Hj zmZqW~<{k8cNLeIxH?0&`k}l5Ow9a=otqTv@w9Y@oruBhCY+5NvZp~HJLasa zk;ba|`K&?o#+6=neROqDLgox?uTd}3%y_%=frLFCKsng= zQizzFUu0_EuFeBG=CI>wkcE6Kzt&QII^5SW_XmmN=YHP}WgW&osaNW*Wmj znR-1qZHsmfHyVm%r(iFLcBK$$*04e|=I3kw;{8m;VLNiu>Wd~%p1e0M&2WOJGv>XZ zv;$7(kCPiQib&1OJ$1!$#*$6O8>#|(cQkkPv7&lUH1>qR5V~m34VW%=W6|4iobZ zVltX6m0e-LK6e;1U$7E+`vps6qsLfrb0MsUd{o4j)-BQdI^DUnVO5kVck{##4mDmF%qs~B84xGzoj9KRT^a5Ga zx8Qq}(6@R4Lp@EN9mha+W)`w#bF58!;cD8dh2$D}I_=?iRt}seDkl z&b))nbncrX`BEIk85ik@@g9|0K1qU$xCa!{JAIr%~)l1loU z%cP4l`wOPGMC1L8y7z%88t3+jSQC(*B#4j>WR9*=9WU~0X;ru!kJqsD@a>QztBUI} zKY}=ijO$AqgxfOpdb>fG9zlEZZDAzaqC#>)LPXIcDqTLnM1z2l{?23FdcCmQik$Ug z9q2?-*ZfiT39>o3-aQZQd6j*F>$^Ap8PNo+OhAo#8NYfeoF2;K9r(j-FzVLwLKjUB zC?tQ8QwT1#)IUs+MvyR7dS-#tYj%7dF=#7UluDytuRh@o>FnHWF42)>0V|PqgH#$u zHo60ihLwEjDPzhecgjfG(mHWj%|um09f*s7kbd80~*HpXwKH;)nVrFL9E7DNGErRos}j>|Wt7;0IU~d}K-iIc$9xUd?$Lj4sU9oJc;F+Ze{S0YC>GRoj#j-CmqtB@)JzQ=Dn(f-V z42;A*cnC`6nx0P9WS*kK4eLWZIWMvFcl0G%tx#~On2dbN zSN0(41;erGM9HXVZd4vUctn2$9TBs+47%AE3=7+RE9{rtZn*euwhtA*B6eSP8Mh(v zB3p=-T)lH(h57`lmMkK$%w_Gmi!WIPo4y6bvUoNYoa1gJ5c8AeEgOm1sWT2yM6FiA zXt$SDF;hY9dLdc!@~I;G*VN?6+Ku~nbB`->->>F*EA9?lzZTZ^t)8sk;(m{N8uyWW zulHodaYfAk;`U^`%lEY#dcxjn?|Dzf&wN&N=1PYypYwhI*PpaU;ZDGn;C_L- z4|gu^BHWd@8Mxo#Zow_a$-X1?r}cwH*T{N=!R>XUzL}SrHFDOFRdr;|8gyr|dhYL3 z*1>;xoOiocSZ?)AvyWn9&0D+rX4**VZ@X3)NIG10EA8rAhs(FKk;yf>Rw5-M)9fW` zM^hQqTqGsck!-P+NH9a$f}wd3R?xH2H@KsEq=}T46_w(BQDMea=OY3HeA=%)Dv9JT z(U0jY*IAB^HQN?O3OwsmJ+`o2l2NJYXj^`(hqp(?PyX7Kzq}=JU~@*hRzJ9|dq#g#m~2z&CFp-NO1INqpMC2+TPK@(Is+W zJ@09zAF?UoI-o=tZ+lM&S|vzDsp!^eedQ{Bd!Fxal2!F;#0<}w#dK#ck#Ks?9X~;Q z4S_>Uv<#$KKD$&T3>6f_kquhv&Uzlni2qCCn`?@Rt8UV_==dt4y+j*p)HmaI%vAAz zq~f2Nihrk$uOcEEsgR-Luh8+cRs0dD`2VHjtB9i?m2EJW%w6P&DeSpnkh7TTN)YnE zee(p~Q>f+?o!?Vu3A{f`<#z=6fhvhT-n#CDJcXS?-`^xJg`Mw_jG9XXYCDV68awBZ zgY)tw3Of=gts~>h+_Mn`mA$d-iz&K@qTl+hs`^h<(c@A@FI9=pNVSI~u7*dlBui); zMh5~PLQCW!iU{u2d3<)JfPZc(j|(*bI>{2Dl2rU_bo>?-e^M&`i8{VSlx42SNJZBd z9b~;j%d-u=Na)$r7Zz*xar&GUDdL)aQDa_~^?-Ct>jCL>8Tnk%sxFwv2hxV5RkvbMn6! zcot^yO?UskXQ3K+=Bt5cp&EFGSdWXJr7F*WGhYul^VNVeUy$XZY~Gu2x0QSlQnFPi z8Y`dg7IdwAKoUq%FU$qQjmo!Cc}gQGigH{0iq^DxH$?$g^cGOdxc?>+lEYmw$JF$Y zaUXXZob&jL{G`L=MbZzz`c=o%+3_d$iN(+OUwEYBWa{fM%SI+gZnIVw3K=kPHet5B zY}8t*icw#JC-d&;wVEDU6+Nghp@+38df4o|F$a2hm|$DY1ZtvDvq!u7R_(36Z8ab0 za77R5TZhZHY}qzDzOJ6x==}f9Y*hU1vyr7{xb*b%{XK1je@Tfp6Yfgg4pbA$5Om>>k%|K9XloU7?%5gatET2i^^E$iGDl6&V(IWQo28^ShL1a4^fj_DRrl=F9p8EoJ{C5?W3RZYe07QV zkQy69?4v3-rnO8ZelF=gPNg&LwriUPq9!Tv1JizK_2`A~jp7)3?=IBE*ewa9sR$Os zmx;cn{jbCzu?k`C-5qqLYiy@xt@HrkeNL_0L{Szds;?^!3fr>GsQa4AAbc8qU#RMb zxnoWo$h_g;X|J6IHaX=8+h1~9tnMZJ{Px4eHRM*Gj0}_EVYBlwij76Exk*x}mazAs zb81U@%zKJ&!;QK2i)QJI)&iAE`rm@{`fz~uoLWm}RsF)9?d_~v;-waD!FC|}>Dw#XSHN;c* zx}(hn`ZBaXR*WXP_q!9YepGO@Nv==h-DEbupOZMPcdFxhrP`e+NVP_yANS||#uF$= z5fq2c?L$M|uX04WTfmbDd%De1bdG#t%#&OGVe*xwJ8FHvdIckrCt&?ZuKqv~vg!}Y z)t`y7^j8e<==v$<6>>RRbYP8g;uU>R1(Mjh*t^}6^*WZvyKo=j{^dIH|1PeKc;_F& z4Z?32ZiMT6JX0UCC>qnTh(vM2 zOO`cCN*|{DGRCIskk*g%*V+%SLlXxYO;AQjPY+tTzndYeFs03-y+H^P%g=1%hGVW;eeSGJ^Y?oYvgHrPQXfU~(g`a;38i=iqkZx+6RMvCv?@SQgNrx_0it zgDg?n8ypz}vue(1Z;)|Lzuf@wv#KVvinlquwKa6}R_4dLH;Y^zvRvUI8v1~qvs>m^q(xsFW-`^+~6l1xc3>%mgo7hkBK(;VX$f`(`MHW%fEa#kiwLOAD zQUvS|0;7L8_k1=CGtdG++U643FziMRlI&Zag?T|+OF_=L>|J2%_ZRE+o3E4WGa(xV zUw!a2>i&enN{qt?xy&2z{h;~@l%Q6*IHZB2En}Pxw_^87O#4MdUWA-RFOs&K%f4ZQ zvGPb?XLUa$&5>ImNH{gEJ{4a59ukds8LMaxfE)&pz7}(hp(qjPjPp9JrLqU3A`ha+ zp!r>|+Fp(npb>3=+!dGyP@aIucyTabe?8sriyP7D1R)NmJ4o18JwuzW;I{@OcWqSNFCAa(~R{^Cj0Cw#IXy`0*N zwftvECElonDMhg<5l`BJGg_yzg8JCIClHH`DtJGgT&ANAe1JA4-N+gfIGOJ zN3g<9X12P)HO?C_hOk;W;Rw-Fti)jlcza$YJv@Wj<3hpn7BT zyM3ICxq`_}y5lt=6dS1yNZF4_XQ}=R3GXCfIJQp4Dsq1xzKaQ;ft*+znQJzx{&Q7v z(KXwIqvCi~mJOP119feI4}eZzQ6w|bj9p%w6SOL7%+ZFi@Kpwg9(ms|GRrAKm{dHa zx74gGuBSPdK=y7N-MyrnR7)R|@FM5tL7ED0Bx7!3SEu7L1!raZi>DAZ!LnD!p5Vp~ zD@KJPK|13H?pO#5C{>n};&;OCtTCJb>2rS58aGV3jh}AwXEki7JW`NNUeNTpL`t4R7?G88EoxP%|1N+QqzjmWt+bf!g z8aT-z8lZ{2ft5=W+Bsd%0pksRli424DxEqvI+d72^YA9k3&Js81{a!&L za^TE%gEsaG5-9~|svGopuOJa*aLV1FCB1^OBgzv(^pD?-eAsXq@G4(5GzfT_OY&+Aq`HSldpb zqb+8Fx~kZ3MEl5wFLu+Up8m$JB=+Ag2yM>@SpjZz1oCi&xS_ZrTnUbSk18nHAWOB> zVoH-?|ACr_FqWCBWhz22cF~(U(gy`P(uWKaZeAIYSZhkhZE_^b>hGD z@^_pX*Z&Uu+xy7M#LZf&6L!Am2G1l|W~1=hAW_zg=VwK>5qO2;F3pgOl6p)2=-S|=$i6XSj7 zkFNhSJ^qYK6|V0C8NN;I7p4I<2t7(|A4DR^nFXE6#-NIrerh52ERsj)jRRERytll6 z%G7jBQio&pHTXYEbkL~QdVH$29vbGkFS|&u^@>$~S7E8N{(YmaPGZL@o}`YecSyAS zd-`X|JcFuX#wi_A+mThwZaA>MJ@BMN@>^Fw(;j$EEhRCw{Fp5MS$R3T&(V6xo1rnm zb}rbiItk3#7rhxmZ6tgPe=MAnR854UMyaQnymJZ}(HXe)Qn6SK$s*f_rIxl)De^a; zqg1Zi8uJR6N26aB&MFRGyK$6aNtCwOo#SKS(M9?`d)WFOyUkI-%NGwrEG)ci5E&r_70T--$YVsJ!jPA~Yyr7{V# zAoRz^24xQAxbRM<6qz1NWO;olqlwcsR!#`ISNB*|V<_n;qaL#kG|Z4)M-QaKBhc#JZ~w;>O%)q}hb`n{9_gk#|E~UQUMjNM z>&06d%KH6X{MzQUr?aj4`+4P}v^m47U#@&htony}p~m(lr*ZC6Va?&=ypr1Yk~?L! zqH-5wzh2|n1XoySVratY|8w2SVsc4ZxgV`;)Sb+i6mHt6!nFe!YZ)Yx1Q0b1PBK}+ zx@|2~{Qzr>csJq1Jrli4Q8a|2IpgK}omJ-}4A(Qh87p&w$rev@DB00ip0qn6|4NJy zji04kSpvLVRZP~s_}uRW4&tPn@}eY=f$v!HC$_f{3LRQu>+wE-(T zPF8@&t7%%BCw}0ZT$vmaKMlpk6)8(GVXKIJKlHva^2I?j$}bH~D?bK`M6N0oU|?HS z)VS+FG|VQO0eGTX%=!8n3(kgJnc(nSEfejfdSm~H9Pn|NB&I0B8nizhJCL1~M@ZjX zGa3lBF7B7g)Fw+E7=nPhdzt7=)R>@lyuw~T_o@o}&4cArA>Aib^m6t6gwSY=myh@idszM1eVcltB$mTgW&{2U)_$4dedF&kSTJEqd~2C-#zh0K^X7$8^p&V8Zq385iX*9UC3a&I z-QBdf>T_`!1^^l*cIEAolw0hQHo6a;n}4Sa2AX|Cgl)?;sZWG$+nnrD%CmyYdMpMd z=BlBwm)Et5N!!b7isH@o@(RF}wLVrEZ*=*=+S*T|G{b_>2^kiIj_ffWlsMXN{Xv9M z?0HHw1;wGRsi0Ww2E1jYa;Ssz$RbgAIHYE%n$9H1x$6Si6r5Ma;Kiq?HMEryYB7T$ z!*c9yiDuQ`#jjnfv3y>M`4j_NA>r-y!}tY>S>L-n{aHamM6Ma?yTOpz%H zB5DNrkdoxBG)xStd02AR!sJWkViI(8U&UPR%52IpfCB_>J#8D1vuT0o&&&VOUTW$ zQ+KD^q`(xTrF>{!mM~giiZ-aDf2*NHmTc0`#M(Tx!<@aDSxeY5XA)b6AY~ZOF1Y(b zO59FqA0MSlyJlO5^vyL~b$9#j5xREzAe}tl0uZcmSE7mMU-diZR_XZ_oJovO<(t84 zc1jjOI;UC^fv z7O-qr*x^f+2F@JLZ{AF{tMn|mkD#|*nIw_Zw?qJxK63#T)ZD*V zZeO>O&F?Zg?VyHM74z$l#;E3##2_uwSKEsu&n?cM-;5iWr)JWMy3}RrJ60oTKqJ)h1xj1$a(tD&`Dy?3WDUlhjQbg`!gb>RUEBl2 z`}-l>Z}7VXH{W%4@=Uo@eEIIpf4>u9=y;5u^jWG3kABRgSMc{i8Tv@`q#p49ge4s- z_}Q;S_9XXFVg#*%F-P!- zE#v-bt|V^mHl~+0qxW?60rE4R*i_rByorhg^K{d*5nBgyJ;tgI3QcOwFN)(BW{yTx z2#2srS+qIXyvWoxD=N)AKZGa?zOa3B5xW1*9A{rMJ6L&taSeWe`yYg*KN-m#wfC{o z1J{PNXvqFFz5WeVt`{vr+*?G!{=6U^eR9}-wP*evYpnC0H_lk+KQHHV(XuBX9;iqIz8BURhPo2x5TT^Fh$pZ7jH4h>&CH*>WhIQec86;*``u*nYFZ z8p~ey!otbmy8Smva`aP#r?5UX07JH_pCby=d-mx<<=Eg5?n0=6EIF0yNsU+jr=T`4Pe{5KKG-l zsG67o3Twl{9BxI26T3 zyqt9rG3Dj-e;k{y&v!!hxFY+-a${Z9j2wQwGfH;{ISrM`u-x{p@Y`+4CUbk2TuftH z6OB$Z(@4EIKLY3nXNx7?d8UTo<=ox}S6#NZ&i5S4%Fp)BIk|V zR=;PiUzW6~{&3CCg6YR((JN|Oul)SK#~9DPXHc(;+h_n5vfI13WXMrF01Wcp?t8Vm zGnMT+vPK0l`y32EybxJlpR6jRE0j=MRDo@BuBu^m5@u6US6n8jNw#Izsn$xO4Oq9E zNNOOeDhM|gOcJpUm-s`;4MO<~o@9&RH%g#7eia3lK#gK_xl`&Y6CF=E*6vczXNn#5 zyuY}RJV~P{xCFB1{jTB~0(n`WMju}4ikIVKlss4bqqu8iG1?&;`ox z3keS&@dX)Wq*A_FDIic zM$t>k_>npe3hs}*X_TB<%n&#2E7W3C+rubPa3*E6m3;F0O6Fs9V({V(NCwe5Mhvis9<5x1omkb9Xv2AP6W5jBXXVTOXQNaFh6F z!O~6RW8OO}N@Y+HvKpKx=nR3*L)3+;%Ue%u| zv$+ru8U28A8_pDxgMbRJ>o4Te%G>4r!LGE%PFx72Pk93eS<(S6d0*0i+bQoEC2#S5 ziJ8#(7Z1 z9g)`nV92XXXhz9Pgujg&ej>!i^Cc7y>ey1&X2x{dr`4Dz>QWigjd?OLkbL-+1rq=K zCZpuN&y6d(cqPFVJJ62+`Vxv#%lD&0C>)!hC^cBRSyAdR-9LpQLi>%9SFui}Xp` zckB4jX*zyyU=*!}pw*GA7s9?bj93eG4wtq~0EV zF;OQE77hM>Lah+qCd>R-K6hK@Zh3xTnP14W+cLW&uL0|vV-=kF0w-Gg=~9YdEOUQ^ zMMy6QQp1tDf1F;QmWg)ZB5Y>CV8Q^9HD?;4J)78yDtlmop>~TYimyHmS`~RLEStiW zNUKB&L5;9Fn2jeIVPEG>{X@^DEMA48@9qxSEzU`GEFLj>Rk@8DzQsk1e&nGzv~pdZ z9mZ9813An;H+EekCaRdtR|;LSKOdP439=%gO8@U+HkE_1*DLH@A$o48`8_X7juvvP z%>#xBp}lXiD4x%9Ik@+2Cg$;Ox6YjJS%keS=(J47_C5_p?Hq+p@9iPac9@pnG=fY4 zOh-GC7osnotxLA0WnxlGRivk#eRORI1LejO?Lkj#xD=1U^KF=!3@mO=`y>BWIVD>| zzSoTfKZ2s-Z<7P7d#U1fUO8MoH#SDKc-a0F`PY#@OZE1? zDN7IgrSUP{^W61bPyKeQ`h6kw>&7=-zx|o@dt=T|LNWhv^eCn4*Hf|9pr;**`j(2d zS9tze;n^FKBlB|UFm|M{f+f}wq2>><(YO`yJ#N)Gk4Wp=6+?qqQ7fGz?@*X6CZ?dU z*wyKM0t*hg5C84-__Om5qDKhne@BeVYI}$gMuQ^8NS+)Qd`go*jIZVPCdO5Y7;6ap z|D7Ifvs=iq-15F_n;%==r)_h$m1EPhtyGgqdqr4eS7Zr2j`?5FW46#E8X*-$$|wL~ zyX5#|AxFhD(&V^}+8s=e^gm6HSN)&TBOLp5^}bNm>z3;6y;J=J?-&RO4$91mHq zOltIJP@|!#@l_$kVe@)OarrIZN{VWXR6Vtg_E#JGiy8h;3iW3N%;^d`N#2lqzc8zY zit4wmUqMOg{3&C-CJMWvUomwa0KKdqZ?CYMMRP*zvOp8ytTgI`uri*=;J zNw2UdU_QNsv^`N@(NWbRK40>}6;5?yzDZ1$G?%|lrhzP3$_;x#vsc3lC|hB- zg=|bJE+}pyO!x_0iOIHKLMT+Y>Be16e&obur-pc_oKJ9*Q}$(?tu0U+wR`c;6aQz5 z*Aol-j1~1w=+v((exFaf&A7XX_YU5pUu7HhPw^78A1mHX5-@VsvmRNf6`uV#PdK5m ziP`qs)?EsiASK8qE;ctiIwvd7ZmT|3_UMk3{+jcb067M-y2VRkrK$&)Kx#7jnc^-U zRfRCJbJ^!4*pjz{=WNCeRx57SzBj5LmJG6T1ghtXmytx+%3iy#mA#setoSWQQz_xO zE5`OoH1FsI#lrkI>WA_nBHf*YisH;2JTZym2X|cp5%o}qjmCMKU1U{=l|H!xTfZ?f zcuz}qB$xQJ#qfEyv2Y#!a8{7DrK?p(WRG4#Iifxf-R|MiCc2ke>f4UH!UwTx?;P{~ z4{7Pn+_L34eK8BFY_;ABCSPQAVA}pXS#QbHU2kRU^%lzU-0incDorDW`hBf)idd4= z)6n74SI~aI$vLaB{%U0)3k+6c(ijvMwqFTakEyDXdIYJt9V~Duq#*z(Yif|IK^^ks zS6^}D$VD@IyBK9`-~Od=8ZLzkFE|v0aY$nmDOmX;cg^f()TsuWyS>KB#|npfk3cA+ zZje0P(wjfX8Q^Sf_kCLZ*HjCpsG01922)Kma?kd6&F%Yyo`pha9SNlsjCzX~)85DS z|AZP|r4?@u2#~`8(8fsTCT9(L`BDH%j$K4c)~POGZ?QLQ??SQD)~^OQo@A>1_q1kL zt#qM;B&0C6E4qLoFf4!^40fu+302HJNuerW!*7A?h`s$w7;gel9@m0XHPr+vU7%4i zgafmfXSfo4@(fi5^B7Z7y8IyT%XsG~ z1tiVmjYyIsY90eTxY{Z@Df6?U&G~*ttc4@+jDD44ER=(J0G7D*8*k&Vp7f%6YU@|Y zjls%R&>=$-Eg><2F>iwax14vWbfmz3G3Gx#%RF(T9UtIexz*g7ZZ_!_s*+?c#4ach zxPx|04G)H)mw5>AM3mfP`OTCg6-LDe^52EL0b^C}YAWN;OSKo4VjK`;BmuQtj=R_wyJtq0iVNGGv<`7iAX0t=vKB0MRKA z-7$jhkU(X-C|ubuU?ZQz9w#b+sLR`;1VzT!CLVTYYX3AYHfd5YB5q)=x&#d8 zRS%(EH~{fPyD&E#Od__FM`vLAfJw@*BQ36G2llsv{0LYGzu7MgO37+9m6TJrX}_kj z4k%s^5Q%aqx{Hu3qYedLG~Y&ZjeMHhcbUnJ=818m{wThwALj_Ia@lT+I!Czlw@55K zrt*+tg>+MtC}V0TS@h(52024tM%}Lvk`>xJ0tRa*$EHZ(2uNRlf_%|)Y8nNOY+_TV zAr1Qnq-QmEQn*T1Sg~N9o(4K&XDW6D{YO1}_`xJM;mW|nkaerDTP|)fE{0h$$aEwO zj?N%>6~cPx2~nP3L|T2H8?ia`lG3+BF>j3x8>o=8Da9rvGAYaUM-uVNh~c+i4cl*X zgV(74k_yXAI+S)$E5*n00NP;eVht_5$nP=&!|rCU2VPlUw-jE}BwXxV;b2?Y&E11j zM+?TFa>vg8me7yCHFWnkL)ju{Wd4Owe=93Hzi<1TAJNDx+a3%c;3Y754=%NL%Keeo zIpay(A`|u`YKxA^VC+0E&BIn&@#MZyXG7$zWg>R@AsY`dKTEJXKLgV+5e+JRZG0?W zf#n^PF$aH2(slcnr#YP0RW|Z;7x#DL+T06*D{QbTib52kyRm{B! z*U#S696!Oci2+J=V#9s$m+mlQ;Ulvd?`0D3ZMtn>DwCK$S3_l&9uVDLMtDb1fi{RC0+s{Lnk4OJ^I4Hu0cx^({P8(d`}o4{7fLA60cN{wJ9M z1~Pai8Z|1`w4~n9p>5jO7CQQCPI88vfteBoN}{0j7oSxtR}#e{WX@|p)?Rz< zwbx#It+o3SUBW_h~e%mz?P7gz!?G{X;>S*K}q(zb#R~ zghdc!T&}zr^tk+XOeSBVC?OV^9DD_Gb(x_Q>`v2rF~Tc{6PKoLBV4WM(qkW(8KCmxJ^vD#=R~x&-Lsb9&O~3Pb?SB~1O> zS6!Yg#fh9FAA{{>LbQw%xmZN-a;J5Xxm^0+)BHtY;0ZqK4R|?aUIdi{7gO~TwS}V= z242o=n|??=H&n}4bItL*D*XIs=JLr*BZ5da%TuzC&rCfqnCTrDoSqswT{0Pe*p@mI zuWh}-FJ~OG8^29NN6D4?@Fjfj-EqM;B7|-lFgG%JutM7e%Sj5nLi!R-G=n~~m(1Z{ z*R|o`fm~A&b_uaFFi8GRT}jql;IkMuV=i#wQ(1EX;RmGIs?*$%81otD)!Yy>U84aL z1B0xMK`XUy5RFx?)e{5>Vr&3bH;O^cwdCJt{GsbwDD&E|XFFyBxNEz3#v);Zd^Xo~ zNj5Y2A^D8&x+5O+3z5O0-wm_1Y+P}Kz2Jrkp?9Y;FE)IolB=+ljw=d;1da9uT-A%} zIf>q8XtT6zml$CtSyxEOtvRjWHu+eJ{NZ@dRlAH|Bxi)78JB7a*{FJQv=GIR+cv^I zc9uq>Tn_^mwcwWIjvGxKsq??)QkqbZ+83otSwq2^UAaUsBx6J$vT8lSm2~54^47R>+%M{OqH09HA?QV}2}c zrW7%Hx`_kN1x3PBM`SJ4b#x!2Tk4g*O-QkVPi+a;Q01ka`MmFPpQYKR*JytaD;i1p zAlb59jJ+4xj^~ek%7#h&&6mvF6v<6PfWPJPhMOX}2^b@L8~EfVv@`P!^bFNms*=$sXkSeXfUYOK zBxhs}3^OyO|L(~NJfb4v*L`bxI231Jhb$ppOk+~xW@UJr!7e>dTA^Nswh`S*a6%E= zC-H(u7K1sec7=C_oHgTIHAUXb(1APTrZeeUDCJ>b$`Q6`I2Ov1VIfN~+wrau!jcw( zW=Y2sB=nW(kp(K*b87-H_OzBYI2jll8In*)(+plucpGn(^xw%Nr$V{(m>VuR{*aaq zOVBkvLNl7cvjZjmh^G6G(R-9;Y@mL<5Rfa+Lh(78%Tc_fYt`Seuoi=*yE_PNsJ9+K2Fb{69k-g?u?gT-XxtKd&y8J@%;J5kl)}_M`N0!vUsvILhbVt5kT%i%??t@1T0EWl-0V$`)f*C@fk^?cB{i3)B| zh3NwR8g5!iA*ccL94i2^6*>1SDc5u&nf~L`w+##yrg8(E<_fNc zlEl1XQd5}jG#nk!IzE95R6fRMNiFpA30N6nkO^t`D1#JYI2A2&s>&$2tko&TvqtI} zl=?uEkV>}Ur*OuPlge1$_@ID2LM#gjC7nY>PP|clR3nT=BV>4b@4(B{^|0h~#ajqg zCYGS9wJ|+`w&NwMi`G1?=_s!X=HqpuMJcV_kg?eK7Gsf}O?R;6kd>R2M!ISIpkt)K z`93z!B&c`{8ioChqVd0-XHFrq@kkYbgem=ho^R-did-*@V6=b;m021qOy$VuJ8ay- zy@iRPru_}5gwwpr16qXq)ujNC;z2qhAm0Yyu>*qxoP@MHRZaLlzKf>2BeA+BYo%m^ z1L?_}K1OZnKk0d1)R*0AU;y&nU6@M!6XLC%amR7<3yeMKRIG{J+Dt7fnCbwEwj-xWICvaRxn<$Nn&2CtMXEJNmf4LspO zjCR?+7TupNTJ^~sJJz7iMoHE3T}*Vmz>5J;)S1h6%}@ablXIPm95Rozk7*H8ITrn5 zDZ&`E@=+EPRq@jh&3DZjifr@+e86Zy^a@q7of6GQ=}=@3H$RgD&JMkc8D8*M#PR;d z4n9Y@IhzCWP7=cclnFy3zap+?wwcopW&4mu3MY`GZtKAm)Vw0a&z<|QCamEYl~=IF zB#>S9-?|VYb*yQe&+!(tZJdD~rbvp$_8yC&8 zg9mNLm8^+X6l+Y_@s70uQDZW!UbY?YJ)FPmC*~x~Fl=Lk9`9JsXM8$&u7@5u^me%w zT6D4DT!1iUDQ5%igVTJa2u{QGl6Qs*Q5)}(BhbUaZSjtFvfHYoN@Gu_M%UbDd+x8` zjXk5|dM>Cl)?+ZB$sk*o6j)Yc4e^D!0cC0q&i9^v*TS0RM*o9 zO;cjd#XpF~S5*+MtS4MS0g%ZvocOMswImHU9(c~o}2;Mby^*_&(IR7Yk{v(dK7 zn}642BswGh6W$9zbHvU&qOcQZ8T#l4R`7^GW`??vUk{6U%7{IxCRof0v)}J}8?{-r zQ~cE&|HLHLs)g|&64JEJmbasfEnQ1LX2R^&8;|y9$;A+TnfAv^7Vcw3YZYZ8o_?!v zFak>6NF(xIv)s(=z!j!#lW+=D6FOLlTI7dPm+>ad&P2y#Zln!89XgSu(^xKN_-Zsq z8~2Naxyg~R&NHx8R>i@jsP)$=xA_6WBHMGFg&Ww4lQlD6Q=;jUk>7_IP0X3rmTRAE zFk3|@^gc7{x=yisVs)X7JLd}D#JsZsT zww=s~4_GV^Y3ycmXAL_E;=mIwXUQo%(ZvblZWz*LB~rPke^|j(ARx!T5egIjA(Nu! zm#X7I3I)!m%O1?W*TY$L%;G&#jP6=eOD?5dtwerpm8aM=M9G!56K3OD8{&7!*mc*a z9Wo|(yG(^S!;RIcg(Ouc%T7XJ#jfW~mFf_3WiNz>St?w`>a&8|a_ve9f=W{d(XmKO z$gr(j&Bn(rOo7&>3q+Ui2t<@sAy(+paHz>Iu(|DWPHC4bbCXTl#U`h;Oa4g?-L}{? z7}Q2VOe?S5riRsKAo|-)q!jI&zo?Ytb*e*1mpdT$a>=%oyIImk)htadw^??VQd3^) zI0_?M>6vCobn&_V*3=^1O~bn*PVpMI;o)+t@D+M_Y`bMF+8Y2DTaGo^J{COx5Bqr> zKK_67wQjh^h3@W;p@4}-umE1@HLS`t9(YrlI`X1)byVre1jsQm*E3mEEiE_Ko?Ell z3b3lkuYBIq(F%(4J6b`pR&)^NnA0W%RryaaY7$wyPk9eFj!Y@LLF^ zc_k-_lt4~~~w7oS7wu^LZ#;a0L6c=nPyian)#=`rXm}eV%Zalr; z{4Caij8+;FD`85m;^4_u7imTcbHav5WOioaN3l{&jsQ`7Hzt_4F?ssTxV7#Cd0O6L zK4wmeEN`9|)SVks5u8eTV20&z@b4?4aHv0H7obPNBWED`Q6oMWmgl5k2-ikq-F^&; zVsgBvXgnW~t_GxXyc{H6fUFJ(nN=83#pepfSQ}u!72M6%6BD)V)Ox>}bziu4Ju{8o zz>@U=(@wpt42rCP>?lTkGL6aNpeP#PmxRn-^|C%71;3<_$<3CfLNqYk{JU6ahoIz) znDU;B_{z#;uH*dy)v|{c^|1U1cri#FGpk`2hEa0!>$JmDu+mnv&gq!;{da*h&i!HuPbG-FZ zoN~F8J11cuyKD@D)BX;w^&#w=slSCd4ccN>$0S#%spSmv>-k$IZfgOE;47g6Q(3cJ zT!yt`SPe$iyZ8yKAuS*Bc`5Y2h(>f{Ywh^&F?EMr0Gkj2D=0sAdQBngtjLzgnpNlW zPch10!$geT6nvi$oWyD$JA#Inu^k*_Yq+_DG8z{6Wz|$EZWGx57ZF#{zlO@IQ6xXB zvoabQursUQ!Iff`^o?YlH=0!>zsb3*KD;Q#WkphKz*=$1zQ38(KQ7;P*B#?;XLSWq z>=`GpyJ&_^tXeGSnJzy!GGT1Cg0vt2Lbi;@hEa|&WdoidV?g^Pgb0Db7n+~Si113s zv~9tPe~Z@)y<@DqR9wX9*DA4Rw8gTqPTaz9N4OYSr-kT5ZMa-sX)ZOFj4bbUy!ukn z$CiwDMXeC6mQ03NpkkG88k=fL!)jhhSl#HekkXT{d7kp}8B-3dNH%JHP`Hmt!{hUeXg_e|<_=sRjpH$?AueiZ}()eZ7)_B-brZ3XS3i(h}ZMD?%V14yf zQD@=pnQ`mGh>DbAft2ZDA-J%Cg{U@6mE?Xt*|HI=Qk5|nV*HE9@ReKRwZ8c6{`luc65W8^ z*x*-YfTeac?hFG7Y7dzGqUG_W0YpSG1CKk0_4{jVB;K3&i<)bOKV&Q!-~T-ZC0gJ3 zYi^?Ii|YOaWrkI3x$)?w#S%X(=0%^d^87F=3PeQK?+llL!BA(@Bux22TUQ?@1y|z- zH&BA5=A#y&1QB4&fj4m6sSqX1*hTk7<62NhdwDNPvwgY}?^-o~8c#B=h$G}jVK86x0r6Osh;falYV%wf_|SYU z1B)W=F)4-!X=5~gZkld4jlhCcrWBtAg|1n4ijL6Dai5!m05{Rb>qJDaQYfc4u?7w9 z%WTKaz4=0C!D$FxsYaqlqGE%WpXVkp)eDY=EvL+7=}A4|>!p~syGk%0aca=(Y`Lo} z%guMBE+jMd4IOg;I+vUJqz)JgoVC)a@ko{+$8bt_?MS^x<26vKHy-wn!o-g6R7TXa z^l3d|zf{>1miTN~=;;ECkpg~80jLNPAWSXwTB>%MT3mwKWflt!uw+ElE^!WFieSP0 zl^N0*oLF1q8>@t#VvnpAbGqnsbPAml_N&FyP)92$Ejtk0!tm;gidBAx%;l-mhDX~Q zrMjQ)Z;Qd<~zkS z3eS{_*wOFkr4Td}DJkoZ75t9T&qB?%vP&7+-XfWTiwe~CV4v~mqP&5Z+m2VLZ5SEA zGoK|_9((;!yu4qHI~#doQE58ft*RfoTXm(SHpxrIrPMYjRQ9!1GbPylO=rl_`;qy+?}w{mX=-F0S%>5F7$!^Vhq6H_=SWETzv-H3aXbG*p=U+ zy(l;si#VPZMB2L1$dJu#r^e5^3m7h0j+6i@ORch`y)v@L?6XXk8Ff6;C80=5KS6-OkU%gD36r^L6J|6zieCO z&ucmxL#39};TF7y1GP;0qmLT~*z=5Fl-`3pWd|Ahv$Z_QKWrovn4{o=)T_zeZ89w#$RA)O`r7S8##%dMg0Iljx@@*D3w%k;(J;0?LM%2U-o*m*)GyzJK1sVF^SYm|ca0!ZNI2 zm#hv}g31z9qRZ(r-MZ^p&+;Ax@=aXoRd^wnIu#bBvn}|Oub?WtOf;#p$OXbtLJ0=T zQ7G}XH1!L@G-3Z8$nxc#sV_j&@o*IGx~LQ-6WN!WL6mMwbyqqIi-_su2))2JtE2-Z zq+|trRLU!tvdJTyG<6Z^Y+Ds2-_3!hC91X*4#DoMK|1N_3c}Y#)iuj>8))jjY_sZN z%My;hPE1gA6KFSi(0~^sL~(~|^d^`zd^J_~B!VimcFi*A?O{sD(wkH>vW*@r7eKDh zYYH<|D)%Uxe%XWEgkVq^RS!tEsLa(by7PHWyx3#*@NzIodQ!7cL?7lQ2Yw(egJ|Nj zm7!69+&JhMy`O+ajeu90`sp9Esx%;jOI`YQ_Mp7c{}+Er|Na3z8smt zcEv{p&1Zm95$kv3gag;E z&&fB{rJpR{s6Do4=`6&YSm-Y;zqQmYM3&5oH(IMvNsxwD$MMr@x>SoTIWY&I^ErYx zT#O6JN63h=-mKt5$nseEIN@haR`{7{ituxGPVjlLAj$2RiO{6neyh2nH?Q3TokzHXghqQJurgn;mWvXXU ziLL(Bwd?tUR#)7jj7PWPc8P-1iqE_^w78_@Rl5-xMR8VRXQ&pcCy31w5|LRC-Xl*A_LZ*|pYRKIJ{tOwQjFx$Z>7ZEEFp%ya7LePBZ@|3Z)Yh@jEhJH) zYKt{zM%ovO*HrQwjLbyMg2DwO$oMVgnXRE%squrN_pt%Gvw|*|#9d_~?P=?k&6(?| zNK}#-nL^CjeDkp z{WZrklwy4UZ0?;UlQZTYWrZX2sTr?F?em^-&nvtT6*9u#)nz_c!5)pzEQ>fR{b=q? zbttUfMqXRrjl8B%Wp-6=F*XtEYctAiyk3w#{CDd)ec)wW@Wjh+dXF`|3v~f9ffY=s zF3Zz7kTM5S?i)`6?chL)FBpoTJxGQ0E{j{De~K>pw(wa%`nc zKFYg3xV>#lfvNvCbL|vo4bMJ+dvD9sy!cfoD8smWF>)&kP+P+F`b6i0G(58mwWQi> zD(^j}2iDfMIUt02)s{58;c{pgOLGSoNM}Inlh6pcEZwGVQ_T%?$Oc_o|E^cOQLGb(_>Z#T1Y z2^~Xi@#D^;2UMq&=giOVAHpUQvKiH!1z!^7vaLF?l<;&_cFF?Wi>pi}^o@#59??;w zdDdEI_dHo}<6N2_QTr^_&$i?_j&=G+s1CK9gWFKvM>p*G^?&@wf5?tHGKUpn)%4>o z^XT&on(3ViqYRc!2|a&QJN|Xxpl(a$Zt;*KHG= zOEc*nOKdw(Mb&u29-`r39W!9X&k#Vb7`mO|rL~(Q{ec=?t1c-aqR_?eQTyqGazebj zUC@@Cpu3`N$Sc>4Qnz{ZVE-X!;pzF(3>4#`J(fz+KRriZQa#f8uHVL+a_|JMJBz`45C}#6LsczJueX& z3UABGm*ObRwUU#g`=nu44Xqw+*!cE|ig(<8k!%vpim4%V{}MFzU~c~56q+A<*_K0F zMV}LM;~X^w|%{gmoCOjFh4$9228L=4ToO1l_(M2$U5poB=o+q?smNnMPVaU$gC#z z8qi?H_^l1yLRX*r-_0+l73Ss_sm7ywbH)0{q^cvbK>ALs&pJp+ z?`=)J#av>+S1V;xsFqvSLjD4T{%B1Ec>5}aFaBJ!`%0If#@z1L4HRFDm4q6{3(4!aqw-YG)6D<8AB`hg% za6ag9?04WV1x!86GrUP*UD2By3h<(^-?QfvUON8Mvu`i33X@^6P)myB;{JoOSkOfv z!hUnjvAn$2yxZ@z)TO9gs!?SxDGR6upNh=1;}@5y@0DG=YN^Y18uX>^G=)+1aMQyep(5g(45#o}r?UC-<;ooO1^ zQ-?c0Ud{==>~a~K-ph2io%9*^{+1p?FH&Zyt4iD6@(DL1c3~F?6cMvRLQv>~Skw@B zh}V|WVdl|y+4sv4%a|?>9tx&1JDqU8+nxAj;;va+*6}7b$6Ewn>4{Rb(Ccm%IH{{( zW9m6Ea(Y&}dDp;eg;tbf109!XNlIaN)6{IE&+GcpC>OQqv z8Lx6CuMd&GD%MCWy>}V65)AI&Vd{dgQjrL?%CI8Zcr_v|?=aH3s4S+I&r-vY8qSvxI=EMRU2Szd?RJ&6E7eL*P4p%pasM zspc}DTWq$LQnxByxGq>?%1SM|^lBag5r3|DZt8E4pKtTNNdL%V;5)@*D+v6J3NU~f ztw5|{BE`81xT(KEe!k87BK;$ef$vPiq9xaY%eD2&GEmheuf!;(q24>D1tk=h=5I4) zRPzvsOv_ckP5rldRe!@YWSvrW0!y_ybJ4fOgzJVAM#s(2Z8)^uaAb;wwz026eWd#k zGKUdS9RX7LsTbVdq=S(9Vpt*~k(3`4pp1qk5`DDcYW*vIUqdcLE`s@_LBlpnV8gOm zcV1M2n$`;(^*3;rgQ)oj5zk-j%xc+!%<0IPVlE~gE zB6|-K*_-IzH|pr#HhVc@#)K^sCnf5L-k2maCVV=uH*vUF<@3wb2#H%FrPKl~18bQ5 zTCvT)_m_+fIUGQMvDM5n@Ov35DmJP0CQYo7V3LE_xV=nFn4$IHNMrh|64pBq@epdb zi_m8c(_RT1dd2%*EkRA)%d}S{;Uwvy=@`5Ec&gvW&k~6gdX)sf9=43~9TDbq zw;=07iQe0=%uZs}3XLsEODNKYo6|&QevVi55}dg{AwPTgDbgtpNWHo?8Nl(7D z`ucml#UW1WqSzuAoK<3GYul)0VurI((yiJ2AQv-tO!|oYP(`>mSv^El6?C(Q#UDm` z^PHKJi5uSkO;y|%MFX=;;z6~NUq>N(41y9aeZ7rskpLlTl;uLD6+)##juv)zkcCxt zHQIRWh08Rl*~vFNma%w3>hVGVo#8K&G*c%&RXFB6Mq7Q0c`8YiQ)m?Z0_YWj4hRr3bW$D>OCQsCil|Ps|iNPfP4g%mI#p8xe33pQjkZ(k`yT# zu9jcTDXJ*z&)gG4c!_+!iBymnZ`ss`!*LJGA#8CyafO$BAkT-nNlMpC)IX^(faipy zllSgRN~*7uD(Z=nD@JYdP*g9V*6S=q77!3iFbdp4)esF8^FqFos71f;=C(*~-I|P! zSA~K+yJ4qBN3TmXeq#93``E+L3Bs|K3&*-%Y~=9V*<7XF-r!frSfz6QzyhNDNna8& znn^gKY}UglY@@I{M2)%1n~Zr95e_SmTdoLOKhqAs;@WfXFbgFK-uAGj27HV4)eVFf zjbl8E`jUO#s6?9CmM)a=!zd5Y|0RVtw2|zP$UkewUIQ7_$b>#>$nD;*1UC zpavwUhVKc@9_P~{0%2lkSFXA8)n&S-;xba)DxhG~N)c~RHY20{FyaeI1*ZBf^5HE3 z!doW4H<48jN0C{GPbBtXWJ{3#1^)gld0vz}AIRNavbc<0vumlfJ|@hfo_L+`X!n;l zMu13^6eU3$s3jpW!?_+pgwWsq%r|-Q3YFi)WLv&po*3u#SC?JQZ^~GF{+EBlmWP`^ zsbSkJnOxoh8R>@rG2}+8Ax3`>8x~u%47iz{3m$sJp4AuiB%_|~M5T>+UbZtB^)6wi zN-|GMwPFO^CnBDn7j-=Q7kFPZM`oa+Z-O9NBZ!f>l%yYN4f$YTMN45>2jxSyHN4iX zC|U#ylDV)!V*aOeR7=7#=w|SeM%53}Ek^lEl15X3a5^B<)d1EKz=DC&YcNFNi@;MW z%xwoRM2s$)4|GMh2#dRpX>L9;l&wUMai0#6Ab!*P09-~wiL6GnvRd=13fqGsT*gTq z2$8WTi!Pth@z1Pr=y`Xba^sF;ZrqVA6R5BhITfN+U)kl?SC<9lB2dV2NW!AXnBxuQ zF8kn(%TQzv6>i3h9IGjJS&>vPyh&<^*ui&78<$=hMY zJ*j^}ClTdzjXE{Qhw&CiJNMcHZ?vTgjCMt)%=V@$`TLRx5dXq6vZhSSmfDGqPnZ!e zT6uwIL(a|P1B_79cl-|$P9s)iTH+SyiTt%Mz zN+#L$eokMzSZw=UbRNT3LZ#Rvn{BK{?b0ttZd^c{YAfW}o-QBgEiQ+QG;Qz25X$*(^q9obWPVAYOH`Ic%$)dhIEkyEIkCoT_R^ zvHd#OZn^_3U&dchF#Qi;l;?%g8R+l^e^O#GE z2*1{HHd{uPr$0k{vlsPuHstSmDLp|hr)gbAXMf5w9CnJUF%COdBDQ&tz9ic{MEUTa z%W;IQOaM>nUjo>uJ(f|8_G4$t3sll(R%MJKX>%1FA)5dU$}#^ew7Z+OY6WZmvC0J2 z;6z+T!^TNiw@>hNqMPeKl-YX6P%bd?DfkeIU>EiCJ0F?K(rOq-HH8xgRw6HC?cby7 z43xoY3gtBynd-8Ya&8gokjt7dTK;M#$pI%VujnnkE+4vzd@R>+K%dw%i6Nb}($-8c zAWeWLQe9Uz1vG>iE(#TEOJ4f9Y@0^-jqB9#tufK!wUjQayeOw>^>P(yyvkUdneSY5 zIopc|lUO{8Y>p&dL_PW!y~;tmk$vZ(*o{X%7xl1a+|yLZ3>%oxLHhK0WSsS@4>Rx0 zAtu#^`twiE6WR3X4K{Zpiwjl<3F@=e2bQ`M_3s;)hNcW>sj$kp>nR5Zi%F!)&_DC~Z@r@ofTE4QeSeLh*Vxn6-344Q>_E+Q+GPbzFOb$*=zC0;q%IuP@ z8tP0pU?tY_1-3>HC#GU&SKyYA`VQOtW0Lg`n{BV;v)5)-?n_@tRF9VPHFb#p#oGi~ z8IzPmX|_SPXCjSZpBO+4;BME01%&PCX0i)-+l?=F%ZW|hl7PlVpDvXY?&l(JyS!%h z)bBFc*A3owCQO-ZSym8g1j0)&A7hT$Xyd-3HyJH9dyjjt?`*x%B9^^YJ05dob0OI`)f5|c$hk$G4apa|m| zI6!sv5(0&5`=7HTs3*S)Vq+jfN0ba28sW@r-4bX7_fk(6&D6oW>gClo;|k=&2I^~I zJ+x#OE9rWFyR4`E?UB%tmS2m*iP#(9X!2vd+RV)vpWje%KRh9M;21xBnU1FY|Ovy@OSkcpjswWS?%#{-CXn zM?!lIXNv~RRSC&ajItC%R@uPIyv#UE#xztHg3YRuRcGoxkVb~;`gSq z(#j+2CD4+LZH>azix@h^IDzcRsk{mn>X(_FIm|{qJp+iBE@qc}46}mOdo)(>iG)6A zc}NrtqK4aBcm+l#IH4CJY)ag++P1c)+W#aJR7%aR5E zA9KZO#JuG`O+M^WqTUsxm%a5@UPkn*c(P$PSE6L`!L&sWv7YUtQRcfm4V2>v? zE>$L5cIafw8=z;^^&);sH^IXsF+IAHS>vTYYNHx!6Hth!5tE?p5$U?#`}6FHcf?sp zt-S0k!FBdTxT5F-I6-Gxy6Fz|Ju;bRkppIk?^@;yrNp?bo$BbL4e$uJxfG#WoK1s0 z8bQ!Q?;7hwKOnrimGshMC}KB{bIKYsUykz+dQ2*CAUvFd5^^7ZTxgHDG@3lrg#Y_r z1o*AoV!P2%T$4jwgnTkZHon`Dc*aL^Qw_*QJF!9tt05wiF~5(gKeQM7>%4fg*N73< zP0rLQC$LI0TZT(#N!Xb9(&DIdW;=(>if=eZD9t#b_1eK*Oa;Yk^ermJ;$ZbeNtZs$ z4C2{2K#@jlFZX<%MJ^Wk4*&opgx}fHW!lC5#UIuYP|F4*{qzRkWqjQ{Mt?9tYoN%W-A7-{kgYQO;z7Pw(8kA@pzg36j z{7bwyo+(sr_Fi-yYWKh(x)CDbTcN(yvQ3lzEH=XB^PH$K@G2Z^7Uma_F`wA6IH+8f zOHMhL7GS_Lk(>NrU&OhifG!lUu;%cv6D8B(qn*a19n!7HJ!)%mcp~wb;(2Yy^P4A{ z>_f&`o=6mg2*NfiJIv6G4zX9l_XaDan-RXl%TzN~#?1)z1e{T;%dzd&k+frtNKU)s zF}876F$rB$pPsN@vdB1aE;jlzVbvdBW!sG}i51kn{U9!)=9FfGFS!W7Omknvb7jSR z$9f1qa0s}86j~8_8S$zi9AQLgp5k{VemCshg?jyolO{mzr>MVq)<|4=Yk$emF zwVV@n{KwMduqNc0nn{QHjA*AN=A+x2*Qr%Drki*gVf5=8gA3rSXNPq46wA4bvjJ8G z(i5>z0v|5!!pn#SWZZj5kM2d-Pi3O`Pc{xiJgkkV!TB=1f(=1kOwGZBdQPc5BL=>k zt8j`M1Tt{RvGV>OMuYD}g9oF*A@=ShWCN2@9Xurlu6h}kbz|+rL;^dY} z6kzBBAz<@;zovqhsj-|bY0xw~>~EP^tGxd73^#oQ86D3w3hrVQdnFi9C-y{|d=SdT zLle}VC4mv165N4bK`ldSkC*`OVIO~WK)yPD#!|9lYuKxF`dR#uG7NPQ7 z%30=EzRlDFPvL!t8ONWhfX(;?mcKV+FnBy34uqX+yS2Q7z0?09sEiyt5Zb@`Hef>( zSyYetV-=>4EY2PuB(ELZX9tHdr^T6ey%pR)s^3%5GccGwr0t@T$0mBFg#2f(GK8LR z6W-Z!R@k#8U8KBcWyz@5AfzW+TF7V%-~yjO%=Y+d!u-EOTbL^eaio!HbX-OI==%U< z!Lh2QdNHiJ0n@m*RbUzcRS0AeBjf=ARXmR(>IASxgMCpKZVmKSSH6p$m4kP;hSv=F zPhWM0SQwoKz)YS*0pFr}*}2wx?ARlop>5hd``N;a`_FFPltnZ9w+P=@D1}SpBwc+X z1TfV{o#mORb1@T4FZ17lbsT1Kpp|H=q`!kq-oF<*@pPppR3@6Mp$P(FvaLPm0HiJ^M|<^-VTC`@+nP>4}vIldGOJ8lls+ zo2$HFE0Wn|3R8W%Ktgmy)X6CB@jrMMK7cof&+^>7JPjG#>}y+9Ox{)W>?VO~bs5H+ z4DsM1Og2-~Uy|fYy?}g}ZpO4Ro{z0FOMcgXmrsPQ%eQ8qbJs+QoRvPiZPl#2)kV5( zVsg;=f?I$@OCi%Rg-A@0I0l5(^g}w*c$BlAK=yKR7PEt_-nS3}O?SdjG_-5gXT|?L zqUN$EES{ppCO=X0WUwDbTa&-A{X{g>-SU!qUX-K{x#_E!uA+4^UDaVZ5*k{?gtjwn zNUdW&nEC$u#OD&G#<8`8DS5mU6kuzq(iCer-(-0houSzv=qce_3_PmG1s9Rv2^^1M{z@-m=ZQl-y0uEHWhc+$cNc>}MQ@gkP_#=YO5NYFA!b{LoHtPXl7 zyKF^A?d?NKk)((v;e!ks97c?j}@d( zV=LqeL<62DCXaatZ_kSj)y}jRbh(7A`w(c=K0V1RI2`G|B`c8_t{F;A#} zbrB)KNN5gxNJMUrB-<#m9||4Qh;~`(0ht>(^vsaZ-7W)%371wTU_TEekTDE6w?QMi z0LPqxDR6p5HW${Ye-v=6Ac5Hod%(q9HC5E~cnyjrnDCy}cC{)t00RDuqo=8Bm*~lz zVmQqHK@`&|Z-5D>OQ1l9fGHCOd0RM##drW4tv&&#Cho_NZ7H57I0+`b=xxFZ-N+); zvAF8SmvT0Ex3O+mn+9k$nx!julxg1?hC{s-FGq0`2_;uWAORsRJ-;%`Vvy@ygI6(| z^{)J0ql&$R?LDrxCy#r~c%UXe4VA;JeB);*HT8+GHSy@g6U`WMqi1wlX{}fUzUCK; zKvyWog;U-tS15NLTF+B%{jYrx#)$V?U+pe^MN1usG-9I6DQ*cEr#{Wt2%t%03mzLM z6xFVEjZFjKzFL&l`(J;OrIySHXi?eBy4pv46b|fA+cz<)#P~)IZwsa+zFjZ+whmt6 zEz&9%(VHyP`$K_qBiN*)td&Ti>?`PfR*8+$fN@QO91kmd{U`yJ93WFsv`hlt6hxtq;MCdsTb%Au-(t1r~&rs{N?N%xwrKttmOBF$ATTV1)F zI;7r`N2Guv3K(01&gpIrkK`Ovr{1d}r_nJ*Pr4vVG?k@cj>igzg<*(6Lf~BaDgG%~ zKsX-7f;2*~00yM+FP6c@Zw+C7 zc}QXj{q5coBcr0r#WpE$X<%$uad7jJAM)lCyDAbu9TB*?P%cF}*|?spe-g zqp+Exq9sr2d}JS6yg+~wZj@Mrp0XVrk)63B@);e)AOQ@nWHCmkNS|majI;Z4l=;bh z0%86X^b}q0y#v!bt&heUeaum}=sPeyXMYGM7TL*Irru>Y>_LV?<@1i0Snoq&m14BX zr1U-MF!sD3<}1C~{vF+cQ#bslgfBwxr!`L~$gs&5HLi-TIl(~-o?XTj8Qvzf2JK2V z-x@gCzTuMp+<>aCIAdInW}#t1BZZ{CTYHvx`%L}beG-0k$?kV8^ zc(~(D6#rFOE6-8&I=kux;f^=&_&mPd>?yx!sV;5Bh}N0Imr7Ih z*bahH6cud!?sMhF^w&_cjy~%2#$xs)b&d)$T!zMasmk=o)a8u*W8h_ zq0xFPt-)f)4|HlpDk`jUbf_$sUNM(mb!Au80#h+g_G3Jnf7hgqbO_siVkXg2Mii7i zOpsV3Zb0j)ncTJOVWly(eH1?!_0BFb?#EtD&nWCa6z++J5-o2Kq|5UX;n{XE4T;7w z;M$X+e_3Q|i=2=7i?IT>Z8hQR&u4WmVQA$zQohiSL>@=aa`=O6uJi=9BA&IjzYQA~C?(wsN-VsXi4y#%P!=a?JigS5nol1IqBLSQ z&2AqGllvtPuH=&=o;`#|DX&p}j(AI|BrxM~Ax*Yexvd$@fC~$-lZilW+*=e?^I$UC z5@=UuK{=RyAlkUVuZ@FL4W4WM^)VdB7Up|!q^2)d)J6z9L4P6v=j6qx@`z-Ln^OJ> z)vv2e9+Da>`_{ZH^;PyKb5vWaCJ@W$ON)@yn^u%lY@p)`K zGHYqZ_6ggkJDyrjTb;Q-99mF1B@aPz1mCW|SY_hLyi!rS9dj)Qd#ZhT$o+O4Y{#pM zQ{N_+9rxI*gWZY*4%b;rHZ~>r#JpMTpPL(JQI8$J6T_*RiqvhBWzgql)3Lz0{srRf zp(e{|Bok6kPz5~|r#b9a(b9MgzP>fOAZgJU=LF!FlqPA+VqI#N@rTa1IZc@*xJL+S zF+=;r2_jNL;Wvf}bz-VILL;z}*}CEiOHErJR&{v3Oe?dU^KV%j$b)@9St9hHSeR(a zHQSOtd*G1q#5Q*rbXuxd$uN*}b}RevqnH*B*(JAP(f{7-q1@m$5WYw~zcAKmHI?P!4eX#5-(|l-_okaFr3|WUYerKR?o0XHw9^IJG2fGeuplXnB(G^&Zbrq0HkD+_!IHu*RBa_-80(@h__{O_&lcqUp<0ZIzjAv~Iu(cl1m|Q~Q_nbz`QMEH^}ay%b-T zTQ4M3L8#WhVhV>VcAbdV7K=(wmr#Vw7TvU&R4WdU{4=5t`*=lD+=?EcqL)9JhmH^v zH`(@#?KGD^&@Oy)gg+SVuhLuD^?TcDn)el{)y_3fjGt2Xi3FZ#D#lEMp3HP*cCW3; zH1`kvJ6Rdh|HegzuB-^!GTvM3bMu*{=CF@9$G_sswwfrr&8Tr&adOL#&nZ@&YZqja zsgkudCsb!L68@6R5)U-5BB58;9;opmjv ze>}7UBfVcSYE_gS$2pvR622q9pPSkBbH{Cui}a1a3gmmA9Ab}48I)o06clYgD$ESyGx8TWOX z{wn1F*|af`jZ1YzmKoy#bqjxi57`dKKSCB{`1dezR=&x8N=&;*U?(F}X8>nCp%7Q! zhLwq>E=T$h8y!}N_3C@tOnjLo*7$mT6lr|V3SHq}@ija7dV#iI^x%zHJW+KH3^FaW zXtID3#EKww74b*3?O3;0{Ohmq-`ZzE571B(6zYKb5u=Ihcd6#JHUvP=r`PoytOVTq1 z+1aN+`ctF=x2FkivoC$=$%0M&T%xR|1az8wr6X;Eb+y^zj+`)4Da zU7GFe$?SwoX-k%*zmV%)zmLUG`U2IN?anNr$?Fk9^ZPtQQYAs(Xp=}XT1LU?IxETS zHA8=1@imR_v1kzcOF=_~EP{ql%697xS|G?b+C(rx^(~A{tUrI$E*yLZ#xNaOkgetv z=RsX3hnNYL2w2~~h8#ekds&^Fqr4k}yVMqP;_o@A)2F{J%tdX<62cB$Ds{RaO{xDi z_~M0Xx4@>l<|u#bz#*MFxEo>243cHYEF1#BG$&;bxOLGuX-6RqIH9(*y_SFUh5l3} z;ZSy)@rg}^a6O_34F#EOvs9%AkL+BCKBHbljyiEeSvGEfvVBH&n5zNt~^FBeow&2YB*_N^;fPVSGy z{bfUYY4wq0qN(Uevb5Q+_G=4k(3`&QNODl#2J~Cm768HEJ9${%`t(~tEhtWhjwFZW ztyjMly`82t_EvJw`1P33yo$L^&_mO*&MUYxwEQyBTDN?;cZ z4iRRnf-j&&LkZ!Lyr*X+$67slnqC6gqH@(mpnl7K-H$;&iIZ6>)2r^RWFSk1@fOuR zrdK+%M~08Y!2WUqd*RZkGj+iRl++hsVEjbB@kBz-AgD}awh?RG>(h#-EPcA`ckxhd zJRq`AdkG~G70GCSjRN(}|8;MgmdaDd6uwKGk^-(AM{y!1))J%oRcva`Ao6_m2~*7- zHa$~hCk39*#%G5>Xa+Ak9PDFLGcVXDmOSy(n|Df^uIQ37r6!^F3JS%zX;|P_^VvI} zgbiKD2Wu94K&DoQNY9IhO$=Q;{S*^l>}^K$BxA0u)z<>sFvS4Rxn!J+7ncBH0{~iQ zD!$Cy{K`n`S<&EDS3V^DIVZ4>@|qrY&?H=v1iTw^Qxau~xEll>(GiZnJv=$jeV@gp zTtuIdk2=Fg5Cd6)eOy2CkA~<{=J{N0$y%NykHyE9f9WVpk0i?X>lwczmNy!f3k zAWd&5gC_e7v6c2bExjE zU7OGkFAkt6Mi-deIz;8VN3$>Z-@`pVK%;{YMa8dw1V@}1xvae5*wi%{pAPec{YG<7<|Nc22(U?-8 z1>#%E)h!j4y8R+``z&?U#Tp`SnTM0Zqr|{aM79zB!$%rW6smp~-K6vIZC&8rnmhgvXavaQRwIXHPZww? z`Lyr%5$dDC#AKp>rVE*PYQ2E_zd!q_BYf$c;OQqP9mD$)s>-YST@~ObCQB_+s`Qzs zb|y9XF1`H93#G%7$_NoB%?BOopA{czw74aZj9 z2{|~3L;@hM?>xxj3_v<32=;S;c)H2>+@!B{C6gE#ZPP=+g~L%_2}7^^yHH^=L3I#gLU7XMsr9LkEKoN5 zuWz3KUy}u2QuL=lK@#688N#CqF^7r4TqQa4iXgHNvW&Sx-^OTUmr(Y!rV(%G%2(Z6~@e7go{(bk0^8lgHB@&4=Q^_du zbivY!rH7Wy`{NOyp+3HB<1Hbni&Bb^%IJ_v(KxXPCnT1jRzY z_vIb`yI&qkb{0}Uv0AoCXY!?8GaYGkN5$KJmTD{y->62u5~5D`%lT_H!%Oy3ksh*@ zz4%!|Klhz8yYJ8Y!3H(;QKV-J0KfK==V9+U8gl)`pfO7#kT8%7D8AvAf4M*gOh6L{ z*?NE=@0xEtvRNgM_A&MtG26^SnyTqHV0~uB`>IpEBqj<3h3;_JEHwI0na|aL1^L(s z8|X6&b!T-0$iGd$@7K`w(Y|C7rnarn9VvKd-{+hC;E$Q>DKfdO(9>Tij6J2OP6oVyi@b#G|-6FfD$Z#nX%Fw-XU!b@q|6ggdA@E3WK4~|6 zmxlX(S>*dB1Bup+sS1)~6b0^Hz2K;>i_WHrTLsNYm$utWzVhzZH@WpCM%(8Rj0OI< zXYc34dvv*OBlVh|J{Q#l3!u&)4&0MA3D4z$MHZUz0+Vw|Jlnugyc*)E_Q81KMC?}8 zj6m!W+1Y8^T%I#98h4m3@`tRr#MEJ-=u0qbP?0)uCG>uY<51$Yb%ZMPWNH_-9sGv* zbd^k+!Gri?-gbd0;i|jECf1o>C5w_e5lrx3ymII}ZzJ}I#uuYQ7?T~`&KV!#GlOuN ztV+$3&pOlI)NV9^X7GL6lWsd%b?Z{~qMb}n#CR^3z>ZJiiCv;v1d}jgMJ@6N=BDx5 z60W6O0U1*}!ZdNM;99|T7S~y+6_kzZc2!$9!tM6vf9C*aTbxFBi`$GXV$3OU|MsoP zi1?L>9rg2o z-n0#VLjodrwmtPV(AJ&bii92PyW`VNwXbrIoEPJHV-ycPsQQ5HsaYhAHg*!)@3q$_ zBidfYcH8`_oKc{eOcPOhFO5^R3&kD|4S4OvsejO!Ypd)ysH?Rr_h4gmJ*C<4Ilj~b zlw+&;^&(6LQX%%{arKDCud3&7*{Ccho#*Zdj9=emH)+}TGi3+w-LOPAz{-s9?u)R} zGdlJIv8_&z=B&-|I8f=-b#G42Bj!Z=?^$|O?h)}H;klipl6a0!gmgJ&1nUmt57B}X z*T&~_#@o<6q-I+rzxnHwZ*;6CwG?uTE<}8;#a;oeGm?5i_TVWuyBVK*lKgW>D3Ec+ zj?q5bt$IC5zor?GDgjDdeV$_Xzf-&$e9B*7uAO@_c?<*H?c8P1ziX(r6aVxW%NNcA zHagw{4DHQwxfJ^{ujxMlCf6Q;2TgdVSJ4!TIZlCGK6Ecw+0F4~zkKAra%=3>H717E zQ=)Elm6U(?CztOTQ~oEEa$smK`6Pd}&M%D)x{YQh6!<)&?H!lhZT9oIX7>!qstwB- zqeB!hy4ka(*fdYN+3Qci{}XPTPf9C|>_evcz|d1}_Wb6Vl3g|!b#{rzJuxE2Ci>j4 z(HyBEk?kdIt4=E|IDfPSI_A7|6WT`Uw2Z8{gn+g;KbyXkHF69x)BP(MzxJ{ImKYt` z{yyP$!Y82N&$%N1m>n47)$Ou+bN63L7G)PUvSVi994Ij3pkkvZ)F;+qBo;aPfvG-X zF^2!dM>w@`h*cla1u%V%h6ZmdcK4H(Gw!mQoU4|0vCg6Z(r$|!eNT?~=4>A#Nr{Kz z^==$xd-k2nR$Rj35EaMX)PLs7Lh-Qd)qh&vrIzRyyYa1v7}oC8{duz5t6}UXn!aSm zSHQLITqX(8LBNtD>N(exXEGa5wpzezELOLt4zX>ejaQ{^L??L3678Tq3aN{VQGAH~ zQz?t@jiUVG-#1+20@`rfRJWy7!eOrL(&0y$3M#ZZ52hrm`B}DM?M%Iq5l%HMz@8~f zR{C*5>K}9yLJE(y|0S~w>|N4p=B*1v*PGuqYjTsPGSL;Ub2oOgJDV<$(Z+3<2SCZI zZ<91`^5ze07NXTX?eQvfT9CX;>e!@na!Ah_djfCxr&qY+N~8Z(z7jo3?w|0>fNsC7 zOdtJSdBl!C)<>E09DmFgkh=(9A}dp0d`UDnD2JQR=n=CES=rMTz5c$kt0xbhMPf0F zKvgmOF+X`F8vbzVKg4`^cJ1<}^X%ETW9uV{WLdsFs;aKf)cF{)%_UNps5nMTjO!w( zFV0)k2aoO3aMk!`KlT^ynl7}}+J~uBkbQ3Ie0m_NuJA?Tztb;u4oOD=qL5HkCGj{`uprDumuUF);1M-{y_VQq?5RmPdQ2b4QMP;4^sSZtn&-JvVl`cRAWU3h z&Ye*2Sn-Dkb#2vD-1=(vR+N@?R(x$rKVRlkmt3-TDj;39(!v?#%ok)N811|CS7=L2 zi|D?p_?pA|)dHXTd?1^_EsAg-wD>Q7aWgiK$>{kgzUKXrTrYm#t!8Yl|C7!2`BQQY zkK}sf6LKxj<~k}^mjM8fQrC%*T;KbITwl-TN}iHSMmKDhcG;hh%bU%m$b}}HZmRKl zK9ZARsWiS;l(=qYBbyl}F8J8-yjBJ;9-Ak=);E&;)qC*BcJ2=77lM18>spQeCZ>%A zKJ!V&EQLd0cb8<7rS8|9N~@@6NFrz5C9OKuWh;|I9##RQXAVg{@S;?28uxF(TS&%0 zmC%0kllNlluX7A9o*2v``8oDrs>`L{MDV&{rNeA?9FG92TNrPk~Aa4?ieJy+$}cAdIF zZ~MVZMBLF@Yb3e`EDiHH4||1IZAtq@R4}YvspL^QO_qZQJw*~sE!S5=moq3i7Z@Be zDJBGb31qQT!`}3goIFzNt6DoVKkc>Sw*b{5x}i2e8c8Yv3rbUm54gNVwlLIHcragG zRxTpx+k*d`Y-6bHc4*&i6Kud@|NNjg^?4Vj5@0ggA1AG)UXyH3>u!5Ns?y??u1R8d zMp0U(+On11t5e-xqP(AC0$2jyr`5eHbooUz+r_wH^`^EQk+xf((u#R@YHLfRXj*{1 zZb?j8C6K~pD^mwtjxd`Bm+%4oP>HYGo1d4S0GdC=`AwUdv;tP>x`1)_GWuR4Jbn6D zWU>g4-%`RUP)rl$64IblhIYMlIrK*-jrO1f&(rcSK z`Go)g|MZtl%1ltwCl4;E#gyc9d_$81lC^-QFBE>_Fa$PK_=1gDYh^{|$G1?thWks* z9`BL0RebtSzN4YK@ix^gtf(gr3tlA?CFWY9~*NLHvRCgNjTA zMSfRvp|RXlM~O8Qp59Y@ssu1*40_3E(5@lK@O5P%6^To_Y8uPadqxbT9{Hm}>fgR- zA+8w&;f8}jcNy!~_s5DQ}LtU$-%U}2xLli1ZSL=kk=9#G%PjYTp zp;vQT(NOt=WJU(`x306G;|6jR&~jmve^xN;^6V0%+D@uro&8k_Ku^tg?rWSRv-M47k=<8zh#y`Q6|dG)6^q<2#Br|w5Pb|Y$2HHGY-W=q zoog`8?7u38OpHN#m)l`UF8WU944T<>k*OVJ`g4Fs6QVy@X!`u0?GijKsMk|i#l`47 zY1s*)w`P#CnKk720{mB-^r;=f_&VUit@kBN{p?xA_|4G_m>;z}xX8AvFz4N12sE3{ zt$xMZW-LUbtUVOk9q`dA9$yk&0!(Yl=>b-sEo_mhYrx_HRjjkJIDqGSZFYo|vlLKJf$hIpTXr!t6XK#s(-;>PzeHoXnGsYwF5*=j#!lBB*KRItfLR~Dj2 z*y#Eo`jb>c-K^U_#}JJwD~_dlr>UM26y}r&L#ILT7Il8X=t}UWF~3q zIhZxkc0?tj$)(t;EZsWNv$1zRt+7TWqk z620eOiU#SM7Fve2pnYm7^^vwUQu=Vc_4%Ik3)gk;8SVXH+-_-`Zn5(TFMsT}S<=2_ zrd*x#{Y~B`tFKhp$Y@Gwf*43NBLofn9Qv^Zp?1>yJA~n2-rEW9!3}17vXk3!c+>rg z(MFja&D=4$oh?6AnTg}~Tj1)&Ek!dOlRJs5Wj3a&CFZKVZ9d;uA8+MNN~0Ox6EfGk zO%F#*^p$@KIHf?$Y!ovj9v>n)FcWwX-oZ^)L47gleH+eUZ%uxtcgOo(Al9txq8gjB-QAQ)3F7O2ZTw_P}a51D%Y3SfU*nv$~@BHGB$u7HGo+U*%loy5SFOV!AVOh`0n zmxBMYtDD8rrq`5dK}d~BuaS^p;x$c4&s|vX)%Zxh4DoP^Yka;^)bdG0CMoVIf%#X( zsl$fW+H&*2=nbn#a*%*DPw6QVTmeBH998@^bNv}JXp!U>R^2}Ui>QBdD6SA+|72bq6N`4Q^pck@{0e7Cn0K)H=G;SDqrMvC#{t)TK$HG ztf$>HmjJ8Z2o0sjzQE1tNP%!!glw|QwdyxR=3|IUrPd)!?M3=8 zZVPzuXnM_Vp=rz5o^}b5^iP7Z^aJJ#{jYj@Vl4O6pt?Ld5GA1mi)s`sW`&=|C7r08 z9hpPc!=5w%z|AkHvKUt<+1wPvCuC>5<)4{@U|N|eGW!ivzP5htBmgn2es%`^O+1T; z%UKGQAtT!6k9u7}Fv4c6m18#pXB-}h+|Bm;UQ?O__B|F8@ML;vJZ6zHAqCoCF#*DK2S1uOVB8N-|ULxMb7+P?2p)} zluNqyS~7FRqGaY29$|j$%&tIB`-%#FaN$?Lj$bj=&E6zou67j{@Neo<_9^`Tu!1V{a!h_arsR zJj+K4&9PrO5)I>*|>X-=AvWGztUxg+*EWuL!`2VCRED z#O$}_MPh+p+hb-vS5gI1$~BS`nft>`6|&->+RWmxeJ(1q&xPz!6uzKBPd784bVzr- zj>$``?V`{syl0uD`DEa0yT9pA`TPTF1;ZQrgNF|zn{_e( znzi%rd-jOP%?j7vTR4Wu6eM@Y`nPgqEgT#;hM=p>afKZtj#2K~n9u*N9q6)`cbdTA z^89&00e?fD|Am1he_fu>U^5(321V(adn8FWxKz7nQHsk9=P&ZhwD*kcPLcQ#|9jGH zFu1m8k)Fm2L#;UjN}b|*tBiOxvPyl>f|=2(3hn75t2*@^g0&raTvvKGt6a>9zoh&H zVwSnbqLJ{=Ag%HAYAY%WDm2JWct!AC6+8>+L2+eYw9xd}vTo5rzipH4YwR$hnI9_1 z#Afcbw&w#BRWPdFGZFZ#MLybV_X*jI1qL$z! z(5T>I)#%j$33hVuc^FK|^o;`~9g?lxU^Y5C2Ld(|plYYU3b-d)pAMj-Rap32{4-(} z&MEL!X)cN7P!n~WH|@q1)0x9(ewY`3%yzDJttPOH;jZ7r3;f1{SjL3q*t;Sg%o1WZ zFtQMsZy~&bLblHMFpmLE$Ea16hf8k1Aky3NDfsIACR-0RC%iYcr@56wO}1UJ%!#?F zn3{A{EgX4d5vg4X@gdzQh&l3dI_{TY7CCASp0;2iU$@X4Pv&QH>-d{}D}(sX&W)yQ zSa}gYvmW++j;0MRvUT(3;C6)*yFDzh6=uGT?Eis0Xl!sZ@x6#SZv97iDESPqyEU`i z$O|%Ru~YruuQUDCG2JZhW~Y7`>60w5VN)1VZSD_cJS$?gxYWSJio=Ud#<7LpZZfAT zf*ttj%1Fw|>Ms)d3ru{=XzU}OV=EG44^^S1d$vl(Z+1CPE#YP6`JlPdL^|`!|AWTH z=;+D#@3VGY{!fhn(&-pu<{Z0_?3v5l5A!|kT2%ONMqq$s{9w;%hYuwgKk)S}1A+p{ zXki1RAsb|^2ew1b^2ezpy++fUokEXlOfTlX?2ZR{H4`zrY7cdq$vCC&XN02SQ_`~V zAeif3wVgXpWXseh@?8Kn*yT9OFC~9^O_IM!3b8a{sUOrc$a$&T=_)029i-B`5Fandv!Ol1&ZLGiGu+9rpm2 zH~x*w#}}dh=wlGJ$GQG$!jgDAk5%t!^6nRngD*6M&`vGLCx_CGX;F_)6Swqa+f8999`@V2mqax6Tk$M&`fOUt;E&vwSv9 z?z@pcN@Efa=B??%YWJ2dye_T-53ZfgTDStN%IEl9mUVSl=Mhg^QUDU_cFw!n6RlaKJ0XO&w#=Xs#9^)(`f%nu$tm`|Szx z+J18j{pMmn(($M%b4%aDdSVB|g0sc{EP#@A0pGQV=pSRt#tJ(n;;{I zea~uvCsrBE$y!yoO4zZm@s zI-LqxQhSyuO#fJbdWsqQg51UuF0q>;Sn^SC2pCVzX?e)DB(rI+Tl1)Y!b3ED*@gPnO~#(6zG#gYn{4W8H%!;zp5 zB2Hq_gQg!i2@6<@D+myA7yiP;=s3Jr6Z=M+5G*y~y1`P!yGqAlPPq0LhDA7HkVTl9 zF+sWGRgfvMAmZHSf6)}^bo?(sTZYDxS(7gmCJ#xtsa5axy^(*1ILI}t zazAnht*YEi!Pr?v*DkR`X4!=%UlTI5#&CCE zDATk9^GT=UVv6o*UqGbV@5Ohd_l$NrrV%Pzy2{{L$`fGw8tpT8p9NZFcFyMr_h*CO zW%rIK%E45sQHn46Gv7B1e%Bq(s&JJV@3|prWM& ziBB8M7(=JCZ{o0^cJv$iiiZUiT~l1t_h-02w7B|SHC*5bsYDZR@*)=82mqjG?~Oi@6gNAIq#!K<+5;p;H|^n29uuVLZ3fr?)fo zdH?8Z+8D+5mxqpGAehv_45KL3nar|-;Z@H%?a^&_O*Od$e&(o2wiG|cfD0&+ERP{UdF#=rbvRDjX$2uHu;(& zIu2n~ukf!4xZD-=N_y#zd}_9>>08vSf7-->Vwq)&2^N#^hV3`P8VwQy z+V^UZg4_bp>@mIg9@heBwh+q=*oPtouia-!!H+3~xsP||9kI?>F#V(H1EX6|4LvU$ z&o&j)NxRiL2~K|TL- zypE~J4brO$0igL zbb>TTq5T5BnE_K-iA<-`!46%cYz1}^4f48$YehN`x*dd+xw-jv9TE*i)Lfl%Z)(>L z*wDHm=pGAJ)$uCRqWZxl8czyM{odP)BIjL==Toa z`hDc3#`PeEeI66SoX0HT*J^Y*Z&}oIh$kNcQjaB z|H36Oj*ZJk>6BeobD&``MN&BA~7o zy=>Wwq33G8(;=UCI-XtfK$4Gq;I!K}YE(MgfCs#3)LF>~p5p+DuoqNWjLK zg^nRnKuVQExmu3!o=Y~rT75_5Y66qhmsHl}Mw%eCY7JpcXsQHdC#W`=4gFkEtB68# zPOD2af6fB2UOfbr5wn>%;U2ZF z1twu;m~LW$V~6oc0zbZ?;QlO|c$^ViQU$U~&ef+HmGZ&e>@Yc**&z>Nq~x78PJ5Q9?cwb0B0#g)Nde~Q-$U;4z7dwZ6RMhpaRA5s>mDYj zIb++_@~Tq%$Czx6Kfye=TlndxsRow5ecNOsH}v1o{z4{4mvI*$izp}e?8S>)PGoDU z6OYQ*P514wLd>9PLEKc1c5^Sby-bEs+bI5yZrL3S*T;In)HmF-07s&ig&9-L6FL9Q zR{pT&Jzb>H{qiXK2l+2*5=O&A-K$xnLh6!U$L=ly8Zy6{yc%jX3r&wTT14JRO`n;) zWAaaVSAU5ou?Hh@t1K$H>=SoeT))gtRiTsi^Xo%sQ=o;vIoL*>hgfU;C%$Uu%4!l> zY~JP{`5!j_=WTvPH3XU_Oc{ML1v|AbrxTrK;H@xvE!f*#)2IZE1Sm1br~Cs&OmfbFOeaMVPiYn4U@yku zs1^mfAtt%lQ~qu&h8Xa#bJA%tI~^S=!eE~c3bK>_-IN*VkIc;8VmcQqI{(byS~N8! zbr|&$?`EwXO!K$8$c6jXlIkb?7BZ29mbB-4IccElW}s$+$N=oGD&<|Ir0uTS z{wviI= z6Wg{1)5MR@rWpkkIn-?0ZtU-N8GBx>zt>VdGfInCk<%gdb|c5ip7wi%B(k>{j4CK) zVe;tjy%&+7_fyliklgNn1O5PwN;Z^qr~50M8~>HO=?}`T`6@?EW!KD2G8|3W4l_X5 z<;?Ut-fkyF)cdZPgxS(jQO^!#^;4SlRWrR6Z+DSGoI*MuzGe*U!u-Aml_!7BY~wEN z|ENq#smm?;KP|$QNOf?b9ZDyV7f&6e6D8K@Zh%g-(-7!H-N)!eVa+RW!Pdhdyo5Q3 zf-)eg6h{QZ}liO()6tb+x(-JZtC43TcnHtYzsHPnvnTd=g;h zE|YEcDgQ-|H-a3mQ5e+zi#RpEYR(YI{(B>-la)H7-6LL4T`Zj*iG~X!fS>ehzI-q& zMocuU2~|RKzY|vinvs_q*;Yw<>WG%6+^y;UI_LVY6LhFzj?g-{N$f29D*ow1m?i6}OZ`^Z0UN#SkDmJFM_y`|TLs&#DGS z1B%ljog3A|mA&_my9In~DdaZNV?ky7{a1^3pj(f2Y`=@)!!}rH=E#h@yl@S})i|4d(oIA4nxzMgY6Fb}>0>)p; z$YrBrhakq4|JL^*q08UvdlUpI)anxidJWMR9mKCy?L@j>y9%rKl12OLi!uKnM71j) z>y!K7LQ!|}Zgg*llwcds-ab%5H6_$%h8MFn_YD;q5F^JhdGsVzi+JmVF>d1xUerFM z(gx?lOm_N##eOzD5zit7)oGSmg|5jQ z%?J!J)g*V>I%V>IZjCW?+Rq{X@D)otShk7_q!h9c`Znd@OXLlItBGV?d7!RnraKI* z&iF@PbCR1qJzVwSfISkI6M47X@ZfG8H$Rzw(M*W#{;hvBbNRf&?u{K`9ksEo4H8&; zs+KPX3#qnkgK0E1rbeyCtlbS>{h^uV_n1v_3zJ=&M#1CUumt+{SF3pryVZd`X1K2DhH^4z;6n_x%|Gu?~}n#?^?r?+Pc_9d^p4JYGcU7&`n-{a3J7%_gKsI zr+e)F&mhQ{q_;{(kvZLO3GI?NGv;;fH;>!;c_8_uo6`?SIikp$9r6~Jrp6?*KVKc> zdV|X$M|n5Pq<49qw+D3OAiou38?w{J?R+!elRF_6F(T0xq$ORcG0xrlxM{6FH;R|; zKb3aBS(5Il!xE=yIpVNCC!F|e8sUm0Iw-5D)982#vy-3B;seco)fMW=q+lP3#Tm>xe{Ted@?q?cbGM?NC8#WFoQ-bHvD|t4pJK94x+8 zj_&xi+;7$*pcj7vDI8ZacQS>s1=Xc6qwI zsh8KuZ@JZb6D4mYxR5E7;7&{dk%(}-ZJahFoFuPL;=2JHUj7z?rFfbDcZwY7BhzWs zNP{)!?K?DQm@2s5B*hSK5mMdQ-eaWMw4ulk2W#CAO+j-wVKRF@r{iY|NUv1|)bO3V z%CxgE(#Gpo@$Qy%yOE7ojxh%^UsN3y?^S3b@~CtD48nAGW%{29@qS_R;ECniunQe0 zDbkbcAx6vIm}Lky+I`OQG9u0PMdGO4rX@~?mY;#Zmk2BjhZ&o~n4r9qtnPBx{L&h9 z|0018A~@sK%3Qt8E!phKB7C2_^UZWmS>KNcj(Pto(2^xD1fa=(`v7Qjr799=9kvcs zA2TqeE*}V(W8eWthQZN06pqc7m<#~1^R?`^%W_8>=o#tMC)xgnO7gjp4+9MVSfGW0 z*Z&Z!KSRsm(_wTWVD6AD#|7&R9nJaHx;gh;VfS$eeF@QX)GR$#nzxv(pXDOw)Th$> zMx-XC_myxp(7sUW;7cV8*=89_FAf)_UMd`aPJm6YIu^(elQ{m`Z0$=JIYvp`m{o>A zAqqb6k<48dJDFKt9VdR}5GtdCmND7~ELP{yKrbw16*+Z6iw7gB+#Cu;B7 zP3fs&HFJ^sRSzbS?oQ?E=^#&|)XODz{kag?sO1I%wgFX*LJ!fGnPPOi;c?GKPx)+4 zEQejOV&y$v0#~Hb@?`VVaJyrW0n~ew{@I%lFZn|jA8K6pbxbrnaTkuaHqv-*gl-#y zXC74l_;kJtjIH%b7zvfOE-5Iuy@Upf>g^w`)6^4YDx1FN! z5@S&}B)p>SXsrTVaC_f5p$96cxDXjTfpwP3Ve^Kl+L|WEye+YkgmD^}eqr?Ou}mU_ z_u-Ot-TfuS#rPRZ7F$2Fh5i}f2k4wub^_iX@Q~wX$A{*jC|48n=7hXC<@MgQOm;e+ z2De1kwH^`8mcEq@NvDb>x;G!`z3v*kyQmYk&$SD&{p5jfv#P!adPbaWuZ}p2v`#_6!x2$8C z>GNYw>;;ndOkXJYi_ao4`}Usc3-sysOkZT4@R4rR!)by13mR+FaBx1O^9H|~^617B z;GI!-G&+6TP5(%FUc(5j@^Aft8Oeh?gGs@CfphUVq!OzV-uw#KKjU)!1+~cGu0-mU z^F&S+FOY{Wx@&>=yQ(8tWwQ0s3O4MAe>xSc6{SS=fQT>oznP#B-kZq8ad402^%}Li z?~`nMn=(svftdz^6GCq*bh9kqn<};P(R}w#zh$2(Dw;W~+!i<5{|3b+tbv)+As;bA zDjV%L+SoE`O8wK2nB)DE6oWaRh$4}5heejzNGO4c{8GX@mlFo=x4@%cbXPxh`=7W{ zDz7b*h{8IrAv83u*u8Mj@KE8lFy?Rs4@vN{2wWYIND6;FtNjK?c`CZ zxpr3?ja(OM-I2)r!(^ba_aWa-p6YdM<}>lB{3dyG%KQsVrPGZ{>9O2aV^gZ|sEw%t zoC3c6lzP2)li4#rbL@xt+RMw@&T_p2N&1U@rJFs;AvDoE8qOqA0V9G#{-n2JWBAL5 z3s?>XI5$75g6@%fnsiSXzXhSlRb{P@VrG~<^RZ(-%%_)3ENZKxOgH=Mim*A~XdY#X z!&-#mn!FV~<->}rf*TKt)3HY6@`)73STXpT{ZLvam~}ZaWa1T8FZdtn@m7Ls#?iPn zR(D0M76^grG(Q6u9p2|ThWFUP_DNicCEXh-+&o-Vp`F9?u6HH#5=|c$Jc33szK^A# zA&2`*u9c{O0C`F}-2c^KqHpHYUv1wRZ}==CMbnZtIoy{?zO;~psDI*J)S=2a3UO=O zDpJi*mDD*gWLitg+GZp@u5kIK#v+;hOuAf~@S;R>T-8@lUX$0cL1Qt)n|MYPYiM)6 zy%AT2J>i&!;c*EyQJ|x7K@R_;@jzSKR+YL;6`gM?n%H)BP!R(}MaNRnkn?t1UsX__ z9ju8*f4shl2i2z>{z~c#{8nIxpFqtaoH|=QeNwb`X{haU^mGDMX;{r^M--(Hj!Zm4 z+0G-IF+Rs-+0sz!A8i^UzD$HZOc!ei{K=*UqnK(IDh)JhJ}mH0DtbK8(g_jKUF_d| zv&PQKCR}_IaA9WBOVB&T_yEKXvLyunvYz>odLM&CrqE-lKYQ1Un0x1hbZsRxI*%q; zqNlD-uRL8nx$e7{=qfXzGqb1e+J`@Et_4i=M5iczfEzf(`Mg=AZbk6x?WJC{n&5)B z`=`VIOF*gB8GwU@UrUwb!GqyuYhW#%>>My?KS$Q5I%-X-WoqEQCe|)7a|o;##=Y;U zP1>Dstbp@Ixw4-^Yg?Q(OI7@`4a$5m2NBVV+UTUVk?HGlr5;r04zl)EF0$cBI}-mEjRL=p)+)h)-O(a3W#t=ber_KsL9zffDUjJnGd% zy@_eJxe>$GpH{A>l4y2DaWYVwk%7)C!nBX?q{9-4)i0+ zb|PB6#lNRj)^xkIx0&IUG906^Eb;K)m!16cgt_5+n`+OVyT8f9kONWEE*C#$P1P^C z)$b;&pU^G5*{0B}Z0y(gRi5^J5}T`U5!>pf+d9MuA)IG%)oj}5T5nyEojmMyT^P$B z-8nuXp*z>h>dJJ1`os!i$`s2*wDWfmd$zfYJvr9gl3vHXx#vf@sFpJLYqOh}xnp%1 zdRd*W+MRotZmrdYwYG$QWYnO9C=XmCGAFEHoa|dAur<|>AS7u5sjGY3Z1VTCb8ebT z%b!hFbL(?i@r-Qf7+ui~{2>HLlv;0Y^ervsm8vWN`&)MP{e;q@-Wc`h*Or(bWiW5o zI>>&8P4phR#e9nEr>~RM-9dM&vy&woYw|O)lb0pZ2e?z+_V~R2vd4e<|Dzs1;AF1@ z0Zor@lx@=gpvOUsQVr~|9zT`RY>!){b{PTxMOHQ`^$*~)MnR}-M`G{bNZ?6UW7BUC zKEW6ys-H?`C*EvFKu38JiMUPPi%s4-Zo}Qr-K!vdLO0u21N{?;e78mXZ~d~rK07T- zj-naa)6CPl*BdyG0F{F25NBQ$ro$WDzPuTvJwF*f#C(YV_4%OE4ARGg>0rtjG9R3> zU^>Kg_x$;D!+&KyKrPIqNJQRUdQJk-r2cPlt2ZU9H))`P$-vC`EmxTICrX%j$QZ(|x(#7n4t9#IsYMsej!h1{wh8X|qC(?c>xInurJMBg{d)f`! zzj-mveC+Minds|$?af5@@^~i`eTPSXCfeWfj7t6_1c*z~41kH|om}KBQWJvAWVniY zubJ#x>g!@?#fZ#m>d9zmH}8nT?G)q;ESa6O3``InpuBUh3*l=$E18|nsP9Z1ccY=j?f`xa2g*S<0n3eQNIu_ye_Y&2Q)q9~aL%{_( zMd@Ae4i1TRFa}q_QVWgO#qJxzND!4kr|wfDQ3%Be$e5C>$BPg>O_niYReH%(5I0zt z0s(PBW^QyaFw;JeUQ&^dWtJeUvJ029Tn^AO4HcP&NqzFO;Q#a0e`{3`jZzOLvi}nr zHORjSTmHYjK0vK@!tMMQ)auYv;gHlSE!k;v!{k_|xgyH_8eS-ke5V8{!w7L4`i^$@ zk5HK8U?XBBUF>G#B^zRliIiDa)8FV2Pf3XF8I{OB0HQ8$(mjKX5iUqiW^zytX!smYObZ(;_m8CUpK8N zHS)xUNx6S0Zm94YCe=1nwEZ3ElDp`?13|Cbyg5t<$BeIrM3uw<3Ei%cEgb|i$M zu`YF(sR8z9%dUQ^F{v^QbtZIlPeT6EC4H`O6$t`Rq(6gHzhk85z1D0_bF;PBED#PTi$;kh0`fcGGn73O30kN@BJk~EaQiJTdY(BU8OI4@@2-~|~91+VdC`NvD0Ko=Ix$F+EKpylg zQjLp4&dQSknEfEvn^iyJUrKFc_jdTxC_tk=!+TSI!g@VD==lMJVTsXU0>o&~#qJpqDzl{}oH z#F;5A$ss7^WpattosC=ryt%2~vvfe)sYZxWG?2Z)X6L*L{xc{7{qItv9jTT+frY89 zshp%-6{10SgrIz{bZBopl6-3`f+X*vGhO)L&Sw7=eFyouUBrJv-xg)I=DRYDll=9B zaNh_ma5}a~qh?l__bhrFrTNV*M|;ORcV8UJId~RJjn)3{3E|1^?8G~%kJfMZV+TyX zOE`miEcxB$zbt>I?GxU4lhiripmavDio?oG?C1O4$e&yBAuDZ!#;SDdJ^QJ29+}Xk zxsb<@8FZ-mfh@DaJ3odCKkw{1W0kqp58-iUdDr3@u+Rw|uAJ38xt(*qYd;ZXlpz-f zqRU>%Gl<=JXW5_h60LqWcY>0#YHqD}9-3Q~_iv(*Xf~ejJB+R|8Ef*|&u;bq4ZCrJ z_t&0~{;;_1$owOOdb|8=A$+l)<6Q9>r&Fv07bYQ1+!WRQsq3Xj)ZG`xFe_HwQ`5Wb zg?v%Ih&!FI73#*lF8*?{>8#nY>_vxvH9Ng6u#MS}*&NmM1~1EAsL{XP7?+c93Ktp^ ztJ%Td=&~2*@sAI53yRxLZ_=4>bZ0+u+~%GHyN8nAc{?gZmi`cEV9pg`9I2o5Rw|NH)Rh1W7rK}gMSCQsr$XM%D{u$*V-%vpO>U^uR z!p&TS+^dD%Dm2?0xn-{Ga*?vd!>XnU)x^v^7?~HGm8;FLb>IGet-E$F(}91E+lfO%Mkf*Jxds6lH+1aT>mR=yc}n#j`0Qte$8OejlBPy3ry$W5H~qq1*X#D*?@+oI zFm}(fB}DYp7A?p>*&9eUIgd3vnu+}$b#_p>&cIPxiRp%nw?MLTw|OT*+g0qiKk9cQ zAGY??=&T`HJFU`L*{8a_d2pE`_?(f;yZ#DE!QJef{mJaPWlc!m*h!lWbg4m&!TRg> zvgObsRiQ0290f+fUj1$ur}^xRqs|2W7DD%!P;Ce%ur-FYGHHDis!j0(cETpD2@$J4 z0p|FJ0uEQzORMN9ho$g(G!(XR;g2p93DP_B>-Vz-uV-pM(z-_(xG*>&wY`!Ln@Zk{ zM!aqshCb2U z*Cc(2eeyiG@=iKET^nw@oFg2ZwyezZed(%%$Fa>e|F`8clVvHdV2GHr|_(Kh7(O^ z<)?W~W=~pOg1Fh%7Z2)tlKNmVhE>VdaTSL*`CjJVXy-f36n{Hwmzt zf|!qmN1k<7ykdyEI3$Mq<3!}rRTt3oD8JA1E93Xx{!q~$`K{ykGkyg!q4j_(!=ZCl zKrSz+gY*Kyz1LU!&9Jkw-fa215Nq8Yeg6Zj%x2p?ENBd>!w5r%mdTb zq56Q!UUv;lliEB6;YYdaD$!FGsDU>x!W8>h9WIRt$*O)8B0-w6n7CxqLs#V zP4-T$oNo5FUDT~ktXgHPn^n~bl($x3@d3v=z004V8b+yxedJ1&tqt2)zyDbxrq_AX z>lFE{=0;?Cxs#R4KJPG`l-1;S?E&I5*?$aVT2H2YZ>B^G_==wo^}q3UDu%mn#2U0=?eB=66n|8Wxk9 z_iEm&y{O1pDTI%EuO#VGZ&!5Jh5`8?$C)L!EN>^;ZGMd_gEdmDOH1bo@hjZygSREA zU~oR_a`6?FQqA;V_+w#2Hj+IW+2CZgwIf~Y8okz?pSCsaP63# znuzT8W7I=m?%I=HKca`UNQIV5unKo{teb_e_8y^s-AtLA?&5$3#~%-+)hw z5O#iT^|J`044E~+KjCkE>wq|pWgCRDMTkc->kRMHJWYyV|&R8 z=I;gRv2IzmL1{GgT{OT*;F;FCxHz3nMCOJNVKK|avEswr!QP>#*81gWw*Di;zu}#J zzRTMY%T5BrC$aZ!SD(4fQON_tv67BpRHOZ|k`?wHegEg{l%e_g<@vVbjr^h+-ep}B4ko)|xrPXi^YL;wva1zj8vh(@iMqbR z_B)4l{p#A4|Bz2 z192?-_r+rIPIWEXLLejS+QvlIFC8gU#~o4L#zxk+jf!y>kGI=0w$Vs$>yyz;Z9MZY zAtp3Tc8G3G;I8*hNlh&P0YC`d1fZPiGC_n7L-0jpec+#28gv$CNs|)me?x)415$zptC&AEQotImDMF*P$OGVFNF)I)7)6!GX^DgH6yqYrEP;Et|BMWLJ&O;4*Vih-1sI&Hp- zKxd^kJPC*f%bX$F$NZiEj?UuVZ|>;g4GYRU+RbwtE1LN1U9ZSq#>l z?l$*?jk`Wdlpy1n*ufm&sMZ#Za-+0&RmWA-VOH}NB(0j2t5n!QCerd1NvP4)2qhv1 zT374zN6j{?sU#z@k_Q9Tc}57b3K=MLjp2yYC(%fV-R+AXNyeqKb;!eN%7~^7bspiY z%=4ANvzYf$BKsqeszmjl6V)G?_LL->(;_flvf7P%w{(c;Vu^Ocbg%RV&WNLSGZ95@ zWcCz@l)BCQcJA)R$lW9-+3oLtz*h9yk+JICxsq53#N$?>h_@mVV!4f0??PX3ZZxtB zfs~V6SJDM>o4{w=$Y}K=xudFgW@qGc&U@X(sW2LCAH4sE+z1S;IMU8^m;&79l4X@Q z2m;qa8+_%)N1e4fCziRxB%{|V#U#P#@D`02T98g1}LF@f%aKhPn{-= z+dN}3?#5k@Ink-9WA^uT6;kzB=!H6iQ}Vq{atGH2YQ?=}T52>47if^%>FBs~_vk@A zDSWpXAA2yi(b@+qHJjS56#-r(f&1bF5}nYH{hr$lgBZHW^R2ir;LubD$0%(;E z>UFQOOFjo%ZqBqJVOt?{lv7s zY83WG6c;dutobm?s_>5O01u=nDTz9b{|BRpIy6bKb6?#^toJP4L|4gvk2vT%RQR6Y z+*e=f+&3ePX=eR+N)0E+b@4iG@OA9q>lnQz#&x+o+;QFH8$I|sDtH}2vR#kzXOvOi z1ag=RPT}P+^D-ncC~D~Ykgc5dcVCfi9M6&dKmJL3qdDdJg1&F}FR}qf^~wY!2@r$2 z7-VGw=)ZpXU(?jJ^TE_7%(VVbJZ?Al-ok1%o-KvYqJr>rG_v_R>;n&DdZZ??fW&aePs% zv+gL6j|U3hdX(G8F)-ct(;$FxDHDX-521ov^ zSC1`-GR#28zvI7=!EDHTEdV1p3g~nJfjxR}cVAhw+b{2Qfn@~o$NUB5z0Ij(bV+-d z@#El3wjN=Au#4Dv9DKSc{ccG^#ae)Zl>>)NBZ05y514l2WyK6mw`Wkat%t4zw@O7`P^s(DPdmRU@2zwk9Q9OdjL%> zk`kR+g3(+9Q$ui-AgUK48w|$mB@C;7tT-FnX^j^JtxXv9$cMN$L6cd z`zCIR(4yU2?aRGS$*GboFD(<#AbKrIrfZGVPYcAQEo4E7)qbyRgBNN>0Gg4mmE^?}08wNSyLrB|9?bO;UPR;@4uC zS>;~iB<@X&Y;2Q7`OnmYUpopYAO#hf=|`a`SPow^N-QENEi0y-9061PQLOQiuN{>- zJ@d7rIKR?GW@~3r1gBw1?h^4&=CTV-EOf^kOWl&uUT?L7`Cf)IzD>C^-R4QtDZjAgD6q!c`{xUo!qzd*~`!r>hjtn&giJje3J zcArbr7h)l znJ}uD<9hWqE}DLIghF%=(H40GVfO9tfwyA;v;waN;)FqVr{fy4H5_Z`(&c(*4jKK+Wb?jI{3rgL1#g7^%C~Up+z4%+RY5$# zY#Y0XDe)g6CU)W#lle`_Tya|D#|xmW&T`%HTl*`^(cdJMHMf}!j_x%we6jab43V6+ z1s_@;4$C)@Cg%O%5^~2R^x+dxL~2&DdDfJKw>cJ>HF@c0Ile9T&MQ4D8|oa6-$+!e zLGV&iwZ0B^Pev4yPoYuXSYF=~>eL#PZ=9TOoKpL(%F0wDm^PU`Pb&wIy-KsJwR6AH zw45Z7*kd|zI{}eHOib8)$)k_UZ^Zbq`Yr21xRo2Kkvr^aeThv62R!V-Iq>Iv$+(He zM6j2&QD+VX=AZe@O>kg+X|j2f4s1#s{}$He;%iC^O?8`}h^9BQgWQEKB26D6@0dle zH3EvAWOL%QSZ!iT zAbYnxW@aXOi=C;X26`+S^caYQl9LG9&4V3gF3Oo!8THP1Nc|P_p09K6dw$uU)M2p` zo(nqca|81y>ebU<>*%lU<(ud)bPS&x+Fz8H`8EstGz1V|ElV_`@+6fo#)tlDx45PL zlG0UauewXUq&_pPH!vCwCu|Y#ApQoKnia#CcC4WtLz(kg3$Su4I-Fj@-n=2Kx1NTo zI#T(UJbfVV&8ZS|n<+u0dUtS09-Mb* zf3Rx(kM}QCI^9(bZJ_G3Fb0?KB z`|z54?YGO?P7*6K#ltd%3;L!VWzA(^$+!Adbe!2Tha*eMTAvs4!*U*>sPU#xjb#k3 zL+mbVtN;EVhV|H1|5XA6>2P+JHr1&)vXd$Nv;49K;%ROnMEC|`xf!`ktOtwgIV!8K z$j&bIAKy)ho7WClb2d~su`SjUM}c)VMPgrxwhGM#;;*uva%&|Prrd+<8G2@HAl2~s z>IoP~#J%2u+RMXjpK`NTRmfl7QKng1uqtRpp&!D?>t(uOtlJu2+J|*pY1_19_9qo$ zAh2*l5FvTJ>{scQBNEM_O3J{ds%Hu|RoFL`nd2Oc+BRU+R@(ZctO?87YE=X(Ybs(? zQ4#fjEWd2B$X`A*f0@lc(dG}^{9_KCUp7_;=bza6WD*f79YmWn!1HC=7!6Dt10Xm6 z-s)FZQn>d$YY0ih+~$o&c$l5IMbWK9V`7)?2}dq3Z)K^sDP>hBVr!H-O*y-s5{{Tl zKYDp(@0LLob~;*=)6t@wjuz$g3Xo%pgt|jUG?+RC`FybRzY>bmZ*dyyEUXW&V-4){ zLHj_-uGdd@OWw%r8@uM)ij-!aIb75fzm!Oml8;P7$Uk@3ci5jk?7P(e;;`>B|FimL zEu&}1KhZy`@a^>)vd7UR5u^N%x{&pm5U)47YflV`ZhA?$xb@WZl2CDLwKocr?51-+#AL7|7}!QZJQ|9t9^vDo4h;iJ-iII{P;5jSysxMkZJ2bN`ixgF1h!s2)KutGv1w z_2{HR=0Ekg0YFdz2!!5FrSqPrLFmn^Q!Ras?r@a_D*VKzZLIn^AmlI=)3FhLyj%y(#-y zUc|i5ceCTO&+f~+w_$bMEvkyQFj|7)F;pm2X|U%5T5npzh;5)nWvzD(v}j5I*+fCM zgM_q6kU@6^83>C$vV<*aM#%s?o&QEs?zeKXckohxq+|dR(dR=zB7gcrA(`0vlL1J6 z_Mq*fQb96(5E2GRkf{BEJ@^1TSCPf`Pv?;ao?<6kIs~4p{#fW4tyhPD=Xn}76rR!{ z@EjGu6Ba!8sRvk0&Hiu*HaWh7VTQfx*6DbdR0GrC$=_)T9%g`ry`lRy3=NSRwC(=A zL68W8gm47?$OaidXrnN?EM7VdCo{!Mzv$JKMjA?&o(xs{JX#9!!WN5M9(GoIi;f$p z_F}S&!Xn|x9TC%t0+tB3@52LQ)ax+@&z7iZEz_=5Yn1#mXre_Q7A?$ejy|k8o$J^fssd{zDG{z!IcYcF!aEk(smp#P~PJ6|HFx=Z;JGyKM2o}0-tz(M{=CmUoTEogsfIRaM?-Z~a3ZmEhn_t%9k z#rz@EGRa%V2I7`=$O}0xadnlzFXqC`vPZpOeQ-PE@Mv!!T1;Dz=jwsLg1#^u*g|^Y z->U|Dp~*u%bgx;2UcflodT@%<9SOQa;ylwQ1I*cMfAty~G}yj-=`1Py)_J>8wpcva z4@2p}ko3!x9(}UyozwFzrau@LaenF){1;`%&pLX1QDj2PVb1-tLzhO*4h_5EE_K41 zR)$rp+k%0HX6KmBS!j=*FIt~}Bo$5PMx-ja7pNtcUW$XGFDKG%>@&V3)tL&{W1)Q1 z|KdLIty|lC_HOfSfHmiFsGcuhSMWBlMu^!w zgnnBm7sgoqwsC^k99R3Zw=w<9#zK3YK)-GHK3ih8@K6=b3Qqh`f;LkI|0WdcC$=8I z%y=nnlPXSXo_0dEzFz;%a|ZpA_(hB#6Y%KN*#(6w|Bd?rzDrtS*VPZ^+vb0ReClLI z=t=)BDiCsAD30P=>iv&hKG`!0(p6Zh9`$dfSZexrnTR+YcM+AH2UKT$>)KfjvO#XmBc+@{vg*9|VBaLNF_L87HS$+(pI87-^NH7s6H9>-i zDulM8gm-f5&vc;d5;B0A=A}Rn%mvm)w24Ch6gP9HdC&aT2xT+BUky}{i?+&wEde9X z@pGnWN|HqjCw{J1w+Op}GTew)7+$owelk%NP0gWplHqo%{xl>g=mNy65WmXFDb3vM z{%*kTAY1QXA16Bk`Uqo#{}j!_*r5A`5pFh$8hxwaTI#xy?!iRaAQ1_YN|4MfojNSR zw+aa;9oj?*EwhJJGqaH3$O%ud!a@{C6R)f3ilI&_9Rb_g;VFDgikiIVfeX8gZKm6vjMZLpMyTa8*q7CgaK7Iq(}(q;D3>K9uoO8dn}Q?W34*T zC|BUp$(vZ|Hhb#DI9IE96Sug{hM z3b7`SDGZkiWu;?P-tkI3E+{WFHa9saE;N>0V{)GeqD^6?V{_vPRg@`8r9?6Bz`i(i z2-reHV3QF@B6Kip7{nRah_$e(uqd7fC^3A962n7EB-MmO_}~)5L5alL5>cGRwnwg$ ze+{XNMV?!FiOj;+C9Z-`%kfovszvi*TR`wo*i+fU3e}5s!o?sTCGFAtZN(eTmm4y;A&J zpEE_(T16TtzICMYuR2FbFAWv7eS!K7zpoN-yHk>A#;hGvwjRKQw;bcI{{kw-+CQuh z$0IGF)+e>XH_eyf(bO4Q{OyY1*%iUFD?;`g3ksryi>%D>ukbq)M~fOtpZ_>hn9=87 zu<;Q5j^yQ!Yf>xku@eqx~I37i48st*?+vQT_u2 z8$WluPy@m3UYH-}kr!~HdqD+1sLBN_JQqwQF^@XG(^Lb5;*O?>PtsW$-s)iK)GTXX zFkJtU#Q@g(X{#!TOiCRl-Kf0(?e!99_^yYToH1W$y!lF6nmrF&=578NTpeRyaS2xB zR}cLR`IF2i#s}N-xG0K;{c$EBjAkx7>rA}V-^bknyl6Y$c{Igx>v-+b(zYv_vfr4< zewi&RXovipWMY>S)L)9DkJIyNxL-R9pz5|y%(V2)PD?T%(9ReIa8TRmc6ee~9! zu(70fXRhTvtdmPVkhC=#X(?^}f$P2B)chyxgW9SS**hl!h~1w;XifcdOyP?cvt!7V zh^I+J-f88&<+=1oa}$<4_2uzM@6!1yVR9n-eOm&@w&*T*EsZ8vekDCgUt7k}oY7!p zNr~)leU2L}wkXCc_RbE$gHC`cEOqYgi@bK-xO^{+@LzD>kvm@8um(j!)$Y@15Ef}mtJ)C;&t449)HUgy-6 zsNZ+;@GDgn_RHEK{KR-AvzNBUYX2Th(5%+9c<-B8Y=87unEW}huri1mrVPwcVD#PvV7zkgjg>S4d=`wLZqHw!*8 zgkLhA>1pGNQWw%r3@zKffb&Y!rO--001M!CVH0vYs*+n{)h{S9#XyY4P0z%>v!B9} zk*%%UELo0RQ`Nf4mDB?tatC1p0uuk@{Cqob1}4FW=I8&Tyui=T=7_Ky9891;**qo2 zRPgFgi+SgV@#K?fs*6Q-h?`I1UITSlG5Rp|Q>%+(nTw31@&ve}Wb?n>LxpluD2@B> z7fLemP<=KwB~M#F0@cOE!@Q4m*9YaUBt{2a^73&(3`mpUsuNy|15 z^iF2}VMu_CG4G;sh7(=eoHm-;RH*Wo ztq2?*m36!YTx?>6+nuc5Ti8!Vz2azg?nuZ^=#wBm3Q48+M!i^OV$Au;j;kPR_F$I+ z1QZhX&8f+*R|2?D1H1uET*YZS*AG3C|Na{4ln(i~Rf`}LOlp_725}7gTW!{ao9 zwC@(B4x5RKco{CPXGhV{pUAIk!Y9T{bk@mkcH|lk7T9~C2BQVG3K0vKw9UtJ2Gdw) zqD(lg;8S$|T==#G*_`PNLN{=}^M5ORRUqOa;G6Kj4WHD*;arTRBhD3vb0X-Qm5CV0 z`)_kO>#8V$b9aZi%Pq<+Xrc&nE2nZQ1}*4{R*!&CuDq8yaQpiQK=Ev>Jbyd$-+K}s z0Q%EZs&DJGmW4Th?@Mb=HQ!HptoH)=IsY5sfB@AGE#!O|oAoJdL?tV8KIk0qzm}#l8Pi0o# zR+yFjSJe;B%2H{urA}oQ>*mhe$PF(G@m?2}B5&M7uSGPExVwn+&$1*Zb*Xw{H6g=b zkjY_B$-9ZjbFJ-iJf-3enNZ6h06Hr^G80qQAk--1OLbB_La(jZ6->uN8+r_&bWIoV zkIHvRpeBiA9lD9;1b^AzQ6PC-c+FE}s57XBsm*TuH-gtkhwI*})Xe!m^KhCcrpJ-ns9l zqXN6=ilwMWcB3J@%O`62Ohz|`({ITXyd5*LB=U;yDsGtoLgA!>TiBza<&RyL%a!9D zzhzV&MakTFw|R>fTQR8wQ;ZcAQFIzG+fVQN)Y3B$S$9+v=y42s>~-z*qmk~G3NN}J zO*%G#CFnf&;unqdtr#2aB3tpNu^3tZ0O8at~2zvJulha6FI~%4047bL^H1 zXSr-xQE@}wpkiKSA;a}{8`E*qko{t#cj5QNF<~(YKXV*>9rlf5yj{Cq%Xg<=EXM6Y z4E;)s3Vqb-Mv^8qI-WtPp$lNvB_mI@K7?pOZrV(5V~5wJT0MI^tBx0DPJ=Kn+n~Xf z5M7#o2*agYa_{|ObaU$la6>PK9-C8tuhu(X8~X9j_KZdU?;oGyx8AwnG3SD=zc^pp z;vas=kw`Zt_b&T@qT5pyx=Q0O&gVBfC-njh>fU$cvKRAgi)bG$dzA@tZRk?xyiLp2y$(h8XVjr;Is^Ul)s9fS;Djm<)aI7_56l2j3|9pbYK*n!UGF#l1bIDdL&blojht zQ?x_DCH;G=R6Sap4Ph+rM!|b|q>HIhSom(HQPJPg2O4aF;wy`H66HPUlTH$kG=>7;dABUZ|#Wa*%i*Dz=J+*b#EP3F2F|AsRFf}D$r>d(gm|>a6YBKJq2*(E;uy}(~&AkRz~`hen&D0zOH=-)?-S0W(oK=ld9B zw!>Wynn^#8sQJH`dmH$uitGPBkOTt+@2-VPTiT{=YD41#3R===&B8`@!-k|4C8;Rb zSj4YYQL_qdf(e@d>va{SRr}1h)z-GQ+G;CQtqC9rAdfzw6-7(+#-QRuYqV&7@6XKL z%?8l+`}=)g|JR=vxjT36Je)am=FFKhXU^<&3pg>1IC~3Z+v(iIkzmbt+5VL((*Bid z*+#%Zt$8kcBL6iqy@nb)u|o&opFWI<9AQ-EhmMTmQ#Sp8$}gHLWmA2c}? z1@5MKE6OG>hOAIs;R#6R|C493WpX7e%ba8`meS7kNz{Us7}3fJd8NBmE7tk!QdT#- z7=19ktm4eu-x&o62M|UjOF+BuVtLDM5G$@(_J zzPC)c^#$XWYrDH?M^7s6D7ou8s`YufZ|6GA!Coj zQT#KJSFDx+1!&aWs&2BMwV&Vsj^Kb9; z_h$hKXk)$c7DmPaFs@~y;jn?*Rd#mX;^XO@Y7PgxXB6NGYslhYw1JwYmcUvuthZ*u z(uu%-&d6)pr3#+;ooTSuX2dBh?7qasu4Rk!7N3L>$qK)$oW(~+8_r@JOrOAs0bC39 zuV0=wLVHYNs(Vnhyj=AD{yK$ z5sIc(_!f6S<8GG*@>dolMltPs0mVV`J7G1fVV_wK4}pP)%&c$bF9XqE@`jg94L9c| zr-nn$UnUI?yXRDd%HMQuc$nJ2KvB5#S#UH3VilztPjMeese44M*^~;2`UIMxRFJSa zO|4<~jnIx)A=U82{X9dhFIp#Z`~8M7*M!*lvHcG)!eF7KL^iItak-nQ$%$+{j`qLu@bx&X-L)3Srhj+b0-0E>=(0JA3t}QVFp(8SJ2Q%`GIZpdu0Vq{7 zBvk%LGv^Yg7FDHY-kKLK8+vsB$6H-;l_7I>#!qiG{sz8alN7G-_ahOnKevIU!kFBO%TD_jF*(!ts5t+(`ZBor~Qp{z@EHNE7AkXhVD@3 z^G5w{MB1=V`I z$lHC3wR)Haxm9XEmQAKes;0oZ?Yk&P2pAgn{`5U1!<2UsRrP$F#A>k8{fI9poiG7j zs89V6M{?R^*>%_AA$+x)bs)`Z>9QYy5Bz^rME!t5vG57 z`G67`cv8o@G2Nw-dXrP>Vx5u(P_V@dtR)LC=|W$hxFA4aD1Hu8#Gsje7hx}vu@ zd2vbd;t43{+1iq@#lAvvDnEhb#gmd#PZgz>S`mzPPnJH7L`~^!F}rhUDb(2K!R|O= z;MPNzM;U`L@8p}*925qY-p&97ARKAhqh%XcS8!Y6PL_0whwtd?UrXScw{6ys+eXGm z8dz;&R6b}{He;MI6z|YB&X)(-p9|=G0(B#MzwZ6~s~pjVMwn+3_Xp_AocNJCK|(K@ zBjOx&O_b+2ZPzOWy)_|{`VQ`bCVfT|6N1H7Z{s>(NAESpbg|kErZTx>?nu+7be8V^ zm8u0TF!Ra?*b$?B7H3Z|Bp&B|6ky86Hh#naFt{A)F9*kf^?_=#$A9|1tf$!b)sRQS zQ^D;>V^u9!EoOPxzg={JU#jW!Oo)};Bm6bi$I2!)UV=kVzcaLja60NWwQ$Y{BE1i! zk5qNIR(_t;94Gs9Yk!=!HGYw!Z^;I=va3Ul$45Bb&|BiQs^YQBVH0YbT)^tRtDEOSRubCq1KB7?4%L3R|4F8Xv%JL@qvR;ost6C}gH15P zUo3*L`VaI9xP`fxw3#aigwTjsYOPp{#j5s6*QGn+DFUWl+l61c11rjdwBA_mgWxUL z@H`(G`5xE4q5qD#y_zbEVk7^76&8qV?KR`tiR_XeGwEM_{4Pxo9*f^cGx(hWe$NYd z4|9z1EF$H7ai%w`;g7hzvE&5pQPR)m zG$qH}kL>R*E5p13X^eh(LwGXaUUx42AU`rfMK6HaP`VCjuZz%T($5cwBHCYBc(nY` zeJmI-h=gJ>=u50$kTz;D?(53C;zzk`ksTBb7aC(NkPrTX zogwVXoT+}0BhFxqA-6>oqy16uDaIP}LI}T+ExaQq6pc4E#QP1$4oaL=jm>S)UDdBn7d%Xz(r00NyuMLL;xsV26L#Zs{sS9o)` z>rMNY-!1N-;Fw}#T(2yT{T5kp_8f2W4uhCcZ|>yPURS z1!%{s0p2^f{(@dt3VKnb*nolDa(QKEAC%(9U9c4B>U<%$tYUI&_+jl3r z9vZW-T5!$*&H?Bxl^}0m^Gu}=qn?N#6Z#7P=Jc+nyN%XNIP!j~1&Af5>g1Q0H0@a> zAMHwV)&|kbcMYt1uY`Z4`v6kN!P$BEpx&MGAoBfIF!oRr1FZM=4;hC0>w{8_BbC~h zwg03+aq#F$4{y7_ASTSDs7vd!&dV(byMI={P3*9?Q>A@oJ+&`JT?cdGBY$hfI%UEi-OC+^YtWni`)^K8|Kaz44=UvXBMEYs6j<#x0(4p_Y z1$K}%Mx_ebQ``~he0OLh_hsfHB}nHhGx_4(7J`5M(GWcJB_nnl_mbjDx#rx9rMSTc zF0q;lf#Mw2N>^4yoQMY-j=C35j=F!#@H)d<2ke#3I+I-!jKN>W-KR%xR>HGl?zxvm zrL(NQT5guE75c4`@rD?pDpEi#VqLQObd(B_uF7RV#DTj_7XH6m>Bxi0hJkM={I|DiVX;YapEtv@qDt?{50 z{ae=yk#o*F2Y<*~CY?E-^lSvTm{sZPHp6@}G-6R?5-^QzDs zV7DYO^5)cl_eTc9hsZ-ef&$RRE{mlqU$Wil-Seh6(tgX^`#>X&SXhOh*q6Mzd&H*C zy-d9vayR+}cZvw^#Qu$CL%D)OgtjsMMlUWwaQD;D{2FE~knBw8HFrZKx3BjzX%aD! ze5E=6j5*OKFnhW|_6`ts{7WLw>n=hHg{D#=ZYw-9P~O=%Z4keyT$Ze^$)d-aYRK?k%s$>k$$6RksKTb);TG->@#z(jMGXKN$`IP_D>8Y75`6y&?)Li*X zLzx8bQULfX?^9qbfrk_*f`AwB(iLStzd9Ek{tL>A(!6pT-$zherHpRgrvMlYx9g(OqwR*jE!u+5X*ADOAj1kC!)?uRdF5tW)9JWiJ`9!0kFdVJ2h=D_M} zgpYw3xf0VHhXUab0qCD&V+~7|s|dD3P|(r%Ct@j`7}@6i!sWuEIQezYwXzHp6SFD3 zL^?_13DD4()mNL^4oaI!=yhaWc%?UUIc279vDIz%D%)(^Cv+`Sfh3X$AO{~TND2-&-?#2tL840Ck_p3+ z5jeZW^HwD8SN_~M-Y?8#-h==mS?@fUko}hDv@an^`n(ILgytet`;%$ZfgRvd?eEBe z)$V&nPWuR1eK}wVLF7~12VRZFY^9(#CvP9|?&aPkKhZP9!sBnJNVOIl_xp^x&1w4+ zBg}MjkGUY!fQsm|#egHlBMs7}!*{7%MsY<{K9p=j*1Zab)DoAE3_x5n=K2ki;eoNL zs54!_cC`6*+FL2miqe%>d6y+rMdLSY%ss|_y77iEUaj^J@3fsn!8A%ROFsF-QuUB& zqh5c$gp+WlxA~5KYpk;n{2mB2 ztuZBV3oB@)&!*Rv1sg|NH?i1hH@(ioY5Rf}i&jcXu2dtE2@M4AHDoIb6aA9Y8-h8Z zsh;W|qqPi3R3M82tnyj8d(XUX1+*D-g=KmDrmUnv4(*jFW^qqr7XJYm_E+$C9}#|+ zdN&*DO?U4ul#y9|Ai7i^=$GrO=%=iY8YAfrvKkKwkKwY*0#3W!z@WBd%oVu5Q3HFq zA&nD~jYnZ7%z}LCT-<7D`YoNbo!Q6-ChES2V&@-_SuJqH8j#~2hr>onUyowU(saD? zMN^UYBRhK7MINhbXHuhab!_P^mOFocBp1zPN0HfI=8ihtrK>9H$!*+TP?gF%L33hq z>cZ9FET{KqtCQ{P2qL~ue< zrC@l2hLcy$G6BY5`NUT5STTmwE$S7`5x@NnuZe5s=QRG8JFNoLG>A7$);UtHRfku= z`lii~H0*{+{?HnTZ}o0vFmp~XUz1SooCORhubq`r|HI{%RWxlA$0FA(_~}+}_f49E zW|3yAx5I>uetMP>@R%L8diUED$V|ovVXOCR8)0Nalj8d}0zuDDv0M?USw+fz9Yn7U z1Y{9j_e0*foP58x4v!{^z+Z zdMs7Q>QDrz+om-axv#lzgTEqnUD+-tRP61&SA1mA2s0RZeoi7WwFO=w!1aE7V7;ls z2E|OtMH9KbJv_h-ulsM)vYF^9O}<8CR=E51*DAWfup~Rr!_5*+-9;2%*xh)(8W{0j z;!ZJX2o|BRHETx(|3nIy*xx%I1J}keY@DOG%6vPTZ@mt>p^>={W3`aGpFvn8DQ+$- zqTgwk(!zbMr(XS<$@Bs(!F0C$c0P(BV%_aeMq9m8JW1Gl%zV_Sezvo2Q%H>|@t*u; zX0|!T##9nRryxz4et7Zifxhyd;+tOpnj=%d%|y9Ry8D?OpjU3GoL=Y8*JUR*j>5)L zChDDe7+JlhJ2h{C2PIcp*~s9-eIj{}NXOf9w<@AzP?2^jj08DxHpA@IzCxd*_!_ zvjbR~w>IWPI75ym=d+R2l(Es&negJ5vFzj`tD|DM5%@1-OZ<0Je1CQMqn7_x=kA=5 z8{S?JY1j}c?Phs3Jc_&u7hd#fc3>9vek`$x)@=6vC4rjg-hwp2XW(rC%1D=y1q7Jn zO-tvxIKgVF z3cEM8s77Qc$hk7*kw> z*45t1sv&*{*>th|D)ak*QCf%H?^J}iD5~Mfg(Zgnx#EA&L3e@Gzm}FzPIIBs*jv^Y z!8)}{o<6s_p{vS0wqu5SK?fV-9T0#fry`E;blO+kn?<;D#-lzsYG*+;*Sd4DX?5=F zF&Jha(b4jKPU;ijy0^gEkKosz(}<;8BCYR8<t8T!XEQHeLI#}|K5^Eo`oXH|8Wh+sNz_lkJL1D=x)#xncWKQ23;BOjy96o zbBFF${LAbHy$ZbP{uAl!p&`{sT@0RxzX{~!?WJZUb+ZZdplA&CH6HcMkO;SjU0(zf zL8Nior0a>azG}8r%Ks5@X6)}t2wjZfhuQ2M8$p~Hq0IXxO*WPK3{-`NVB+FMh~qZV-Qu4{ zg%N`AoaH(QuhzFvg4q>nAE}tk3^dp9+pGdEOBWD-h{lUgoc6qmq}>a@WvjRC*^p`P z!kLz1hyNRo9%j0a`%}`+Rb&;(-0-gIhm1xlzLZK9H_^30a^6`3*@-I?hMyIjij z0ImMcBDLBqn}mdKv3MR>HtDdQ&u?JCcc@-i?%k>l7A#B-Vq3ToP&bJW#h?apK$uZz z4Zk^&QjVuMksXobnG0h>E?yWbo4W9tPxzCvKg04NFbiAt1g> z<8cOr#Kj~p@Aics1RRqM;pY@G_TGztGb;CCt$pxI7a1~RVZ@y=-x`QKyzAZm+^+Pe z+!+ha#Su3da!VKTI&z{qo$7904(wXZHa}yVx7VgLlcxRZ-SlnYZg%l}ruKeLuQpsS zcw_Dvb3@W+b;ACuOUHFoJCWyN$@3Os*HD6Jz)H+mlxFy4?htcigzbzo7M9>L38y`ix6TBCGEKnN}S8f)Vg8nsx>#WA? zxdK{T+CmP#=Oq53P;T?pHv8v(!mNtSwaeADZ;Qu(J7lh$vX9|H$DC{EKKd zR(93GW(+p2x2<`f<1eL)7kU>bOeLl#8g@lEPE+$73%bXMjy3!>Hsrj89IOCmN2j*2-(@Leb^r_uuJ1l*=ZC&3&cC$A!+n(gM zgCxE3va6ydRFt7Wmb=tPv>L;IaAO%Ou}|8>xlPAL8d@!JkA|*8&~@JSb>&~JXv)R$ zFvpBU?-+n9zMEB8X#T*G&#dlFq_B^r3&YunEsSk}NN#Aspn}qI6tch+!g(z%*b@8d z{Iyv~XMA@_GI8H&cC18|SYL;%$4MVaNh{QDODuVDq*v1);_H*W=UOEO??KsBn!&d@ z9JDQi?^EgYMBn?kfrLar{2zNSS$uIQu~@pzdy9qB#!vgD=QfRrrU$*+ukk**yB90H zv*)|t&VzB@L2~zDciZ=!yS8%mC{!OV-xGFf_Jn~`2xZ-K&8KY}NZvw>L|wHYl4+B6 zIy>|QmSi|CgJ!e@%x)z^?>xEEUGF~G&jDww^Th8O_Qe`r;=Gn)w)Mi?f+NxhnKd`2 zwv|pLmJu8>tYuh9aX(oHRhBI+%&APxp&d_hROzef@g8;acFN;OUJFv%S{-xxddC}_ zA1SWjbP?+FH=N@(Cf>Pb@eymTp^n}oIJ(8D%FSFQG@KO!C;paC?T?l})^s1IX{yT~ zZd%pzG;~dq1kzt}T7+ay*u5<%R}tm3pTu`Kg}DP1lcno_&AR}+;>JRxv~8FXKbV8g zC9Mx-Rft}XRT@@3qleJ0#nm+_u4nS~MdpT^Yd;Y7&eLR*yZ8uWn%kRS{;(5!7>(1s zPBphPU`_mI3)EU1;cttldPGUpuDwmG ziLg1+DU_WKbOtorsWah^^yiL$*Pn-jA(#7~VXNzgVwv4nuzc$K%cq-uz02>{AN&0Q z9}+nJu!GU{E=Dswxn7Kk+1KK<4M~0DQ9*}estJ6ljU<(MZY)`3e#Xx&@NR=|N;A1Y0-|~X ztk;^GRI-FKf*JgqOIdvTZF<$72F8UW%pDhw{wb@E>39cCZ45A*x?4c-kpAs(@Ln#i zdxSL$cSWR?ketP%m%=btBd%g-mS7<%uf0D{N+i=7|d?- zKE1JXfdS@ph-`@6@UY7fVb0(5ut!2M zw%q3JrVx>-Pk1fDVS+1s(pKsAynwNXw(Kx0uh!75;8S9v$&WuUW{=(v#s|aJP{IP3mRyk2f9X;&edoe@XxLCF@fwuzupxp z7)B*sAz8pd-)|wvxTF5G9<{d{Er_M^|HfHccC^-fL8;&b{N#A2{7yG8$Xcj_;|irj zsg??A!H0x5*%op+g;2oHC_rVYkmE?1DdhFvnnK1>NaOvj{Ze5xeyz2?<$iuoZ0*mv zdI*;|uRe8f;q*Mczujwmy}&2{Gqt8ajC}0_KKyK-nnrqqcHlIO$L=>o+^!Ki@1HEdKQMDeiii3=u`#q?D^t#U06x#3aJ3 zX!FSACiXE(lL?Qfn>b*?+EsBATEHa}Z<%nO32VM}6QfO7Ya=%?&V;p{;U=_vO>&Z6 zVG(XJAvLd?h?sDUryX08_y@dzu;kwbcHPzqBtW6KH=ML;*r@m)*3dhoVPqG8Exhm% z$eQ;hbys=Fxo=7Y{g)OG-Q*Wf3{dqvOk?KZ%ece2uhSf@!j^n*_3zaQVtyg`9r6D?xjJ{xAIQen5hjVv?%1weRUd4}D`T8r?m|BtPmKYG+ zM+|SIvPWO&-_*W6{)tLfX`V^CQ3b`DD{cc_6(?Tj(;3y zoT@_!eqa(LOzMKM>740SD00KW|t znan2RdAn5q4=VU*M(5}AY2++i_5G+=Q@7MV+eH$-I!N00)#lxg_!;_>gplYg+{KT^Gd@?7S7~r%<0y%YM-;cLK!MucwqpLb>4f*zNO@ zqa!BmKDtEprxUE#*D0x3&Je#4r5s2T2i}`OB!SPqOu7YRyJ8DNz0&Pv-_dEi%3$zK z6>^gZM1gC?UaGmwzGN-0vpby=y01KfP~FDfqitNB;;vHM?2Wznl+fkZL6a@&{>%5@ zfMcwu3^hMIuad2eNa;V`jIp~BZQ$D1+3ob+KD%F{JG$Ght+jR6EjiT&>e&-Hwj0MB zL*IUiqpvIlIlKPuD5kGi|E9*1_#4MxzEkpeZzR&tx#pG@Xcf03fIs?Lr1yqS1;4vw z?obxWv!3L@f)Z6^B~mOdV>0P%+n1>A>CSWNo}iR^oQ~Gx7Gw7ItSy?l?R=@*?ws)W zmBa9?@mTM0=Y+?uU_zSxm{amJG0!?D>^7gC(Wht3r)LbyqhWGi(P@U??CtIA;=`xl z8w{bc_o`~2r8aarB^&VP0maN-8_DeoIS=JkkV%w?OBSqOQ6=B?h@jg7bls8MZAubJ z+pQ4)F!3PKcs>o}eM(6Up90_Y*Ig@)WIobyBRRUPF`W}lyptPqs=MX3Z^t@q+4gU7 z+RrhP>AhyROKY1PvO+-=7+4~v7y{B>YV+6fJm8|w3M3xq-^RVLVl~pijK;!)o72TzSWL97i|g(j*v5T zU1cd-AT~E#Qe`^rPa(C2of5bPPnZi&7>!i+(z-~cZEK;DL@_yu0%CfkHq5C6 zjz!oqFsHT?Bk3W8&RmSD%km*!FEXG+rBWzuWRmdwveul>Qfx zMsC#HfznVx%@=-9Q-dEA^Y??ANBp2>8b7G{jv%^>>nQjZ{(i>aZ~0rz-#Y%b@@IrU z$=iv2CBWn?(~b7rxV&#s8m=YXO9j`?{ukUwNsUeQn2?+ZmXd7Qz_V6?6%r@(xg(bH|Vyi6@Dr+fqxxecVnjAU&wM` z{=C`K>2r7^Mr6ny}i^RU+Ecd#5USQ9r zXE%@R>V@ygN`wEX&TiBX^O4U=_?^pdkvD@K8$`>=152WT@^C}i-}4}k!R2M@JBfkV za~zMs-?5=$A#=ki1Ec3GJMzd`j~-Z>>>e7D5V>=_4Gw-mAE!O_#{Xl8yBRz~y%!`;>n zBubo>xN9CEU_UdAP{eo(|9(Wy>PM@;5uj`iH_4w=ef|l+B_{uNkGpo_&d$DJxIXCl zbZ#e7_}sT&=MIB}20RvVSB~g1LEduQm5O9|y|-GuCz?(#w{R+zG+*&!l)E#za*`l( zM?LZjUVv?IKh-7lW7_>_tN zH1-4>#SHKsb91$6v>8OsoPcMx+WD;F+g~TEEL}ECE;qTFcJO_r=-Vz0cyl!-3?8!A z382;(CmP%YS4u!kCd8y&vvlZ6XoA!~Ft>?6Bko<^GJ;eCi;AwqOp~hRD@x^@FlyI5 zg(R>m4M~xzMYDW*HKDQCm8dhBa!yYs#u5^?l}4hXHf#^D;WDuUfG;6?z$9_bc?BZ{ zCYWHNf|OcwvflfaR9~oCw6v;_d!z{vx?PiJ6YK!JPZ7PJb_l)0uOg{Yw>LSgszR$h z0P*f%$qRQVyAOg*jk=ak-uM1MSEfc?iaG!XknCBZXc=_}Ux-|!$Yj3K5&1(K`Q2~p zTmEk8LzAO^Vk57yDd*diH`>T+iR{X+;3Ws{(3L-rPyt|c<=;)HkWi#6|5pU(E+Lp4 z^$miQ{N{J~5wpr}t<`s=&!e~QmvsFnc5YaScVJJLicIcbp(zP!JWU$D%~tF3g|$O+ z+`fvoe>N6D!o%-146Eu-B6({95iLLg;&uEmS2N~8$Hot>KW)#w9RB&7$b=ewa%^3d*h|mZbbz~evRLJd+M<{bTpcfkD2eXzf8#3+g+(C&^BWa zA$#a$79DuQtz^KXmp86HH>YdakMj7+KdLaJFS%?LF>qFB$1iL3XUzA^yWb43Vt6^+ zv=_D8CN{><59R;k4`ADE6{U8y-bq(zzfZrgJ}dnx|33YM>a6s`J~%z|$=Gb4Sw%7TSCipHY^;fH8YRjLq*|{%*h9cJ2O~^09bW+rP*7s_y;B>HwYETey0xe)6q~x50~azLM+Q^&2gy z-%fN;oMgGi8LYPUP27nI5dNjTdwbJruDPPM^dUD6UR`(Xgq5mgQ~&c1YFzf-`(Uwt ze*2)Q>=(u}cQ4na7+&WlLj;&;?p+9r(R^_fT2eP*Dwc~CMu!O6m4D*<#VeADJIEVxZ@3!- zg_93;^CN;q@3d?^VJPvsm!OlXLdg^s-n*O(CCD6PwXj8wO}a`XS5Ix4mEidcvhiWl z{j*~1(8e+0vimhdG#0v%BDZ2(s%c1n?G^;R$v~|IKsVOvu^*k-dvsjbk$-u zbj!D0mCs&nZ;;jfXUe;-!evxfxD+oe@C?&797#T`1IF{&!1m_teV2{xT`((5Fh1(E z%a}mI*TkJ~|6_eQqewieV-SLcUI_w?pgx-YpawRDg>(Y*5R#v?E z*la3C@4%Fm`VnPWSbMkn6dfu>Yw|c0jhb$=_dR1)6c77kk|w+^H!^PG&ZOy7zu&ws zKMkueq=nf^L4UU;GtpB!e%Iv{36iSStj30$RqbaDf2kmYgE+;tFBRmh{wM(UZUDbK zuFuc8n!m;TwexqK|EKu>FGwR1S&GE#M<3jV6Uu51!CGEGP?6)&{>&icorxkyGL&$?qb>-hqsE?6L z+5fy!HIJG_%t11b_IK>H$Xxird{K7MSbO<^In}_G9~T7{e?y#jviqL(4>xseM1Ij> zYhPyO6>IpzkVx_l$-w?QZ>t8qwb0v$EjFV&q`$U8p2l=pNTBI=_CSO?YUi&3j%^H9 z3#b29OPy#zXw7Am<1N1lWI|*J5*Lrfdx|dARrxFsi;=g!PewA0AX8|KwRvRmaHcXP zf1`v}ZmH0`M(fyh->A6R@^Bz1X_+dGI~)^IXSr^DUC@!pYW z!CStP6F;J*skkC1evCX-JZg!f#5^OZZq|8}|{o+d&Cz<_jfXJLAN-P>nJG9B&cyZW`vbk*~EBw77 z<8ARS`~l+CKg+HTERMO)a;X9vH@blVNv?3Dd*cOk0ouPHf1?sF4{aXVgydcmP6#~v$57Q(G(4_L=z84gQck6^hlIZ}4_9#+Nig47u& z_WV{ebL)FK6xuXm_2=o+o*xjU!z&Aki@B@EvdWN`xVv0DIkHg?qx>B2q4I|t9q-RX z8ezGI+i`Qe-|&jDNG)M#clR%y9Q;wfLZPDJGk%>W{EJ08)X+i=cFA0nZ^QV#^R!%IlI4C7PX(|sc}`D34n4`(0fEL>`$MG6&`($8cbP|X zx+(+u2`9ffE_v<*tO16^hj&$ul@Q$<<8`Qcm5khb8n1cr0AKsg&t&ZV0%s-4(PYw7QR{caA3mL3R~k zgU(0)1-e6P7J#Agd1(MJTm8uj1X%aRN3sBj z4FE9J2Y`gx06finmj>YaF&O}Cl@M7@Pm!%FZ=kVts*5?&z45WEy7oMgY3#@Rx=5H^ z*QHr?eRiNO8e8!3gBoiV#>vEFaNhF^pfLS+w(30wtUbO8KyA?wk&ns%rGv$dqxJ3P zJtYQPd&pZ!hjJ?vtKlqcG9l%7&A<3pe{Yo~hF{W5$`4c#|IMV1>>1Dp%D>ypqxl!9 zeA`PFNuo@@=!m;i{biP+SSJe$$>n=gu>F8J>w0J|l8jXNF`>JMbhU^f=wCX{`P25q zawE@TBN0pfX$1u(e$pnK(U1C-NO7(oCp%Fw(y{ z{vvnt^~jd+aHU-3m-0zUiF{}Y`_;XrXdYFqq~WT;GD8t~2|lV%CaC$(W9jvR5T=gKf(|1;2Q>w0y*HL#H*5IfCf zo@T!F&&!4;*fn!9|BRnGIb~}K$cV2baZhOzTR;qDAEHkjX7q`J^oXci#d5n6QnI6( zJ6%%1WFR%OZKiSp5qG^g->H6c#xJ}BrQI6Qv)OB%t4-AJOP5pW?uaGZ%yvh$+l@6b zHqT}ww$^OKK7FCT?OK7BkF#dB06?g8O7@YC4IHKWy~hUy)|d^Yuyfw8`iLIdVsRJG-mWeNM|oOg2wl8cj`Vjk;ah$1;gRiTBt)R`V;J`y!E0s`3B_ zg9~szs|z5vA9?{K*I!{52{2RoaK0aMPB6t>H9S*drheyy&a32)e@AB~%Ypw?zl8=*?HGxw3%HiMr2)ofGyD6>L!sYbcVapi^x3yiDh*XK-v7 zNzKp&ov~7G%Nx``_M%SKhlcXn*TzS1-OKO;T=~)av5-@;P8IUb&v~X2$Ubzyq}{QW z)EFk^4Nnf~JvyB>Pd%DRI%FWFDOdNCWS6V$_)OwZ-a)AglA(g^)CGf57wph!4%-o@ z+m3KJ{iY$jMR&1c13*`#n{|YnR|cFPHE=rhd1cvU4KYQT4%pT+B7?sT|5x~%lEz=a z)HTK8?;y0Xvn{k8nN9-QoM1M#REoh?Rw-Hf|bxB0c%T@G@!u zFTgQ?4$f0tXP99q_Z3{eJME7n`06Oac5tIzZ}F3!9}O2zz1N;5NW6zU+71%IaA1{B z%9gblrlgDV#FX4Q#@xkPYQs9OD{i5zXev}tjmHPBdyy&3f{gt9W+gjH!!UrG&8~mR zCTAuaIo)Cuo%#|R22qx5JSaAA7?IuCk$}`REYB&~c2H#FumY!K>p_v<8dm6(Y{`nG zFdAitrbnC{# zeW1Y3AAAYc?$LMd->83`zaB+J_Uc*Tk$Ay=9`oOF+WSyAnoW3Zzgv8nefSk14!|sH zR=}XW=RJg8IKfb-eVt_}f#rj`0}xKmKabNL6Lkz3e*U&dKQ)EBiZ@0|HyLIwUVdsj z<(uw2Ug*cT#F_bobHa9EU#2jDd0_OhtT?AcW+3&CgNMfs!jm@Xm|g0)Zm;A~u{VP! zwgc;5<_}AN*=CX%uVODP(5!kcc>KymKRVTN%6k!0R!}+T1TPOC}N)I^gpM|U{%inbp>gVdxt(B!uhFsIJ z$JqYP#=FP$86eV|+tD_vvT$i3j3sR5C!! zhG=^xuo{7wIlFX$>MpTc%N*&^iq2=|4mNAJ696Q1%W(s?p!FxUu z3?t_Mp~MSDz)v(r415$h{{OK=GuE~VHVO`0z&+Lefcn1&vi=1-A&bGC-{-W;c0WCT zKwnp01Y?J`qN%*rkSp7`z&MP=)F4YtA5im)hL~O=r4YXUa0st|8rGU;S!>;a_-&#e zOBEs{F}t6+n!ltEYZfogYCBsDcJ!qpqG(#_U^lfHp8oM5Cce!o0)9D|!$V5~~zxzW;%hk=n?2jVZK2U;li zy-5F7r~Np#jAWB{HxQ>?{c8QL#bV~vKZbo;OzPBKH}SINTg5Lz1^Y`pFDR~^*ugJK zY@RH0d9uW1t*>QtDEkCU`aDIb1j7F0uqx?Sp8^M1$Sjuy6xNvtM7mdp zQD4B{M3Lzoyz|}I|AB@vzxo~{6eG8iP2TU`8jb#ekH+jrtNU}{yn*~BBq1rYjI|(C z72fZiF@9pLz6TPYm6cewM<#JwCb8D+>BPYsWj-VziU)ug4-f)DOL?neFef{#mO=Iq z?2}Z|nB)078om4ZhZ+lF2AE}1sG!UM1x%LBpUeP_#k(~rRM0VIfE6pV%m7QD$d~~N z0__u7`@5TPu-B8~VFB}>AHM(gteo-<-ha!KC-I=?lRO5Om-&tC0bbB)WW_J8*JfNF z@qt0{N{3s3zdX`>sW!Yh%eF?fhuvp6HVXuoS2ce{t_9s$Es@e4 ze*bWKqz?Rdy@lEqR#t>vfMeaZKq$L#evr(`#W zHKS(jEeuqH903;Fq1gBG{!s_!h zug0!r`9%%oo0@hJ_#5<;XD&AHM;Z?{uu$!0k}+1DX$<35Eh=H>dwftQY5Na z>dI~b0@e614By>R>CEbwhgCP1GXM#2MI%m1?j%9km^m?tIe|}3omvPbwF*{VuN4fq zS80j5?2PC(Ll$vTB1N=T)R%=UW1_sw9zq0am!SEw4wV++9Ot1a5tQEGx)WVfow?NZ zjvl!N1`w2Z?+*Yn)Bk)%lb$mkBR_~`J>a&6Ez!8G|udcMib8}upV_={gc42@`98Xq`a9g z63J>-%JHCz37TSFb7nrvI$6}j9~y_?{L!}6==w0@uY2B^`6@qq`1`wXu%3&3o$F*R z+w%^{1rG(B^ijxm$h!pTvRH9|)PYf5h`GFuF4o(a+d~0m%k^`?$8%1}lc*(W=jB4lc>c~On&#Bk2`jb2N(2+CTKs`D0b$xqT43{0qC3_FJ z`3KReD7bK(&_^tK&Y4f~hvu%1HA@|-XR z!(3Lg`BRdGIad^}uAqW>$t7YS119`{&#*N^+&AUN$`$dU(Vx=iCCn_F!~5yvH*1xj zOy?Zv@n$}b_e|Vb-N5$Zb}U#_FGytjNue3)~5-tyi&=lH_q z@q5jhd}GsIW&{oPX!*{jO=%&aLQX3a`>@|J!i14Bs~dVEiG?M=jnlt(@F)2hV97|B zIGQwG$(iZCRa}Qy#Qy8tXoH6bYv=mKq|_zW^NkmYn2UeM^J|ea&B_<{$R$~+YG$dP zp)7Dw;mH@Xzm#tyE7DA|4%;6Ll%#{;zF(Hy%^y=fCW08ZE2IinVAHJQ%P;(;fFpM6 z5tFvYe=H6@K^%NO{Cq*;ouSSRQnuhGf+tIkD|I{gRV)S!AX5S2J+=tY-(llas~Mv! zeCvKA?(k0dt*kI+D%v16@dr$}{Hdm{X!&j@RZNMdg#LA8G9QU=+SfBuALJ8hr~;`P zyi)viAy@M5ZpJEkNLSvirW^@Bodpqc?CE(5R>^@uyds*waOZkC5NUl!wt`Ok{X8M@ z{2QY>k{lTI-_`onFsaA2=zBxrQn_xR-EkP=S3CIor{H4f3BEdhC-huR8Pe-FhI!^S zeud|-#>qSj8c#B?o=t-P2-f2S(+RITCEnE|fZ*gCYDVPrIzaHMQzDR#TTFzi(xpNM z3T*xj6btfTs@uFfXTkJ&mR0!S+~>K)Z)3#dSd$h2gFO*enE4@(9nAKIXW z(l+JfH*|)Z_P=O;nXUX>rbxAW!RVgv!fn){PP=Y|u~j`jfZm5}5o6x|(xBGV`mL!S zb+awo)T?e$eT!{et!a%qBfANg_`s+M>83_)9Kx-|Q7!(9r`0(n%%}BZnrzi7!@zvF zrsn5nRjE{&CPvbzs#W2pfN?!PrPnkz;%C^g(Oz}X*x=e-kr4-Iov+dv8XlQpQPA69 z2z8R7=Wa{S55;_X-fHQ2)bEI}g#-sW3D>0<4i*0=BgPnOAhXX)F4N*hQs!LCP?0O^ zG3QSL+#7A+Zs)glk}%!{$bagI+) zmW|7;BV*3I^nB4~^l3axKVcP`2k9@Y{-)a96=~2Q;QSn>CaDUI0(80f*of;QCi9}j zJFEDStG^&bnkZosqp|9SjU0DDO;Nt6s+rcso~lLgGxLA6d`GjaQAT1`F%&(8#Z(8P zlGO@yH0?g5`R0J2%I`Uk)0|m@l_2nD039YkxkdmW0tN_t_#vvXwA~eb`>$61FcorB z!BJ5+_H->v+>u<`j#jsTyDyTHjlgCMOrE5b(nVycjxB#kniJ+}aqb}fkkL&K!l<0t z!cz*|CF&VGo?%R%G{PlXpGtQtgmyVA$a@Vf&Sr@TwUrnXJ2iv5D34_={Bo?cCzkqZ zt@d9~$yAmvsA`@abw|{=v&ZC2cYiddh3rw+Tz)X!y?2ZqM8DP#c#r7+JKWC^DeYMy z)LUF*JLHB(9!Q2AevjmLJhmBVj93&utpKZJ)~ah+C3iO^WA3rV!Uyy!Lp~_CM3h^E z-A-GvWNv7+MZYFOM5_p^Sb{VPus57-v}EG1_B^5zug)n#t%E<^i$CZ*BL0|=n2kf= z6xT<}p1XBl37gC^WXa(dyY~6ZQ4>!@FVsF4K`HD$*n$v6v~v0@FE{td5)k<_Wna13EWla`v}XO~cq zRzvL~4M~}wK2>r8HaAV|sLbqS)6ZEFF~B@jiQ3U=`?w%d3qqX!mm=yt)F#!b-%8WK z>IzFptr3jLep(;rR_dk;r%h+g>DD=DR{uG%Bk`}irg&=Vff=c9jk};KHFMkr?7Bza z-tBL^PiiMMHRajgB=+fkdDBycCDyQRqZJ1o|mjbVDx({ zp_^qS|Jlw<47DA5)@`I?xyr4!pjo|fJLon1&~BWe{w(6yeGw)WPW>5sc+A+#a$_2y zx*9@3g@QGEZEB_QlxCmO5UQ&o6jUf!vu_}cmIgDl>Yqlau7*%hpIRh5McbZd2UG9}Atk4jbyCCBgUd5FXAlyvSY9v5UIUi-I9hHV<+N^xYm zK9OLczuPJ&)$;WeD)KXg2>Fq4hKOU@9@}iW7E+p7LZ~4>g#u>_hH2hG<)jG_^3!K} zMrh9zp_UlRn`Lr?oAWc|_tse9rX>xpkD5G#8YxmUux1MJ2|2#KM`yPg$gDPxg=N}- zd<%wOK90U#eo~CDh&t1Udo5xxjCU}X*12Yz^ z6^rL;SZ@|hn}2Eiq8qd;(qX_kBacQN!Cwu5Ac0^_o>?u5T+S#^ibA1*P+bk7phCeK zjNH=0HJ~)3m4;AV4WXby!J5&Tiq06TG~<+pP+bk7phCeKjMP~8o4SgWrdVkR)zuIR zDio|K9;mBCX^vGILUlESf(iv|jvc6Lg3?S<8bWn7gn|kMYbFiUHCbs+RT@HdHH3l+ z1#3T5Uj&06fcenVj!BqM95RBeSDX_sCIr>Y7+`Z_GK`EyEW3hr8I=Ik&14mdBTs>#hd2*19@6vh)78NK%sF1Wz0poU}!o}Yrjd+dt zbRFtuoQp5u4OO|Hpi#`LLm!Ru$;4LPMw03~cu-wkt@>pbSu5|P!L@yYg->UJMpG)4 z1*-4nMTMGl_omClghl3yCUP$+szIwMv+e-Vg0NE9u9NvO#nhi$#3K!9^?qK`fL0n~ zq=VrsCPj4#55XBo*K{mJ@-hJ21iv5y$D|B!Hho=Pp5VB^G^^6?gPb*2Wg6gvb@I6+ zO)SR85T%7$Xss6h<&CWV6{3aP>ILcVji$ylW+@t8sGRk9R5SWJ0n82}TJ&xqRR&E& zQ5-Q_Of)e@%WjOhI&4ZlLVB`q#-4eXJl!n#h^4P4BlK7*asq~kD4@$qJmjE(dREWX z^DMLD0O0Adf7)TGeJI$vxDs?TK(k=Is%?3&xa^E5)i zn%gqNI!j(#tuzlP4WVGo0|ROH(=V1~(Sda}k0}kIV9jF#Y5J5#G<~StmnE;Q3z{iD ztQKqP0A2{o2ovPb68bzWk($oaRcND(n&+;I2FX--vHn|N)0Ma zP-&z9$5)pHyk@L&u#IPHCD~X$SJHu7^g+A@$koJ}B1Hgpa2E5asmMTFoX*QvAP$nw zR(f?G{kk69jpAxQd6RQN>4!eR_o|4yb4Jc<6|!$FQdol5vRS`&Ppss_OJ#a zT>&4C;qN>NjOji;Y~L8UdDh;8+qs7d>7BtH16*FFnR~N423pDPn4l4;O{dZiexIhB zNjK3Qn!${KXvAmwLCv)-4VsTN`!N>RR_-Xfth!wjliCX|0`a1ZwAE}_N98Ip5IRos z);g$iu)IZWvQMjLE2dy;u^o(D)S+5w$%dAtTA>~ic$XQ2@vJ^c? zepY|_lx^kxLwa@E9#y$luo5zh9BlfCkYhEQD%p`b#+8u)m6S+HGcpoBWjJ0CCu?NS;# zv~C)qx*9@3g@QHDq+uh$hw3oW0==h_=$6CGWf_R*mj5Rm#v>Vqc^B4b*?%V1D)QxdH8QG3h8?vsqE?zvmSEe44#f|jZTtvB-?B%S4Ewpk~TB6+GN9;*Q{87~nX#ak} zEA-{d#!lj9`<{_Gm)iG?#4BGtq|Zpa^Xz*@;+26S-!l^L8TLIR@t$JeGZODHyk}K^ zw0X_cUcf6YJ5=KR6{yJQhYYVretfM3ZgYsd+d^N}w9!e^2nB1}Y-;*4OWs|jG`A@Y zp+Pe7z}W6kn)OOU$Z)N+!UGcW<=s6>194>7e3rcX=&(cNT}Ja^KO{~Zu`nbM6I3Wn;8{5q>JTP7P#v;l~88DTl_VZyRzerh3N+az0((*w~CUbq|UL`N_rDZj@TSb--m~|{gQieaB zNtmD!X00ok+lY(?d&H{s$~bEuC8=K1TpmXLhT#N}Bn^PRu6T^CvzPpbpa+JHtnTOKh>uJ(EqWz`X9_tKJqYaJ zRY*}07lN60z)a8i$UWfVc5zsKf4fKg6YbI}e$ygNv*DtZMdGE51D+s=Cp#fd+wtN? zM&E7ab)N!os3#6*C3n-sQiU8wtVyTINcV>kYYvtJ8B_-eHKdSi|Cqr&SXE`S)LmA% z5!&_YOE_RQE!rE-Yvz%#75eAFD~aJ}IJ|ze@MO3M0?FK&+K# z+{djrlg*$1{~*s`NH8KT&tP?*S3r0EPvjY#eMX|W|E$h^HI~~Q?cWCf0exYe^wUlx zf%M*FNqV=kB)xxGlHSoQN$+u%q<1|_>^`W9*)J}}K|-^cjb{jLX3NGQr9E?b2ip1F z0;C0hQ@wS)_Smi0+Bw$YBtL{WvR{eSFrj;LjHf8;y6{=fi;?99lVy22%dIBMJtn=oGDi(b z-cy0Vr0)w9$C|dp(@GaEV$j5EA#R0bC&%cCRm@MaCCk5g%9uUbIms8$-B1@n%-h>_mA^ z|) zf9V$IE_~3dD9Rb?c~RBnw^-{3-^j?A8)0N*%#ExSk8hPRU{e!b9#*So76)W_p@w5F z7YbCI^osEUdG~hHw0Gp!=vE;b`ygj^jY7Kc6mO2_u9Jz;C~G+9$7tU^QrXraM_*gL z@0aK0RQz#BEOnQ9loJ-hd2MysCD`4bf$T+y#kQR4#*)_+w@@|)aF7SH4{)V$c3`ma1gr!H(pdP=8mnb%Xi=V~}qDn(^eB6_MoE zu~(g55yf^Tmb?gdgF{u>9ft^FkMxjG;#{Zw;q=9mvPZ`fj9x1#PeI$#$4ahQg1b44sUg|^g8AYF+`Q&U0^i^dRr zHw~jkT;1DNbBM1ZmRz=-zTjt0#V2zn&cqflmbq- zP&)bfo?I9J?s$G>+eQ)RX79l-rSSt$8GeLqpMTvS=T~7p#^MXsQwt?x{l=k)N-n>2 z%rQ(bS}X5$_E5xvNUBw|EuU#EU}@qjYxI-l4>oy62L_OlWC=r=IbdV_l~AfBhX#gI z(UTa6pPN;f^ZoR&bN;k5ckSopj6azk*3-|lgYKdZ5o)S7;5~J!W-!Bx;1i8epGQ1> zws=GtwMV#pBVA%7IcrB_yYIGo4T18xDLAfeVQ@b)IOb$Ob{E=wVT;t)N-nI?(!StGpM27QMUFp1MzE@ zs72!}PVY6tDU!O+^m6i)Nb)Mk|5Cd70!SM%4ZEwqm)&KCG8$9huk@w~JWC}Cw7-hCKli%gRlFm- z+e?)rI2qIizOF93gWoU{9+qNIedA?#HNTxGcx2NhIh-)PAkwfamG@f{b!&u6;3Ph0 z_;p5bAIc&zI219o@Ylr2Wl!PHc*}cPYb)OJUeLEcM{?x@Dp>f3Sni{t{_glgiRZER zsshG{`|yl()zskI->597eyE>qXf^jjZH&L%^MAN|7x*fxEAKy$1cD?!=O`#`vCYiH znb@FEfeyaNGzU)V37#NTtcj%5DGs$&r;a4nwx|h7S`Lq=MR2BSovETT_0o5|z7^1F z!Yu(&K)m1`)Y`Vtoe8_p8XW#c)Yp=cb+H0@B6R1I(G2X^tidnbcro^07h@Czc+B;)qg*WNg?mZ>E7=O&u-gYFtWq@ z9j$r7UioR;UqJiZRcyA+6&>0yeO2z`|JP)pE#~l~jA0p@y5DPhl?@Y92#+-&#LKpx zmL5A-?T@Ix)5HE&=I;1}{zA4ox8KqAON#45MmVfOWIPZKD^cJD5u?CdhL_iT6$ru5 z^+Rxl;DCz-c6?xL1kFwO`>M|0ba>VI&yH0X(_P*b$@I7{=!3~K?|I9Up7eV?&0bY8 z+#ZwnE4?r^=RK56pKRSzz!(DNCUW1`dok}7`;dw_Bc(#)2p8L`;y#~Zm zVsyb(t70Nq<>$Rk%=9qNnCv`@mA07Z#V%uBNp?Q`Z9SA1t;~H~dBbdK+L6iJC*U<+ z%XnxZz!@u34I3snjhd$2!@cGW+UuC#o(!#!=dZ(Q52vArR_1P3eOYw{eCXw_tH|>y zsbE%q78RW4sNf2r-`^*^2zd#=J4C+W3*61geM=IN18OlD(uR?zM;2`*XFfTd)X35bx)4d1tW@h(WOdKpfXjskwSh!rH zv`e$o5(*w4%sW!$o|?|94DsPm|DYk*P!EDLtS)aYS-zaeMI;;0p28y;&xXUPpNPXD z1rCSv9}dyzJ@`rZ+pd|kX@7p*Vcc@Z5@wyvtQ}tS1hn+3uldI;&+KI*GLpRrch;1v zNgRieZXhQN`Fdl>V#JOi-)p2rMA1W@POL@p@8Kz@iXXt3A0Sf1|h!(aVVU9(h19~9lR2DClMY<_Te_H-6p1;j2JoL-*kvdssz>uJ~ad_v^I+(pYLJ$sAPwn^RIX4G7_U zS_o&E4FhLrB%qZ-qm`I$os~iIC$!Q^+>Q*PwaE6aU6AuYU?=7~e_)adoeU9s0C+&M zHATP0m4VUgD1ZgIa(BRm(5j=^fL3>gwECs;5Wc#puyH@&?Y(UHYCXD#$EI$Hd8ciO zEji3@Yug`b>nVV*%DQ05^dYe&GsRNXlmDA@W;M04_hGNa13yz42J*)t>?8%6v4*0! zhJc~w&>cePUUHZNg#duyp$e)r$U5rVx+YU<*1&KgMsofG#$ICnvs}vzz(y}UtT2a7 z_~v6kP-6a-hCxK!-;1f7mY#HlP4a1dv91lKcqW!grg=MG5h&h=%Hc}k8Vv#dHU)CM zoUk0Qn7f&yIJT6>h6*Y8*%U{tD9}-+!f7BFM6c4LJ2Fl853kbC6?x3aC7jF}3N2(M zIl^Ka_gk8L#EFtT66O6Em0EVPBP|($ed!96ZcVIzabdcw@(LHsNacMW(UoaKm>R8- z)buh-jTa3}%?75K=|Te&<0`cG57rw3L%&{m)~m~hTa&tnT%%5LOFKjxO^F(luS0*dh7ojUrjv?U<-uwb|2oz{TrZ34mniXg!K4S5N1PKaaOF&{)0bzo$gu)q1@Ld+Rr+%|ig*5$N`E1$ zy_dr)@j}gyTX$={T^yYGOQbI-d79&XyC}Be#MkYhUe&kVX+FDy@-dys?#hd3D8)*3 zL@xp!}JY_Gj|22ep%#LO9ocz>C zlMkld&J$N4yC}4-h+QvxBW?GQ70s{LAD(DheTx(|UdyxmCj6`JZThI-RmyIJKmx1x2^Yc6uRh^%(tS>9DL|sjsB5Vkg7O zBUn|3>ZqTxvPX$r!M=uFM!$xlW9d_nlU8UeGMI8&*?eeG6O+NQzHq$`IA@l7CmdFH zCT~rGBqx_IDZqjac+M<0Xz_NKgP0g}23o1b4eGPsN^8nGQcIuX>qm$CP3nAZ@U7zG z-U&1F>b^Nx`SGy)nR$a&(A=+rT>~o6w<<_bLBZe^Br+8g3|hewis|{tJ=h z&UJRwU!zgOHtGFF+V!(5xMD5suLqqK>551^b-OU_f8%D<-uW?qLwAA0b=g|f+s;<3 zemA%9DYx8c9vSzWMEaZ`{`#c_FdoYD?rSR45V`M+MAiI1#_osSau!V8R`=Zn6Sq~# zE|Vkdy>+wV-hHoC`A;$5R;$pdzf#5MDWUaVX^3j zmvS2pDKO6z0B?i}MWMM^aKYzO4}%e7^v`4-fGD zOhwt#hHtH3pBFi?APDf?5f2!#QzvHR6@NH`{ggc1*h+m`p63ru4Kw7rG2noIl2L`| zA?$2O4{O1wntYP|F2X%bNHGc(y%^OL_@`h25jmwWhSJ|EDx{*X8%-4cxoe83rcu-s zv6@Dyril79>d#%%7}YeEnsizuT0T}ajZsZw|GYH?20fU#wqoMS0{`pAx_2zRyn;)3 z%QpWvA(3X-5oB{>#%gs*e8{hiMH>qWM?}(b$jpd%$7?x72gXj7#-^#4gSQ7E&4!o0 z)^Ol!UQ4moyOzJg{|JKxt{K+AC5J?C32u1O_s>{XLL@srqK$Tfh_95QA#1|{TH&lQ@$6u48;Xtp~attpS5@_3% zEBucO@Nb`e$k!+M7qiS@-i7_bg#~DLVZU@?0nT06uU%Mxa2NI)7Y2KHj;6S^>KU^1tdKql!ym?M|8t3F41^1o2Y5Y`2-Zjey)M{O6qfFn}Hy(i@5gp@$Iv zUgQU2GC!1~$Y{kYu~fybfJ%y?5(RRymESXsM!vPTB8^8*zW+g|R-+dhfz)T{V^>HY zuY~mBCv z6^CQ%BAS4I zw?z6@N$81G{y&ZPP>c2o!A~zpHEQ|BeZSb-9E_iIV*yRR{6sv#F+G}6$~EtPb=-$j?({U&vm+gkbMitke2Zq>kXVciJ7VGGLv?pUUbW9s&g(DT>? zPxjU@ZuF&2S;KV69UPBk=4;Yamh%&;PA<+xbz(}<=m?Z0C`=-iabB<=uU;=5Q>w9n zA_mV<$&QN4lIWkM`OsOA<6V|y|14S$AEK5*Xi+!XxSUx{i!Jh6wEs`U3I`w?d3@>! z2S)hg)}kV_#i&MOS;8;ca=eYk%O-0yuB1*IjXxcoi<-}b4jv*7|IAP?=Ja04lPtJ? zj#Gl||Q$8};(7Zw&a+$^-ZzZp;2q!uVIVyiTqL-{XM zU#$OA>Wjns)E7Vdt_=k3`O7K}V*~27yB73=f8DeMJ6$+ow$ZH|1IMgtOCxFX%GtroaSIzS9b@dv4s*K%>Z>5}{W3 zyQ}$Ns9d{%;cV@$$DG zCYAK=Xtl}gnG3)MxIK^h8`n3ekXlA>R&yyj14w7s(L& zoOIqJR4P-lN=@3;$f}ioSFEi&S4M`jPfL#*!9G>xY3Y+w2^l)%zK_kYjJ+$_3BXwu zI`=qQ`VtvGl$wLRtn;F5-9%=l$3_x?MuhdCT-v-mN_EdvkE~7*ZEzV`< ztYED3bTBP?7(bCwQEkS_UA@k0g{*6yGd7E|ITw-1-F9yd)K{a!bxa!7TPR|?4Ae&5 zrWAR1AEFZ3$K0(Hqn3U`ElaJIHJ?xm8;6Ikgq~0db=)S?wy-lYY|!aM_%NLzP2O!u z+fMUZy!qiG6&TMZ_^d?ItXm}XmcrDxET{6U+ zEs>TxAs|hS#f!uOFO@KN12oemb6BdJoZCH;V=#B@rWtLWxw70EL(DR3P1D+9L~c%} z9s;QJW#%qYo^I!w2EiN&roTdhnVp9KDG5&RB*Apf9v-USGdUdE`7_SJ9&?4rZ$O7|N!zj_MM!7^Zc{C(9lqJ+9x^y0c-2YI*XAgY|fD z366&JV@!SX&Bd_(t_%4YINyAd{Hf{UWA{~!MBKdU7O;niX}5(f6OVP5=!Ej7lV@!Q zjj8L6zhU}!*K8>%ntH^^1(n|A+d3cqem@~HnEy7smp%WTWAopQ$J_jO8&RF3|BAUj zUG&1Md75pGcJp5cF$5lGU-?SMEOoyNoMeyu|EUbAq6b}|_Dh+FmbjF6xxoKHV0->K ze7G6!r@YZ-=Duyb74XJXw~1HDdz7`9SK4r-9-8s`fj6{2?l=EoApNxFzmhD{#26+^P6;?nG<7uyGbo&g00^qWnQXD zZTIbxw^Wm^M;ml5HF?Bef5tbNO(lrL zuIMS2Ep#zOC%N3myU+SI@patgcGP`uL40C||6x2`F+?1xib=SOZ5UiLFIX09>8u;i z@}rne-~b$*zpRc_Bn$`rN6j5FK!$K)iteA)*P>S1z*fI+6t8f(6-~H-pwuByyl+}F2A&`O2w|TBm{Ft zdV_np(xya0t}bbCAy}aEd9H4yTV^;fJqn5PUoE%m*?8HOV~MTid$Ou>`F5D~2o<0Wu`*G1W$<-{H-8BvytlY^g%M zmNT`Od5d)vRL>sT38>#=4ZCw=4cyStvWrtNBK_^e>-_lWhmV8yc`17P4@Ugc-q4eP z{O5VG9k0;-pu*J~(0^R}rJ4msC1P$Upa7hpF%b7Rv3nZ#H@Mx?pRx?e?4J5;ra4c@ z3zlJi3>eG!TL{_Uy5PzF4a0%IYbB_2_i2-L2F8{XEX(kC;$;u!o~^CZ^4S6a0o#++(nBok#_ zq|vThqU-^2rh4>u@#i|D<2q&OB7Vv=i}Xz*pg)?icn{SSdBFV>e-4G1jqO%P-I& zR7`F2n%-o#jA5Qp*75)1_>+9D^V+&a&-yKSv|@;{#zFb!TN%E23_6#t)n-$2ke${F zv8{&PUxRP5*Ln-;M)A#SiHB51UtNL}?FYp!mmt8M0TO9A4}dJdM9u0i1TEe&A93&MnaI{6hVnuY&^cj@U;yDl$KS8G2MSqj2uC zhz}%UHRaf&&GWi{nAH)?F{DJBm*>7t*lWbG?!kk~-1jw$5~N$eqa$HA3*sCEp{j?y zxxJaJBsfqZYpFO#wurRL(=ww~&VtEp{I!qht(l}{@hev?@<1~vA0vr8udr&C>%Qn2 zHceaRO!Xu|H&ETdv(<_*w&Cgzd#55Se;?b3d!_r~^sElm?hoh$YKIye-JlHG{Z55f zy`K!#T9{XB*@qJwe7Nv|*O17xt`}?~JpK>vIr#}asjPz=(gc|5NA>fEa1f3m_``5E z5GrdvB7R)^HB2Q7xELZ#hlsWzOePTxr3f>NH~uLSeUz2xiR?sle%x9Ty@)86mFD^E zG_)RB&l~?o3d&4T)b@w$M6Z%)J&Cx+Czj#&Bzhz}5z`^ln8^Eo{Y4>*pqRuUG|=nV zrCKLXx?W2H;o{SYAuqsix>!(33}MUqyC~BbO6*yGi#H9WS;VQXO6s!pME~(rg2g>$y#b|RUxzz&TtA`TPvV6$#R(P(-kF*fv_1VHp=LLOr{ z$lq{{Ud++!ryP+smOgnzZtXuJb*k22!T{($GzSbz`4KJFF!_YR=}Mr@<}4=^(KNVC zM|P?v;bcjPO0h_d-%N?&D7Q(}w!}m{CqJvfDl7m{35V6|glrULl*&4am{JbGkTid^ zC9RQb#g|F^2cF$L-{AR2bJhEEbwIlVYP2>qki2v6-^E8 z{+?3-f}AnUuf5u%ICKLfNrJFar9v9j11YEGi+rPkHvMP=>_Rk<(N?bTcD zU=sQ`Mz-u*it#6*Ip!1P3dXF`WJddGWR~@c25^!BG@udtQ1Y)~*r2eZzhKSmm@<@+Nga*Bf(3>K1D4qxneHWoOZLyX&x9ZHz{Z0wnqPvx3 zVKK264$`1gJ*#$9eJ41%ZY_ZGckJtGJ21>&+t&G|+-<29PAj}3LKUHb!TER{m;aQb zWnl1IMaWCpvF{C~POFNC()%k+6MTo2kyfq)J>{M{RxYTn1zA1hs)Uvm@t?7?tR6l?$=zR%@~;tsB%s{%s$1L z4P+9da1ZR8*dSiFb zT26f=aZ-6f{b5)`-94mp(>cQpaY?^H@s)l8pFzNdTQJRekQ@zFVK-it%BgHGN9U*F z&nQhauHCszuQTOos1lDa&fAclSgux&iM5wcKsCvwhX7<1o zlD!Akep;plefxE5|A1)mdw%+DC=G7^77hp7rvSF#jk^ zS#*kvyVS+~g^L^N0&j9 zl@TU`i}udnUOFnr%yhI)J>_8I2RX&q>O5^8)ig&=&~#axkh3U^253Zi|MR2eXL4KQ zS%LYEtn|I(YD*$o)f}_o5yWLP(@8R&VY=A9V;9x8UR$P{Gae;eN%$UW{|SpKnDnPt1Qlo~}C{6 zB7R5iW7|8Mb`Kf39Xq4?z4T&pu;w-g1W1dl9>;aGZ2HmAeNQ*;)_HAzd)t8`xc_Nz zx=H*U!{0C#jr+T2VxzR$>>$guVHY{s@BUkY^!h*(gn=x1R!?_{rFw{Fg{dsKC@bYq zshn!JNLa=8ZyfeWf4cg&K34stzUuD{tKa*v>L>YBzqdQAUMYv7y&RvM|CA!^5Z_~7 zdZ7r`Ut7sd_O`dVMVvF8_j#mGj5#aQb?fqoPWtOeQMvEw1pk{l^D6i4Ot7{|^tM)U zNUPs|66E|v{&WRT@LB;aXIM?kYpsXL99|SIY`M z8h`X4siK9Xat_94F_+e&fr*~rTy;pl_mtcD(a1o>5nbRaWn@GycvQ)^sft4sukn*q zD!U*gG7D9a75|R~hb~_wpZjQ`nt#DYWe6%jz4I_t^>4qDMUzSvnKz1`S!hCB4Ut3F zpnZ#TA06dtP=>GuS3F>0pN6_>U*hl#n*bddkXdCtf&xY|QPfs;o;5iYB>$XY=8(EB za4O7k5fB@=;{lt=vW`l#g{c$>KPS>I8Ii%Aa3&ZFhYoib+_{$7mMU@qHa-17AU$<7 zKBC89&_=TiseiAgeXpnfUt+l**@XphrXyLxi4kmny&|`l9)*m-Yl&zr;gyz@@MGMe z6iy*ysEg#X4ihNHZ{)h}777SWqDT#+5g(i_j(85{cwQ+?F0>~6cI;c<%1n?6>@V#0 z+{QiID8oDMA{uZJ9wRRuL-Au64i&H*#6|yY3Hk7uecW|=`4J&M+TIiE-G~9m74Kv5 zIDzEAZ}Lw%#NU2fvX>HdE9=cA9ai=OB{%Sd%Q@RWUal-@a3OQd&;ifi1fEO7o1aHu zXOE}(US=6RuVUWOQ=CuFGpWnJ+SW62vL;KAnEz&#|3^E8zME1xgbw4=T^t&#=~D}I zdF{5e(>~y+!L$%Ix6JFv=rdw|D~@CFmmAA%tC+g3!kfX#{7BwUU3h!!;19Qyod_MY z4M-A=f#j@od521;1yNsdg@Y!8syNpNkBsU{K$5q|-VGBfkPDIKFhNg!(@Q^sL>u%n z?mva87So0`q zemtyMscg2it4rbSgHM(NI{e7MY6~;fUKv!oWni_1RJ$dtR;h+Ej5Gu^OG~Y6*IGTP zudUu4n19L^xth_jJ{TRrE#O25H&Ax_bVpX?u%*oOp7_+Q-jx%PFTpw(=NBU37lP?3 zVt5A>H&G!S`kb|n zS6tJU;T8Fp!av|wfAmUU0CBPs@#a03WsfHOIER(YX}AfTyebD+7bwGT9taX8oq8l&?s5){BFi+=zA zhL4zmHn^Ar#SjL8(kB3DssMB}Vz*{(H@jS&nO*))%N}+v9)(I`{? zZ(wO6XG&L*##L3Qi3WYGA(s8mzUEMNVTrpFda!m4Q4yioFlf6F;QP0Wv#*tCxMEEk z@&L`iCc4&9XeeTAcHP@M^%3vN-!sys1QxufZoTX~!U8D3K#sA?R^+@L^vj^ziKd{eJm` zVu|-lR26#|4Lp}zZ8TC>s2g0$J1d^b%{lS0gnxcDxa(B9^o(jL=`T%8>`iOy{fu{usIeLqGWhq*3YOa(z8DySfSCPrknKfX4Cxw$B--LdMDhc-HiIv zo9;iC=kWSrv6Jd^>Sruydgvv-bLu$#dM4Zt4b|4p^bd3cWc^>WZ6OK=@Y+Yh@c_R% z!*U1D*whNb|DCt6i2AQr_*I0zRhM7UvZ?;auuASK*xGsad7P5|9E-|b`kC6o9SE&_<A2bjGiLi?;NQHR2EO&Ac{};7dje+JX?N< z78uX1LBhV3bn|1{E@=`dDpSK^sd}`WA>QQXcX;*o70?4&ek;sz<}qyJNU*#l1L5NB?FJwMyY38Pt6VKM%-S!zVJLwt^lb z56f}k@i?|RTsUd!$?@VFmC&^!Qg@VUvMiYj{*L7MV^O23*sNg`&z+*o6~4y;d5Z8$ zvxL~*6{5$WvmqqtbcWjHSZv7U-*iMiqOK~awLaebSp8Q6TB`JqN=)5e_cv-t*aq#Z z4exw!BJIxa{LgXfa0Z|xOEo=5<8T$Ys?@e^)<({jy?O(_N78 zpXmH1%~PF2?pJAY`gIM?23x?0zOCRGQ+C%c^O9a z<;VIM6;01#RRP1OJ6fX~bPIgwA>o?Eo%gcK={Jd?H1&+A`+QT+@Ve1BGqVAgy5BvT z{)5^W_#M^|@!H1q%XkkxDQdScgf+B9St1v1_Z*lkYllPVf~_7(wGR=D-;q)&d;a2%lBYZGe`^R(Sz-ApYpQns{A+d6-EZvRcj`_rxl@~w zzl4eZ{GI$9c5#ntdpUwX!Br|XE=}y#&Pls%%Oo@Xg$gXy$9+U~CB<&iY+9|Fs8KWE zey&R?;BY|Q5o|)a)6?7sWz#310J0aLPh&=y(s}F-4vhQXCeJUGzrw#sEmY?}ui6*D zLHthoUMSgQ42f|+_jRr?DQ&mQP^b~^VOjkp>Q#K|?zor48y)vntnWOU>}2$N1ij9u zAppOx&EzE=d68{6atwB-iOmvf|*!GvJqzh zp@E&}1oed?gkb3Q`_u}Kj5TVr3Z`T`&cR;tD1sOpdB+t%f7)sf4|i#k(QW%?`!om- zfb|gTHpKYvm${*f`FVLM^wq9cFf8hv8u-d1ekq-%}>r#yIE{0vshOt*)^3c z)l{Gt^ErVAsur>1gw3Wmc>cZ-IrY;NX@+_+?}Wvjq^|$61*y9V+N+?WE$Cnnq`rF1 z|3+856SiZJEhs6$b(SDyr4XzV2#zif+7P`?8Dl9cvaV7~g~et=;4U|m5pPjt59>qQ z{?fvvXdX@Ex!D_E^z3Ual_+hgV7zc-tbMUwnA6Q?rYlGp=gD{~dR;M*I@bKT0vdt9 zyYp^afF9fMFk5ed%~+_Y%`C70^(u;#P1&71nYVR%?FL>Yw_WxhwC%Xy#+kEF?x5Cf zP#hYX{HyorI4)aT7uiDgOseB^4)@nfWBAj%MzWyO`9thuMRalh1Mppv&ihbgrt zR`?&p%l60Nd?hg-_4E2F|2glDkNBQo3&KaJCjIRXlj*90czSLxXVZrwZC7&HiQpdV z36Apwg(HBQi8X57M`O7Fa@@8BsZj|_x(CFl0esXDkD7nnw(03)4#o!VARr0*l0;&A z2PPbPh=g*u)UU+cuu&X#R`qcfqKm6o4a1m<<5Sxg{_U)E@?VW`hJ+1wZO{TDC{68` zaxUls*)GNl&K`-irP>&5mSeKmgU}VC?!6}2lQXhhw4oRCzrt>XEqF2E9LB=s(eBX} zQoT{GR|%511k0|O9i;_BSZOnhX(tj>yCXHJ1$7>0P`)^t%$N!yw}!r(C%?T(hmIRIQDfMlks`FM@`CS=ijTDrC+r?TwB^z`1u z{0`jcRF<_?mUV<%4~g_R$uDGluM!s!WgDu>-mA*pm(1;94&O@zdqMNrmm-5pm|(%G z8Y=w_iLz#^G?Ckp{<=XmJBe0;$ZVutu?HQ~oUs4N< z_x5iJ#5~eL#WmzGJV$&H&k|+bb)VdlJbFG@OSCS@KxSY|W&o5g9=aukWdob?r5UNb zv45&5!w%6D2Ja^~ObY4^MXDuWVWr{?Ua(_XTmjcSgzA8-Zd2d{nRhk%%5rw!u-hGnvj?Qg$Fik8E+87?UP4FJI_e+XsPTyy& zcSAh){g`e8fx`+A0h_I0H*WDV{22fcGz`BrK!~+h3|XTIM%pGpqQbvU(heFcEhsQD zktRi>+PkCK_FJpcg^dBfV=mMcm&(R+V|}dbMF~Yn3@XrTY3;Es6(&`*Ud*)ox*1rk zNE5bfNNobAIj!~`D%6~fsZ2z*K#=FO8+e*(ZMM{HlCTij8rSb6_*+>zs?a{Jk#HFO z_xbx<*~Q(=x3g};knP*t-2`eO(yJumWSgR$j2vmQpp4R6yIrnf|`T)Pqb%yl;kW|2H3Ni z?+cbD#{>K?^5;!#MKgIEo48j=;zTtW4L!8!RbUJJwh3H#)Cd<(G@-A3f2mEKWB3`^ zzQO#hY5K^iI~sp$Zhhd^YVx(_@5tD;sUWRiuqL>mWK3{fEaVlNAl)CcXk_xVS1@mq zSjnK_d)l$r%M$GAMEWjG`xv+F*?l;Jq|ZMoH02ccfj!vur(+M+F2Brl_3H;4dvl7N zJ(%oEZfE-T zVSYzj*OzkJV38N?drMx(G>V&ghAuqJnK}v}zF7`KEdNGstc3|O*J0ir+fx?h-SJfJ zW2qH_8I%>FZ-M!5=gphV^w$wyYv^2m7Wl$Bju%he$gX)g}$} zRgX1oK)ZZfc+CYDVh3&&%7UjO)g(63fAy&*Xbq$_HkLELEolH2+K4WfdQU3#*}9#W z%ZWq(Y15hbx~B2-vGIUiMnq&B8 zH&!KIYf*Fgh4f{iIfvH?i+N4w|GO%eg{JYpbEHntn4GPFSk3?h+-5S*noYhswLaiz zUj8N5*mBescEyBlB6MCWTY;^eN1iqcJV&NoaWmTdQjFU6Dj4ApBQ<31nxe~Z5luw> z9AswitkE+_r_TaDd9KLg+4*3CLa3D6Gw9exBDx47(q= zL!ugtBx*6iiQa#ZBr5n_OX_Uj&&kYS3GAJ8Z*}7yN!W5WHUV0Z*^_tNrK`-3+fI}Z zNq;k)EWd@H1ZTdEo4tgeYc54v;CZguD&dZbcbdX4wO|$HwY)$l%A0?b@S0COO09@Y ztG!9xj7(kx>?c0vKjRKcJx|;0pj2f#kypk2N;)XDuD3Pt$O(LD4JgEJ^h5Rb%xyHXvm+5;;V> ziE_2;Ww55ZrV{HKuLi4;XYKoQwev418~Eh?*R)gio&#X$Ap04CsWrcYp+hY#)=8@j z6=YByl7pRFH#DJ(1epJ`G!}cyZ@?=Vc$2TXlPP=Z<6hHJ+#OYw zJsdB4sgf%%afp=ZPAueW8T)h&zS3rDeL$an zf5+iDU2AZyWLG#Wf}wi9izP~OPsaVsIY%&RWW{#TuWhX7FVd5MX+I+ugI>Hddap4W zH~jCAk|vFL0Rn1ex?1NXS?0UdySs%W5v<~uaWpq_osEB9+&F^-Zqwj}`*Fy+bRU0j z#=Wx~CnNp5r5cyeHW9MHtF9XDviwrLQ0z9UjNTnIF?!u3g5mt@)iT(AyOL}tK&ImXFX6QD;#Dp; zRWE>Bv$|@k(-=y-=QdOF#{F)lVy8x$z!&#Zqe-Mr({dTt!u5 zAYCinr~Pp97=#qP^sit>Y%FMe^bG8MqhFvL2Q*#+Xj8WVSDgz}4j1V6H z5+L=FhG3HcR0gKJ7}5kxLqrC1)FskzSTVQ**{tFQ1@RTv4+OC!b9{hgU~CYTHxS?u z$w1t|n}H*pa^UBsk76Ca9zd@lTmm=?Ljy1n5N$}(272|@i1uT&s+f?9JNU?^)esm! z#nJL-pw)rUcSKKR4rzlEZ9iJYI6gX8XH}p``GWv{V>0m5i}43LXx=N%utQ`s0E~n< zl6922VQ^3hh{`+wwpkF26#dI}#^w5te>aSbuHD#=IKHRWij=b;YZM;Bu@BCKysm_w zmM4e}*r12ih%Ja<16BYV$O7*R9HaTjcmmrKPhV?P8uEsIV3v{oT;{VzlsU9JI<58A zU_x76)Hk8U*WvMI3l&6`hU_^UeGcYcsa!4mk-rz2+2pv#8i3riM*Nv@ymVoJiszPd zhrFvt?T{V;{W_E2WL8Lj*6XKR!7D=sok7ZNJ;p8VK#j>!B&%6zY*1)60S>sgQbcs6 z8cBVci>jT~E1`k(BWoYmGHxjoPv&5&0R?Jb54l{H=&cPwFUgTK@=pC zOQFbeNdOkFt*wY{F4D|aOM^2Hs0KFpu-ZzPCYKLM=frJLuwEY@DYnhIU8%L4N)g~2 zr9SOkuC+I$`Vy_{p%6{ywPfK4jw8)it<))wVqh9HoW+{5E^e?cR^zlthnhs%HA`0! zW=*V>w<1naP?Ew=b_G=LqFlL#k`8N8i4?h!HPVTwrMp$93R8v$Tp+6w8nm0AnpY`{ zq5;BIs*m1gZQ^CQmCefr^_eXjRlEm9}z`%bTgc zRo}F3WnS=dTeDth3|8gfvWB}>6~BB*5NyRPR<^LuaTh}asC%Wpyi(gWd|x##ZBVpV zy;qZ-SN)a>%dE-z))VV3RjsxqBetYdVYdaLE|b(Oj!Oo-nBKoYOCvaqRqDH&RR)0@ zRqx$OPK6SkB8!6oQL{MV(nOcqi+sSKudCjvzLGOoIT|~4a-)TISW!W!aY?V{dXs~R zjxL^L(Gkp9?b9XTbCi8LfsfBg_UV*O5kp>daZZ?3K#nfXbFGUwc0Vz%2d@S zTxRBOV@$x>@uO#;@eEIbJ%}fPEMr=F$#DK^bH$dwXF1#l@oVwB>O3TEQrB$;QL0;G zv`uhA-M~JXUsJ0XOOl|*)ly^hm?NZ6aX1F1F+s>_AVNFd{o zw~t*hK^kqttso(eO6m+DK}J#Gd=`ix;x>3V3#Ao@RO2a;#g0&FiFCZg20kT98?>lo zR8S28cIW|t-zs5v<9i*aX#q1du^l!Q$e6~d)Gh%*f;w{>Jj*yx7R$<1!v?AeI51`b zSy;3IEco__wq$c&D!+6A?*b@mjBF9~gF254%*ZGRexmHb^)b^10d# zBlzCiz#JD&;7=MiTTkHlNSxA5>#YvywT_X%m-0wk`&L+V+%>mmuS(cS3FZijQ=`fq zxm)AH8ogdG4pxXFL79wyn3M53ujT^AF(s2#0E%39WtcUg7dY)s`lt2*Q;|fWD@5~? z<_)A0LNhE*=S^ysb_5l*(&c8?WrvbZRpoMsM>zyJ3@=T(Ok(tKxnN!FRd@9(f9V#b zk{m*1t0%b=NBmu{I0iH6y0#+3*)Yi!;n&6;gN(&g4UfiL864jHP@vC)W2 z8R=tn0SlbNE`LyPbh%L!(3#`d>lz~iFS5w7!kK=TbK8|JSL8zh((x<+ zb+V8Vz3pU0(hDr;?AurxEGVN3iL41`l`9>d$h2lskZBRjUf-5NSTaVU{w;HLM%PTq zB-KJI>QX4Fu}qRKwiiV`prjl^o-+moL}c`p|9ZH6o;zlzLgQn0z4LW1S~unuJ!;2v z>JcBaN8r35SF<-0%)6+?$E78EN;mxkDm1Wj0 z>9PHNasNZE^N=!Ir#JTzNHeBAf2B#mlRvzkO-#xtCSI<>I+ZDHTZ49dJ+psQIbW8s zjaBKqCfllSS?9Ir!n&CM9A+qAO{OPZg0WR_T|M`8OvXe;7oLanm(L{~IX?Gqq`02L z=bDZb*LCon$bE#@JCnH^xPJW^O4BvsU%~`N4pnln_72WBDL=QAbw_qM>Ylc*1t4wm2xQs}-$gvk$5i&(J>VUceKLK$ z+1YRhmsh%Q7e7DQ29uuA%Fn5H@^i)w{LEd(&-{i;ZX~b$_S|)G|2?O~yA6b!63>4# z?!So&Z{PD3>AWi{&VT(Q6#0`}BLkmj{>~6SAO-h0k?R_05zm?BGt%*VW`~R_U#w!F zDt}yKFhe*AFH6S>!)#Sa@X9`!@SsT1Lo}9ToYB*J(Jw<-rLJ$jw8Nzcj%ZEz(- zOPbWW>8?TAOsF2$*srasCfr}B3HBiDeCU69yJn~@_~M>o6V3n-TJMc7Ys&Z-0RL>@ z%D@V18DJH{r$0VvAn1$dZcOw(9O$t#APWU_*GMFWUAEHE%I34+@$_<9B4ip8Gp&M$ zlr(uQ*P(_F1`bh^bFW3r^!HWZSFPzD_6%dXHgCOm$JSWx)`~Lh9R~pOPmyBk&q9iy z&;>ttt6kUpoj~zp3+1SfZR$;dfQ}yPR(V%!KPlVSGW~Wz)j$ z<~gx%#cJ8oh3|>PW#+m>Pd5E-;Axw8^ndb}pSc4_fHgAhH;;_W`8{j{exa>T%`W-9 zm$L2Y{IQb6H~U^T&i9fG&YM*=znt#gAv(Gx941AR@gea@o1?NRa-h z#YC-`i;w9(@{-RnP_qMns3rf3pcX4pwQ8FlukKdFI$lU)ahW2r1FZ<()g7_@`>^3M zU?2Vx`I1rW-wZ6!cl@FEk(SQ-F?gq;CiE{@Ww+bGm3N15*5W?|ID^>u{AZb|E`G`z zZyw(+=8o-81n1X?DAA3wam(2=E}ESs`^(m z_aA=3{Wh~0i@;}IyuK=cjkWF9?H%e$X*Adow|}S z!AV3eReRk|2;|p3D0UJn^*;*a@iZf24`s_d6mOT`6c}OXaU;=+#8uXB4YK#fKm5b5lBsCLVv{cI7ADze)a0Le z3B};y*qeu{bso#rYM3Awn?d3#fTP!}r)zg8vH6P_UAs}_!hK?pxuxjeJkF=+b|A@f zT(H;2=nKJO<9Y>ifR?7DMBdf5#X4=amTLSj+V7vbGzbB$Y0qw!lsdO@?+p#eup5DukhDDW9+r-w?jMh|c$d%p}^*vCc{E}NWJS3m0)qVZZAq!cj=y1g@ zp3FqL$l)A}iER&XLxg28fQoy}@vL%m-JoVkpD8b_AcA8@V6Md0(kU2PL%b@XlhBwHB?3 z)UqoCSZ28BoD&b$OUZuB17znJ)Dg8hx>iv!mwj`Ai|);BcqzBx0Q=`xp&6r^`>i=l zw|2^ifSc4Vo@T{I`?x=eT$+%JhPg&g{-)L9JZ_=3idZ`;o7Qs8%|^HiO@=tC*L$T1 zT1=SL(xjp%?&N_@NiAL|KH#*0)Fl#kO&1XTP7iY#iECa{hrWNX{@>`wDn4V!lPy z^IuI6OnA8|T*clVu2Jtf*}#Rr_bFCBO1lzTel8Zsg5AZg()@=n2fq}M|9N_Z`B6b4 z{dG1+Ks3s^3Cn0#F@Kk$2#Hi{k{M&FugE=yVJ~u?nfPEL-Z}>O0x8tpS^{wK0BVg6 zs}S$tG62&a1D?wX-o{TY2Uknw0S29s+?ku+z4mI?SQ2WZt6CbOU5b2CUwW&3nua9a z6`2t%wY7YRMP~1%rdm!oNGB@gSB>~T#_6ha1DT`Ap}Q!IZ6{DEkL8Mxg1fqtVAF+B z)CGWuAnCrM-*|7Xg{i!GldGTk*X>B_j~xQd0(&Jv*iDzZNiVk+G|-8Y**#4 z{y8K=dPg%zYfhqz2D6lNj7lK^Jw!u#h=yp7hG>t5Xpe?ykA`TE8rr+&u^9&8aVNnH zxPHR{DV%ws>rHuX6y0M)#V|AKg8nm$OmBG3W-D&Pw@1rq4(Hmj2GS0Opx zG%ldR+e31^CnU%FjT|X7pvJg}Fw#`+XtNFkWkGEbXaPW+?a+h62SlQRH+t<7y;AAu zi_`t-R82QxBwRasumkOH8>LjgL|pB& zgmyv;H9IM!x=>W{n!;aE*e=4(DbVNZyq%XPk|$WILug7`<~YA~az6Qh6+q5xgg9Exs`C2!*NCJh*~R@P&^}PNK2ZPWlbxshl^5g zF|E!}d}SeD+AqO%SVV=Z(Tt)|jH1yCer%ISZAp?u=L$LzRCI8YVkt<)m|NtaRM|!^ z_l>iLROh%>Kzq?&IqHo%8uX$86-PrVj)qi>U8$qVXh@~ekV>N=l}1ABs-_M{Z91<5G!iPUTx!wztA>*OAEtsia$r*wXOgD1Q<*m^K?kv$p=4c}!FW`m;t)Ou_S#+Lqv z!9wdR{(FP0ullZ|UkA+lt+BXPzA3AV*h8ewYfY7A`UmiXwbTsQNTles2ee9%IBzn_btasdy>yufliLG~k z$*^53C!a8|nxg-)##RWh%%~MB3A$ECtp3FMZ7mF@Oa6=cttf)^+vJ~St=~#tv-Mk) zwzE9@JW-va|EI0rP9S^V`mLN860B|!7syvSmRB=ep!2t!|9iK7`>G3kGock&evV6d zoC{ofk=Ae9D8#Mb-scT`6Q=Sp8`t{nBwjB98dUHd%a-4yS_fIbrD{vK5|yodTdJ>; zpI*BFo$FpT6|=sZKokD`KMxP@LZ9M)kmWC9ko(Z5gzNE7cOQDc`V;AE3#j!W{&FV1 zkNtYWKT=*4N;vNF7qo%1F-!6B6}zm8ml#XMEF~mp1K5Xjvz{-zrsI!A-JLdt&}Rya{-x?M?bP zPI;Pb4^s@voxq1c+`BI&2#G^irq0J{{7-gPrRHx-&VRKkbv|5?Bh@j}1TL7`R`-t! zCbq@=4_n^9yoQ@-_a@T!NRHx&(HM%T;skcfJ{@4Gpi_tAF5!tk4$t96Yj~_yB9*<5 z)W4t;lhT~&AYcPeKGmEgM=CFM^{6EaQcY@<|7gsA!n?0EaBEPE)0cbQ9qT^J%}o`- z-3|Zw#_*i3V`zw0RhQ%NWh3*9;zQP!CIOC8e!icYbi9+JFU=(ld@v%9dHiAy<>Shy ztRs=WznEHei1@goR%JYZd(_7LAHeh z+x}XT~4tNV14wiQ!u)9&25 zFV0FA{yWvM{9L(6N^775ujOQ$($1Bt z2NkB62F`PlMU1c#@{EE4A?Cl2yDzU<{g!j0toFz8j00BV{tJBP- z!4T}a8Ll0^ujD;z#^^i0=$y=CJgqhDDW{czzBZE5S}B>nOUs~&6JL?)WrBYIgAe!) zD2w9;Lt=GZ6<+0vOnOI z@&%V>6fop%n3r|O{7%@J!~mT)!cjNdp(k89c_)CV=jy7jF^X0&mgJvgSk@IP(By#Y zQ|QZC5pny!f!j~S?h}ss|0^!;ZI}HW7k4jT?fJ|3 zb<*@I-tyJ&RMANk(w_eT0iFWd^WWuFiYSIs1+O+-68`#Rs(cJP%4{=~Lb~BmP!#9o zw+^aaMT><7i}M5$ z3>uv&cugueH*i%Unm?~pmf6*dN|-Dow~7Qvd865(c{Qs83lYudFPV0yrct{^2mx48 zVy#`18fBj~w~lqeD9j{d>?Xq>Rpl59j@}rkXYNuHnT1UFCru~st6evA`((7(Yxyg{ zB7IN(QJ|%32J4)r18f9*g^Ybi>3YDF!RW8t@!9-i&NI!+gwnzdr^tOaU^B<1zUz#Tae?goEF$o z#;dGb#5xr7Vx;Of3J58KfZu3crg+d_jXcK@28|-;Vvf(r9>bsNqPGT+i{9vfRK2^` zEb^aKH(ybTvt`8`{Y$*9GUU5PaHzED0OvpUGtB$We>_+eP)-+zH0eS9%m3g8*YW@H zV{X2z-)x{RU5qTq++D$ZTtDqniFJWOPlV%%Czrrd`&Z<*J ztz6t_jnD`n^PIkn(vD|kOokZ&uZ=27v;t=LE1;YvUT=iaSCWi~@f^YFHEy@Ime5-5 z7`Xy$#2F>>6SQLzG`3A32?#S7aKeg>I2$@TOG!wo#99!!HO`ZgjjS1Zy3ZwYW5Na6 zkZV=)#!^czt83RJ?TFqr#RAPPoE4cJRjt`bVY&rZ_W-F+yRQ`=mr>_=Bs&%7q0$}Tsuca0I1atBf4-L_7t=vyH{aD43%WK)}e+L zO`x2ss$DrUiI-`%h$eESVMNu5Bw>(quF7>k(wbcfFbV6AlL8lH(vs)amNu2OWMVg)w$}0FGhar`s?YkjYzG`>uYrQ zOkmJt9jJ;?omA=RkS?Ke8Qu3n!CN!BRcH#U)K6w~n=9pOc9 zbaX}MGyq*FT{`GghJK?P_R$;NlVp=pjiNKZQG+Jcs8J%wuGXjDD2hroicI`Qqf0M( zqYD#t!Op#E89M7G`sl5efDe%~#v%N?p&t#lYK~_{zb}x&^1Uc}k|p*!v-LS(EtC^NzHjmZ z!{lB54njiMH0WGs^{7Eu{$tRFWBDN|4CMGE(7@MK=8@D``mdL}4B)(6D?BLVRvWjx zthV7b2+yZAB2eRe5D$D_lxRGjD3e77^7`2%7|82&_Fl&T8Ss#!@%qQrI~`hr#vkLy zSYLp2SD!Me2V|=4pUL=qUnZeBY@{;TtTLzMg8rF|rT1m3&CW!VQ|Gt<}>@+A4ShZWraT)c? z30gL?`5+zFKB%pMz}HHWNM@vI50&p5Z8}4~2Gs1FAPWKzH}Iu&)1g|r%ygJ3Mtm@0 zdTydF&@4o2IBM(4P#!D8F@~%%%H906g|VqwfUL}a8mSycrbL`8SR# zf)zl%b7^b0GO~AG7Aoysi0$ITl3ta1zRVc6rqBcii zmE|pdFl$lv$h9_o0=FHIbI?8dWj%X5*19S z;nb;Vk*0`FlO^Z!wu>~kiXhyILpcf!+oYT_=mZ+BEp`qvfz}R~Ksz!M=(QzQ$2fim zOrU}6O?}W>H04H5^~M47=Uu`4SyysS_WUWRzY$ELG(B#WB&`F{yWA59SGyUN?tbKE z)l{Q~3Ypy;>Nkp_Q;ixje&e}8cE?)Do}^u?EtJ}5n1+KN&}{Us3oJRwBB@64Q@_y& z->ZHPAdf3aHEL|ADi@BD@1lclS@tpw+M^zbNFWL*gFMww>18KB(Q`DdM2?+sA(TSC zQiaVf&~HLkHPMS?pc9=fYlMjB+@6J-t=m& zJa#7IsW~Op;r^6&Uo3HIdeptAr3>$jwY1lNhpS=gCREMeAS-qB3)+7gqWvm1tFGn2 zZWNC-mATt^TU{k@%$w_<;f@XMA05q-bXI!QzpB<`*=F5e=MTkD1KWhhWPtH@*L&D$ zQG?g~DANp{f~)4gUX{xw1Uf*~pltLpfA9IItgul!3&vahmmo6#1w!Os_xd)Qad^AB zEyr+JbK^mtZqaXwABLnUf^3rN<||YW-D-@AvuM}5tX5o}6;iv)m^CvJ(Kov~gyxWE zdDX9}_N&`8QwDVf!hNUe(`@SI3#S;eN|e?(HDAANa}}8ZrcQrGhp3~&T}LUqy5u_R zZZ!X$@Bcs5RgMbfU8}x+fqu!jF{`Tu{kzJ-NVs&67Iqy99lZNv(d31ie)tyZ2EpuZ z;pM*#tFEgPzL)9h8n9ZK%R%dC{^tqp>zm#JY7YASe?r6IA-Db=r0AQC;Iil4Pe;Qx zPdnu%a*Y-1=orf7D?`Ud!y5mOF#f%kuXC`9ZDH|%BjG*_?3w9t#s(POT7G2q!$k^_ z^RmZx!hz?5@BY6Ao*~HqIt9{*v+16cZPsky6UXMEntNko+uP$)1Ic*t#jNf6&Tu-8 zF5@%f@EqzYC!=iUHAl#1UK0d@I(l}U2nz4$XQ*YttjBEIryM&*c z1OFi^vnF2ST}8lA`sG!{pdQE0*iJz z{VILU)+p6>j$SJx#6Xh;Wf7}eAqbI$dkrtr4%f=<%EC^*$bv3Fe8V#FV{ei`v34bg zOi?k|;*E>zN(F!#Q+X=|%L8n^X*$*ir2j}TlXq(hx4arSq@gur6`)E16sGsIsrC`R z<}XnK6KMDIdFm>XB8f)}_`5Vus73gWI!8H|atefw8u-|kjqrYQ3CPU0$pfFd?Y-5| z7b`W?fw0LtPveHc3<}AKQQ-c#Hy-`@0dKK{s>;;dNM&l_7{jVA8(m^rhCcK%i!Cgm zwb6xKdS=Q5-CRo((O-dB8lJ!O3{Dn~@3~|oyEk-j+V9F``?j(3r|%CJR`ZYgnPFEr zn%CC3>}k%9aK$M_$g=*0Wcq3&K;F4=@0T**PNsi0fyp+RcDJ5UM$yVM<#1Iy8}np7 zzcE?%lhJP`-N=b^_Wwp7I>_8L9$RxY&-;(h1u;D^nK#tU73Iqa z&`&1C4NAdJCdHjf!A~Ydt5WcjNwG~S_?gGndre}OqIY>M|DYByk2Jd`V=v1_X@tn> z2Xz}qrTKo*;*+bGZ>3WJ{@j6A6W$vzjq8m$koP`K@1(r4q=D{>Yqj!pTuUndpX`F- zXKaIl`>Y6pjop|wb~!OvUkq3qWDr1k%e1erLxN-YXwU~nqii~U%!o8=2ifc&*(}!4 zjt)fK;QXNW^s^2NX1P}X-^`s0d{ou7{}VF7@Q5>0p`{iy*3gR$C@s=TBQ*nqPH?cO zSdtPgZLFoO^-m?SRw)H1QOCnrE%sJxZ)>mi)?V$kmexnHH31|6Uw|*fS9~YN2P#6a z*!;i0wa=NEgn(9i+ndiPbI#fC$J%SJwf0(TqvLtG)noR9&0rf;1DqPc!n?Ct2iY3@ z^J!LN&UElG-NckGK17O)x|gYKSs5@a_0aTH<9KUZHs1ekTPEoK$ZOM&Xd zo3>qN_iJv6bDYS2p6*{{^yg&l6_4u0E5W*>Du1D@iy?9%KXkegk)LS9EP3>Y9lTP@ zPda&a%D*$m>h7E!{lBsjjdG4%y^dZ@;{nQ=Z{B>`saQAPQNEO3 z23F0|NSB&n*1GxCnR(XDlaEFz0oK3sHKst*|0j3wQn{UINYpr zQJ*BGZ{MtL2`PYi;jjg#;5jh+?g?3>-VM65*BY8CXeZ&u;iA_Dtn1v>j? zs~Z(%|7i_3`({Xq8Q2b+)iD8P-~6Eta1S?VqGXmRdOcCpHK2X7?i|(d$x3gjJ>7V- zY>~AyT^N-!>e7cqXYGOKV!ijon>zvvXS6D^mVh6+Yrlf->*$#qvm;D@YY`UCZHu_R z5$ops#J~D8DipGA7V4|MjUWASDW5q%pR_r7sF@d<>GbzV+a)anjGOy*@rbA3r6&@T zU5lE|Rx>>#v-J`U!o`*Iz-O33ZLH)$N~W|9Xe%e=Pfv>3_^5s`H^A znEuDlX$#sG-_;{sx{w(1-ad~)H5T;u{rurS(+KgoymI0&zI;Ykah#)q~H!cTVL z@#)f{Uc!e~JIWp3<#jgiRM&15lwPHj{WYd@{?0+(rQf8l&fFG1ca$ZoUER6)*#oqCrhe!IVVB6{bB@!#d>??*F8WMc zD<_!RKDm8J7sP5uuERtTl0%V{N3!>w~j?i5S6hV;Uh*~e)+J1b4G-Z7}LbdqG7aU%&SC)$Ki<`9asm+ z{L&Nf(n=>!kFIbMpy<^S{m9}UHz@-5d}SxW3;xqVPtukVAs+L(sy+0pp&cFtLxr18 z8fG}ex5r&rmQ0_!#ka?8jM5alu_JuA=}k6BU(7Za+F^#eJTKQ`?mR_%Dob!a9|POu zHXekl8of&a=n=Y|I zzShwJk*l>qHowwv8hx429XIeBIgCY+tUxYaYcmSP1UD>I$zGj!*CdaGR;#r!2+w8f zs`VTkNY2asSW*dzo&Xc@bmO0S8~Nui!JUSqevMJ9v1=F2aOS+)A_H??T{uibR$1d< zd_1)d(2k_E9qVO%ft2-B?R zcn>!f?m)(NA%32LjIuRzCh8hK%_@RgWbjLL4}m_1^>g3UIN*ev5XAlBwh;4Uuo{k@ zMK*CsTqr`emT>bqATT~B-%@MC5cG{p23(h-LEoa*x2~t8+iPA*pQ5dS9q?u+!@R-C z!Xhh&6Q_|H;hx?o_e_n}lVQ2qpWhY12wrO=NQ6lNNpXX)qLQvODFrX9B31~eAQNeD zgPj6!Llf_Axi=XC!#cl{fi@)p9a!j4(9TMA5MRrA zTMd@ICRnzEkZ}~jEXnzw>4LapV%<6cKZ5b^{lrr%M+Y#8q?1S8trQ~JCC3C5)S6Ay zK_VS$kPNvh`dfGubueKkW;&&@y2SnB!%o1G)WFr=VM9i!^fd$`&NXd}-bBBGH8EZz zt4Kx%grqs6C?nk~0FDHxploy`5;oS+T0){HZX=;NN=*)?O`0jv?;!n~L{PhCjS%q^ zXpplWqcP1zb{1K{I=vakuPmUOzX7h~-Oa3qW@LCSV9JXRK)$6h0X_gl0|1IT018JP zOp?L@5>Eq80s?^Yp)~44Y1E*!YX|adXLtM-d#~9Yzsw7jN3vjSSHI9eyYGc(%7=Tq z5r^-UKKz@~s&WQq&k^71(;+y;n9&Vc0#oV8Dq8?71Y1)ySMEYpd6`=nK>b90XHBZ( zAOZQv&#GhvC0;NYV%jb z*1&!9D^xPBLH40 z>e<;GDka2nz@*ZZf*K`Vv2$B7_O|3oD9o0Xj_8AAQe%kgyscKcje=D)J8Kq%__1S1 zNCl-P96lddL^&gSZrnm5&g1L|Rvi?vg5|Xx&5>LSfFu+@n=qX`KH?{WOCVn0?cy~V zBx5pa9`%!Gm96C)$DwY)lEN0Ezq-_7trFj+Ut?nS)c!JM_}v_{5Wx_v73NYi`VD#( zIa6+o73m*mhx2n{MB`dFQF9eNQ5il3MpH2{nnj7``xK6V zr@6kAimx5szQMt!8vdYH{T4gO)Cr>IhrdYo@HLH zWMikE%!?HkAMY&P0C+AIY$Hj>hV`U2AEFP9raga zG+2?*>~hMkBU__gax-X_(ywYKhx+*T(T@7aoCNj3S=?+8AGXkH0mR5G8BDv85BN>9 zzRL_h5|doBk3NKyaqq5VX2dbc%;v@%p znb}8EptFxoW`_TnmU1I$zI`;ubL+GA(EafbM5#IMAy42t zuzf_%f7Q>4&hD&UPqFH^>Uf0C%qQ`m}NwJ&A9 zV2FS1`0v@o5O~!r9_eDG6F=<&uW%`S`-@{;;Qig=+lwPEqPG1i|U^5{u={sW=GBk)usxG_00Jc3Nxoc4@R$AKwE&9x_kIv>ykZlz9j=C*OZ=f zf!?EOOV$U#o&PDFV9fHc9FjesByrCFl!E*DpV~;!yZfJ-sI`s0gKpOhA6|U?XW2lS zD#bkR#sAd7iaWgczJFti!Jxt!@;`O5?|M^?|8z1HkDuFUX};E=@sQmT}Yj|m}2K7*_n118Xnb* zXPsy~>(wMPo^_#P3j`^;&h@PB6Y3&TJdHBKbETvlt(&BsyLciYjkg3#kf&ANg+oD~eSMoo2JCCQ zW6}b5Bz>LWK!Iv2GgZ@T$V7cp&ztPpz9FgAb!=#l_Ulx{d8UGdkXI@?pcb1q13F=? zUQTY_tKdBAL=lS5fKL_7t~DyAPKaHh9qQz%mK-(txjK=Fo?f(_81Wj#(-p%}b;GEh z#tYO}K>^Reqe?&>SVy{c&|Al-p2h$NjOtqSSg2*6V?cc1gr&bLA?TJBK0O|}+DHmQ zuJsv;$PLD!5@J+_4dpp%A|X=`KhllmlH<)F3NCaT{fZBk>683T4K#8mk=7DH>PAZA z?khRC(;vuSl=+Snf5Kwx#M>D}Sw2W#xq*+AmIQgJ)J+&;Yj)MH5NK|&MWnc6rfrLI zQIS`SRK~?PO1z>e3?|I1B4iO&!b(7=Y+P;3QgnFp=Tr z|1`dF-vC1DV3r4PwG+&8G??XRFw45CJi8Fhim{mB{LpaH4qaG zYa#7?8NLDk04gD}GXkikT$lxFLUe_bgX{uZ41Q{}3hN+*65W~t-$~lSm}zLNNfc%w zxz;YXiL@-bHKEL=SFEHz#TudTahf_fFY#Q_+0tN)n!m5;LNS9?j1?M-;kl)k9)b2D ze4wGCXz3%zY8~xzd|NO+|C9x#76y>(1TAoHZUsec1$B+4qsE#^A&JgS*nGI*){!5l z(bAlZ5T0{l)yZxqhONV%?j~{=H|^3U0Sx#p@oPB3IH=lt!1%RdRkKfjRvW8ZpLutG zRvVl@D^ruq_h&U?V18{wmS59)t+os6^Z7M}=J+-16bF0iWZ)Lw_&3;h&N-l0P$HRa z$|Od~j5DeRu5Bq9hz!UcxVCEu5!WWlNL*VB&#qtlZmdoN{%x1{1l-8huVq~s8UMD&`F!B-s2G49@Xu)5Nb$Ee12O^q7X> z3GcXZp1C?nM{!JmpQ?#dOkHBhr@S|%AH6UA3iCge)34ApkY96=)0+^ylu6Zu%`|eA zW3?l{G|dGx>dLCUo`koR3!RC*S;))|DOb}|yWK*LuB#IDXO_?R?){Sn#rL=LFQjALX%`Y@@bH@!0 zu*}zmkC5mlYTt{7==G=I8CNn4mS`}P z3eVw$ug9~k-Mi|qJan>agPqh@0l^_u~_D0Hy|wxNM^=vH0<%Jq$_gU z1E)%+KjtneSslw%;jG4M_d=<3=!e~<&UP-80$YYIvNW4kH?M9S7E=;WNg^@4TA77i z|5TJ!`0izqYS3O&ZCb72!5dY$d7cf<6N^5J!~J73@q>D2R3PoYby|Yv3`JI%V&l80 zJFKQm<8Hc?c(>3+6wup3{>BH3-m31sC*1r8hz$8GnyodEkRPimErc5FUuA|nCz{e2 zDqW-TE3-dV38U%!`e$ShYvTSxzTkmKYj5bdqdXWVcSx1(}pli zr%iADTq^EcUideP2TA4Yr%=B0ud)yS?YaG_;cx~^I&dfK;V{3u+%ut)uNG&+hg*FO zo*$%FeCpuO=B%&esm0Y^m)*@64_{wqYCitI%JBbpzT@;|i0b@Ro#Fre0TyuYt%k=- z7ZL+rJyDNL>Dfo?t8|h38sSn-Eek2|3>SE?0@LWVDMRt)u9TBp+yR!dcm!W<#cxoS z+YLtX4I`#PuCl0k{Nn6fo5CDkCEBB`U#W82pVc33N(hE9?xp853^}(l?Vaf_3<`F0 z`VW52^G}GlZ=$&;q?ysvXo|s+fWTM4`*nUFKT~4PbE-NnJz_+dh=P7 z>M0IiG)do?k-r(UQl*+ie+}i#kVaBpB?8r$G!x zMjn3X5OxS?;x)0_jN#nwYk*e#J{ zD<2J~Do|(vJ;UEz81pvu?eqI>EVVGj8yau!Ke45!9AXUFn5X~ECO8&M@C1K?<($3W z1Shf+9Lz6$H~0ffi**o&wn?_jX_#d5)9SlywMiEIiTm{v?3vr7l}h@4a%+^{f7P1F z_m(?5ce{hR`+rC>nY-#tXlcx21KXox^yfVn?yh+G(;idyp9i}sTk^GGT9er+`{cV% zS06<$k~OWx3z)e7UMW$b8+2L~w8OWu^ZE=4!JuGWo z^Yc#>q%EX%S7h1Ky+0@@`2Nt|^~=^5EQKO$1y)s|Ck4%$=x7%(ObvY6n5z^=ydcB8j7es!A}`!G;=P7rJCs~@B_;6#bAjJ?9NvGqd{4Q28(rL2-Z1X(r+l>)FXY#8c;DoW z-VwH(H;^K45BqOaTJ$L@Z7Xgk#N>FH;*av0mHe5##6k^|_@DVwMn?qkXfRgcaTrZv zNL0o0n_4pz-HmxI1fX@v?;K1e#-V0-S`RYx2ROLteDY5)NgTQr*M3;$m*d)r;24P$ zozrx@UHb57P$Z@m(oxi*QSBRY@q&UM(uk-hzmAbr&Tv~e=JnAkNYEemcrPzJq zqvk8E`Ch@o^1*p5E1fx6A(*D>l5M9H8cm7w)$VJa5y;fT=n(C0GD*o=k8xPo#{wdO z{li?lesbB%=Q6BF`H(Rty_W*sas-|$lWAx8APa^T5}EgO6AId`Vh{ULMp-a$7iYEi zkP|dI3x=&+9^dtsk;Yn@Q4}NDWOfX^EH9s^@(wrNjqfY$K#P|f16u=Ubx4TQ>uCIV zKni2=Ac!|B47*s50D*mjB&Pv4V7h`%Z^ zRT@nxkIYvKseU$3+VQjU2rrt|8#KO3nlewNym&V9ysXfCk@z}OgCh<8BCi8f^|lyi zCOqUro5zji+WGY6t59B1em&)zvWfI?<4ucjwtA@Z0y*Z116(Ve;xiSQ=JSk6>p7yK z+ornCbLC>Sj9&ff2%QAt%SUCpdwv(|4VC!any1VcLa=0sibo`gWS1UpyK}&nu?HZ| z49}&F>N4=V6WGJ*qSZDjyKp`^^yT~nX6d|DD(s{-qwHs(2{{NdOIsQW>7BBkBQK$5g}s^g7ZqdW zJWml{F(u);q0(2Dbwuqp3ZX!0E1(^0g_xR&d8ib>iOM=Q?m=%`!*k8k(_1w5dA)N( zk*P(TK2!(4IvuM;0wHIEsNmPU?UyM3mUR}15k~ZTJ>lkCKy18D`0(NTGqd+B`fjq~ zwHXypGtL*qJUnDcV_6r5aqm4vTKji$E(@c*9{FiaavYW`I!3PDXswW*P;NXQKu7v< zTKF`zZsh;r@VK2yD=!tZ$@sS2_%`9E695IkEC3x}X`XXeX?K&>fTrsX-1<5rm@UkC z_?GF3@}i@;)$W%OgQ%2{Duc8_n3t!ihV#67srz1OrW`4Ym1*n$i4RxJh?EP}<11B1T(Icz(RW?-iz}rSlaVAAt^og{Rktn}V*b zI3;#EQWeM;Y=)0H`j~L@o$RpmCYa%su9%1ym^b)l4OfqLGkt@v*s{vzmENV6D}opA z3jbxr&-|CGuXA~vor5|$TQxZtLfyZduayphh!X-&nVywQ0mdutV#`llLU9rIW!6BE zm6ru^M=5Sp5O=ilT^YpHD6TAsi!1J$Ag)Srp&%})I2$pwvy6cka0or0$?qI_?82ql z0)9DW<9D%Bh>w>q*6QNI5k1^dyWZ-`8w|4l)AnZk=IqbOTILH_CCw-ycasBCNQk!& zLmj6=7{i^)Bl2|e*rYC7h|DRU1MJ8n!bbi@XtWUO!w*^}ffX*|bHk@L1h=g)Vp<1ka&}_@O8t$+VzrJU{@jolxb?Rd zi#0g$=Z07yIg&Lg(%Mj7n;TUmXt!JGG`~VjioM?2&ZpKzYNG2BpJ!U^?}At$#NV1M zZ<)pVo0Gq$iD)Xn!{L|ZZWY?D!-!m0zSM=E369gkTgO zZ`YOI=)c`)s$q)#L-}of7?*I`o;IY|0HFAoL&f&HJb2dXMXu%28HUx4Xm0MC%3CbTN>?$456!UmWeVPA1z+Qm5Rfe#Uq>$1NF^)IrM0!bZyuaOX;NL1$W!n{a<8HW&^HbE%FZm9rd`Jt-jI_H=(AuFEf$NcvNj zU#trnXJx2??%R;L-J@F@KnKgzSQ3?BJ3)i(rFmQPkw7X`<&msXe?N5-Oz7#hqs7aa zS+bWaVV!Mt!Q>EHMLtn8N>O9)3<>Y_k8t|ISQ^BFfa-$1Zh`cFDURLGFq3@Y^5twy z<40{FFUF&=vAg;C6#ue2HTzO$Sz0ZHYKljNtrb1udz9J8bixu;S^V*XWxrBDv1l zOrVeEl!cq8qJ(2(<<>i^+pSN=Orw8Y`BGc1448)6kSfDfr+&DLlXIkl&`{RkfY_s{ zBiJR~4it4ZtCrWMe^o#pIASSBT4+b|t=BCzn@%2SG2dbX@&NS?#b!wh?MP9(5|J0$ zA?V1F7Ml0ys&Q@)B3AI?Z(mHMz#+QI-=T;F(xd+NMXW$4>hHwPSp?Am`QZ})QJ( zx9I*bNn`$Fv_#Q2mS01n1cqwAA1P1$T)Tx;Y*CJ+~ZJ7j598W8Z1+6O?AwyNBRfH$y{Z zy_?l6co#K|Lh zaZ*fP0*UK5CyFJc$%L~iMiNhzA_=Gr>~6E?9pwvoa#*x%tt7^FOPsUeT_nyYa;SdJ zUmWu!W{cdgl$woNIG-0Z$n&}!SMfM!F+Ua0h-ER+*K64L;L*H>dy<{dODNu?>NO84 z5e|l4kUZUqyKn;jnnES+8sW6dCG+|(DVY0GlrcX)5KO}Pk~J`@21d^p0~xi}b^R=N z>d{Z1T+*&R^vTngsZZcdGn0L#kA~mA_4_XE>bckytibq5v;F$+y~vba1ZH>8IC@ClCkuLqP3+%P8;trQ`hzs1X zqlgo<-x21{*B<5#SruU_A8kP$r+t)HUFAht(=1zYy$ab=pT6qkQ|87r%j5pcoPs&I zzgTC&-(kDdzTz?*-T$Spt`rkiyv5` z%T8xzLYJhIqe^B~wl3}{>dl1SQAx4N)r;2(re;e;z040yQu3(GXm0N9O%fL&Rk-=* zv;;5ga!1!4((7}{%!FYygYymDlY6P0G-Qta*bFWHsc-Cxpbq(}uiq5Y709698JW-^ z@3`Hu)apUi^&4kohKJ%sYpUzl$BVexIOKs#A|qDlH@PCDN8AhHP+cL>_=*r&NUo0& zN*Yai1g(#wIsNW=`{%N;Nuu!dx%*H z#Zqer72RFkdw-&SQzrD$M7?C^xfbX{V?h7*)|ha!>^r(@0IOu>JK;;ezzgNY?tlU;goc^EU5VpItJ;2y6ZqH)uExhWc ziTPX@Z#X-Vx1RE__o3j^zYBk_mc7z!A@LmkK7CL8-Ic@Nn~F{1H0Gi0B|aXXPU8%T zADNHDClCq}KjX4@pDvp#uyz164vmAm!gKEy>I%;_#0?hL*n_#<6tM7_K_7)XW9}2tBVwm#8V7|>whX_ zXddPK(5PyM?X&e*Qa55g!pC;2C~;+w*Nt7a;yp?ZH&4-4@FqKexV4>cl!#o9Ob;dM z*Z5^jciU=yduD0ZxYO+#e|DS3*rVQXn?^t{+I|tU4dW7$#Bw{vhe#NpnH_|@Nf;1xvfX!}6C}^(_Xp7d&E0z$I&xWiZ1Yf4)TI9d z?eTY#57ZnVBf2G)BPAFv##4JjFk~Vu_E?$O;SGjJTg&zs+r}Ql*WYN~b3ghaue@&e1!On2ebH8S zc*D(KVb9SZ$GES){_di?Qg^ZYtPLfuv`xamIDeTYidsP^ez5ILS&R~HuFLIGV18{- z>{8kkY?q3i`sF^_YVecZ+T48>x?3^w)e&5A-5EaYT+YT1t3vVO!KCaZYEBvrSNzq{ z5(7;OnY-90knVEwa9H9ter8`!8myOy9!kP*jv`Vr_wz~!s+(!Q(}ol9rBVEF&|8Nd zi4L_ny0&W^>;CFYJx!NykTS_zCyF8F45daV=8>6F<&`a0@U+oVOi{Zf;`v(b@8vi}yK8du^X=VJ(l#CxA&76~CwS~eAqJlc^;83$U9WXx< z-?WqV&BW@!AbJv|MyE+V#`(SIiTz2Gfs@DJM6u4KH>UffFZ4^`Uw|&-!I0k*OHeI{ zEF5myXUJYqZ;)f$SBa~g@a;F*F^EQV8JVfGq{y^w^z<%iBfO-ZaKoYWA3m+9ncFpf zAztl#Vw$8@a!#c2mBMv|*(c;_>EaO5PKZImlO|cw4aVFL=I)Pm8bpk-#=7nqswAeC zv5%^f=(KHwb`z>IEM2I(h1j+H>kj5R^vUX^%BJI`x^|@?3&3dR7jhfPd6l`+l<4Oq zwYL`Cp@)@2x0U%0c?gx}TRSDzY$elO#3M%|_%$^{gTeiyM9@mSb~7Lx!novUL_`hJ zqhGZlj*>P~8`21j((AMc1N@o>8ooE;Ah~uzp>}5gSEAp@%n`hvC#cFBYo@e{NH@BV ztG#_jw^Jcc=a25o4B)$tuEvq^i_X;WP7~m2yyajBHCf%ETZ{6Hw5k|kKDPH6;!Suv zx#lG!D@;>{!D9vlzU?HAo+m{YT}{f3fe!3vb`YXfsL{n6uSPdW{iVl=yGwBK^D6kObWIQxo!J=+)ts8ce#$a)1q#Oc}>T+I`g9J1XMR;bOWGVMEA` zk#}DrlWY!UhtPX6R`EchZJiCIKb{raGShmicRs3td#t*mr?aZ>18_J_`2Qm4Yshc&pbJ7H{ zKj>aar00{m$QX3hB1c7UfafTnWI0(ErRt=#nX4#O<1zJj>Ic_ zV9XKV$eM*7U>&U^cxNYV$0M%-ebAu^e zlIAYM$XIt)?h0q_peM*IPp-JXy6rB_Ig6$_M94#0P$y)L{;{6Piq1@otGeE(_Fk%P zTN^B*ClfoLm{sv&Z%bfbIh~mwPA!qp&00C}Qg&Vg34*?}TTLF`rRXVni^;&aomIeI z>cfO>SfoQ6fOfVjE*bV=;z=e6Uv4>=5Ih)i1(MjzSWWR#w@kV;p+dxR+r~{yWOe%) zpSD(Q#}u`sbtV<-8ZAH;r`yyBK^`3Fo|jMbeSF2K@$ zC^czQ^#%;>0*dIIn^inVKb95x1Fbq{WRqcl@OI_X>l}um`DR#5AJAmTFiu#`yRm!} zPu-FttS3>4fkBOpY#9^(aAvrOhT4%syAe462-b#yrhXIjJY`gD(B#kZHdGhgb%K9o zXSMfsGIM$k2oer35(Wc4X4upTI!Nq%s=DGWLk2p1h8pTm?hf#=X&wNK-3I`S9S{JR{46!2^R{Smw@rS0d@%V&&E!qKrrAwAyX@zl z6?tIup}F8pooT4me0K;WcpBkJS+-X*)s}XxORHc(fM7#VXb>S>lKg~41&~0rTCv(@ zce&bE+sgMtdfDXXbKs!8U~CQ&7?0*(=O7`N`2h7Kioi5EumBulMUNDBQUP!C|A2C3N24T53kuF~bKPO+K zi~7E7=cn?5Y-dJ>>Ez#GzM~eLi&p69+a%!7fyr^5Js3uLDIv<(Z6$;jwWNB=mK-6k z4hv(MbK#;M#^j~*>77BcxYw3B+8mD+wN&;jeoBrR7EaHEI4^IXWCi^OH1&gU^YOs1 zkpMcp0gUgZbe^N_%yyR7I?LN65`A`}ZM6`VP-_(k7F7m*QJ&ze2O^+)=hkG!V~L85 zIDDzz)Wv2v5z%C;(`N=%K^th7TgI}A3?JXh{EQFZ7$RXO`$jxj9lmWPGm=DSV znS8+Si7TqDNr;JxGf04?dg4j+k9uG=f=;$mjRtX56vNd z=a?Q!WaM9-ECGjaWo!XJ;Kza9rY?g%wZiW01H>E@`tY|65JctR4biGVr9om}81yO7 z{(wd?b!3(&N4bOS2ceEO6U12ZQ10 znF7I2IS{1p28cpL=zs|jXA2PL>uR-&=`ygm(81#OY2$>SK2f5joez`w04ey)!K4_y zKJX|zrEnw~0AWCg`mk6Bn8eQgqzijwRbILcE^N)!dFgH;tSvPTjI2Kfyetq~`Tm0P^&hI_G)QQ4A|p9@*r;Iz zlO8i7mCvc$?;i?PvMZ7KO$UW>tiNg`Cf;vm*Bgea>&%?jE`4e1JoCZ>3VPQiIQ#)} zX6#<}w}LY6?t8TDqR!TW0%&E5_{BC}+b-(hSDF=pzq*8n!#e8P!{1=`KEMI|)nQp6 z@m!4rb@K&fhWN_pah1E{vC4ecB~rJmQuQR<^tD2@!VcqpYogCBnV&n z8HE=Sz6aFkJwd~m3l+$U?Y%01bv z0<}I_FQgK(Dx9pl9&lNs17v-!Z`Ot{kWFD^TkU7tI=4@aL-1lo0u+^KWy8TV{c?Si z;r0=xgoFn(cb(@ia~X3ZlGDc-`2IkLkCY0pZne6ll-oX6XtwaQ*uaF8e)2>3bk7vu zFb+fP+ovGeOnB8LozLxJTH8_v_4MARLP#K2-!o85T~F|nYYcC>_>*)3HjAIW@yuV+ z+w3>UU7MOn-DdSP92EC17Q_UrquSdr;~VP*Nu3W4%DP7ATV6Wfe_0hMr}RG_DM3N^ zId5z0+k-a!wXL}8;YdLteMr>5ogVWzABLP5XzZ(ykVi|~&yfT=I(9A3gttr}oXAZ6 zJzud^qEdkcMDRHHf=Dm^>>+k70c1;LscB}BxH;kmul^;mkCfRPKNx}Zz57%gv#dq9WC60|DaZI6@pD{at>zLOjpl-XWV)dq;WPJzUETF66ly@2V zV|0|tCr?%kG;p)Hri)<>?SOjs9=WIrIa6qi^r zQPk3T*5ioU9ru1ROg^*gL+895WaNHjJ0rr%U6>id3tVw2ZsoTZH=*Ea(z+X%8 zVV^<`A~WIRuZKZ)Ymyb+NJc-Zk2Jh0@uiBdcvEqisUbx`K`QdxWW`^Je|;izQ?VwI zSy{4_&DK=%6up4B^@__(eR7jaLTC-4E4Nuy!YUIJt*;DH>cknBX=Y?7A34rWnEu~( z?xcTFf#2P&-~IIS108Ke=9cL9%MsE}9=b`J0Tv_^&lwC`b6@um#g*>ds2M)|#YP3* z-#v-<*W?y9GV)jJ01J#wx*jAW(mFf1Y41J+_R4%KbWS`E>dSbo$jEd3#CMRG=Cqx| z?(jFcl8sFLF*Stea=GT=t&N24>OPd$*Bgg2fp7EQ(|rIXO7_{(`Q-QZQ&KZ%J7SYA zaE?s=qHEwL<$c}Sx2y3$BE}ZGD#ui-eP+H^`)2o{lw(4y&L0J3ZBybccUfn~jCSpN z^c<>>jNEa5iTS&YjNHZ>&3aU|Z0as2QUVBCtY#t{sb#04tCYT`^C*?9W8%e zWg3L^vPD17>E{*wZ03gpt62C%JHy(cu*c4r5k5;v>~_b<jV@u9c`MVV5OEI&O$7qYp;?oAiRa?!X%7TA{Qk3dt7;QDa+)n zr1y+?_^d4?*rG3C{(}_KNqcau952T{a4xdwnkN-1QE@jhuaLfzz_WDv`8)wS$wLq~ z_f-PVU{TiSY*QBSwJn6cpq3nK=cOlToi5ouBRqGVdIXsf{S3)<-bl}*UnFm2l;4(` z$JPF^C$3>Hha(`yt~G7d+g6Q-6c2{iPPSlZ zk)M6We={(PUiVpjhMOOE##W#<@?oELu@IZq`oW+8Neq^1BSAc`y-@rQ*logb=n5#& z$dksnZDGuBTl{Td_uWI;zD%a6TaWLpZtWP<`H`6RGz$a|4!JR0px{ZHtG)X=|5^om zv3b&ZL!tjeB{*g%Or(17OnZ!dHNKNMZxDLxo4dn8sdrcO!S{^jY7G(tq91|Ec$6O2 z{-8W@rGu7Q(+-b@E+je<&j2zt@n(Lb{AP|5j&B*TfU(&EoSsp(1OaZg1hR`<*t7op z>?K5JvxBH|**U#@PYuusRJMfS`6Xz3ORWx}BA=+dFMR3C(3!!s&8mO7y7Jy1)G>HJ zekm+}WCIV?VXmj_DQA6BoJDTL*i3)er?TGG-qn=3WMxnX3s}eYr>(R38-csCq^FxS z1wv~#079A4kN&rIrn{ND19$@fB0QAGC)_eqi=H3DKpq)?)|wQG=*cgxff6jmh*X4H~umrr^5 z%eJ$($j7^;jzbQ@?OcnOns!Zye75s$USYnln^cw?AX`3F+4syNgCH_+XdDgaC;$Aw z$zAF%07}s>g!0oLGhli(1-OaoCo&gwdc=d@9n9||iw^Nm*Lw{-Z+B{hOsrgrZ+|9Ue~w6kdpq3&gKBL1?yc|H8)qs|qjx2g5*QiK6>u+f^t|A+Z!C%(V?q(psd zmcN_=5onxoJ+mHJZrmN4%zfSCEtO+1{WK&Pez8TuVZxYMMhj#VM>gLEZUc8*ceLh4 z0$3W$k*Ayxjc2cj9=rWLG_P%6&2!8rEm*gg=7rR}bz(pBng{#Ie(Gx+F-*}j*f#%_ zV-*=&d#jO7R~+Gk@ynV-8!7HS*SJ9wjKB9^I9wZjYex;&hySIc1w>s@=?@d9X9nwX zu^^~Isu4Xl^sgNzX`M^B6a6A<^svChL0D~x5<yS8)0HFtM@^=V8VcT8ESl9p6gx3zQ}qw-fske;kqYi z`qH38@9JbGWco6G`QEZJ7*dE1xw=oswt34&@STor_m+*ammY7~XnWb+_`s~nyS_iF z+PimV<_=@+XJ-D8Qgf@J(0`SzM`SWHbHxn`p-w$c@GrQUwu1iU>UI*vl+>@k=sb*wUibodRtA7 zlc>a}Re1U8SM7+~$y4B+ov4KuCzs(RkknvA-a&psoV-VA%Zy%kvM(t|05yGl>FJ}Y(U{h1J0Le zxalG*;{1+T>G~~Lj3QvURL9k`(u+1$d+jmr!Rm_jv(o3c&+=Z^pw-Oqb|=zvIC`b9 z<~8Bw3n(wotwIZD;R<#GPUc~G6clG<0&AkNi18fgNa!0S`_R;)yvxS zwTb)D$Pll5KD>MloI?`Dl=(7RTcG2wh0;?wxBFx9@J%yTNMN=a62) zAzouu+*rPpC+9B9)(RwIr=I59w>gbi9ZN3oZr5mdH>>$GK8^YchmuGPk)CL=*trsi zk2+C7J{`aK4(r7XFH{~!OnD8Z>Lg8L4#oFL{<&x;++c2w4t<`Xk^$`C$C z{Vmje46^0l?mw*HoZ%R{6JCHMu^V4Xg`8$wCSo7@8^ir`h849;Ros&9?!kC-CS|3y zw*gYJdR*rlQwM{eT{~j876#4h{#f|%kr)1t$R6%QB2(kgHtUJbdK2Es@XMa&Q71?x z-UV_9oi3c!{9MCO?}B@DV{kfDjyHQ!a1uC1U-8P8h7k$x_;H;-pvt_eycO1{w;Q+y z%@d$>{tssGo~Ka2Wb&LpmlRBTMFMcmy6ms#SMF*YUb)i1rRn)Xjq5`*KD~qc>l0J# zP_1$3ZRMoxii0stn`qfCjY~s0Pf%&YXr7E?xJmae^Ik$&2~UQpF+xcQVE_BkQZQ~I zsTs?Zs+yjO7yONn^(-&%oh0YT4Dh`5g!EL`^9Bw58q)DDcBImAztzaqw!axZaTBMW zm-bK(?j@4m+l*VsGNJw>FM;bL{WHSXGn#fZd@@Q0S+~xx$BUZ77cwwVr$M@tM#888Wv-5Z-SynM;0lbMvd&xG}{ zzh-~e%(GLt^_)z{2W^Q}4liH)e8MY&PUxLIKLFAxq4LJk#FQJ9A>8~hJ=_nPe0^&JJz3OpcqSDnw#=H^bBshiyiu%T8Lm{`nMbfH^+2g=yWt|^= zl=Nw9R-(D3any{aUarg%{66)$!3DQfP;b|B{9wE~WqkRP6S)RdJxgX*b`+}0w-WXD zC)}}VqR7GZ8BYioU2Q#WJ0X4JK@#WtT~91qr&a*ogSW*hk1k)_;yo0bGNOFR@er)1 zZA0edCv>vAj19AMA8-xxT(RWiZ%JxDy2GR-n%Nz;9Ad<8*HUs)luYY^b2cql6lu z(^}gll0|Gkj^})yWu2GyfYSHySK{s?`_H#Iul^5yg00z}(l22j4j$>!iNv7s64fJ9`o@F$DxKuMnq10LUCK|m zz&q`$xbq2RD8AgqeaOYFad8h4*H-*{ew}xVExZXaQ*tc{+loKN?=S_l6_4PxgaN0l zuc=5((AN0+0Qf3lzb;#PdpjUg(0EwFE9{+J0<;~nE~Ox-IO+TlJZZCwD7n}ovWfuy zD49Nxc|i%^^0p+Dk9JlM7i^g~-$2J;-Rrh6zRrlnZvU!Ur-iXpfZk>f4hbr#0?x}= zC|9|}pR>f@^Ajh$2Rdhyp8D-XhUS@q&TY8)D9G~(6F#D}`ud>-iw{MC{y;^`%heWm$q^ z+N#P`Z0eUSKDrhR-^7NBX80+{|r$H<)+Q?Js+JE(r54p)9CR~{cWjoeg*df zjXE;VvHJ}JqkW9zvq{LK#y#e{#{&0Q=pN^~$5K7eCNRhkro{A1rOSm$lI$+#fDk4^ zKVy8v^vAs2od^C|5P;o>vS(HZtOWMZ6w}9f7aM&tG?DS!(SYVtX5|Q1p^ap73%y`y z_e&4(%jm&Y@(n6drCrtzf#VInor6)_ID`tkl$eT2PRq?rbU5A$ z1595DOzjGP_o!s1bn*Z6VB6Z1j-0$-L3L4UZ-;4EcOP&Y6h}e#@Y_b|QG8n&k3@Y> zqV=_+@J(-fsnbkDj`A)%E_uY3|acl1+ zTR}JK+o8rGe$MU%sh&Z(uP>!~2Isz#o=qf+{<>G#9d9oszfc24NlV!$KU>U&6*oPC zt)58uvd)7a0b%$6!=fAN_QK`ViSw$k=Lskhsg7;&w0USFseo!A5DDLOe4{2Hw-o@ise~GlGFio9i z87!61={4La{^~T~FZ%zl z@(lii^!gUZQwEVEc%D-p!M+ZVc3h{AZQyM?=x4PD5845YS1v3+`@^ZUEpj^NvmvdqZ0Zs_Utnl7oTW9KYd?L%P};8s0Os;(dM zV_?}gy!$)@(td$o>kG10LicQM`6WxO3T}rq01e;dVm@PV8hnj2a1Fi=bWnRh%==pq zv>)~~9W-akN&!K*>1fuSrdn2V=f>$@Tt8JiswOg)i^~_xs-H5$d$oaeo-B`dcHWJ1 zE6)>P0bfF8raS;y5^hT9%R8||DB`P0imdk9s*9E`6aZCjT=a#Q=ici*jY-975O1ug zEmnzH=y7e6HpeS^xbe7!Vt+?Ll6A!ll!ss3IcTidM+4{d!t#`76UG8lGpaqzDXDQ$ z-1ElqorI67uD>6)y1M8RSNEnxUyOMd*n6M4-$V7WA{5hU!P4?<3sTpr`ggc!1$Qls zn;VU4Z%DOwnX7NZIaOS*f-QZba`icrz1J(=h*feM$8kHGcQkwgWfpaxK~y)nTX@oD zbzA-IJdj#Y7K(eX&hU21pia!0yd*Zg1Ji}is~O%i@hK~`1-ttf0L7et7w?AAM0kdR zlVPpJXpLqPw~?#~&5XL>oefTVWu$C= zrO`)=Grar4H?R49K?ECr(GQ41~s8U%NVb0Kl{F3 zPeT!(a;=R>v#z3#v&L=IAlQ~IE>9FN$T1JcVgEtjJWtybl2aAqrFJW>q9rc5#*9y| zziQ_$Xggs@OgwG^I9eE(Ip_zG*a_b%Hl%ub8xA43PMJ`xmO@PhzH#)dZ2j)w1oEbv zAuJOR6+3lXGBL9So|t>J*hkE}Pbs5d(%CbbP`yM`;m2!{wWPRgrm%4sj|8)OFwM|@ z>0N%=zcX+MGqi#9ZUD-KkYM@L&~VeA=oaFQb9y&;D+E{GY8p1td${4#tR8$mwEOEx zP@F*f!dk>)XUhGN?kpbOQo>85oY#UaGcn+aR(yz1+N;cZa={Rojjv zPcF1+Yn$^dEmpyAcA=x0J@=?|@#lP8g*P7H3eZ|DNn6Xihj`P<4zpL=>!4c}XoqWv zXGhrPaLQOS%6CHmrF4y2iX~S49pyrs_#|6(4Vmre?u5q@n4T<<5b;x9z(6Dd#Wcf5IktXp9x&D%561|fWT z5cMzLIffah+O<`o6jD2xw?0cYvt+KdH&o#2?xx-v*_GD}Pw`r}F@cZ1LaTL_H&p56 zO)R2X!nOE;Y)ux0l|?Q=YUKt4#|e5Hpozq(4X&NFegk#=l;6O6ReF8{$)L(y3#Dgc zX5G^5u;%KAR?bQf)tKlCGQVNgNLr`XtXFI7?H+p@xLvBcZ@XkwUwc>5lZt2!?ptJ6 zWfoj#>z5jmYvwgBFbT%lmOSBZ>IF}Wy$BI46sRQ{+%Mrc~q&X<`pg<6zcAJukq zBFd4}P^7fzH>x8wcH*uXN3W5q2~eUtSza5YIzxB(Jl@Prr|ZxZofU39bBc9(qU#u) zw>#YYZM=x2p64X!bok1?@QL7VO(@$x8tq_|Uhod|&;!+mhY6G<)DwNZqMv*S2-kEg z$oinRcJkkU{*}NrS}rHd?@Z0h{u5Qp=(kYr7YL(h*jxv;?Yi|)M}6GHQ^LwUmghHj zy2V)f;~U)a9684iDc`@nOs}kU| zNumiIY6ns>;K40r%`-s~n%$o_qm*Mas~P>6mQe!7AbG7jGZpeyQ{yxaH4N3zz-j#& zn2n=}%<7&^RK<4(sXkyM=dsZHv{EaP3LwWUQdR4@Jkt=&DV@}BVWd93JU<^AEz@3nDyKr72Q4`MN8R*OF< z&{77jrSL0&yPgj|(7V;*b&28WKzw-MCMz2{70YiUjH+!)hkExG#m!WxQdR*0LizGth zp-rrAqcah({>sw_lnvWvjyidO&%V@&YkRKMB!5U@<5$o~mGG8+XfB=GOpDC$z>2o6 zsK6RgF*J?K1hhfh-D<+D!n7y=(qsZPKh{K>EzL(Bfg&o3G-#I?G2_!6BF1X(6UoBx z_`QYrP>uHnO?=J>L0YH$&w}#$_lMx_9PL31)m8$nTWD`MygQz!52*Byrs)_E}LRs+m%a^s$LC(g$km zan<-FakcA|-KTx@$^wFpachY9=mARUFB*sl(Jiv)iB6Z+xh6srfJFe*bn)k(#-zaf zzxaT}9-1TMY+C#^W8M%psDyp5n{e}1p_yHn5lEhK>cFp}F__iYL`clr;fF$=albAkh7pyLWHEJqoI_90U$rl4#sUQ72oT-2^oScN zhU;k?Y#%pq*l+Y`7759tibxO$N?sIf6Rnql2oRfZp8%o#j)I`!elOhaK5s`5zEj}_ ze(HmDK-H`X;$Kw!h!oJ}L%eIck+lw)s=-?XA%bb2z_PVVw{jryF1^@;LUG-2)QR5> zsH6eAq44}}7>VDvCrXm*Nzl@4kLYmFVy4CV=C?dMDI`HjGfNNdWisZK^dnzfHyr8W zccW-8-B7sS4WVNi40?6DnTQ~*InBaN@=ju{1-1fcQU^3+M%TC*%XWjfrwszFYtlJc ztr<4_@m{**Xq-n_vPR=PuvZ#K_5S?}CpTMrE*vPG|JAiK&k;e=sL3OO?f@}$wSCwp zg04pbA~bai0V0MZk4PX~76WA1={qm^M9$BC?jxmnen{#5KXV}yc0K0O6kqueCa}2A z_x96n`T4PHA!zLi`t1B6!-8v6q=qa!cOj%c;s)x zuoUF^4oUsjLS9>Um2m3+x)n4ihzdo5H+ZCZJ6tlAy^XY8q^-^-RT)+sNMhbAxs-SU z70E&Rr%69k=~cj5OY3qI1klm|MRW*4johkxflPKGkZqKInA|M0huHH63! z;YOxT`mLHu*?MoWZzpn6j?ypw)St;1+loSpJMe6g+b;$?{`EN=qh$HlcVtTab$|u_ z_5`T^6U7leTwU}K6L)f=Xrs@tu8n&wZYojc7Ec%}BBBINHgo>8Y8N0e|W+4+SY_P z=@6_0cvoH-00Tn6NdpqyDDX4u$;#Kl%YVv*S4%!ISkr$dUrAP`n?^UiUHf6^Z}P_gqUOjg=1oVj`h5$+hzUz z>)lK=Oh|FG3{?+`=-%y(x1b{+uY6#^V$B1-WvDFp8QR=j~&@QzNH>p zA92>}`e+grNN)O=?YHEmYI}E1XzH^OI8PSpp~K>JU=|#AQ)eWQ-)ZA>e1hAtc#y|( zIA^f6*5FD^j%skEH1T_7Zu<9vv=6Blpf@_AGTzE|gqoBjT1d3sSRh}% znQOLS-WG`Q36izewTr2-1wbF^g3sHi)W>0PY!qrXh@Z*tO-^8&<9>|A8K5^>*XoT5 zc#AG&d!vB-iShX#fuEw_uki>X(SuxC`?KOtiAa(BDNzTE4H{>iC8D>_l(0tBR~D`{*LxK%$eF$dff_t$NC`~l@@5la&1^k+1VtA z*atuK^#S;yKC;39KDL?s4I+(z;nQtV@337;Hl&gvquO8*TG`nMc6*p60~d>CK1gmP z0YC$9B&m$s7=+arI9s(_^_Ha+NGP&AOC=aHA#@OkX9pn1wO#ZV&eDSTbcD}mb!KIW zS@f%R5@Yb>i*B=6ScEy)Sx74z>Kos~{isFwr0Lz0ZwnGO~{ys;q=r+(5zzYGc zBiY@LkiBzzd+t+@q4Ek(nQfTe|G4V z-{oMUf-Yqz={++T{dp$q5+s&&Y2GVY=0}`Q?Q4$B@i&va*(w@%wsKuF-pINY^l`7< zv#v33K9epueE;2Z{L`-k{)wYvRwOITWW?EX17yV3HoE;j78;Ba8KKTufEuI#KM%Op zT<>1Un@#5R1FtoompY^`FSS&>)cHevTI}b0qs1mX;qchxn#&y?oB9zyWb6j6tk2S7 zH{a*djX83Oqs0O)%+X>Wq9QwA(g17AF{VMg&9v}e;s?s4qm#GLf$Do6{iQJcqxPY{ zEKKSCFVJ68&_wM+e_em?p7d9?j~&@Q=Fwk4AM@$2AngAV{nfu01JGYVv$y2YUqM)w zRMFHyr~HfQuK{|~pZ*G3zQ@G;@6uncWg4aTMSrQ)2MSpkA@EAjiF^*m7EeHbS%QBI z{dMC8LjwPB`s;R|{<;S&H6Z-*j~a;n@+0;}e_8aul>VXx@lo<#)0h4tI5bMzRsc^~B5OwwH30n;MEz^&FY8iY zl2YRzG_GHlM1KWQd0om8DOvg}NM*hI=h9!+r6PZp2ByEPb$w?`^jFa60lQ}Om!v2&7FChj zg@)jdkiSV1e;XmPTmKzTQ0|0I+)MJDymYBgF-i$=7>S*DE=xbfJW$YU7}|0pJvUfA z%<8L_J`8kXOU#Q&%8U;ayRM+N`~p+9s103U60yQ+kLyIS)~)GK5y_&}-s=AOY#$$; z%{NQF0b0nhMLGH>HgaV|HnA$nj6ms3-r6@R!=B~ak?U}>I8{1p8Culg-8Kf_mo4TFy7jg1TWEtKi9 zojgaUJN1Xc-n$#`>^h4Abw+XqPbn&EW;8>=%$%^vW@hXQOG=>6?d)SSr?VOiWW==( zF|VA=zD_PEgjnV~?@;g7?0k8+yRw^ZG)oB0W8s_D$2b>3H(w-1=n`ZSda=fFncy1h z@HTI*vYCMErcFxhjx;SHuY(FLvpST`vwgrkCgU4^f%4dEs861r0rM2O1}RUVYXl4h z^K<;}c;!0o6JtVVRJMM9x_E1PoZr#VUOEb<$@SGbx|<@nR$U6o9EaQ;ZvL5$LmvA` z|7C-B>4BEb)SGc%Z*r}~_n~1}KRtgM>NqZ~pELHhe%6CJYz7Tj?CcL9Ve4Z;5q0TO zzFIU1YdaOyclnqpYVA6=dXRqz`WPBydi_e&>eFVCEAa*1J6wrwVfked?1}-TvJJ9D z$WoOwmLjZp3CLaJwqzSd8UCtcwK?sLJqxo%$|`nZkDxFvf3Tiz%r7ihjjX$hpgj7g zwH~bx>35#a$)YE7ag{V;k^eDewlvE*Wpwyyvzi+$$c!$z>oOJr@_1XOOy5~x@7HXxsUeHw64RrybuzVp%A=PiS7H|KR>oVHP4Z17moVmPm z>uF~kh69h+V(wRl=~($I`8}1P#oe!rqFg(&r|qE&=*+&_;@11K%(B+|$&4Da_blsO z6Wn*DTf1@t#d?32v9k65hrIQlwDr%{3I=Wgr`j>tle`E;uOU3xG=oi)IUjoiPB=C9 z)4ykPKjyVt^7xl(^hdQvAPgTd6P`K?mWiTGI>qG3(j99~V+J1N{4rV7q615T=-v)3 z!5_EuKeV({mTN} z`n{&R8U`Kaw%S?lv_uhSwHlcd2em#^GHhe`7Pc+dU;E~xit}6^1$@)**0(u&*VE4M zH@J@LC{$Y7XoLyQH3qB|w?>8q&0s~86!ve31^%;|a(pPiEdeNG2Ssfe^iOL`Nq$?3 z1{#;5e@0tk^57z>5-tcs3I77p>w`OJ18t zQy}17uZ38EFn8Tv_g%H zP+ksn;WQI>-(9%3I!*8ae>(x&9OIyzam$@;o zOi>$oW#*_2S0=>>#(M7yC=Q=^(PVzhcz}B20p|74Wg|aMh7VXC5F5ARVa4>XgYoZ2 zbNHP^D}^De<#JJ*2mBt*6Jm0N2Mx(}W&i};_{*-@R0G8@DBOH5Or6kkAO3*j%dr#W zKAo2dYtIH)cp3Ap{|B_Z)cVdKytp-81dN@Lqc5a8rKa9%34CnDhgy@FR-{=qFXNn6Kj89m%)FT(9jP;Bgx^g`0GhOo0I#IC zKQXleRSxzAAhU{Gag-%^+uXlZDyY3r)2vxEPfgMAWt)b(E9R~?uVtpXYNv72l4%)@ z)iV5Y{as^xz+criQwpf%J~V5Q6)-?s0D&G~U@ql|4c1#5HX4m{#5HBT5=~2>tD&P= z{)yT&E0M5Hy}ap<8a2FOMc9hu%0J?|)fz^MxUN~5P+>BS!h*pEOK=Mlm2DeseJGeU zEyw)fkuH&D?g5@1d7~3FgR#`SF%EWA`K+5ZQ^OD&VIt^Y&PcaGC-{l9Tr4x2(UUv$ zd%R`UhAM^a=yY{0dj8A$U9^otG^5dP+2X0sGSDemZi#{B@TosMK1Pq8XAny?`|4`Y zyI^kBdU1Ks$!Be(2i9th7hShiuEj+f^_uhF+6UEMzO9Y6;+zk6^-O$k^yJ;7;$EF> zs{ha2x4=hLU3*VR1_CCY34&4ujcsV70ZDmOFi>a0jGU2)L=BSEfKiZArAl>zSP>H@ z5e|n@5WPaHSFE(9SFP6i2t{i`kc5X2zz2#CRMZ&*ilRJx&G-MWea<|RfVTJE@B8x0 zoX6h#?8n+`ueJ8tYp)#_4aOg_Y~w(^ub_Ce73*RYk2c`mmEix^CMEn`aJ>@zKfV_G zv{J`g7xKUVSn~fQ;e66?%)Du{D7)y1YsIKNh7QImo1qAai2iJcNO%beXM9()02^$r zG7+%ffMX;{$IPj#xq$txhxVXbu}YM$tk|fT#Py~!{gOU%?mbL^MVR{ULXLB zPdpL;jEU{VzXU^>9sD(Ec5n`72hTyxma0@c?HFu)+4B|~Kl|5;jsK%6iH%nS1z_)J z^N$4orYn}6GRl7HKI{_pbd!*G&x z9R6)r$mZWxrT%69y#&R42mk){a~A*3xYpv|%cdNke-l++Car8$v=Wue>J3t;Dhax` zg#-fha(jY*r%Plq|E65BF3!Kzw_uUmzX$)OWC)_ufq!?Xm9Xy4Rg-F=dI|n*RV~54 z?V2h6Ej6?FH>h6M{F^mOf(R;Sv1_rpAs<*L)e|rMAN<4RJgx{=GZi`rQa4|9(B0Gpm;EA_Nrw zw&wH}Sd%z6k|b=~ZT@{C>P!CJU5Ioi{rZTH*C_sd`!5y$KKb(h4gSr}=DCv_`Oq5= z{|^5aI1xm`zwNj0;<{b&Z~I%tzwNj0%Bd^AcYZBstRu8w() zTR-ucpCRZy_!bP8?2Odj*3BWMFHkPVe6I#ZJ;tx$81GEv9St#4<36$d*HQ3t1csic z8z_gzeBGG*wpO-%n`D2kd8Z5U<^uYFGM}LrEA6qZhHnCncomOR;mhFQ zwEsfg+!in<9**342X%&5{IV<>Q*SWCmYcy3gE{tnUE^wJ4y`eZO>eKS zwa4ycc3g;yH5wUrv^G@-}wSYdk04Da4r=STa@!<;3;Un6Eo z!=*dk;9;wWc-ZoN=rOm^!PW_8^@rjq9>@^7b$43zrJ-A2bySxGrdrLCPB-83m>Y49 zwhyR)ma%krV{0Zz^>Cks{;5rvMb<@{-t6wcww}qa>S+(KShON~7K=A0;0$D`iAP*l zCfs%HLO1Xf-}~eqoCXJ7_X_^m4!X`lgEr{PnZF+Py-Md`wqGu(T4XWY;zpbC`FAB; z2E*~_?~pLHgzx(7>u2DtYWlzS&5^h9&Cq}C8!rHbE)^scq%-d&oReK_NkHh&q$i)y z0bcqc(gd$j{a)y+Zoz(`ujprM0kH|*@aFXeX^5T(^(00vJxYN>!L=)}ViM5m3M!gN z4(M;5oe(f`)vzuGeZ`!>TW$uwoEGOenqI$>5>mF z8NKjbH_L-EwE91wY#zl0PyX;GZGPDl>sB8NPKR?bOz789mF?;u@|$Ux_)D1S@~7u8 zv`@%yfWIM`$s=DGl!YJ|b|WagXN-H{T^S6)0}c}5^%tU_yhKzi7apnpohVkGgdGUx zlTsemoU%e5tXI9G)&CZiSIg08K)gTH z_xw1XG~PA4qem?r)2E_ivbzS2%wGMwUUV!j=ku*V8`(`X$w}z{llv>V6wz}Pr*vKC z=#*aU9Nn=)JEuV3YKw0|li9!d9s9S7^z7i@)pFz#LFpQ| zie3GmE0QL}8lvOvmu28}E^GlE-^H?_EEg($9ufvjEs%a9!k8LshSmoVs9#TBYs6F& zs3PgRBQZMcjT5+&bUZeW;obTQ-{Zp_sUP+LCgDT%)l2HDj-PBw{sfUgu@hiJPQC9I zyjluZWFO;>-wud|BB8oXLL#mHO9%#P{6jCbM8PBDcW;4G*_R(jd zVoG8}he0Jca1?px=&78Tq;-4{(OuFH?0!)Tf*iypG+DUrHSSvEwwORV%=YLj2Grk^ zp_`{55@unD@u#=J21hnT(NRfU1GyP{7cHOM3u%9f{+4=ji|e^Hi1KYoaKdRWZm0W2;UsQ_Vf!x_D)iDnT; z!rtC6I8ZMKEb1|d)Pu?=XdRAVZ3lz|pYRQ4peku3{v9X?vPD*V0%mt4qm~FMW!-cv zs0cP*tK}CMLP8&67l#!edm38_b6Zl<+$5rs+@ zphU^Gn1h8Q)rJCe2#l~|ZASx}s~e(ykQu2;7VZi8gG_GiC2@P1j=aw5e-aeRBSbm7 z3Rrz)!%|sXN;T{hDO|406df5|mx+YeU2E~Wf&^x=W{_pNs+&kQFQb<%$z}lA-3gFW zlLqXeP6KwCo-|-r%7E?2@2M5(*VTBHh%U#g#2jP1+S&bg#_Mp5tN3`83==(NNk>WJ zwL4N18@`p+CyPAyjDrHsZtwB&p+hNM-~&>~?leKmF7ctu6dm!Q%S6Y=hc4^Z6+ZAN z05{pJ&QZYwY+ycu^8iH8r0m6WjZ#;_#Vif9Fa^=4J}HODb#^i9H;;HtoIeo_m>*zf zWBHin(O=WV)9g&~G>buw5RUh{KiIxyn_!~C*-c$0BvE;|kaU&voeJ0|hrWe)_NCQx zIsyW4x=c5>w2I5b9Xfy4!24EN3mTiPhY_#%RLGcHt&jna;6cgjrI;o-xW{_OL3o?O z>Mr!#uHg%CnRzdrk-EJ19-$?{OI+*ChyPKSl)3U2Fed9>S8n$hG($N8Op?XmTKn5wha7a$;J2WYO*3#c3hVtkTL7Xq$~1z1Ex z06;~9#J*#YH)4oXbP>ap#EME#ZG}mKCU9aK_TX@n4G2X5EU}4Ju&zMITOV+h+}Zvh z!KEBx0B>3two}5&qZZyY@)db}gwJifSuIH_28;}-&lO_C@upryXWy)HVke@T%aKEc z^GbwScykG(RnEj4Df~S7#Ks$}6I)n^WP*|>t1Rhip%N_+1c~SU#Y(9TEjCbH;1WKO z-(f#o?E?>D1ZhR~H)TLBr1>1#M-fsk?g&3Z5MB{Z$Ask(AkDAgWCqsxKA?-=>;|qU z*wdZZ(+`%@LO_Oq{}GLPAfPJ(GWc@VifFXRdKhz$M}-UwS|J1OG%bAUOh3SO=HB}? z*B3MHc&0=4Y5AbsTS^otP_9(3Z zkv@MwLH{5>fZq}r##ioBxFNm_;erDZACpoDtntDg%3jFt1e1jF{6)Rm*m9SZEBe~% zQyXcVw@Av0>}%D1z*l}|WDoH;^5|Bw(Q=pWk9Tk$!Yt(J%V^XoQBZ~RoBxy?EuzyI zd0vxvanIcuc^Vig8Cr-#>T+192XSWOC2^bqN(s(b*g{Ohm?w>}5lB!;A&{jcBh@*b zc(cc{Pu_)lS5#-jG}Z&?GUod8)x+S6tdIe}GDt$wx*|D;?pGv-=Q4rhyvsTbe7Ts5 ze<|~$6#7GSO3)vo6N!>#=VlY4%VV&eB=(UI5kOyotPuT#L;2oR?@AM*()Ns1+S=0R?8TqMQfIKGcz zLN`uFG)J>Vv`*kFa!4jx2ay_I4G0N~=!AD|Dmr_;+*9%H5h+NR-TjPKImd}sy?jy$ zRt>(UmG2}u6vkJ17_ZwB#0T_mqDo8tSE2lf#;KzWGlhH=&a;?~h*w&w5RZu7iVzSh z#r1?#C5RU1LditSl}fZ|avYuNvWV8n*6igH1W-G!q@GoAsb}z?ppGOKj(FL67_(=z z3K{sk6*AzJ+b#5p%eP)yTz41zyeOP8!5_Z(Tj7d&IAanVpLxj2WQRZ-LdFT%k}U#^ zfwA~5h6d7i;VoUg=;^ys-JOkvv%9o!E$et-9L19O!T(Bj%J44XeG!S4bC3=yDm-MtZKJIrdU8;i%MuO!C zkFF!4*37wGvOs#EHWTH;o;H6EdbNc+Bw)}e{zm#<3S}v=M8?Ahc9yaw0v1YYR1_c$ za)xU>#R-LsS2$hPr|^1UQEwp9HmDtej_=S~7OxS$BKvm{X7lwnNm4PO%FCq5Lxi6= zA63!W52~CL&n`y>70yKnvMBQ{j8z${N-_Q_`9$$`;3-*jCDs1QiwqgDNQATn;u5&? z9Hz%uK)ImT90z)dk_ctMqfj*xDx8j_;z+Xj#XG8e(&g=Aq&9YtR{kOQ`qfw?=d|R7 z3|O`cPcP>1@WMQqtb8=?ME-#*p&;bLn9bJ1;Q7dojsy2#*21M888}$pK7e+Ne@cc26`6kBXMRG|d^7H!N&E$V8&D$QOC=&FzFd<2f;ECJlmXHx zA|g)8g1bO9WN6q0$}2%Kw%{L9iH8zo4=j>k+o>QEA7hXKnd3eMImYnbaeoeiJRQc@ zR&t3ZM0Dv!GIey3{C73FWX!~@F+(SL99Uzaj^St#mzCCNkr9cZQqgzNy$apv&ywQ@ zqmyH!vIXxlSSp+YN6ILP#>Xf|nLVB`CavPIlc4f_HJB;}zV#o#XUas%h!~rLg$u1^ zaC}TDE_4&ZfVPc9+k5d${IkYb9bY?)v6+&jV!+pKChauF{3<$ojLIo_jQtov))+g5 zu^q?QxA#bnBL2u2OA?;B55f7GBuJ8f?6HKnHH?!S)u;on;Sd!UjW57OV+*jmBD>kI zm=X9I2AU-WS)&a_%F}xQfDAGS&mU`x^D(l#*a;lL2+=XY<}^z;;bxu#&ugd%t$w@g zEl~rB1B(MJ`ghFRMacfSC1n2r0bL5&hweu8IsOK+9UQWSKT{6_H7jJm4AICq-wICx5*&dVbQ1Xoky^<_n9GCiBYYg$1+iA zMI>Y&8_6)=Tc&dOP~8XI^mD#jvUjS?(_kfi5_b#h9%K+|nJjY~l1#}yXeadp^f~YR zwF+k)DWg<;1c6A65+xL=X?cayW92E9ja&kTWG*rg(XDKp(0r2hu4L{n&XxM8Nn6)4 zcNS&tnbr!>G~5HQ0Z=pjyW=zc5eM!$FjcOW%`FJIe>OHQ{d(tN=oRY8P8`e(pKh$Z#d10P|>n1L6#<${J_koV*Kp zB`Cil;z%TCe4h#iN(#Y06@yI$`BbpKLtIpmpp_1`3OO8PBE(`zM0DzcjUs)2PgKmF zzZ5y4oBvDh9Z)fQu@$?JcZD#Pj1fo0>}gh-a+L$97F9VS*Lx78a7F112IJjA!P8Z0 z5ubsE6$73sVnyN#0~rgInD66=A(E{|R`PwgYh^W*yv@#OHW+Tx?2e||Ha{!BRuTth))H`I_q*Sr>8+k}8F>DuY4 zO0E$l*29?cpGqZN1JAWW1`I_AP}B?6W+&?QPw#o(5^-ALZ|A&Ng1Y@P(LF~=^c z+v|6z!d}7MLak;7S$%7(qaK!IovGWMD*QXC+f*yhE~(q>;^R`cQ%H-zR1^5sNuwat z?G6ivZpXb#>eic;AaxrsL_G}tI;{y{s@x8+FRiN4)5v@?ApUUWs@ z5Z;--{WELivFV#cc1hnPrfd3^%XXm)4`Mxuc>M3vw?DvXDoMvCxpzRu>_@EF)x0Z| z=|tb^tTb~}4$1WGN(3d-w-UTtNceM=IziuFrWo@b^v%hSP>t`RZ?8eiDD>^?^Hb^D zvyAwkqi^D72+J{Cex*?|mv~^5tfS5Uo}VGxV9q{I-IK3}SL}fxX)f6(RvnuoIk3%z zLG1~0O13)H99FTB*Z(MoR9hx<^1a(~<;`NUqdhYg$Dz*6 zD}@cH9F)BC!`Qa^mg*u{gKqbmn_(O)wzbWF?+!b`&|H}M)VBmH^gU=wu*$aMpB&JVYXWm_#wVek}Z;xR{?sD$RXP@RQnE$-|0n}kj_H~0M&!qpiM?*bUu;*H~I!T#mrD2xBLVj zpT>{R>X1awh|>lIPIpD$18%W^ zM>|KgA}T4rKGA0ofYzQI&u>o0kNQQIS@})w6xDu9QfB?zahhtp?z!!-F^#|FwO^d{ zmft=WW&YvE0MaQ0QijUdA>BdHLd?w9h! zZM=tTT}#o#QI2YtKFXb0-3xN*6KRo?*EF^KzsZwF{U#pVnY!W0EHT{p zIs7edXaEVOOY`;Gb-R}E@xn|P6Z#E3Ghh_s1K!j8I2P2?;x0t3RoPZues@VX9s)1p zt6?A`OR3%BCzcKklW@2A^(IEwMR6u-OhdkDX`@!OBzSNQd8!?~yUU4)-K)_K=M z`_PK*g6*#>Y+rGXjqTo-ENm~qxW}Rc|6=jD$7>u((9pEIaL%)U;XARaV;Ms$nxpQq{Qa z!O9+0%a2#h6&Zc3s`aspo1FL-Kr8JN9nnQ`{ZfiMJMjsMTQk^(M8C+3e>(;w`rE~Q z3=B$wME~dp1f)VD*G{`GHEpigyQikjv(x@ZYTCT^-=rqYR|$i^Nh&;O0}tQT-h_iOXoBF{Y@hlf3O@|$Oah~J0b zoA~AKz0ysgU)q9dsJ|^KcdbHR$D>`=JGpy0r35Nc5VPPc0jo%Kgnb zlF1yj8FAR0PuRk?0rQ*Ne#U~Bi_|SA({7*2*2?*% zsfWq|q#M~vjheMd&fg4SDLD=Sl5PP>$q!z$*ahjwQ+wpVu2}5Wo-M^LKD6hoiC|d> z+hDy#P1=Mequ3=0O;Sus6u0O0au^<$*)6@8oBvuxUa81Vm-*n`D(WoDKJtwpn(_6(Dq?_WGxIANC*su1eU7LPVo8F!Va03U9OfQ0+$b?3txSv@J zBe8gO4xhp5^ka4CvD>arFeqr5-3ZSGk5>ie0y~}0<$kT2mT3d^W-UQ+Bw^UCyREAp4O&t-nU&FvhyZq`w3#A zb1_3BpJ^96Z?0v-Khu5zr4>;l$6S(VJn$2epR2fk02=%u&hY6F3IP88#Orn!LdN6k z**y^Q;+8FA!0!oqoP~~W1`I+J?tOD{H$46QW{q$%@VFXEm;UfVijt(nnoGwQkS}vl zO}$U#Pj@;L8jMUHD;B-T*XuV1Ptik7t$J+}bBH{1wY6a8wWZLMvh>O07OG^C`@lPB^{G+&}#v7G+5Qk>w!G&os4?avWB0XiOMQ*@+ zmmi~9H?vvT2KWp&zw6-#+R&ZPQ4E5Nqlbzd!Bf2Ei7@PIaJVsen%?Q=H@8Ginv{mf zX5iKa;MR-Pujr#5E647e;Az;_wg(R#KX~^td=P%75&exaR^s*?1d3x9@C4I$C}1SM zk^<)7p<@BH^1<`$8%OXA)Zzf1>_iuYv%-`ES@m)zgb`mMjrc~=h|kRljjlS%Q<;oI z*8U^-l$}JN>E@SaZ{7T~_DdPcnJqnJB%d&Bqqz?2Y9J{+bn_0uX*|5j-B(*9GvI3* zFL>0R-WB;s-hz1}dx7k;5~20Ei7l!uPl`g7UWa3Uq4C&|Y8BYCWo(9&n3X7TEJWu! zrO2@`19Lf>PUG;QIrDg4p5fS`23Bkqvd^8Rh{qKe{usa6xBL=Bqa4Y-A(7y73xx?%YkGOW7 zJuTfj)Y)T*cfwwjUw^O0wwaG?{9)M_<_|C9#>kRzC>J-W`)*dpts4P!m{G>!E3#)^ zkETGtH4Bjn53WlxO2Q`hdUBUHXl zZhi*h^w+uMj7LeaGD)9=Vr>MUA;rpcxcgrar&yW8c4Lw;>H(p=cU(t;fR!HZy@R}g ztua1r5_hSUVM7cQQ+>;kGhQn(Z4N(1%FNIK-(D@Du=3>Vz#gZ{E6hFlI(St+#hWMd zRw7gFtY^h38S+pvhqa!H`d^Ug(aveY-e1+6=QzoPik^mGQyL-4h`C`49>i*Fb7aN( z-qg*2GvxT#{>!p#EMa1WCYNP`+LNtwH=8V!Rcww_;X|eemek3)avcz*>JZk!dhJ0j zbSbQoppbemRw!c4)K(WMa4o(70T7YIt~DR6$1@>=H8cgle1HvM03)ted-D|lw0s2+ zY|$mo15qQ(1wrr2+XDb#9d$i6BC>1g#<^L>FNZEL##Nk$L52QByPQLQP5Fo{%=)>U zkN;K;jRRaz#|pkSr1geueC9muC+LVFt+OHX(Mw~k(sfj1FOv^k0~V-z-&=6E7>aNy zFsOWfe}%-8T}84?)_Et#7lxD@Xjyng^p}vYEvk*0@{{5|ihq`zqWCB5eJ%d^BjiPF z?DM-7D}HVk_puPt@L+bdgb-PS?w5(7FioUDRXj$`43K0rwzv*sw zMeFuRusiOJ?H>^Zwy+^b2$THKGQTf-|~VE4tO7;bLIfia@@}{_$n1V2Lg7EyG=Jeg}UMV&6I3MLo7yRSuNFWI`*SN zL*mId7m{fj8f3cR2p_f|O0`TTFhn7P;3~d_p;F@pT8@fvXa<73Vc#I*VQS=BLevsC zN}F4BL&QrYq#`Er#sl3^SMz{;gbeseqy>Qi^Y=_(>F+#70dzIY+JKTqK5cOW%)cFL z1zT?z9oTiVG4j+OL>%fRy2|K1Ajvw^HCATUE?*@)Mb5jKNvmHbT>guL60@4BmJsPG zs~lPMTyJ#x0Y?7>%qQ|&yjvNe!x3ISVj0FK(0YRrA_hfTF;OtT8TBw1LFYln{31#J zkLtP*95B<#kTJb*m37bb#7bviNYqCV6KjD)GqPwcKc2f?H zOp`$InCWEo0vAA&LC}kU3FCW3r8Y+>pC!GXBt$D7JMCyZ7IiAl!T>vSwi;kraZdD; zvlJ)7PG*POnkSgWS%wE_vN>{QA`8BL_E|hfzCI*kN20ugDX~5Zo{744mwo1vn6=5% zhP2%1G_J`LemMCgHO%wWFc)+(i}MT*sO#p4`6WGQ{+_MIry~X-F1oeF1HHYGQKkgB?*nI*oIJo21KRIIWujm!Nw4QAzzLeOJOx(1vZ@&@2J9Qy zgHkx*_z#R^QYB)mmo==w7sDD!8>%=#Ee(V#^JYPL?}A4Wcon%Z7l#1E1u}d7R;$q9 zH4}5$5F0ltGnixGB@WRYAP9(KI_O92RC-3Rx53wVx>Kb&mMYZ+U8TxTJI9?F1aZz` zNIY?gv@V{Q3R4!2#92X|i4hX-CL+zg8#^M+XFon3((Fsr#?&!qR&CQ=tTkTa6rjKLgIy3T_CI#Kak(w{x$i;0C0&80~D=@z8u#YRBX!3dj#mVaM1Z zES~zGA0ay+rdy#u5z~hvftUzMU_a)RsmQ-Cb)1e-NJh#im`JpbW1>AI=Ez{S6zwiI zagk9#nv9^Ibt5_^4H)MFHvSZh4Qt#)eufL3+67$hNV4Ozp z$0a2}Qaor(^nP4Y<01cG#i#y)Y?-=6NNIf^VZ!2>=()^8`J@V3GRn7J*pM~g z4%17YapP)Ec|7J(pD})UiMc0WepF(%mW0PP_`{dBLK-PCZfW%yw>03_h~Kl3p;vqx zBhy=e$q1RV_}%HHhXZ+f@YCDQ6nMUXz#EXU1fX5@vAYTANL1W&l{Kl&btnRSbT`?!_wV#cor*%krfDza%-P)c7Pdj|c zfcpd8Yc>tr;WuB5Ty`fVg3FcLB(3ffG@IU3)>0o0Y3ILi!wTpVxJ7p&F0___adN^4 zQN`ib?s*|FYE1;XqTndKXhlBwdv&3^Za*|X=HEC_+tdB#7nG=x#AjxKc$IOwlol{I z#7bSzUAWtwvKcYnk*5*tUd}RJ!MF}k?GxEE0aOENku#@SEIN1*e17DCMmf(tH4_*W zV#PoruzuTu)mywcl#d_ydq-AiD}wVGY;ZPnT{poY*%TW68G`*qUubm)5Pgi!e-2^~ zI{)+kE1f_5W1`sqV&^M}M3&!88G0-hwf|1l7K81@*+%Lz1C?yclKw7$x7g=dN!Mby0Hk&k*fF2U~_{O03#uk~a2 z_xYu@WBsvvt4)`)8-+doqKF&(~%_OQz0ZvJYYc7LS>X2?Wg^FbM;t`X?zeG$zUCGEuW) z1VOlm zC0ev}7QPRJGjM=cAkQ5rfG3LDk%;%0I|2n8x!DVU_I`6rIBVQs+_+oI96Uclt=n*& zX%jjsr_Qk+at5Ckr}3$pzKWMVi#$=Bb4*`o73dLT%2Mi%amVg0YR8t+b`kSRDivy3 zsoF2mj+$UDoR>Bp)XrW9wOjBct=um!!sgU6R2!20aYiqdm|r3Bw2q0nwpGhe zl=d!uAK~|z&qN-BfE5*A8nv_vz}pK(?MU^s!KfXro?47rH=fY1+8y%%xj;AzeOd-N zA-t3wirx$qY(H46x$1hgvV*jWS_|Zj=%7YpK6{qkIYh#5=;1Yf#~}HncgIhRZbbq- zk5TbEiQ*WBegHa^#&7W%L)k=YAi++-;dHA}Gwts&7gMf$SzUtBeD znUaql9`h@#3Wqku(3vpY2$(HCbF&8qDm_9+poqO_JI=81hZ^(fa_5E*^{KCyK!eq& z-SKA@9bP&I0MYAr&l$=|@gf)A;0I)vo=#1K_s$H2R?Mdc8@(^;+C>&Xn%aLxkWgVx zPricSQ<%avpPBHxMb>vsl8FsS1J1q{5vSmaCZnLKy?cG*%^C10h~W7Ij3?GCyZ6>* zc#C#vi>oLELwANrDB9c%{U4T&CYfv4k;C?T#orp-gPo1)Ix~9HphuMPl?uCPZQ?P` zG6gG)Zqf5mfUIZ~EhSE9i+>FqH02o?Wbekv^O(&A>&$IUdol_(tvGyC@-uhE8be21 z)fvWl?Ps#tXt6Y^l1&w&ItXqN=QB^NBxu*|#x4VO7FxypF4C}Nbyy;Ftf5RW@^X+UM(Ss<=s=8LU z953Ii=1~eG<_ZqWqMdX5dRox-n)9W52)O8fFnSHgFMWbtgE#icxIQ>gaGkliprwGF zVs{AybZo#|Kv_ll!u&dP-A+F^amXg+5M3mjXq;}(jWDxPUxsh^~DbfgStg? z?T%O!?+8*VMCPP1#oZEa_eaHXdO^q%dx6CtyBD}-Qopg9hY`5u+oi{Qd45Xai>#ih zuq#)-$nK)d_DkbU@qc$y+6Qv@yl^5Jbyp)t27%FykQkSHPSO}&n5>LL6 zy~U&)0u4AN4TlZLp^yclXn2qfCk* z2#~wy$uv|bv=`OZ&VeX_m=nN#<;jZMr{dT$6~`yfDDlRh~$0x+qtnG&fNAP4b)CUh6Lh_0h86jatXhtr= zk!^q6RJMFV3N&%VmJ>1^zPiTX7`!ZF6R_6fc?wbR)=$A}$})vpIUyNe+7wfDan3TK z%2@ENLT0|Y9l;Z*&y7MwhR@w~v0yL0Z-jEH-RY~_tD=7km6=2zQtxL&C53kyG@CE} z1Eo85z8l+A-&Q>ko{8<_dKOEk`^{H<<_0l`e)9J2j_6_(>oGTYVq0N`>ct*e&f>t_ z>&`@42H79=W@ZNK;~dsE5}!;HyBvdx3(3u%|F5HTp2IA0GOs26Z*=twFM) zW#rEgTiVonBwRrY{D6qBY`x5@M7}_^Tj*!M_#gC9|@p! z96_r_>sVAo20y`D&Z?jDEjF$Z5Fh6@c`rxqIX#L(EPAdV&XI=@`vOv0d5F>}H0i`Y zKHkt9owLDsxJ;r|SZFQZ9P>uDjB7;Rv6#ts04BD9^CTz&7HbHlmWp7a_$4q2kA4iU z<^Iy1BQPA-*bW_qit=FtMqNJOr<*V6a7OGefDwXpa;)$0=cbr?g#e!hTe*=Oiw)986k9l{E{%sEjU5i1c z&sj>6Gpv#Gf~BM|)*}gu^+@_*J(65lkE9NGgz5L6kMtytF71Pm*(Ww2wPRszKNUT! zQ9Vlbqze4x3`g5HJsi97`vAXB@%tLT9;j4r{LaJAp7V1(T-reCB@pgAH_dLt{6LIt z*b#fztYr&e7Y*(pjfsZXNwsW@70SoQ36Y8Wf1#FecT{+$=zt@f8qBWer@=@ zhu*3OzRxGZ3Okqma9+a=N`$$a+wC=KYS3=W*suD1 z@51?3AK1Xe9q>Gk{n@vm9+OSliU1eer!*xPh%e+F(@ z=o_|I5C4U1k$U^{t@Us4R4jq7N2u4h8g%t*@2Cee(KYjidd$zUnBl^6*9*9GHQR9k zmqty(U|H2nOnRVC#bRwew5#U)Eqw7gOkuki-X;+RcW1sc6RxSrh0PE#r9}uaz&je0 zunEX+l5t@HUQ!ToT0%ke3`A_OHO0A#9(t|>;70QVtlM#JXkQJZn3kW z8;TKeZn7$014UF*D}Kdd$%ZS&vzSsK~@3S&#Wopa<4F{!F4}WIv7=^y^aI z!r6Zq%(v{ntG87u<^FH6&|qZ$Nd-Q}K*Kph-kfRjmVK9sYnGJGGQ71ohvKSMV9N27 zNvIgvuSwMJaiz5kR$%VNV=Hkh?0o+m6wVcxxIGK#J%zVO!3nYqbBheLWh?Qe*AQ%= zdwr~~j8&iCJ1L;~R|8P>0f2r5>`-6^VJ@VK zAAMt(Opp}4MJ(2m4yi~MN5eDojzXEX5c!*vZwo!xh%&+dj*eQv(zQAskwh8PXP!B1 zhcU6mnAl8RGzQTGW8(AhFbDxCT+$NhHvl_Yc9;v;j?j@<@ML4b7CajFw&L0%!E97O zSy1}14@O$FF?gXqHLb*~B|ArMCFbx(G?(KbG$-hoce+^`Tmn8A%Yi|fGcY;@0e8)i~VXQ1zga zsh%p>Ha?CLhV2kfAw2aVTHW2Dj^W5O9-zD#&60-S$-$+Y59~s695nF>QTs~WoCHI_ z^?LgJSpd0S)OzDZ*hYiLf+qh|f0ZYFz08}|d$e)uhwbnd>>;#p8UkC!aw+`5m+2OW zEDIyoqh!-}n_ajZA%XgFAhWP)uQ_o73-p-lk_x=ayi3Y97aTx_1>5zhI?COl=4&W- zhq=yMumgn~6O&6ushe23l>9{yZI+_~zF{Gtn*rm`EVsRf{SG((s0$@~7=o$BZkml< zeyB>5UbJpD<|_rCd5Un3;keJxNk2maS)Vw315@2q<_0!h1l|xzWY%8uEpNdqM)mWo zUV8?P+jyP|y}B_NShNoYz9Scy{NfrgF}`rBLsKLd9q_iN;043C8!p1Dd-xCU3K+h( zJ?3Y6?N<&Y)$Z5_EbJ6Iq{zIus%YH}-3rzjzMU<;ZAgsi zW6SLBIu6ljzXsQB?Z2cAAU`X{XE~wY;yYhGM7q|zAr)VS& z&UgbMF-+mDE)mr8nR>ofhwW{M30B57Ve5NU0H=VMn+)jO%vXYWK#|Qv4;-cOHYH?m zI(4Q-Zp3>lxG`m>yle@oHCEx z&uIivaq{!tv|sPmP2a1)NpJdF#7VC)`FY(CEcArFhCgWooo-=+EcjbE*Rj|o|)V{-CHmji>~*Q48dL$tA-D7xzKCsRe-=Rxr-0NRc@r`P{x-` z!ncx?mS~cTN_d6A4ZyYQ$u^Q^2a}r>JTPF2nr_H0XhPi-Jle6zaam86 z`pSSu>tu*}g0aS;`MVG?ckrR&K>+?scqSpx>S#6~6}mE*DDW(SaeMceCx|$!y*_ha zz+6b~q?=2GXHCUcg{&s)GhtGLv0*VtVx8el{}q^2F__f4OnCD*b zbSun8;;DKNds9>aeehuoiwu~<+x+J32_EMAP^;G<4*Lo|iAimvX?XLP7mOaZ8|+zt zYE|5LKxioYRk{#%1so38k-d(?Tj=q@>pJtE=szGLrHI>Gu&DEc_MVO#PimK`bPU~Tbz zW1ZRciJd&=LIMO~)ftdOnoa-cqV3w)?Z%QeyNR-EF=CcR;`vFAw>WjRu8Jb z1CT02@fp0pydipp~@O_&qTL zWbyYjvzcy;wKnivPW{4Ily>Pce$x@o-&NKStiPR?h!`Ci^>|TW$d$hA|+=a_6tyl^ljY+R8 zh5HHv=2Ls{u|BoF5x2n9M_X~z@(*hHA7OuMz^vbecTWrK^%=Zp3~jNrJKIhN#Er|b zq5VeeXuqXji7_?TZ@#S6{pAPjgPz)gJCFj)mc<7S$IQhGmYjn{yYy|ah=Q-4IQpY0;%!=z*A_Vs^2_A^VGyz8;G#+^I%AVZ%$5j-JUzm_x zh`70V!*RuCD?o3!$8cxhJ`(p#ga-34rN-Afu7NzB#xxo+S-87#cj4~Ey$|j>?)`8N z;NBmA$VBGR#|M0O)#Amg;*dp3CGf7Q;Fc<|xK72RI08QEL2=mGlK@5v5GtIRM|-fr z0ckKADbJ(3Dv_li*9_*`j{T7Y*GjyA+U~_KwuTZV9`@sh@+t;D3QI8Dv-`eJZCm;K z_`$V0JkrrUxOOqt;{nA&JhjNva8Voj4Jf2ej4o0I)LR8G&%Lrygc+Bqj2n^BKD;}h z+$#k{kkt#+eM$~GaxkB3L!CV4i=kLrb%wdE-9-bz?!b}Ec}}S>UD3}%lX(9P@G}$z zMm<6Ci4SE!tr8HYLl%{iqDrpQm|ZE-xpU=xhFoFU6UeLL*QhN@3CeX2uED&yxK6IaW#U49 zJB#147LynAvP8=-so{sEe7l>M<+xPe$ETINtk&{zR^u zP`V}{oe~r@2ne{VnRSVPxX|uP2LbDn9gGVv>$m1#7|u8iyGH%t(KRIn zJ0-u2Sd+>TUzzyEK;jQ@AZIr{{dIr(=l;;qOl>huwxbW@bOZLrN>l}Ri#e6QkJeup z9xkniGo)ekbP9S&dX1|h&5AJu@<#LARkm<6O^dvX3;p2|oTktWd*p6b0+!?%N@{$FGtP8vAtM>+qcHH{Icm^4#>gFc42#H`Tt53znU$E)m!}Q#j{(2z& zEwmwHZhf@<vI$30?&o`#id z%ULBg_$|TjabWL&37-+OUH4cV8&J|F?M2mnD+ybLF%^B!l2o8>I-<&C=uKXY$BA2T znI@!Rn&8kh!J%n_|I-BXrwOW0lL4$~>olRQ(_|P=6Jj(?kb7F*49RVlTuC!#3SpWi zgz4&42)OzYUK(-nt>;r~srbX|=K?PvaT7KU!eb&cuBL&OR>-f?pf-~`4 zQp3w)T+n(_ziD{%)g{`G)MX3;Nbsm=sEkn=&KReqF2sQR$+*SiOleO*+EcO+0VS(s zG$+Px`&9__A5|f-ei)YNVp=0LQ6|notb$;5Zp{D48q0gkkGk7=zKMN zBaL&Hex|v6EBRUlRbY;rj6@`xU-l88C7@L?xCon>khhohPpTiN9m2@d6uqz^X#qsS z*>{R4+f2nRA-Y@xa;=gpTdR0EaW08ADuM}$pF$gF=9LL_Z4f3CbGFBAQ^R{t>eQZV zKk4BZwmXR=(#0v;f?CDfXVVAvbZ4qKQ!sj_U^JvvNmH7jkdwQnkO_O$|3|d4m$rBk zY2|IbJJU)4Vc6~@N+}RgV}pIB;1L(0ZAw`jCv;s=%D8x;`RUyUCEs8OF#g8f)vBofJ?G)q{Kv9 z)*AJi-gBTEeQ9G$c6l64W`OUnSrds=OWB%Tnf>6@&kXEg9h0Bkq?wsMnk% zSSQKQsr4m%mBg%saho{Lm2lM>)sBFK5FE+vAl#)fHa$>G$)?Q?&|Z;Um4pr|jr7=I zD_1pP>WX4pGoOU`Ez{vQvO6{U@n~11yJEz0grf{`Mbe3c6Pu1t!h<5n1T8|&I)kq# z$oZ6Gk@Glx`|s0p9R2#Q%f4CK;>$<}AA>SAfyGMp?UJ6W4ko(V{Wl!XGwlhoP1XO$ z`J=dn?4E5)-CcFROw zv?<&yNfX3XiMC}TPIaJWLZT0UqzoPlJ_&*aVudd;xj+ceF2+hBG319E# zWjQa8^YSDwq|%C|5nd&P*VTJ@*%$prS`4Ff=Wpp!-)h^j*g-|M`+aGJrA%7MX2$hP zY#2F0904jhm8fuL+26R4pi)Fc#qfP^@C){r65A_?=5uNY6Ino6;?!h4=;qk z&|ipBd1QO{vh6l&q<_1LD1M*fqf}-iq(uDRsZo*4-KoY&8Z>TXfQ)i{=(0H6M8a3W zY@5=?K_w!yfa7wO_-K;30OkH%WDw^!lGzNo&XnscoB4=xu1vH=7<2qOu8iv-Us!`N zSvNQFK4dm=C6#e3vWjo)o{6h1-JH(Zl(4WLU?C($gH$ni|GQnYu$K`IpxA>gm6drZ z62$?gXt&ZQC4*dPY?9|D$&4*o#8P5PT#2+K!R!A2Qtr4c<<3@+d;(ylAnoxPTpZm} z7a!Epf&!hIvc)Ge=sReKZRU6WcTH)$GH_6z|FQW@=G^(wb|B36<9|EB?#TaE*;ANr z$o8mN{}AAjxy*ye4DcFI15Y>!q_W`$pJ{MukD&-_T$};P@$4paEz%~c1&PB>Qdlr#FpU-rFP_@%M!G6kg8Vp2~sL{k}5jifpR88S_ZFBzPJd6ugZjH z$dI>)VY0p(G%qqZsnn-|1t}zkJ%yDfwH{aDy!9=j0Gf*i#+!?RlNY1Vbmv5*!(vpX zRDeCGwALWbTo|(#!z7%5Q0s5UTbC08$W?i}tE4AnRjUyNa`6e)FP+pdNs@Ynvv3pF zFe(N&yvaty7rXW(FLc?B!rA3$#m^ew}pZ!`t7!Gu7w6*g>t_y zuLk#kxhjvA6|hw>OA5JB_r>vQqi!iexlz~6)V1rYaHD&K$<012XK&In9h2Z1>zf?h zv6Q}){*A^`dWs1quBm%o1JN^UI_SF#JWeW9uR+Voy9ab*856OCt!*kqmquMV8H68> z1yJvg_r|-uUjeRi;XF{BzWPm`(HBt$<8q=#xOianG*l6$mPqv!S1z4 zu=X3Y1YL@j<>G_SKZSJ;-;Z%3LdI05bo(&a6@T}c2soZzGOKOkc?jYU#sdqIOzoa^ zesF>S42pP+LIB4n;8X;^F(;SC1hCjBEkryjm8jS)s8|4d3`$GtcLy^incqlf2V46N z+;mJs%o8uSo%;7Rf(NUURzm^gNalC6wck~$t+4Ww(;>_YQEoS#c8>rdO`>QAbqRjG zb$I>;hyfbZShZGJN%hhVCcGG5@($;Zzd(=w7Iw=wd%2!4i__}XOZCJwPI|hRKY;M9s1|GVG!EAUu>KX=Y zKY)vU%Zc$s(=m<-^GlBz5xLD878oD^(5I0ee^;a9WdThfuP}1;ywu_F{>R534qsgH zeTRb|V*$s6Bq0c(KrnshaDbdOV|Zv?ca8{-47DvFHyJmkpqig52!emxfJK3sJbyok3qhNhcva(+jV4;5C+8H?YHen3Kb- z-HU?{A{RK*AQQAZl^G~qt5NuC^I)G@Xnpw=NiOjelm-$?W-UQrz$1UMy{6*dw)_Cr z4HqofBL%Dbh1^6^w1OXL;buJ37WXs=Zv%U3_JtKMM#7zDN@O4{!{`;~s$eu~v?Q=SZb6&u9byadCm+p| zKHQj$Uq0>WM)Vl)AwD*`7$1TG;LWzVZ(q2uq1M~ekc+Eswnof!)#OYwvS@;U3)sM7fbxxBdDu>%xRshkSa_-%OGn}@ zj=nWT-)-kGwd(3EL?$5iUVfzD`x1A@#?)4k> z;?2-w)IY&&>tof~(|yJtpTtWv011JP>f7)lj_MoL!(wrT5&8zZXYN1<`)K`!o(^+E zQ=}U}cuA5!FU0lG%5ZeZ26oy3ypGH0@SfS>JuB&*hG?NTMc(u1dQ{?GjAjvy&b zY-=^t*=%Wa3KeNIaNciKYp_%c{wSnoaJGYRPB-G~eaP<&{3ap8*R&yTX=U44&x00~ zg&N6q1r#Z+NvPDZ;$4jIbL{wjjPKudJeralYt`zjG0|Zge}c5fs}Is=qP*T2oPaEY4XSHMCGj^ReOLYi-CEynl>Z^+Rh-#Hnhc zF3@HT$Gd6>-%&TfL0Ryit%y@?V;oh3xS=ua7if=t;W4*>m_sGz>e~nHwDHNbtQ@s6 z)S&4ml-v~K+6Jr?QG*P#so;gCBWL`m6;)~Tm~X%*Cxq+axg3hK-}8p&@l;+{_M@A6IF{h!9vB=qb@yq{Y-xAH zF*iJDuQ>x5v=571f1UU#q*p3xir_(vJ9egTk6=Gp>-3@xv%BMAYkRNhzM`!+W*`R~ zNYdQ6r&~CypZ4_jns<6Mew6Mx@73Aqo^IQ4*PdSIF<-@g(U$3+o$th&$uZErg0|_N zrl!om)OFLxov=7x$bsyJ(4O|@ojGoy3L3kxE}zCCMQ>{J#{pXd(D_i(p>Gs7paHlm zvVe!Wyhg-OzeCC~-D5mTazbtgTLnr28%8NL&>jRs{X@bgzA>jvP7)1-K3nt;)Q=<{ zRBv~-MfK{Wc&eUA_59{*K68)x5zcZU-R|LOK_ET=-OG(UbBOgko%=qwdSaKlAk!4< zCbkXH!@ju{E>{r(z8?b*S7F;c4UPCb5_Usmf%KCj8Trih=F1V|b5Lm!`WLGzpg~`Z zM7rAbtRs)9NHjy_Wzjl#O`}Sh0DaMG_Axd*?qbC!9Di#`njAr#!nu}Wm7^LC)W_$W zwbUYws-;E=Jpa~A(_lb*chg`HcIZ&QWakElH`x8U%|06^az1l5LrYjJ=yJ9m9uE=c z)mR&v3pS&K4QnEAvFLbx3q`ACzNYk8UgcT=BA!yWhDX=CP}#`Kn_{B> zcnUAp$&9k0X;km(ar&rBGOImMb5(tlg(D2~YoQFg{|EHz>CZG@r6!Dev&g$2;8R2G zjzaxrT3RkFVM8=3QSVZJl^V$Lr%M>6)L(R)+T zKRMNz+lS7MpsLs$$wIh@3++>N^CIZRE`SEFwK|cY{cR*T6Cbq~*T?3;K~jqzYt_x3 z)kiR?b(Pfb4QBX_j6C|kK&0$k)8PT525a<=YIseu%2|bM>>kHF6=*=^Nqae!N@{O^HizPow09QTJ1e!lU%mA&wRabByNmWdiEO@4d)*V|^epUk zdsjE3qQH3zwTn+!+5heU^c}g8-%McBN}%UZD!iYf2)=vGN7<=%@OdnGw~xM~7BLuV zM_mr+mHov0KrjQIpouiYVv!$6zFQ;jyqV@Gx}RCyIta;t3qImP@QnK1^IT@L+K-&v z`MTNACKP3BZtg;>mnLotLsaO*Z8CkHN70;oc@>z!MwuY@Sa{r9Ir zLyvLvc?p4^n5RGa2J{AhC$Ktc4b~uvQcxozm+%{oPysfR_EF<QPyupdjI^lownoMy1DWM{wWqfQ%ojMQ4@1As zvQB5|s{X?})c^C{$E^QRMA0LZ2VAy8E*}R{q3~D9g+q)9UC99YyUL|*BxLv`dG}cG zxLb1G8mYu*ga`8kJl5ihPcTl$a-3>)g3_kIgF~+~Jc^J3`TUGHJa$Gt#J1)REy?T9 zlD)4J9$mI1iYOZ%YDmul!nwg^o9#~6fFx_rL|w7P16bZE{!ff2)#(t=N}a)3@6|{E zNq~r$7AeOI_btvKa?-PqR{u7>9d>AxAe?pwIfo?=6Q1yTf!)AFYJy`VGwrXi?C0az zUl2bd8CISn;eVn?WfOiK*??JE$kwLSk$cu3n%B$RAj7;jY5X-VlJ#A{p+Z{B_+ejc7|FV2suF(-GO_&c4H8~_Dp=&-a8(47Q+bql$=hob5eCJjC4al zhwcFt><8BfE9C|#{e70SIF4gY z@Pc;$lG9I9s$LGrq(F5X0?=p4AQk*U{UJvAu*fqpU+RCXFr9Cg}l98|9Wx)7+j5hd|c-dZ$`U0Mt%v}IP{Q`>?;hEn)Af-)p2v2F#jR@#4+DPG3<)K{fLT_HmVHRKud#UpW*{_3FnH^{Z5g|zf ze72rS!#;W?4RWjyV6IoB5V4OD=P~#B>SNj+3y{_HI6Ys(;l}h9J%4E&bKMrX4_`cy z<{kAAF+sayq9AD!J^v{J0-#?d=2OIWNX&hRY)T9B~pz9o645PS#+&K<8ly3*MH(m+xCCXz9hfu*uKv% zQ0;s6+hb7rOi?$8AcxR^uDCOSlu%qB!3Ie&N9UdwF8(eMKM4U8Fj? zlq(qJBnC4;U~}WnMJzJAEpi1iYB&?EZf{eRcUvUDAP(;K=R^Pygi!pS>^~p40LFh5 z{&}inV(26`l-w;_7iZi0~7 zNlU((0D9aQXZZVVLHzGN0&r{O7JLJ_rRV`cknn%tL%4VX4IT%E-xiz>VXGI&5M^x8 zUkr&-#9srq#`Jjs^0PHkfgAu%ST&LF>$({xCPlhoXo6Jqjx`rS&bqZkdm6?*(U~$} z*<64%Hx7Y#W?9ILghRy(a4jIklkkX`uP@#La}7^b#iE|Nlu!g*6%4h}ol zJd5KpNHv`wev*YJ97-2RL0o)L%w5p|#ZC(^~4UcH0a5=MwTzmZ68|(3cb#!H*%ppnfnQA@aoy zNU{Ssip6aC2ShA~WkC`>g0=%|=7?987b967cG z06N-q`^|g4for5Az@s11;Vn4+i;?K|G$AuUz852J;KgIMM3(dSW4R9^F_@tmgVZ zQa6yM_#oGaTrnf^r>bva+A|A?0@Ldo=bWcK-v%(jvgFrq(6tlm|KoW5&rbx=* zUX1j!+VCRF2|X_?Pk8d3f>Yx7tfQHUculex`n-UxE~&;uX>&x!Sx{2u>G3j2+)0`R zW~=dHwzOXfRS3(9O9O@&xTwxLnZUgb3E5dg4@H7_lw)M6vEu561&OqH5tk$v;loP` z5moeavYc5egweXh@fSTsdz2*K)P+EfRe9{EVfzow=P1j?q7EiWpZYj?`i!gYGZ3-` z`|7m1``Hrnb>I$k7}G(|t@&Xx|6pA${`jO@@sGLNlIA<};HWLm8|l!8PH6}&^!45Z zUz~w&4%JJApa?VHZ2z52{VzfcYh=x6H%H!-W7JSj$bZ8cQL}w;T1gH%6PfzWi-fm{ zwj`-;{iJT2BYU>8ZoZPrR^` zehaKT3d04QGfs)l(r;D%T(vU~HB0DwPKoQC1|eMJgXjZ*ADRzwrK8FxlWERGbo;z6 zR9w((8n5fT$u&GQ$eTXQ&D^)^tbn1tH;fGyMo&Soc z`u)`!r_T#80*5t5KSTkta(5Hn;nchSdfb&Orf*nAin631TIANAemPPtWp0g(L52*l z6ehQwY|p^Gh*14}yYzFMtW=+5CpnWzq?@Oc(gciYIIGiK$sx-rZd{{sbdzdrN=+;> zw!esN-x_%eY2s>%+Y0O={)u3zMZiSn>`8Pd^=~3!S!(3C#GI(w?fg!vhFP2tL4|Tj zwVH|~=;LixA8(HIhHqXV+&xL?_M&^?T%emW?u1A<0o0JB<2o=t1>(1(S0$cPvTKIR z-{^&iOd6bcw8p1x{{U>mFvQ~7(+7Zck?TY*3HC)!bYag0j?IyqkrOJ0MsJRc`MVkw zV0{tx3m9`xSp_hD5Njiz9=*dfcpucf#jfPi6h z1Co!=M;*1gM+K#n)^%;G!VW!LE5?F2smG;{a%Wb<%V8rFg_}naL&oNR4_i9BjPGGc zctfsbNZ3nZH?mjN2}pI=fJP!2bfvV5R0GwGstA8(PYe^ATk2U7$pFbG(xQI>gNegb z`djFWxHB%g*cH6hxEP?wp};%;qd>8;Dt*jobyvM?EbX){5b{mpw>|A)43fsd-X z_MW^TK*9|2R6(Ld4F)tC^acYuhfL&*Oln$DgM#K>thFt+RA($IV$w-!P7kB_XnnTQ z)~}@%E3IAyv6=uTQF#egP*Kr(^~7k4t%acIeExkl!DW^>hchxlC9?U#FS=~2mTRWb)fOusXAV;Q>W$2vp}8!d5*%& zwp_jw9?$piIC&Pyvsj)b@|=QnVPXns(-@(Z$+JS9Gvvve6za4P5=uUSaD)+IU7oe_ zoGZ^ddCn(Bk`mCaWQ0~P&#UFRNS=%386`$i8wf9DM0g3GMgvMHfhH%w-cn*XWFhuZ zcndV%ZAZ%qjr=a_`6ck6^J%3M;FyE?kq-f5wH%v%}G9rA)-`s`6d9_N*A3tZXlqH`nI#l|+ zW|E44)`Ri|5Lb_}1Oc@N<*7=fO6QadIWxCF_z5NnOA+l7snR*+N^xhi;8J*1iB##F za;3QQo?w(B+9e`;)8!&}aBw5LMwm6Vwx-w^|2*H{d=WI7S3#Va+n0h^0i1``59Gl( zp?f@7sB}fK5K|=25_wLMXPG>w$+JS9GsyN_1Ow0vL=}{$F3*TOYvnmto^|q^&q~cl zFc7|y5#f4yUM@?0#>s63a*b18EwKrqnQNYZ zfPwTugh#!4rUQUr-|GZ2wE{p5 zM-OnBij>Z96oMfN0X!Qol!-E6W-0aH=z&H@Gssd}B(7_86hb2vg2aqx0F)I8WyNVd z;X@~A>j{I-Nv1YRoWK+(Q04@tIe`i%FoOZm`5sX>(rqL;2AzQJ1R_qL)(PM^bCtNx z3Cw2zbXr2^m3FjI?*y)P0*jo$Vkf}a7NLHL6IjXsDEo-Wv?hMk8sym`&*k!5Am(hKy6vi`UT2;OUQ&d#tNYtUNCh1tlP1(dqRoMzv+0}sa@d(%` z{6N5Ff?`NttiTp)izv`@FvEN0shFS`vPxnyS%D*HJ|d7N%2iv-BsLQiLr7JfmdOg_ zq!_(NFz%M8V#0e8CLMKl-@%mZHINguD@Ps~+Lae0uu*XQ4)-diR_PNei{KT5@gHDA z6((1;=a2$EyBgEd%me0MG-Jw`kolMR=ebL7iJ0^96IF*ovNZP3v^kMsAa`W4Rf}&; zh7zO1Y%_aO>rtx`xr0bkZlmg+M&yoEulO(+q15}VL${GV^5Kue}*b| z-aIJ+uP@Pv9onU2u2{y@xI=LtKVOJs$e#a{H{)*Aq zDWNGS)MkY284fA&2%{c7GRlMVF}eMIgmI<3+YCuZUyW#^aVeh3PRywEooJCHYOoWn z>O0Y5Nz`N~THSY|s3dB!6Rqhx(GrQC_ma`L+)ns}ozQ4pVaKdhF>OZU-FD0~_$3SA z8RL5AsoNjo{$|LA4v&|*;2H;CzowZhc4OoMmfXjEXkZW8-n`d^Ygls}#0y*YhL_TZwD&!8CgCOoXzMlQw8Z1II@y9gjia#mW#qfD#X{heMJTl0F{? zm$w{35MbttJ?c|k3Obbw0OksSox%82lHM82P+0Dk^pb%OsU?HG>eKubv^#@3cLqhN zBpDfij(gL1a~-_zDZKS5pmrpj@5WawpU6G1jcf?wYkw>XDRd7C0x3bhlM|052ktA= zIXM-9*m?o5SyYlrl2HQ5Tvu3DrZXsTGWbY+x;h2zX3>@I45p-#^v)oHgdl7Wht<`NgGc9^e;*>2zV+TZ_DZ-T9lP%nzn~-LxqK+z6}manaTI;>vN(#)0Eo8kV|?Tg z!FoghOZE6hT;;SahRYg%wuCg<-lb<0&=-Frke^*2fvy*zKS;vFFX%vdj(wT)9e76W*z4*plJ^noWR!N+yOzTy4 zz#}lXR@UL$oteX5N@WlQomE7B!XCi>le)YwKH@5;D<$X9-bd}X`j>+b(I`I`4) zTD+#Tr5j4!)RZ*+>pn=6j(12C6+^$$^yy|{_L(1&*(ts9hbJYz2(A z?p3!m)u48q1R_m88&I0=1xZHyK|K4GCfY|g7{2^razonxj+>5hUQna|K<r&A@$qm9@p#0gdgw z-6!FhrP64oUYwYl1uM}v=`NKtSgaWE4B6PdF}ZF z%?w{%ZECHW`E?z`EoB`wwjhCKW+ftchZSIS;=Q_3+e;F%echAr#KL`TFQF9yz%c3S zxF7{_#vQAWoQ!I0!6cIAKee$Fzcj5HS0NA^CP53q?wMM{*}mAZ3SanY;uL&>OYmse zQba69BLVP66nJAK^Ds7}qkD7?5reC9?GQ@P zNB|(4#vk0yOH_tL!kGZ}Z3rh{@;C2hR=Avc4U{E*%~p2Qr&3VllGNCcP|E{PAg+5X zqD9&TOihVdK$p7~@G+bs3U4YGnr@Urv<4+s9 z^vl4Cc~uzN*X>5&t?oSV?6Q)E^-}QY>3~2LrvMM80oN;j%!`v%0LOOGd0%#O7wvk+ zG_04>3x>11spFb~>7M)DU{_)A`oo`aanX4r{C_;lG^LIf46DjhL%>Ig0oBj)gHRRj^+ zf$ze)q)A<(w8bQ4HZ1HkM8RNckX8wjjc-Ys1xzOD#(a6wU3_a;zX`Pa40(~#W0!WD z!}#rH2N~ar?Cw%RJ1ZDnQY$nMQ zXkXA5wi(V#D-(@sK!%cw$_y;x4LtKU6Ny|rH1B;g-XoOL)-dndhi9@g`QoIuNiXB} zW4sv>hpA3lKd4gE0!jM4GJxl>J21WxXIG#?C^Td}=XDAi&G;cAG(Y0=u21nyqvaPv z;()djFJ82$(iu z8*x6}$pX1ZwknkjaJU#@Qk*e{JbNWx?M~cO+<+>c6lbI%&tB>2by1`Oc~ddFmPv6& zVl^V3z0xb^3sSNVQGi%tKPk?5L!P}r)@EkG0mY;^BMo`>N>AU7i=-8jo{>hJPfvOw zn^P!QWd9K=-+vn~)(m$%zZn*2s%MN(17xJMJ5u^N)la%VPU?F!Gq^`J9vnuvr>fzZ zvrlJ7qViE~C@{Vy8q$(*Jkv~hL8WF}!MO~O5;6Z5Vl%dgb7#8k6x;#HfO*dW3MKHZ zhV|?*e9<$B#?{_jFm?|!PdXpKu~}@zKhB!K^MSR1$I$;h=`C9x#t+)V%diS02HkCR zp=LJlMoiL|?3~nwaX(+f<}m$U5na-W_O~L$?v$-unn<9a5%{+g3I)LTmR#pM;z0$~ z*1T8o`+E1du$iMTgvdicnY2NYqKsO@)6xqg<(tuY#AO$h`J@U-fKB|9?WXk zL}n#7(PqL;oNzUu>(?eVtYoy&(2Ac>r4pXy-6*qTnuf48d79m$**S9j?4QT$ChAb} zazQr)kimS)o_wXk&~sB?=Rz0W>Lcqqkm9Wlg6iamR~_Si2P!yT zFx3UYk`cja=?_d92m&UB4sIIgM>0=Q>T zGjne+XNEx|Clm=I!yn%Pi8b&;ke+NA87oSl)Jb|V{I3l?_S@nJ@8 zLp($TR>8jmpinz_6~Yv@%#X+l-}U4c`R;GN3_SzgZ;PudKfU>q2=;$0`C4N6MjG+w zC+?2df$@>jozhAVjLNXU{FuCas`}* zEpRX6_<;zPpHL8_YW>XX)eaYhva9gQt`4&60rru7syahmZp zcqK89?h>L3e~Djz$y=tu)JFUjJk9tM65cK0wG5lvC1#JrJcB3vBSw6$ytc}x_awYY z!j^(}RWKoal_2GviI z{4^A!X>HlO`J9f1)v3_(R49@PEkfx2`;I{zsDuk@q2;Yhdp^6G7wiG4$W0) zRVu_GwTk1gTZQP2kWf{T{?3i(c3?fV{7g|lW&8=XEG*WIsu}nX8CB@DUh1ftK_GCT z7Gj`KoYN7v5cv4>JtaQE#ktlR_v4;$LW`+#zY^6 z3n7#jANq!SRD)W2XNGF;&i=yJd5}-gx_NMpkDD@ihR-p22ZVujpf(s%v0;(>cSh#e zQN)0m4s6%P;l9=^0gcIyw+idiYa~@kdS<|#pZ`fazd{96NDYd85<9K&x*I#!|00JX z?ne~*-W(+K4JUnL+MT2VP1?>m)`?QN34Ij=t))&Xf=;sT7Zg|ok1R3A!F>SMRe&R- zicnVPWDYmIsr(nH{IR(Fjp)&Rvgh+m5gNr#hYaB@aHFW)%j$=W>NRMddH>Y^rR-&uS_*aL!LAHpx%z zMMZu?CJdAxtck{t*qQn#FSh)Xm+XeaFxaUlYS;4EyOPh)3%6P4NyfY{6E4KvNQ^*J z@m@9_N*Q(%=vh#X{*qmyrGxT$yQJe`YXU|ew|s@Y4d7PiD{`S?N59=^eF@h1OPp!Q zrNxVpJC5MMNm`_kT*~BkJ-0zp`fUdNA}0rD2kb@*kC8|F!6P)K6sxkyDs@b$jx^a= zua8%;B+{=dk(28yeeJH-HR)H)Ih_L4xCGT$&oil-mP%L1) zuOu4tRlZ{wWz&F{628#k!Y@VEamT5uTTD^0^GJz`1Ty&%RO~2&{83(R&!)U^M*)s{ zfc$|1^Hn*-#JbYP3{A>)Trvwvgqir#^2~!`t#bt*PCtd%mDt*$FVPE`IQeEHMDK6M z4zhrwnAUw2uvCMjI5%@Yp2HoWLi!1q``6Zq&D5_)`^ zP#cu&09Ne%+-c1}F%zrOM=AYXqX_#MGQE~+c17QOmEnN0>LeoOsK&E$Y5{iELWt3By^_fI#vK%{^AHmdYU z`=^-#JP^NM$`lX}yy- zui!zw1yP|NKpszU(dfwIvhVzR^7!g!EbkG^<5PXI!jVUheSV|hRw`EX-#S1avHnwp z4bb1Lch{!0Ur+v@9hACEj}N|m&XMQ;X8|5a|K4=C{BQK;Z+w;VA2xq8Gk8lmDXv812vAIxf@r=?#C)!0^wW?53SO@Z>*L!4J?LUYeYN!UO;Derf0f@$dc& z1ex^@O)W+*4E}>S;@$d%LMI0L>1n&yZREqByO`33@xV50LxBR8k;cQ!1y%1(%JOFB zS7zsj0j}hCsw=HI)essjn6{r3P?{f${tNlI?5*D8o7Wde zKI#7TcOPdTasU2v7ciRWPHTDn;qv>A3qH!fV*pd{m+Uy+i`!3Zc)@|yAwT;l=^!qdpk+i(}bBi}Ps z`gDC3yp>sA5B|bF@E;ri|C^VkD_{7z$b%pJwEfwCQb}!jyi%p>C6B%3>qb`=Qs2J= zXutMjZ}_vl@CUyd{AZV@izxYr-yR@;5C8w{0v7%}2;hwNgxTu+41W~ulOHQEku^s? zvN1c-TR!w7@~57q@LeH}(cb>l{|#4a4#*qWl`8Ga!=ImHoll1UrQpL%{&><~<4yn3 zJDKT4-@5%xWaobgmQmmDk`uis>cwt&+kg2F=G+V3L+=DHy&oZ>Z~1h&Yd*L{xZ>vLrap7? z+H*nMe?W&Z4TxVTM8~E&IW=hk=YaI*kJ(6TJx*h#s+GQG`{DLzIRvWA@lV+J&r$f* za3_V^I`CJ;8jzE+8*Q8({(NzAU%n z(zm~A5Z|t-{)#{0z$+Yb8ti2Pc*=W?0vgUv4&2!(P@FSzI>_Gg#|Czm0>j~q@N}#G zOdwHlY1gYz>B;YlThfmAAZ89}0!&`+axkXz8JLQ{xx^{e(Rs}Cx2fi z+)(o;&U~7hKl$_lRWxr?7!cn>{o}j)!M^dS@}%sI1q#FQl*nMy8&Q9}r4`Evc)+8` zM0_P*zi?iA>CXuYezd^*pA_KjT@CMKmAAGGbBR?-f<5`ad9!fDn?EjHbLaoL^V%!_ zpDTErt_u3?{9C)S`zIhRZ_a!L#qDB+W-8I>a>9VQ?W&#cf*~WW8d9qx`?SAL^d2mN=pwxq7T1+VQn+q67yP(UtuuJ2Et%hY(W z&YrXXhxKCx8(>?ggD=}|=rC*5oINg~wn-jPzRp!>psz5#2knbRW=F`h9~HQk{KjH( z#w)aGc6i5EAKxUL$kacah|JJGDScn7##2Gt9sQVs4yR@~L03@Gl$r^3COgY8@!6tg zNkOX2gErvR9$#t6JNZW9>)AVrOldy6_|1+#Do zhsVDWboxWP0Drqtia$jdN@-YB$HINtI1_qsx$%<@|;;<-6!u{iK0`W>Nz;7 zmFWfcKT90Z5-IS=mxmv3-5~tHCUgjxU4G0eQ^H(akSX(ixZo|nLYN*8J#(8&nS&xv z`UT$f4|>vj=+7MAPgKzT_U8}X)wdFMwU2ar-?2n^;j9M&>OPvgqJOc}AS*8@)d&%N z&7Q?tuCPpJ6OpwAY$9AthB^a>)ye@(ZSlPXudGDK^GmE!Ya-NOx<--x;*_3nNcQk= zg32z~K7o*^<^JYhT=wa26}a0z&FvG~Yo9vn4;=rD z!lTyHpe3sHG+p2V2|@euT91dp=kF8W@4hzxKH+D*DeipL9A%=!$ojNvGv&b}KX1mQfNA-e;z{3IA5(sQqrfuc=O5t2K=R}0bHZQM2mFp7^abys zcdD1()i4Obb*KCC>X$E~p7K4zT>4MH#hZQ#Ebjr*|J<8?xd(sW{JTnlW$^FLpBzc~ zz4;yTEqejq_pquR?ADZJ*AIb^{?rmaWs;6iYyE7u4Xl3P?Wb2b z68q9ZUkxhG%A}%zY#JOR)COmHlA^9>xkW|BBuR!#P|34IdY(asz>G5@I zpxAv;3_ltfGFObkkucrafid)?{~J^S-TUnjy(3l1eKwvhIEe~pduQk6p`3s&_OVUk}Eoi)n%Ra z)gC!MX}|g_@yls1+YiStC``4X#2x@&uJZY+`bO5eznWaZnZ_g0H~rSvTi=p$9>)K( z*UrXU7p#v=dGMBRnZp0?md`qT`IJ03>ve{!{7#|#4J;0nhJ8ezAq~Cc>(5sSgN{_b zdU|2>$m=y<4IfYL&ZN+TZ^Bo@CubdJlsK&~T>88N%c{@~enoxG%LRIM@R{{?R(s2^$<}OM3VwVqr@| z9dqqRMm_nv`d1EcPgMlqkc=bjUu^=ET&Bj4ch>hyfk(gm`9Gz^M_S);%{Nf%bb5G#@6))HsFudNHVWeUSFkr~Vr3LVsk#6Iz8!Y^J!ZHS}-2 z_QU?ZURZJ(>!3D8`zV?m{?s^&v{xw7w<(~C1 zi*WCYo1Q-8(*=TA3EXE45U1IAq|c!*mESck;2`~nGY*^I*)9;tZ}LF-rRyhK!P)gQ z>a4!&C*8i?&4Frhs)2SZ$CcWQ{OZCqAzXFXST1$6m-A-`fU}8Mg18^(5UJ9`BTE(e%`~0DUiEN z=WWVPxUe0%sa!JB^1QJFdPt$%ED^X=tQBo}{_ zW7YQUTDOk`vOd*{^fi18i2s(u;6HcNzlq--UQg_WUpWgM`X4$x{!IO~)f9%L>g%{M zncVDEUq4p>>H7L;WncB>$iw$M_}}uRcJMpt&+(+++E4nFzAE(6^Na_g-}+*IwCyKS z{1Z5;kUq&CSI}xo8En>&oE&^~|<@qI+tv%0}rYIG?co_LYYe(HX{!Bfq`;gYAYeLg`a` zJ-~)OF$`SZWeQIw*%>t1SHB5YZZJ6WfQBX7XpaLYU&u_r`kpn`qB zI^FisoeJ2tUpKMJ`mm4E_SAo6r2n)V)b^eJu=AJW6sBJ14FsT@`knZ)+n0wQPW{*d z`fOYnqUtB5I;{i0?zet2<#CyUPs!u6zmQT6VE-wAv_4wuvHvpZb@oTv zV^o8(`x6qOeK>^K7a|6}WfUM<$s{uU^V>GF>E=u=7G?|QW36!<{v(RR9J z01{U3tb|blFkpF~Yn1Z3>|-SZj(vFxjjO)6==7ep{&VXO+9%&qc-{8NrnL%HpZcSh zeR7gQkkQ^Z^oha4?~fa#L}`A{?~C6>ss8TI-t>`y(;h7rSQ$HU2 z<~Rj@a{mIKvUDbqkluBbiNDO-{%`5C{qM4I1^er-Q~bMGAxQIk{DAG*@xR;V!nq21 zmfL((CV4OO5lLF$c$bY#9@}x9O>Mo)Y)%PiX8BPdHGgS4c%NM+v5qRR4!T1}edSiRC5PsL@&Dmw z;Ya`Yuesnz@b_xZ7c0CO?RnOYzBGc+=hi3e{>LhCw>>iIFMUC~^^x0tcy+0iDoa3A06u7HCxOUvN zV)&X@RUwYFzCHM#y~$hO9{e+HNgWu!x4yom(7Nj@*ET6Kxz%gDGgU#R`BgwT7r#9G z{o+O`z!9h4qSA{XIQ!#Xb7$ef|8p16XRIGE{Y-EAX9iAR=uN-+x0(3+ zmfu%z=q>-hB4jW5P1~=(QZTl?`-IA;mp?F_{@RT65BHZo<>{+l~;wxBdQB;dQs);@|frE#C4w<7sY?q5isDA+q~FM|D~EyrYnzdmGpvaGZiq zjW51rfn3_at?ym_fDf)0zPRb1_LbP1I<8T)TGUdC>W#7@^`BqFAks9CG_Q$REV7`wMWa2{tWiQzRcbmfJ z>W@-`MrD6YSgmTd-xlL(zcUrWwEmt?1m5yx*b^LJ3{qgC#+~_~GwiH0dl;3U9&Z)W+t`YinUuyLJ%j%`e1q6WWOzJ22(y^LamSE^mGMM8qQ*uKxy{U7keV&Ly~d z(R@uevi5Jtiso4z+h`tbbk`+qQ1%ziFGMlKEk$; zyzV0^qp?T*a7_W;xB>t-jH{PL@)DJ&CC|Inhb!?D0#f{!;D3tI$Qg8_k@Nj6jSs6t zA@vhcKXduR`fHreP`oWvzC&B{plg5>=M-*xkCMMO{RCpylb zudr551k%z$f}u%L(7K=ggCGtfhRmVH|4=EC`Yn768`lL@j7ZK`AQAi!J|Jf*tn zh3JsDLHxPhgH_7UY1u92shwCm^pbVfMX3E-2^8-sS~j#pf<@$f;&zGw3WB}M2JVAl zJJ1679~Uwum32N~&3l$0m2uBvJaN76`H|_5Q98M?rSQ^Agx7zK4)G;7Q1rER({bj% zTuE!aNq!r*iVS0-X6V{dWZLy1b2e@z3f&wWNz9%?H-?Fw2}N@F_c^+Gj{?~d#nPC< z0~bpc4ah=UHwVa>jrGTK$ic^$5I;m_ZtS|9sBv(3m3b=}vMM_|U4@uK;)2ks+~^o> zZ39wSchn&%qAYzLmXi;&h5fR*puOd>DxvMxHT=PzqLU-$3hQUMkQAjqR!__>izF_n zAmOldUeV31qHne2j?nb);~r9T_7r1wu{pcgm|a5F%JM|#!UMF9vh=0Qx|!834Khnl z)(5GdF4iu>HL%$BQC*&luiFCx&cdMVL(M#Z<{7iMTi|3|+>Nr}^2;_>H+>u%YD)VC zo$r`&3Xf?}c68i2z1Vz&RmT>#Bw{>V%#ugUUz1y8JE`QToh`~umXXX|T!Hp%PNHdf1p0oT-yj2^yVk^y<=wNeS*PD1Z*Y8FO z9AG&rYdxtjaczb~b@8TRb53#mU^04|8E@jZyO!fwx#9YWr5h^Su07g}x8PmEh0l&b za%9xS`|k9_U2E|Lw@YltkMYPRJayw36h2y@P-%&RLEVE)lL&M($1p`p@%kdkJXx#9 z*9$XaC4llbeGaU+ZzNQ){$W7GMy?x*2y4PwSw1^m^gUG)^KpWO6dFiYQT(Rjr1|&Q zxcHZ2Vj~sB;K2~1s>G<8VpL(aC+>*Ni4dC}TWpSoHiLaOrvi5cqmK@ouQ);jUM;Kq z;)ge8ttaug?`?>e-Gsx;3aU|%{X<3y7w`@*ba8$!m91K+t81WS(-Y(<_+&|iUHtrVb9xf}_x?`ahDSl}BdRBf67dx)PuMhv-L+vn{8*Zm0 z7Gu3qOj4~`A}*#$IOB2Zs7jN>m@jMos$IrijBorkv3(y4V=1MBaIYg1wDTq-%!(^v zr0SLJJKzn(6|KXOY;jp-+CSL6MT}?&s{&EH5FdCyMpa(@v@F~n@BkyLF<<(jDFlTS zztEeRtp`3a_rVen(hX@TM%+Sj|6`woO52UcDU-(IEqI2EIF+#~K@!&)LZ+yrUP{(h zm_4p49;cfPK1{??OB6)xDmGtDZdYS#6tx0QKlF&|z!BB|n~h``iUFYEY&=8aJ)`~2 zKc(I@8yoNqLc%s%7Mk8jqWnMlJ*vfQWIar8B%iN8QSst;4FHObGbNb~Tq@~8m95wQ z&=iZoj;CnhU*t)NlAz*E(Q;d?TZl%F8N!=^rfg7FLv!nrA))C81t2;YRtv?-6x&5L zKd`s7H4(~Bg2g@EIq_|{0EvlFz(72i?Z0ge=noktFypLARO6{iZy_^8D5pycxc&!T=(!$fCCn=Tmy~==Q|emOMUF|f8WKZw4Ysqw zF58Gwgi1vY3{gxF3PN=SA+C953w zA~v`Bn^%Jbo*wm*H3Ii*s>?3&AOf)kb^#U2=_0$aG5j)u8Yc#8C`Fj!xgsj3O;I)7 zq`+PqQOKV-=pY|Y`5FuPicPaQ?Lw5wvu|$56&a~q*&tQ_#EZ(~AC*;?zfo=W;Bs-z z{3nFD+UyRtL}_;Hhy@a}xLBb~-Qb0Oik(rtW?Gv6v99KiZx|~EI-7ibMzUbbA0I|B z%&>G5r-n?EJ%o9ew24ISkVNh&T4n3?qqWNI{#)5lHM0v#@fT;6ewfq67IQVPs$23L zI}hHrd^}o*`@T{oHRczUQhomB`9M)=`F}hYzw!0tpwHht8$V9%`J1N8C)Tsi>9?kf z3RV?+DK2kg#eRUxh*aH`?=YWdGw?rlP*s%OdsUnNV<_X<%&EzFA2NV0%<0nBZ$buo zM|?N)!Jn(c8s8vFI@L)nIjx^g3iS~(9v}u)uYY&xsS;OL1cy;ST@f&#iyMNj&EGtV z1rmX`1r5Ck#iTjuZ(0WmnW*U*1iHBPXYEKlde=iomw)y_J?E}{2;74uWH+yf7P%~+|qZIasHRF|LMLMcyeR4 z4xZ?Fz|m%9Lj}&LG226CC+rQ)%n##IFY{%yt*tA+?cG4*JHDjPcOoCdwzs{TKMein zlX`O4%i-h;no)ZwwuL>{^V)#}@%2}tB)YYlsYp`opK$JP}@+2KGs+`2bg z+inf*M3RPg^IPA^F3ug=iJze_X1@>`+E(2%C@Gnk@~n)LOjLxw=B045J&bGIOd+9p zG1O+)uWU;1$8Qadg(v^NP?Re7a=YA}TFdYwBlFwb$bf4 z{M83|=r;9?2|d$W;Kgc5Kcv5hX@g_FL&de)IrL#W*_z%(3kp98`XF-48`P=2TxloY&Y0pY)$B7pE70*(NFati*rBZkj$(cjgh7%&K{AHCT-{s8+t z%_2HKUNgU}hFDG1;yqc>qw&m+j!c|)V%lC*)}q}LB57=x*~nfnF(bSC1VS-_T8$AS zhyW4mm?Gzf;+)UyzH=-LU&e)U+O*1^>+{Von|EmbaL;tHa$_eu9b9Ze<$88**N$F0 zioz*VLNr?y8OqL?F2+`DY6@tQGN8=62wM5#wIksZ%QxFFbnChHsYLG3%AV`im?kxW zAqp6u3(zli9Qeezi`qbS1c*IO#hUGgD0^@AG`n%~8_n*BX|5sUz8ZiXU1J(FyBRJ_ znccgz&)T`D{_a1^84pJT#-X2OAX2U!V^TFwTV zAA>`s8|YulOv`*S@C!^PLVS-7))QI?jz>a^d=^0{2slI;O|U%af3qDDFIM?{?Q!}e zdN~uBAN;8y)8L3eH#aB{E!kGSLpM7u|9{vpX(y@Nm0I7hj&%S>z&rjXY)J;FaW5hw zu%Cj~&jfT|>}6~IM(F-VVZ#7KedL52cNt$xFVwHD^(ut;OIm1JQU)M^jM zahyH6J$!d8eSg!}$S4YHrWFKBit!j84ax9NqqYF{=X*_}?{)s_g+k+6C z>Eh3L8cadcO!+fp(B=3u#yS2BmzCBfi&B(NV~R4CQa+9G;>Q@{@@WjUeHuO8bt=|2 z3?bhs!!TkzvK) z0k%>moWZ0xCm?+I`>HMqjK(Pup^Es!_=ydri{e{!Q51w)B&s_{gn<5p!#XHr$ca%J zrNMSksIk6sP^cjrER(8ELmU@r2Zi!Yq-5{JlQ6vi$yMU&ZUW6yVMB8Iu1qduj$i~+ zOM9SBH|@rN7}y19BPnbLPNdryZA%=+_3lef#lIo*Tjel1;C>&X8#loJiWvmXI($)$ zR+)HUG0KC6rGaB3Qy4DI=E<`aC2Py*N)zNZ>GI?8 z2MN$?wg(mGF~j|{3T4;!Z=`?7<538nkm*sd=MK;(qZ7Ho)`8Y3#hd_;S%paAviwNp zePnHHXxPNPQ!;}RHs|EaTNbW^4|Bo-ZgW-)>Ic&T81Ab%38hr6gOgGSgB3Em#q?P8 ze_%8ik4qf_F*`Vn(8O_Q_S8TJjjb^o_KEATHHxACg|Ok~RA_W7-POa|ML$B<_?~mc zHU7;7bdCQv6r#Ase|9ng#^aLEczj<<8ob`9&6~TrVg0xmoXOu>;|?WCuZ7gK5&D(J zHWD2+4_ZawCr7?_Q(({q=-37y9Eum5lvsgqnXd>RFn5F5vAbzhCq_>NotQFa$`T~> z;kO9beAXt6t;`;j8?`Uo!)y!diwov5Pv2^nQ3hlsZ|^yr#nIJVlEG>irW^AxeZ=56 zdU7%$SxmcpsrebYF?6#_PkcS}TpkF~6NSH=k2}BvIqqSXMTSfsxI;M8SrA12tSa}XEmLG$VoAsw^gTx8RU;BQAa^v2IwedVp)c`_G69tAmy(P=Qj zNuF_=t>TwD3O>GW2>?;?Jtn4kUW*kf2IG7lf~@o9qc%m^l78;62%3*C21Mn{{#k8~ zpG-Lb5y1hz|1r3(h*bF%Y#$qT{6T{g66N_~hRpZo<3cQdQ#%lAiP|hMEp{mj*ge=K zLD!zdY+)VaheP45NUiR&A(!r6#_4GFm427_KBTk$CQi9ny{E;V44I6W50Ft1-~4dn zMv{XjAE9`0noI{%sYvmY(bfwAiN{ z1G13%{}iRNHle;;rD>+iF^xr4owu$i-|){}f(wCzs13A`W#@x^<(qVvU1f-Iyyv(K zb{~hN=8KpP3s`kZ$j7c73ktfgvGS*j&<|Gc3-kmIAJEn&K^7(H)HUEF+QeY-;B}wF zkr0~DHtY0%vCOflm^h>k))Tj?YtctfnT#^R5fU-Cf;U=xFBph+Z|yyX%vvs_>E)ZP zh8Qq6ZX)ehz+=ebxa?!o5Oh%0W301|1!RX@yAG1=31_f5o<0~G&EQDnoWF^fvjQAPEuRKu3cS#!hRC z6hT@f+vf|o$;b=?61iZBzzbF(z_=;SzQh=_5`z;}V=6z1W%H66B@abcT)rUHL!uXA z9$oJNF^k~5U-`NH?pi;G3OuN-3m~~ORZr1722-q@%{8|%1My^E(e;;q+FBm#4v4>_ zF&9t%srh1@IIl?PLq8TF8`EHVEWHU~ZZna4bou_U*%dKg z`GTHv53{i*+?3}t7WlFrBDkUlx~4)6&w{Kk*WKAHuZ*>rxN`gTgAAe4A&s9mcg>lo z7$I-AK1cm>o?U}mdTkj7vDQgTAW5Zr(E^svPPKp{e9V{L`}K3u#~epeT- z!f*8%NjQ|Hd3?q}N=~Sy5?#V=7ej*Aq5=4)F3$MSqCT9D4`<4UK{mwq)rU#=Fe>B2#p=UQX@XtS+DL4B4$QHR zLES^~%x?r|tkMJRxyJz!K^FsT5%6I^|DuYSFr#eg z(KDvsGP)&HP^2f@us$HUQExoxL!Y^HkG^mNn`2RXD7VOGo!p$~>pnwIEH5s?SLC5R zm1X?`xkk)4BBgHwa8`TMcz(mj&%3?`eJG2QuF{O$VwK&Z8AZ{nXAFs6Ib&$Fo=xFg z5{+}YQL+BScJz~sJOz>Z!cIN0^ys8s`T6x@!6E?W12A{S&{)2n+=l2McF9_~ondoJ zsB|MVv^9&gly+~dCet)ro=m%h(J zo74{MIliG>7FR(N*Oo1@wxC=zDJwv5Bq1ok=-V&E@Pt^b=11~4Cn1>qO*QzfZr%^K zHv*x`eIftseWp2{UtjPyU5elM`XW4i{^lTl%y=22dUE~EpGwJu3aax^C=vXE?cqK^)6^HbkeWg7y%q5#rUy0ExzcIvTjYM;bn0v)^*#VNA)GnnN>A>O}4^_YW*}HfMx~gdYbKuMhFLg(m8KD7Y7?do*`FTt^H*-Fre=LB;S{8 zwc*gE_XceND4I#}up*FDL?pTG=Y3I>F7QKNM}bceN_$9YU3+i{3p-3t)DA;o19mAf z&yw7rN~sTPpM~OG;}Bx!&vINa3>zYPQ;`iS%s7R?h*Jo<{u9PtyeB6%%rNEs>&p0> zXursn45c5w!2E!woN>yHe<67zNa77tVKXqD|D|18MaDAwnN#g#8cJ7*F-OhL1ew3TC)`a`sC%((t&F91TNm=~kh3|eNv=>@*Ez91)^ z{>7n2sM3OnJahp@P$(@HYeBApElZ0_H0<2MNwn7L(Ikwujw#~VrLX{kO6Og{DdN?# z$%})B3QpseUA3aR@^6?nt@h7;KfazE^7)%K;F)UItK^048m(Fue<|I<2Dq3ldWm9` zwGk#Ghe`hCHwdy6tnoK*LQpp!Q7t=Kyo4=#i`}x{&$T9g7cF~#v=S4@{)tUU%hV~Q zfg>Ye1OCPOb_#PN5^y6bL^`U&&$us!#X4yTRPqz5+za09O(9xd+yJm@b5j^L!UP*v zY??g*1yqx55h=B%3k#xyl!R2%RklZ5WzSJsyYrqy55ijMI8Ai_xUW(7V|NSU!thw^ zvX+e{_rX}@9fx4F07BNMq^m)&c;akp3-%VzTT)$-wdUyFYjEktb{5|z8mU@rN4MKv zv#oJuzqTNa(>t(#zO;z+dhFNHUAFz2>JP0mK29dFNG1_yCXvL1Kh?mszy+en5zZ|` z$5>a#vQfPV|7G|uG4zV7I)XE@e1;x$b)Fq@n$YYpmgCiZ06vnM)jzeVSFc)n1jBlDi>=0##*ZRnii&n=zZRTRfW*lMMr@K>tENh zS1sH+6*-`;(FTu=u=4ZJOrQ3FqexwXp+k{XiuAf_fcc54(ym3rSkfnowi2~cPZZ~)%n^t@Mmah(l*OT=Ft!lgfn(NU;|8WZC{xe=wvnnA+jGxsocbSe^*BLNN0 z92v%p-h>Zgf1U!YiP44j*Z<)whBr$ZDt*z(_^=1E&UBmQ1Et4mQy{O~U;dApI0rP{H6-)K+xP%v1Rjnu%2& zzUa)Er}O8mndSUBZRTD0@i*UwX9eot-`s={ioXuRPvNjWf=!7|p*E{)7BmAEBm{1* zNRiD#eRnMFo7f~+JVP!j^#OQB_Ny7z0fq8Iy^BT5|_Ubjht01p)t%n`_iP1OM>Ffd3Pt=$3 zz;Lqql4F0_Uc$0nl7o><;*z0k>w*;wUZbPUh`TX~Y}g`jNjNQGF$?s>MQbRwGbM`ziM2+kZ*taMy`K1~M2<(K|0$pb6R&D+y(;9d zwzOo2^~5L|;De|&x^`oEVBYt^?s(7D{#)BQ&Pa^D?!)~_{a#!olf7pGmd!5z(I))p zIWH#P0b5TxMcDeB?q%znBf!>U$<|GxA_@;pmXts3mGW_>ggW$<%JWppWh&*^UMbIHN{l6ZUE?JsRz|4tCFeY-C{#P4qtT#=FyiL#!XB0Sgo$<*n-|1$cu1Lj4KgWof{n);VdwoltgQ&I|&+#~GdN{4=RXzT{Yc#X9c0&- z0rj{WO6EgUC6+3v2%)9{syqYgW(9SrtBJaz@Y@R#q@90%+Zmyd((gg)=g=^fCBs@5<6o0Qvr19{)#leivcueHL_wC)BL)c2K#G8 zjLuzF%a_e~LGO3-ENFN-+2#*B#AwzR2p-OsKy#W|bWcRW2ooYfNF|V_!UVZUz&xp? z(P3Xljm=RzI?t{XxKGeFbEj#jgLQwwm#68ELDMWz{)?)?^i(w!(}d?}^YpNpTMSzO z^Q^$}e}Dtp>Ks55kz?EJvgSk9Wp<_eJS1DDl8u#2+~&`jNQOBy9HfsqxWY?RvVHJk zIGEsT8-X=|9bQg-xmBI!2j`M zhWO^-Kf*gN@_bo&dD%I6|Ns7SMA6eG&sYUynn#xgXu$l(7*EEmrB)=acSQQ z*^1pKGO3{%YE?wYydxJy51I3d%Xd^Ia-ns{9X)R7Lb0j@8XONE2KVq$#;wl5*p)Ton^B8(Qr(6fo=EDY25mPU;eN z1jWCAr9F3Wn1-@*!yj6?6x_~4ij2K}hAbV!*k2AUxAR-kDf#V)y%aL;pp(o+J985H ze9wLsN8ODxnlHonB9_B-QrX9cSSV zwlS8mp!OfIQJu4{j!ot5sS7>1*Ul96wO0xzsTEVAp48#wUe}CZZ+X{|om<|A4riG> z{-oz$wdK95^pH;`T5Wm{_pT@MUJy?awrD5vwyGcopLsh~FbLKgTCJgt#}AeRYkF!a zmE>U0uP!YPK)A5%(A?10lY@Cw@#ebN%;17 zenYJfy>u(X3vr+Pw` zJ^3Yd&1GdZn8loFVz~i&ne1Z=e2E|CPtuF9{tqb2uxDbcmPAF;d#vVs4BnCrZPk%) z%s$lhI;d#4DFAQEqX?OE;K!*Nmk3Qy-gn@jc_H=~Y=JplUgY z+n#HZ9p1d(&*c4|(LU;z2+V@Fn`f zEs=$-Ph$@VTm-|c-_FG>7e0kBkuXCD%drmZPE2c$zdtdu@cHN|Zhy2VKkT;4Uz%5* z3@2NYTVs1el^0Hl4MxXu3^u2Rzy-CG9tG0O7w?0>ffQ}$J3o^{=Lvub>0Rnhf1MpY5TAU3w)nc_}Vtq&{27s`_8ZC2z$bj&71 zZXw#ejulZg$hy|L2yZxo;xuvwD(wta zZVmY_*cvgPhX#w5Xq*ijYrf>Ph>iQV&nn8zj(^TJ@dn#OtCoBr_J*rXL>BHvlQ;%V zqQ=|=YaqvO-Sc(0Y;r!*4(yqgnD)Ni2u`-=Tl>bISN?`-0dIvWZ<%uQQ6b}&DcuEN zp&rJRP5Ts^oeRKUmYiGp@>Yz2ax<6Ycl{9Rf$MeaI9F0jJy}l|zjnE{AT=>>_ZO(c z3J6I(2Oe2y&PCRX+)oq7Z6J~Y`csysP=~6?xV*07lnxD|T03kyCn%J0KIPb!xp3akEiS6YCM|(xegOnwr3B0&XYzU`atj$1#**A{d{chcH_OgtH2x)R34A#tlIekT6Wv{N> zf^KMw-P%r)*5>XHX62);c}nZ=Wk*|3T55o?g}9J*7f_@zBYAr@iTfh^n<7f=CKHQ zgiJ7h$?qtCV7u!7!FZcMbp9TR%j9~QNL+e;`2U^%t0MoK{Qvj6{8}vNL>032Mu&#c z+x4JJ?jC7Y)nOBNJFEp2moq0nWc(mEWK5TK-n>AJD=4E{?qSHcCc|ObrE^vUoqUa) zd|{n=8gqj_qonI2f7{uz$8`!V*`VP?XJPr|Lo~i3L1xi8hpqmV;+O?`RJ>F@!AwU|VZX{d%Vw!#b44P)x z$AARD)k0jbaQ`H&lyCrGxAGF8JUousyzUudgq{ib`2;`x(e(ap%%zzQ8)2Bc{adG!*bDs6390hZ6*!k$Cns)e`u1EKzHTL+5U^Cs$saAgzmI9-b>k0aAZv<&@ zJtjNxI?;dY7;!y~zHjUPWO!jKr}pkXQ>ONo;76wRs4L~;aV0|Hrp(vnu2(_=)PMV9i1atzkEcXs`)*kfjW8HQ z2Gba5aB>3i{^kx44%GJoz##{}cW1t?$b5a!^(wjK+O(q-{^pp%_^>MxFs{seUFCWe z6h*%1l@bX06uqER(Tll8#TlP3+uuA^VSmO25A16*U!TZ)U6c8`+V#pT!FvDg79#yk zui^pO1jh4@ZBi6yQn(qy$$Z zAVpY&fRtfzbyF(~5!Eonmr^WYNQ$wPp`q6e%4vjP;CPRx_YUI=^%7qS_(Gk|a4f3g)Z=n$=^XXRnz6yNxlxtdJvZ$Ll1sCeAP&K3t6 z6y^K5`r5Q23;%&tV&+@TJC;p~n6IIC3mqQjCy_fcT-m<# zeXa5>e}d)L7h<*LQu;P#Ui#TEEYX~n@7VWaxnQPxkc=Kj!7lg)zSF~&Y}YG$mcHGc zs~Itn3E=pbIX9o5+!$H7v8J;9=1DlwY)+z}NI&qp|H&*Tf3Eu9s3&qqF#ivb|IOo& zH`C2(&n?0kju*k!H84s=4}PMQe?GU;F0x15Ser`gEPccx{fOf(sV?6EwS;hWe_TC0M zs_J_94oL=vk8lSC2`U3aDk?-#+I~GC}Oa`>ba@>wVYyXRVXD z_uPHH_daKzz4zHi=PRlY#D9EAhf1I9c$QJh<;M_qk>g3*lgw8pT@U1QLTKc%o=HFr6 z($&=S8`RUjAVEwd?z>LqB${{3!^m^HyO$%A2&2M^L4Eza#nu**~;boy(B2 zGaIs0WxloQWbp^}YYJ`&o}N@#mpb>>+@dU$LD$rl#m>3&-~E9}DLKe5Wv}e`zQZTG zSNBKCuNh6{nyNSz)L2uTQGLiN^bW>L<@k#@O_9QN-ST**Ud}8iLgri*!q1-Iz_&*V zH{gm8_KprTy5I*Tfq(Z4@RUyxQiXv^-YIj2ROBF~ivJ4Z*?y|LNFd2Ui4SFo>G3D! zIa_4IbsK+UJuF78+J=@0Jk)$Ge_2zWj84s}hdg;lsg#Bp8r^Gqy*IJ+#JMA<&`Ta8uw zO=E4Fv9?k5EOWX_l9H!*@Fz$klT9S)XMSs4wJ%iCw)kz*ZAhg{)sXh$V7HeUFMV;$ zu!Y%XO=BKiMEl~VL}b-8aS&}Cj7F6&_^qa@ZN}Pmve9Kr9xS5F#ohHKv;L+|OJ+?v zv*sR|nUY_7Rlnf3+NEM0i#O^_o1{VKH`4dFpK29u(d#R9J14teb$_~>rIBxUyhrif z9V}vkk_`*bm3A;_mqtjK-hboi5NQtS%?2}Bjf=OYW_F`ie6W8?d_X`F4NvQDW^xl< zP`j1fK$3>c>i2u1n3i{_QRVbz8lo41bUC*t`wOvd{)&)&*w5K(b2V~+p7IcP$6HLg zlzWDS-E-l#9`&XBn6MfmCkuLh^hNnd7aG> z?TP*2WHTPiNO{}enFqp7bNA3F6cfE>uE^>0riqmWnmb%pU@|UT2tA3Z;ufWJBAYtFQTgN|T;T>W;>@%sXO ztrYt55-}#dD>UA|j5 z%a}mWsPphAP^!Ku4;@Y(&&iGia=F(GB1Agl;s85z9%dQQOV}q(ZF9lM#T`T4CqpE4wO2&4rluVqeURU2rmfh>A z@vP3r*@@?+x<3k4s|W_ePBqz}U-tb&aX0n%0^wEM{jG|tzMXdgg)yU<0rwUi{T13LnVNd4P7{7jPDChC<_mj;zgr{l z!d-T+>t1(lN~^rD^XnAcV>M52Kh`KxN%9p$s~QsI%}$c?>{Oq{rubQy^OYh}v;TL(AC zLU4WG2s*?Xp4lTt>)#WDhztNlrFtepW)!UPA#a|_;m&`eR-xEsfJWjksBw)Csex-1 zC3g{XXn}ZGRH8pel*QzyP4ZrUjrzjbR##vsDGhhOCGC-ziEIqsJ0zRYMJVV8N1Z;x z(#pmUg*t@GjAFN?~uurr}A%h?#D*?j*pE& z@-}ET8^E0lzCk(`$7Z8oUE%l<_!Dm-6QiP8GQu--MNal|KOUj4=DBjhw=rleJnkMd>(p*WZE@C^@#cv;Fy zB|F4(-;Q9fYesw_tv7(2McZA6_e2U)Ed<@~k!ZXtn00pXVie%WQocBIFWFE!Qj9g%G0iHwIkB4BpJ z^s;H6KYVZpI1qCFZpN!mm(KH<&U=YVty)$=oPcLL?J4JKS$}4(DzV+4hYOp-C5`hr znho>TDBR)M5oZ!q-)c3v7jr^-U7lE^^of*g2pgexDadDKB@-_S(?By9Vsc>AKTch+ zNONA^wmYlw%<Ps&!*@^}nqCy{Wv?+>OhVHu&IhIgRFAS|D}YCUvZPP5MdH(}m5E zl13x8LB0PlH&U|Qxbp>Grp5=H9K{P#Yy~f2XIyUB`EF6TWL?#XVP{gnD%m`53bTZq zR1GA8d@l&cCI7~1zK_e}MHPLH=5HgT=U|F#6;$`*DUT;SS6JdXZA;>9t7Q8;Toj%2 zBGV>A_g>X)rZcHHQu5$NX>BzYiFN8p@;*mCIj!4vAM7||e0E}*RdQqQyg+31jJ)dJ zmL1BYm3ByKQB`b}jL)5SzGcrTqQ2Cny=tIUGC6l1bDNb%%_SPh^k|v-io$3!=ASk> zo}FvO+Hn0i&d+mTQs2e7*pG}0bpD!ZhGQGE5K@IXo72BFYG2{EnmPeB{Zs91w5f;l z=3j)Amr}mN6cG6jmT&Ps){y!}cYCC>`24 zP6}X40vXA0K{@|UL_Nw`82sO)nnq1EXST+xAet7_{(f=PzM+7?XlSZ&#%DXPYijd|-|~KZLhp!3zs6z3wJC}S zNXTg0TaZ!J`Ca%4*+#Q=DH@7L*5z?AEdLm#F|zk^IQJ}xN*b#3BkFNOk<>0RTn*>HB6eS|`?{)`P##N|7G(aUu$yGv#xh=HvU(aT zz1%Ug*?)0l);zc)c&5lTkZz=i)7*ynM4Kj0o^eGhZ$hA{H$|f9FTHpPW;NorcCvF% zlVEPdxdf-#dq0m9GM6;rcuTbyT5JknRB7b2`C_qLBLH6e{PaZWzve8QHjgsv5KQ5b?u5OhjU0p zJxTtB@<~&rd4>sDhD$0GS&mm^IbMWhqdl_x zG;cme1Jdkx_6eFcONBNwt-gx`&?aQXAm<_xjBSAA)`e{>Ir_I+_5}YFd+0S- z`}<6DU8M?Bt%{c=S%!y+CS^|`YZQy5s6bd2M}C5(9EOST($(3{n~C1m!CmqiU)(<+ zDwd@pgoG2k{A?dcLJ|Vn0!?f6DaFTz(9K}h%a8>NkoSg*K%#@O@)Zo0x9$66T~^ingIhUq63mkGGABfwna!xNrZ<=3i8Bz5kB5Fcs)qvXnJ;hK zV; zan~{?4O#Oq=Xcv)I1^ol;!Zk(&Q|l_Yr!+On#kI^`4e;7J}Q%%0%1$ko1Oyoo0pI2=UGOrs_Us|0Y?UA&IW#IbvUvM*2VWI^LcS5z9F%ds=q|Vn0MRUqW88 zYkLgmq#Uw~eOfaQchQ^W*~5z%H^x>C7QMl9SYl}w)2QDh7$}u2IlS<;h%=e|w^)VS z$slhY&7!Pue86an@+@0Eu8YRG>@3y>tFf8RknP&wL1Ft=SSm21yHmRG1bt$}9`7fR zT6Ll1APfum(l;GnoN2WF)A^J-S+AK=k9f8ePKg^JbmnnYY8mc2A780=ZRQ;;ctw(fxTt7J??;eA*NhHYX1>kl5B#$gDr^E+mme#dYmoXDY3LCAg4wdd_07pv9Jfltye8Gs&Z_LRS z%$^}O$KSv?X>(cxP0ce{8~}}$tTSSm;R89&PYFid1YVxR!sa2S zhG@wp1xEcl5Lmd^B`nNg;pOPTCOkleaqJSM>}r;b8}bN#R=gtPuHK}NI%WYgpiy_2 z%~m*u59I}CgyZ+i{BAk@A}~OGt*lA7^OXnZ(tvP;=qjX7^t4RJgj>xbwX2g!EUS@e zzNr+YcU4~;!Wnm7%qJ+Xs&AxZmvN_9uYuOAWo7tWB0Ua*6Rq+oK z75^|%@edP)e=zFis?TPwac3n@mQBt7D<6UOT%`z;Vw6e&djXr@`88fpGmP`+XN^IH zK3u+a_p7Y$v2Xj2Kx~YlTJmHV!}egvfNo~I^QzBdteFDfE4mUg>WakD(oC`kK&Yfq zD{U5xJ;*1UjHzMg3UChAqGVS!Tf#1U>l8J9RwL`M4CD^1SmCFPJF|$Dk?a>$um1u` zVNMvzD+8VHDioGY+7)V(Hdr=kim?iJjpfC%ON+*@kdCZoEXTnUUZHrxv;NyyN@?C; zqS3#df@BjGEqU?ImcwLMv+W&PfSx(kAs!~0wwWEZ zGoyAH+oV$30OP6<**PJ0nB5!)+!8rkI^$;V)k>5iq7qhF#5sCDXR-4?)_#sN73=cC zsr?*&o~f(e&yk{fJJbPA%G%$(pOeyMzgtR}Lv4hkN!3P_?w{4^lumZ{HSvNXDkygp~Aw+}m#`=pj$j6gaa=?gv&LFca^)l*2(P+hzL+AH-E>A`tp73&b z!o7#AlGo(`>6~_Br|8*?rnO2;|gWm|77AqF^GjUwYzrM0b z6vmF}ziNh@MO-5;y5bW8o%NDWiCIw1sjskXjo3A>TX3Pumh92mN3u4OyW|>1>))L* z?1N$*q6HB${l;N8de>#7e94M^aFZ(crv%mVFzdnju zFZ*b5Q5ffxV3b1z&WCHjCXixCZ(m=zLL}(malVPT8l_}N4taH1Z&5vkEDrek0{1__QQNkMl6U$sxP=#L=0mtBhwk>liw} z5pJG~s+?DiXE&ncG{>A<-4E*qxr4SjF${;kBXH!vRa*v75yy8vH8uji6Z!eb z2;`i?uN|6Wtn>}%Nzzx^p_`0neF1rm-&SUv9V+|C7!;k=5c-~EJzcUM*)H}G*bg)W zjU!a$LxmK0`ziwmgrRP2Vw_TFu=z1T1Eby%PWG6nFl2G2>PNZPhEe&gmtZOh^r(b* z>K>H~zceF#j`Td8n>Q-uUT(ce)!qBFBkUZ}y+3a0|GN8MwBlog{SsfPJ-YuN()~wd zY<*!Sa3&@cN$$mRXlB*sgVWyn&Cl0ktoeb}^eK{wbxNcNPc?dazIA)pL+`bZg5Hb{ zy`%9(4qOTHqMQ?|lcO{nhLU0JdZ9{Xs)-MiH2V|$sFg9u<|>?_WU!;FQfGD)-cDzN z12+mZA!xX60w|$qNc4K4DLi$e1WfDa&8kXYiv6lc8Exp9Q9JO69_F7)s`!vcH*mOz zz9@4)7Be^sIX$@%8_WC3;Nrc8zeEx>9d>4_$ToN3#RB^Yg4Ux^IoTd5=|nIBaYK3J zYZV^olGlnEgka-9G4J|F1_S%qQ_K+5f}HX>313`H{Ew~6BjvAKj&{R2*$&`f^s!X zd`3Xv&hp@@cMy|{+qOOtr%gT#NPT#*0i)eCiI$ROA)h+xyiH2}bHC_mMVraGTYzOz z{w}57uTT0>@87D(2J_7~*D(UEF@cpoECU*7L@LdJ*HoHIdZziEP9uOiO-`GJJ6plU zy}ZRb=MF%rG_~|jV|U3HJ*6WX<&RSRcK-@hgPp0aJK@`2*9}o!CrvLECd(o}F2FEX zqcxS@wAIBPBaobbzD`}rJRW6{>MydmK&2Kp(z4CUd zSK6BB75fV8mt zuo)lU|LD4NS)yc%Y$RscP9u-q5URgupSL8Z##0Pube`>1c@dp{B#is+OtGfH4X?VhfwC|`vimlOzNG9@B#8YndSR^B( z&B4_djBKo23h`%E59QQ&IaeBC0`oAPl~FZNGksQUaZ_nV)kj!o0q0-5Rais(Xr(b^ ztI95&5J@jDwps=n^Mak21q|Q$8RxJH-V$|Gt&BWo0J&C7J)){nzg9_YBVXnXbtXvOfdK%194@SdQ za85@zusjV$&SgkG8nyxvn}(U01|!2IFdDXk(>)qyRvOGB9*l;q;NXvjxh@T6nFpg` zD>xIRVde-7{cS()0SKV??Iv#siqi6V(gV}r6`Ul}`OHm&dD?@~uoc%?6a&EX1n9%eS@tKg123hu}+xU-ZWg*$3xuywTlim3~Izs)GvNC~zW9r1hr z0QFmbzs0X^LG9mEjZ%1IM-;>$TOdeLyF;~EWg^DuX-yGUM!H|8sHnweh&&Z!ZcoVR z9;8lDQMJ$~VZ+AoH^@N=1LFyD09MtP7UC#QZh5r}j%dwwhwAIvp=X-d=Ohbj=0huAT|gn$4Ms*x?*wNsYW=e|*57;bh-k zyNB7f2CemNeUk05_9Mxr*kO2MbhwD19&BtFKiDnDxh7keGA|Z;=?=1RO&yK>_+-C( zol<#Lk5DikK$(uq^_cDS-C7r4o*pSJJZeAEZEsSFeUX^uq9r?EoGltpu^aD<9qMh= zJxLSbm#g}%I)jRJ9$^p0K?$SoV;~(M5}$$@ zRg3#HVqM}ac_)6Vid-T$lsi$30CXhUgcf(6imY#>L@)mG0W6lU^35oC%_!Kw+E{if z|H=pR&&uUnd7e?w%u6YN!u{}E{-(SKc(C$`>|o8a^7vNpX$iDsmNT3tkaQ;Qjz#HYjJOp$XF}&4M?WaITfvh&AOC9Q@8@H#UD;?;*L@T zC!MnyCp9ov@IZnK&iOzO%tsHZfl>Ee^c;^<#Vg9u<8e?qR5@xq_NvJLe~-s$x?w%X zqpw8LkMwjdeM!GfI3&IOd0KBv%%CZs8}-lA&upUE+d{54$+@Vi{8{R{WTQY4&0?HJ zi%EUTey~fve^Y)t!u@5SGs69swtK?;P#=^=QK!?B$~Yf!++9sD@fjP%LS%87o@Ags z5omRu4$0Ntwvk zpenO(`v*PnZfocRgq+D>Lv?F%$d#1lw24&wEXl37x)lSqP?B!J0DJ~TZFC!GrvM}= zz?vQUfaivFJd1yl_-cuC+DQ0u6=N674l*wTz+={+w^xJPq}1EC_gXlcQIwIpGYbBhEujpKRj4~2Rc*X+M}{q< z3_14^!S$eCN^rf5sFdJZj0Gogu4lF263q&=IZcU`N;{TV;atX=w9&nLN=C-P9j7$L zcKZ^KC_rEy(5s`?S8)N5Y2IZX|@3YqtGAv1>?JY;@cvR)nqUZk@g zGRp<`wYNPUt+;er^?M3WpH}BxL>sY4PSVU(*g6m}u+`q@2dCeQ#4lLRQ_8=ACk3AI zIt3{7o#Yi#eW{1OJ3RFLM(V?8XT}aE^twXd-D5@IW7M4iGK>{jm{E5ptr{Ca45cyo z2PC7b>SU*+F}a>6JS{?2w>@da%~Eh|g%z(=y^{Z|?-01mz@o$;Y%N0*4I zMGoV{qfgNPPuQX5{H(M?FY>e54sGY>T|4vvKS?{(ho7N#==6rr*Lgx${;7MNrTR0v zM|wH>guXUOd)(jd4h^f1MLj->qp2Y72f$+P2b%GK`+bH)sK==PtNJ9jX3e-yas$EL zXD@(w;xCrq5UEs66f%dP1j;bUw5S^6%f9J^vL_oPFXO2*D3R%$<0GoxKm#-l8b#Fq0Y>m`q~cwD9*=kWNX zew@prtTg~E;!%){pGJNfDgwAt5>e@1KjUlTSEz5In`i)S)0n1*}C~4_S3RwP3{|vEU zh)*c&%py;?6Ws@_1^T{k*#Quoak^i(5;xGcwx72aU7qls~|agT^Jk19$h% za8DoP!(&eY>}z0b>s`GSi#RRbJEL_1^{u(svag1L-fR?X*QekrI8nC;CP>0g%}v97 zmape)hf%=e%=L;5A9NWU_@K*#7k`Dop}Ij+5SqZH&O~%LXo9fquvHas?1QGjiU%eL zBkLQqSeVlapZ&I<```n<46p2?4&u3 zWH0rC+t>9njhV1(Gll#Ai~>IODhY=_=rZB;spO#BVdiyBi=~Pq?BP@X+@Je5--J&v z3UtRA1-e^}0^QAAYH9nv1{jo(XT}oQRddYb#;PlL%)*};4tA=>tT}@*fG)0)tzwa^ zw|8^7z3n^jCzY&JJe{47D~hvXZdTP$xoxCxD#?g7g*xq-YgqmzlatpB(+`8z4Al>Q zd-!k3NjOlAG?sIZLVTg4JWNBy>&a63h{;c+iD{Z1O+lRBJg9sIL#_~ zvudPFurSHY5YzJ1;F+rew8CwFLDrP2e&TYaN1?U2pOsSZQKJ zpsSWm)plnlej~6wE2m%&Bpj{`P2A1>@6u-j&DE;!dYh}I^TM+aTTLHi;imNnzP>@# z_o`9CMRul&FiYwK1@?69-^SvNKJj57+2WIleavg*)`r>micKeuKK_^ry zG7#<^6zf%(iQS@wJyo2J4CUbP>7^Mp->4BN6o~jJDQTSdLByF+?u0DNIjg1vR%X_m zU&Fh&*;rSyW8MLQPJELg{8>}(b;gw5!#rkIa>CV0x&k|lBtoMS%A5VA~xM_rP!Zn0SFG&3HguhYV zj$?#@r2i`6n_ig0Zz`nV<$Yyc-;Cab13VuhWbiCO;*TdRAk7bs5q?A5i-av+Nbs8q zDR_C$p`1a-2Z!(gRmoLUvCk>s9vVCgUYc%!5}h(_kFpZATPPJk*di= z;J`Vt)L9{>DNJl<;BKQ=a;Y$W^7UrEMrMcBM>uJ+2ydlK);ACpbgm+|A>Us3Ns`I= z&g{6%{E)daF~tLUxaqyD#1(1@NWDeWN|1WH$XgIJWRYYNOl4xeAgpBK6!Qg{ED|T0 zFR1yjzbW@DazAaz+0W#RG-Zl~KZOZp;^ROZ8gOyZ^PYDO?yi(cZI*E*oKi&?6*w*q zBF2ah)z$KMz>3QJvT`wIoVOLz7Ik7gCBJnh%yBLo6>?tD*Uz^F?WlMQrs=|7;F!sz zwsoo6swP{r4_U_YPi2DcTtX#P%hMtg)vERBF|$<r;h00km|jD7d9)|P zOkSENC@k0On#qZa5@$!9?0iLYDv8`_lgEV2+#Y2!`Hpv%QFP&gT985`xpqJfV$#TJ zI)gnGwv9aOfC-Z4JZC%CT1g?|%_ibp)e&{_^Mg*5wQ*NfIdbW$X)F&A9ldQH{I_0T zx>gq@X`;ql)MP9V6{l7hSu@-v-$n;-5?3YUrEsd%|i$E8*{6koe;X0lRO;=l6Uu z93cH6LI&R@_|rlPUgA0lj}e|ByhPaU1&KeNaN*s3GcGztI81tj_~Bj{$!{v8;N|@{ zgeind!Vd{cy&&<&6Al7*$;!~xNpglhk=6mVsU9d@qD2$#HJ z)GZ?hIexc3O@!jIsS1vsAFR4HSUkU|dOlJW79g?Cb+#pcEQN|cA){VNkXT~Nf`#Kt zZ|xn-8XsKLJ6JM4czagJ;i%g9a^wqDr#TH`AQI0G2TK|ke-)mR>!c7mu@7F}l<ReLf`TM3)ouaZ04RIg zZSuTUo?8;F-90KZ3H(GP->)}imm!-wAl>4GXVDSdC>C~}@(&RHww4DodHaCap}w~V#=7KE)z@_HmwXaFbq9lGKccv8y%vUnfU2*#g)N{uo1qwi2aj51 zWO+$U^Oi%k*d#)!MMZtPFtwVfx3d)^kji9@;sb`PQEb4#HHr&hS=g1}CLm+^Yog-W zO}nDb>H_H&(5gIIpTy%reBxQ+^+`SoOD$Uj5t&LSFuzFO;{FL4DOYnMPU_%Y#7T|( zDhbjG9@z0?`-&3`5sK||e}BK!<7M~P{02uqTL*-AczMPBGqWL*oxoY0TagR#kTdH~`eDd6FJ|}& zRS2#4&qQna=yPzL>(`gu+?-YsThKTt-Vx9zDT9t4_+OG>z}Q#7c#{ z=yP#__A=PrsyL#n54l5K1Q|)AP8dDM_wvDk@N|pwOPROLcvU{z!VkLi*)UlLa8_j$ zv|u|R0;Gyo_t4Nm8S?fKZ?YW=<|9ICarY2y;`a*%IA~?PY^oJ5{ZA4U zL)JwEZPxtIm7gaaUx<3(MlkEGaPno_cOh@pwIcS(QzOXuMx4jh=1%U5v68+)KqSt0 zCM;srniX}11|3`Q8Wb;J5{Ssfp3+B_^LJKxSyy2Sa+3l+VV3SI@uVgo!K?#?hm87V zN*W*Gy3&)DN;)}GFo36sb2WY567Ch7O9xA7m@K%^hWi-e0gfXX1>gezQ>ampLY9IQ z`V?r_aUx-Bq|-&hCYaZGDdx^Z*r?ZGV8c9#j*uS)I#$O2Q2pxnsy&&<&6HdIJ zb@G8PhQp-K;9DOr4CFTzQtu1=vL%xp}$Wg4r zmW`2%@3h}3hl8A==F6ZCv?)Z}r&#utq?%8vTG>T_J!Cm;#98e7Fm4o@8F%(NZIpyt|B>~(a43H@tmOG zwmrEN!~No92c8?H26%&fS~7KVu766YrYm0&1(2LOxR%dy#NyQZdmgcn{?T1yaRQch zbAEAPe4O$>Q><&jNdnzGNZiX`tbgz;Ko|9Ac<2l1OzD$TL}yROIQL1CBsp>|d{n9MQSAERkWdoC&U5P;XDdoVb#LRnxcJ5*ZKYs2_e$rwXE@TX zFCU7CeIo;*V3YT%fiOrBaUM$z#7S0sii|+SUXU7r6=@>?4&)4fLZ8pr)MEs;-z&Zq zZk!dgZ~W3Bc zK@=D@3Bb#3g(QSqZ>g%eH{YGMl_%D5Cg?R57t)kWgNXG@`R<@i))8CgCe z_9^cA-H7d5V}f+@*LCef*Hp;SkXvVEsHw0zuu2pjVoy^>QAJlP{2`Cbm0wKXHj#?dT@hZE9O3yp0e*!RK)DsM_;0j7rNWW zS&ojL{h4(`Qqpl;yN@gkK6fmhbW)$4DP?F+BJu1#;Qrv7)m-mSHkZ7yc&$*uOgU~P z$IQFC0aEDdZ)znvj;b8D^9J-6t>eq6H+esxYozJ+kB=*)`A54TjTT`;w{z~H>gi*# zQ3mwN&fOwjOPjww6~<^M$Cv`<>T+oY+N-C33`}f|8pkRzMU*y(w4g{T!!@2r1Kd7n zJ?WFP6UkgSNX%9W{S&_)B1P{@t1ra+}fd^T>1T1KCPb!q6|J3>^qEV(evxxg{=hDTN?aNlJ3+B%mnKYJ9XRANk zA3KaxZ8Z&}l|yE;lW^)9-hNc}5RJ**O0srLMG}XU(Qz2d+r(3a?MQVK*CUl{$bU@I zqB80!I?KXy*C7vXtS3LqZbTPj$5h(0drHv+{D22O(0)LH47JzDucHze%efv@r)8!Y z@hiwkLD7o)T2m8}Gz)UhbDw6+R*Rk!ij-q}s&heoBY0S?+ML8&`ZXGT=#jn|NkVU) zbG#t&#}n=X?$Kj}QN&Fp%=W_V{H8(*Ufxq#d-xA^xjh|?gUn~{Qp^HXBHa{~;8^quGwYkKYGa}pt`RXp&}k51fPKH@ zr)2=*&I1|1mDgxBz_MSe-9MKAYej(g5-^r4cQT!|fO=wpuE@kKo+zL@<|b^b zL;|~Y&c~$d#MvH24`^)KlbJZ>7_^+|?Q9@yM4sF(4(xMoeM~JHUs<0b)^@7LvXJK{ z>ELc+T_T-k1b4Ecs>O}mWaZ8U81`u}!;p<)q z@|y}NczOT7M6cK1pGL1cwkvx5PzWwQJhNGm<}@In*ZrCbFOWAoXM&DANTk*3%jeA_ zL-jqLa}k8x>RU{FwsfnVbCyo{cfUlY2veiKw)fZP zd7Z=Vc^oO=N=iXm_s(TJtL;+Uch@?xG#q{lKUf~g=hh{UK=ks*ZYpA*F3YPZ-xR%; zv6jtZ9XnWBl#x-IQProVb{WvUkP`)q)nnB)GDliYP2|V2_9E0Pg-t7#8>Cs=mEvH? z8B$tplavNeA({#)(f!#kwaMWoDLd|nHwO3FJCp{l?pcY8tuMQh%Y3FI@q>*^v}eJ4 z81;|xiRG8LX|qyFur{PMcZ!%#tG;sjSBlNk)osSta|TcIXUsntflbaQmn$22-?P^u zQu=z^{2Zg8E#XHcmUHM*=??rwd~A$pqAFfZX(i1lb?(${lXmH;-)mR6$)C~HnoaaF ztdaPcRrT)X=XA^6$-htlL)n5V#}mv|ecj%wy(M*Fv|#b-o%{ep@yFCYCEM_oq}%?;ngqhdut_)7gj}0nR02L&)qf< zi(<%Mvsx-W{%g$3#E5b=f?8PwC5>a}%3dNK`VRV`gNSW0Jio;?+w@3Hq%0?vCmV3b z5kO@CN77!Q?`To1HTzFmR(n(a++z!4gU(Y*7~9(v57cbRVgX1e3YUMD6_2e_WZ@i; zA37g5A+J!8Tg+sKV9Im!T35->=hsMjxqSd!EFK`wnDD!!z(OZ<3o4s~PV_r0%?Cdg z7Sf(^%jgH>P?u3Rifph-zOmwyWZHR`pc9kNQRf{DWs|`|)lME!)Z(GDdLiMCTeEQf z8#@BG*Gc7J)mEPRJ6S9?cj=5fa8r+UP={CtbqWLEX^(rv-zo8|=VD5f2A{ZDEgMHg zmP;`+Q^lC^$>|EoF2kYo@t)Aba_9^o)0L7QBx*@mYtcTxiuU>MlJ_Iz%`@C_su`?! zC=*hgY3F^ZX7r3t{2;aNr2!|dPc41vk!4cO>)maz(%Yce+Qhlogeje>UjI%r<5qh0 z6*DU;)izP7zQPj7Zt&;13Uzi>m8DPz)-)ay>=D#y0d?*``I%IvL~M6>U+B$YGqCg( z%_qxfnqTF=FjW7ZQFnxPt1Ue# zzk|Yytr3EN7gN5tHoFhMqi5J(P-Mh;KqPviJw2N#PLqsk_bX254rv4yJAEupMlk0g zG2RM2eK)CaTw^-aQPN}@(H2`rhHe?H9;%Q(Uv;ok);}f2O^nj&%X1;US@e-G)qN1S z-S~qpYJBb*D&$e2yX{de9P$WMuBs3VZ{#HyKB|f{IUpOBImZ<3Xyww;PxQ_B$8Y;) z93&V#=X*iok0;y<+?uDp7$y*Z4PmYqY<^QA1uyUaA^euGmavWBdO_lkCro=ncg}|u`fu_b`7YDFzSk$`0diOJ zo$Dm)8@9Hw3b94~3)HB1-4kzS~k0nTX1EXtmn^PF6)v0>*f!-3wH@yK0x5i2t8Z6yK~T2QA}m)Ro&n|p-@7uF4ha~>1cYSq2S zokmHy$_6;LdKq1wQB{bK40(z;HA`iMWv$N@u^w_Gs~EXaJG>4nd@9kCU5VuBI1@dr z5(Qvj7*I=T+B=P3sCLUCLfmCUAB>ZgU5ki2OlKD!Qqny)?Ttqdb)KeWQB34EGi&VWI~G>=1u*mnmVoOHEU55)FJY^T-LKVpwi z#mpMN;IXn#6cZH;&t58$fY_(T!hGkRpG2NvXO;Cza*yZ-VxRWmwwh1-SDhC7bU@WG zV5$at+d#=BEz_Bzl;>1V*cmNcRZ(apLal$`>bLr0=)D)a7AWxiXHy$`A#Pu=iPL^Jp{bSv)^yosf720hKl6w4!^{etp;V9>s!)InopEMJG>sH-zzM&F_ilsVup z-dJmMeYt_S>77ig>HVz4)uyU_demf7)jd6`SP-Tw6K+lY+S+`wPUNkXxhFBqiZ3ap zyG`d`;CV4mopNB(bPgKJ|0>-bJK|r6YES`r5Q&B0%a*vpm(0HizMKM};EVIBMwaOd zK^C2zu>2E6y^3xv>(A)eHYUpoG=jWML0|YXjL6On{B!CDkSi65*e^=GM6qT(_s*&F zPb8v<2!0BrzV(uglT%8C1Yr35GY^`1YA1ZM`AJL7DqyIhMP@-Gv>TB9Ct=pFWrSuC7DwvSfj3j4D!a9ZME9p4r)rk8s z&W8RQjy&Qx9e~JrY%H2KxH}Wsn6RrwkZay129aneqsFnZH9D)4#l#WstgY-})Om#N z?9%fR)lIxBFU@kGaqGD@r0SnLL!Ww?i^hJ$Pmv*wT+gw^19~Sf)e~Kcp9Q0HIrUV= zKw@32l&EF@%w~T4xm2z-w4(Cns=U_FUkYf=i${_WLF_YM^@*`HG7)Fq-j9nrw^!P? zwIzm$+&{xq%@&x-pb_k-4B9i=*gvla*l`;9Z>)?-%An)O5B^a%*wIaFZ`fzHF@ZH= zpvJOqb4tUGx<8HW?US{x=}?v(VmsWVUq@~wg8MvKu62dUeAIG zQ57CvvuC_sX-9XcI&((W_u+C`i8(Fe_}=F+aRLwTb;s?~kFKMJE7kdaGP6U^#~O>_ zqYh)4*Vr0bb=|d9*S3Zl)mhBYdiP&QTT<|}3)Ubf9P+~gjr)(gBkh~y<>j)%eKGBW z^e-Q9M-pvwf1CCpEyXG~&IcL!=m9xLmDMcF28Y9>z}Wh^-pNYA-<18rr?Mx5oiarY zN5axsU3{LLy>lKGQJVYQ4KgC|Ls(FutAiU_wJrMXfO+t(rhUB;jScOAX2;UUiQ~~P z=;Kxpsr7O4q%><dI4`kE^}o=^VXG<4JW0t4V@++ct#!XC0@)ZR z$s|_A}iXUYDHH#wgTET0ftoZ$c=aINA zq=SOtlYUW}0G48#ZE-zi@S3}>< zJr4!eczI|RfYVoM-B0w^i#?q*H>}hdp3YH*BykG~%Tfv9+~=wTV6mngeK<|CERF(| zX>D$-F^zGFsrV6T$xi7`hWb%`&XHt^K|%ZH^6IEGijPrGEXd326^AhQX}y0mS2xpG zr$a2<^W5`qkwrD8unP_$pg01--%>^%O@`$>m|p`t;u2AAVlYK#Fpn~wSNB1ml}WDd zaM_mNcUzUP+5OSG5S1NMh@kS6W12nk+}QorxfFf-(fX2!tNUi0L-;!3Lc+yfkoYeP zllUeSH zv`;A4J!)kWdI`8EOFy-$exifup$GIZXsd-oF*R(feRm?ErJ~lXjsC)ofuWU1XGgP{qyENp* znA`xlO6Peik!%=$_mpfdb7spo`k%;FUqAkd7NeoR&%Tock^Hv(ufvRjDmz#MaCqrdRdXxGY+}jcgz7Oy_sO zNqWBzyOV5!;VDtEavU-ypIQFq@`Ef;5-C2wePgfiKG*S{HrBE}rSm8Eh^i}{KT+9y zIe)U^b;X}ZCI1V5QqJe&=1*n;>^L*|4}T&l;ZNk}|2BWp{zMml(!!(SPhRSdTc;o4 zPozt|4o9-~zvfS-?@|1T^z3sWhG5rIV?6$(IPF^+x3R)KJ?%pe{-k%>hqM%{-1l~; z^Cz<@>R9|qw>`mcwLQVl5Y#CIQE2MTKTv6!{m=t~RKkWAuqgcO4mG>1A-T32kS&)x z{X39Lt3p{?*o|?=$}g@oe@y!ZdAN_!9_D3Pa+g$KTyVhQyE5`$t=bx z>ig!V@;f$fqWKbKW?`!-Cs8S>R-{rL(-ul*q{Kx%ZJ|`$ImfV{@Uk`R2NcLq*b#Zq z^O|Nye*yG?ANS-eWIY3{S(0B=%ABo`P=pr$g(XoK=&>XoKQiyvAY&X+ zuP~ooT+Gq@#rCGY8P5@3B(xGXdqLvAEWE}y3G#j9I&=?&euNVUCwoESk0<;HxI8-l z=uk@hm4sWoa5ulHkb;%>|6}WWmQdWW?XT4Oed0WC{qFayTEAiRWUW1Qmkd$PaK1tm zN50QbJZFhoYjXk;8P93gtMa8f($SIG!cN$}ze@r;=XM?Wb%~7o4!x%G+{riA?@7N> z>-R{V;Au(F>a+RL3-|{-`M?-*Ss@AR;WzNp>f6QtMS^E>UpbGdWjn=>?bI`OtSR7z znZv=ZF;;wXLA)&69j)I-@LnqKXY2Pc2 zpV;K1K0d)mLRj-Ie94!P3Ru@2M`)_~x!5>G zR$b!(|8SVJV@N9pUz8O4337-J7IhvO4d=fy%@Z#cmIQRHG~W3(hi~ZK0BJ{`sed9quXXYbG0wm0ax{TbEgB2m2if zm6-l{Z^8!1!~CyWS?xXi8HDixf%rAnl!>@;W-krS1-6&^NfP8@?Ga>)e%JEoy)rm@ z7}_$Ogzxj-|G2r;_s16pW}HEjK2|3c{GgGlCoWBP21lFz1rtLfx9a_mszpCa9cQc@ z5D+!xxcJ~(p{CF@M%N6nSy+4$~BHil^iCv^SuT0`}_?gm zl}x+UC!|+Mu+&ebhIy6J?;c91`A;c%&FP$H6z3PnPn}J{(bxJHoXzpXu!G>aEMO*^ zs13Ks(J^*#&=I2PpzEZAEdRXMOx#S2p2ZEp9N1+kLS`tlBNz649&%m}j;{1CxH9a# zuKdgPHsgZ}k@OD0cBVAIZ!wcWyGXzbBk{qfnh71824phB0{^D`Jkf9z zq#Un$?GJ*PK}MJB%0nev<`?23G8q-*ST~Q!uh%56NA)of?sm6gotb=`zc2BP1ptpr zDokpchZ0huh3bCr!2@iX|9--cm#JpSH{$e*IwvBSA5T}B;n^LP<40$YTUaRLd@271 zTvCaDn=K;2A1>{_^a%eWmmIOUPdVAfw*`Aw$zC0CVi(!UX^YWe|AI3^&K8mP8!Iy- zg2GLeRP2qr9&YakDH zy~2V|rhVy=ppfO>kD+IX86vsFzX13Rz-LCCEHk-I=!2V70U!U3h@jmx1z$RChWO@E z77Cp8mSf0=LxS*l8pX{E4y+)Qs*}S`cD}MNs2m-rK9lUMSR>=OZQchj2%XyJW<1XU zWWCPKyymJao1rGEVygZI(Ye2q!}#2snHduL9WI?+Lqcdn+5^PkOe<@Pnq2myR#XxT zNjG|$f5GW#_J4en!qxOLz1I!8v%N;JzEj02#uxRxrwcB&)Ii zIy#&ur=w|KAXqY$@pOE>)(qrUC63%1p_edTz#rXn12f!zz;o6&-Z69J)}XTiROltG z>FNK4nTq@c$H=}P*_-_v)jS(?aNy-qz+|QeLFwN1xj!dU&&KR+LHzEM2ae`3_{hQE-0t#9Q)4z0n{sN-wmS0QbzyI03e zn%V{Bn6hZZ8Fnp+NHg>-W?W{#Ejd;KYv= z)@b$lR}ai6B+t&%R3+pXt1QZCwa#-tzf>xWJ{i$Et@`JW;jcyC{7uD@4k#blh^dQx zPks#vDJM!foRJ$Y^-rC_~QJ`_+;)^UfERn@$bX4r}|B9lyjQIu;`ycE*ySpw_9Z8Q zgz6Z7kqw|)Wg?isiWKI6d*OddHqJkhd3UHr-b#Dik&=z`-iKcP0~K(=Xt?lmJ)f#I zk0}_eHjY5j;Um@iLe5Su%&V)T(GfW=zuzikB*KO7EsZ)ah2x{n>84j>(_&v@M^u;iAVXq$Tr*ez9$yebs~c2c+6)>`KMZirq*gzuf%`^eAVO zTs4jnu?}D@8Q?eTH&hf5N}BUiVDv{YLlD=!ToX-=PW<7I zbP3E{sXR0-TDZv&f)#feiX3a#%lx3WN;9vyvNJ$7t-fFVRZ|&Pfp&hE?NzI9sTY&D zv(;DUJ!7ewp0;a!#~-JxZDr_||8y&Jgow5|Tp;I`W!)C`t$-j0VNt=4JFD|sLKMP_ zOefNLMfoGTwcn}}saWS}@(sr%HM}@)*vtKpV8ni0Y3eb=%Qx=Y#}|B6K6?&E>mI)J z7Az?c2QOqMl-sZ$ATgsWsHEgPDJf5R708p1n^PYpo{_{pE?44L5+4Q`+#63&cvNJS z3=-EjpoheiT;k`t>z5Kf9ED?Ilvl#ApHB@r9(jkC}8pDyf)nsfxFVAPR~fQR)7F8g!~gYb;d$1ViQf~|d5OQNWuj|;LzCqogV=+O z#0;%noPpC;q8*9Tg<19*{o=@JIf2UQ`k-P^bO|ui0#jy=af3qXxlFR=>WQlIU}HP? za-tEdp?db3^&U85o3ne40yhHqV>f=`EqQ#uE3pB(`I z0;?|1=u?v>W-yiQSfanqR$PZQsu}CYrwOM9Ji|>ByTlY?%m!vnMb;)$=aJKKU(DCi z*6|4KM9h3j4{Yd`KfES5X>oF~S2gF?!zw)u)6`tmUzY<0UD>QfC-HG*?tx|5a>S~* zb-avV26x(!xq{KnP><=%7SCGVAk2E)SNhdYSXiRY!z+G#0+TA&%AQ<3h}Tu}T5^R< z5N%8l?XjInDCryFc*8QjM4cM>iIikk_lv-rMcDjTrKS;Tn#lm^T14#rumt>DRhYs;2QnneB>6kj!CP-}DhH zc;|ck>oKC;-+zU?yYo^0eaUxmC(-#b|9XBG*@1F}Q?oi(x=MNE{1DwoO5mn;oL4u? z89wQ(qLE2^wI=K^eJ*B>oa$3|*vY9rTwQXXBMvP&$v5IWj`vxd)eFWOitsdGmh3d{ z5|d8Jt8hm=)`9rhzDqJoWuel0rvpD^3MHF1$zqHB69J3NR=4j3o%_WwRiE=+MWqqj z&p%Vn`PRjjz9GkYnveg4{=JfM;(AW<#yV8mjmJF6YiqckC-ha_Ipf>IowHch9Pq#g z>Ut+mve!y6j!K}EQu;~epnGKkM~EgP-^;pTYv5}#9T(I$-gFy%~GynSPp&Py%zO~ zlIa2p`}EWfAcFP{#S#04QaFO$ywZ0gw?dd@8ibvv`!T1;m>-Zlh^YB z9gqEZ{tnud9P(klTytLKlQpYP%M#&ydPU+(1e-^09oe27l1Hua(GMaIQysKgHos== zX9HPdjbKyf0No7x8a3tbbA$^Urs~4EgIr*BJNnWN(JWC`F4{GLi`qB(&DQZU`Cz1& zmB@-ZZ*U4DgLNEw3p@WHDjjEujC|O}sguVkIS&b#wAXVaylAHPN%)>}dcTws zac_glpg)QnEfA`_)JqRsA(k9CJcR3y7O)p-Fg7fr__w`vmhP=jG4y<*j5CkTtR z#II|iBv-OYXp>GAZ>Eb*@gP0cOlO!ZD^u0c*70Z{Js?5mh)63sbbfN%)Wa$(1Qg4K zeKnnbn`<+82#&rfKVsZ_8;@Q4<+Mr_>w=tDlS`M${6Pw>TIl>G%%di5WOetG4gbPcY)S5xNaAMyon2?d^-738!i8H-?>;_q1x-%VMHw;!0_tgOC zjLWvwg6B1jK4I{4nr13I{)(OI2XSLBezg|Kbw4d7RdoJ6_sF!DLIij>(5Ft^4H(UXOAhSB`U7)|KaUT;G?SU{{P7`5SDP`5~Xg88f`S# zrlM^yU}s<=6HPQ0QLI~P6!EcEtQkcMm^g{#_A-K1i$1N7)^4`is$GPDO9GOxs36u| zEBe@aV_a|r)H=WS=bSsq1hkL8<^Si!&AoH>^F8N$&v!fDvp(@eU!nk=&yxg=h`Aj? z55VEDGt9XBc%dB^zi&!*QVPU_UA4gdM9GE%_sY@$uuBTUPp$5O7lP@5iz+G#7Li^$pmW_V z6kGeigHx{h$5S^x{PY0+VTL!uqSBZ~XW8EkM=E&4aaPchxbOv2Nx^L@)>-y+B0Y6d z!kro!Tz63vTe$a3cqc?S2HxVg-X~MJ+ghk>R;H)6$rCU@M;*qC* zf_S9$k=qH4opnymElfG|7Gk=-Tlq7D-V%QWrSXpj>mOx1fbo~Buyk>^n3(kb=h735 zSzaIofs5GNuxa_Le!0bu+rXs+_J)7WkH9_3LpI!@w%+hf{Ggdif4>c1Xws`r+Kcl0 zWxguap>+66rNI7HFEMd}{u?eQ$6j!HRNS!q^<8|Lf%fBVg0@6jX2O5<+W@+EYLwrD zmV&n1Mjk+E_O1g<9quF>_}y@FXGH>9V^%e17@r;Zx9f=08!yJPXvTWMNgu5-V3vX^ z?$f%ezFr8nc`w(zb?)@55Pl4J`#((sp{be{8ytM$Ix&ZdrW^AFpt#qTr)|Yp_HQ6* zUAp+ey^LS6>&L$#uBAKRS~!l#gx#Ryi#z)!GJ!*U6WNfnmPb_iV8;Fva8_{r_f5I$ z;An<8m=KGy9lpglmq=%Q6Ake!VYnFiCF&nGVI3UHTJH%%A3W~gg3-0uR^SnEA_H!R zb_zVyz+)iM&-zA$8hFm}&xYXH!aMt9)9SZo$l!X( z2SfG!Yghin$bX|^K_-0E+p2M7ov^OMubjf1^>$cZM1%y6PsNM4m*Va8QgRqpM5t`8 z-#$h#s^e>4=*Kq9Qq#wMg-I8ceA66;t@D1X$%I`N_X0fXH$%~B3QZ==JFN=oa!Gp1 zFnew=$i{Lwn6Z(f^4uYt+31+*cVi>2`Is>GAa0FixfCQK^J}!PG7|DeCv#ES!5zw6=AP zS~j&eULh<7tfoc1_owv6%U{g?)Q>IkyXm5^G4b7f`BU7wa%46qMW=Z2!(Qy(QaEsM zY>FE{?9J+Ps+>jGWoBZXDup>HGIV1WI~RuhiL%sVD$bV5v2sX;U>ctqwuwRx0K|8niRcIr=bI(K_Xw~OUpOJ`gejAF%UzY1`~z5AjB z#j2miUy3tj)rDP^nC%^*Ki;!Xe8K{`?jv%hlxcQnfO+TxDXf=l=}zQZW5lJ4HO|Ut=SVNv$cYHP4%c)&27x z#-HV4?PZ#5jhbw5e^g!lZt~!~W#vRvJnotV{YO;1)Vf;L^govV`TpkP5w9m!(UV!5 zx6r1Xl8%2P&t0hU5>2@3>4kh4%MY)|_Pk=XC8_$_=`{#OJ@r;i*lc4_`D3Q{#*dk; z-eUDi1{A8tf7*mCRC3#>!w|G$}{fcT%C8lT6Ea;N>*njaVsT`{+4_0HJ?`FmYZq4!*j`jmf2cfIxCIApC+xf~VA z;HCs6+ew9~ngAx~zXS<4C9nj*m|BJboc+d}U7&D{R6Br#zpO(D4*tWR|8;;58(NV{ zkZN)VYD?!@&rCK?T{Kq9{_CiEmA=xiC%w%%l`p9_s^S%BKalG9@YGjuLfSMni)lPl zO3Yje?9ahesZ(NQ|ImSAKKoTE38hAnjSRYjrN*6uQpGH32IyEh<3EJrS7 zJjVTnaQ|?esPrsUp>W{`XrpORiw4RKj9UkO51H;m@H1waJ7S&pQj!*`NJ8rKpVyu( zb?-)%ZOv@^ZWqgQcY)yzR8$i1yv9Q&xztwNt_e!~5o zrUfqzKQFBW_jl#?hmb|I<9F&*PperSNE>Utt^Ry=7m*>So5q>J^DkslK*1EHYl`|} zgW(ATjs72)8LWu0%tF%|g*``0R7R;uTm1VIbm~Ga1mHDSTAIb84eKK(Dt?k4;@|S? z0>xV9tZ6$$48BDQ01{#cD>vw-Yr(`HSo^-;UWn@TF71=eI0q`OqDJa^Zm#w<@txY& zR%lTUR&}GQa#I3?mi^6H)JgUJ&6F1`m2AJ5UUBc_Dy;KhmM0+bocFZ^rr(t&p!qP* zE_{QE@D=7FmoVFIrbAO}LKjy}A^_A?lfakepb^xr0soEmhv|u7Z7^*#)MIh4j*wi} z6Qnu?R&;K7HSuKw@4cJcGbn^zM{B~|C2l=*$9e&|MjN-)GR|syn_sDiH1r{-{g?dp zuC3&U_mGC8y4RVqUDs^L2w}nt*8U)FRTK&Dr)CJe>r{Un?*)I}-Hh~Zb}64<0a?5{ z^~uP2m@QtHAdP<{K?FEy*|)bmq|pd9kG76^hN1oGKQzziKn{CIO~5CUD!4GCVZqOn zK~kor-nD8k4N#Exuj)1I(liwFdfC)Z@(M$-yh&w=JmdELFp~u%`-*p*cAW^-(lpS` z@!TDNXt`E+|CU&9VHqDGqkHauV(4-m^!MaX5u2Dc9@C8@pg&!XEtl>}pt(_&WP%l$ zz-lcK;i=>)cN0~!dZUOe+(b0tng!t+G}hs1rFD3MiOlJ9_96HYr%ktcJNKWQ*Yfc( z$s*_eSbkeq^BBD+9h1DW<;p_tqrk_0UaVz%Y~C>bes{rW{(f)X2>xDmb-}%Pt4Y{U z6$>X%XkmdRYe+n)a^A6%CSH9^%g2@Tj&AvQ;?wl`i-B$g_3!uVbHWa?{uvyw$aj>=OZiDiJ( zRu)kRJ5a=6POYgI{C8VL_!OT@xghO`rha<*K2@iOn@7?A-guh{!uGQYYqI3)-Ue{O zt=H3NIJ8LW7+oRc;_tmS)m3PW(h6I5;36Zm;5A0bTV$(5^zvO*)B1?o#A)Y1UNCS$ z`Jx#EZIs{)0}fglRV%d&{CZ_p2rY~%BvX2L(Xdcz9;zyCs}8j!i}{WhN{QL!OnWxk z(i?-zy6y_lWO`BA7J}o>L%qIkLWHajf{Y$Eo}Pxu>^kpBR(rVs!2V0|tB0d8N^Q?1 z$2%)NIba}VHtXl)xL!Hvu-Y$K(}gX9>(9%^3V*jgqJ3%rJ>kDg*V7}xtiq<)8I;4ZYjC%#DF24PPs1~vZ zU^SR?+q?5SwsO3Z(Yq?%q_4SG3~ED7`h=romo-~DyTpn;WiZW8tXzl`cgQB*NCu>f zY}d2+dFn8hDnNn?n91BIJF|;u-i<6tz2{8gO=R=#{F&R8DfNa4DjV5@u;!V?4|*gI z;9d=PZP(oEl-G9wOW4sBV@tSWX}75*&Tc0}+^Ln!X(~b_V2o&J-ayMV3Ca-_nYKpw z5!Da$WR%`BHJlgixU7)9=s?|-9PcR5tEOXWp5DiGOwHGOTF2Ca{(Zdgg^S08X7v_~ zBwzkW!ZKZMcm`pjA}|Lr%d7O>@UYOm7;oAkNO<*gG`v4vVCJ(1Pi`7_!hhO-BC-d7 z%J4pnRvrD~bz?AS5?V#8s;!FKAiUzIrkXAGqh_5vx+ApD zh99I9_lR$szklE_=HNx0qF55WR=k3P7Wv@Wx>DnjzH(019wR+f>)~4JG0TX>(B;n! z$k%A5^sPb`)An%kAm-uelPF-&{{YAo3t#Lmy2*R2HAAAC;SS57^AAkgFpf@wYhzeRC(2oLu z`o|tlJA1=FQg!_63D@h3F;%suQS|$JgvAWpfa<0Afo+*v7-}vBp2?D`lH}-kRWvU- zEMAq!Z{CATkj+VsuBzJ9$NS8Cijxhvs?F)27yi#hW3(CNcf^o>&Kubi%WGZUO69A2 zVk3rA-H|l0WfdDr+y0P>-h9eGZCRjea6 z((BIYx`C(U6QH(DB%>dHJZS*C-)lnl|G*m)dPsA$1Fa|Ye7vKsEEeyGmrY5ePq>sd z9Vag2J*{24IpW+uEx#(3N$wr5%1iFfucE40UUCEJmv6URUA226J*_G^6$x1h@p*}+rxO=#uEJz@9|#aucYGf(n@r^6`$YIC z(MLHSV|iD)v50|lpY8ya!TVZDPc*%qxackFoL5nlNjlE`brpsF!SWH}#w&_)aqx9O z-{N44NkKssd31KVKJxiEMIQxx%%D#NcNTH{P6)PtRF_}y(WWvbndwa%4fQe&gNM_q zK#FMFr`4vZ??=U`%Xw;Z7vk>NeM&)D6u7) zK?i4^%4o6`YF0>CqNF|3_AShmCMiF){mSN^$!9Tc%@4OcV7ARr@~@LmRlsnrElmDS zt{{q6xI)i$hk+6HCKnU`PC_{LQ}C4k8|Y)_{Y$HG|7u+NM znP9fQ)4}fnN`emS0C#mIhb<5JtS9IGE@y>bG%&5%ud}Bqa00Cp8v?JL{ z=)!o%#T`90OUJ}J=HHxf=l@IxY#r!?W%XV!7Tx}&t3{k_%#@B&ix|QYVzt1R{lZPh z0t>NoBMcdl+0;Kvz-)kfo1Vdfk!Pe?UmZ0q{U^|Xnk!5~=;cSF&izjd%tpN#@jqaP z=r7+jiIkra|2V~tGVKUHt|;mwTlx-vVo>jpuw84o%jD97$Tq@6-6*GQTC1 zJlPT|f^9CjzzA0>rjmwK6+}Cl%Z?HJqx9^&g|=sSK0Msl%Sfl0vb%~B@${Wgs4V2~$9jMr zZx+GX1}J2|wTT8|zx4`wfx3y454sl1tCMK(L_W+mqixb#Z~0xbSAw2rXOg?ct0KwK z(W*J@meH!Y`CM_7={6_V%$73mZ&dLWs$g6BFg5wr_A#NN`J6o~UUv+Dz<{UAR2zQv zBKAJ0AsOPVB}liVcKVPOD@vHA_LR^!%YbB4@okhLn*i)6^yTiyElC`6krtnZUq~1` zhjaf%o*rO?qrCec^GAx8mOpWK>R1BS#NErryHoe$^O4@El@Y*%hMd{lLqwH3wXBZY z;Y3exu^yqlqPO3KRdA=4PvGR()T5Xn{%@L@1ZmF*D~LC8ub(K4#X2+YO=X8kJzJz< zHv^j55_~hRDL?q0!}nIcNix?>ZRbn2)i^OP9WRKa>sw-}u9&}4<^Z1Ij{i{Jb$ zN>7*G66E*G%W=`s|y^b%Ppj8f=h-Uv5&-Ud{xi*JAnu;F0>`W zz%ha-=fsAk8;Z>O@n73v){S$cNZ1@FThxyp&D1~A%9&D+%wC=PIFlUiom|=e!$t?Ks26>J*l z0?1-IZ9Lgqm7ZSGy}gKU&gOn$S12Ch2Ey4th#quGoW}BZYJyvE8tKjKfz1z)il2c_ zLUbygBx3F@Y>at*F>kB6s+bER17DgCQ51eEb)wa9`E#rQ-6~nyFV#J|CzTuJ0xV@P z3Jifb%$e|`qfIAzOvk(Zv9a`YNV1LUjn^X}JjCHlVe}c2LCz$6x(Pphd$+GXpW>~t zAE!Zsm|^5?Mv=D}MD^U*ocrZq05K19Cak0HMsV%atjBpNCnp*?Il(dT%ObVjk2pc` z-#Z<@MxG<`_D-{A!yDrP3U4c$V?rdMHWH~-5HGMMPFtrw*mC9=!HW{C*HM(Ad?y*=}3936P+Z;8Gz7fCi1j0NR7|<1~*NMScp}r z%gmOBsiAyLZA0G8A)q`&#hOO&5Jj3#Gwl?N_@&$IHt~Ww?+40Sc-MHJ#Jv6*{a;<BI{_k8dnMpO5n{7L$nM)um&_5+=TuLG~d%@BuqU1LV#46^l3 zUhEht(k67992si2WAK`%Yai~+tszeXZ88Cvs+H>xB4mD#3Y|5L$Ufx9U6 zDB$-BTHDNrI&DgcRj+9-^G4xgAoW1%On?_kmU@dkC9be}$f|IYx_V7=EXTIJRTXU} z$q_##o!jOq0jtGnpKB_?KFHLv{HgC0_QhJelnUnsv29xtO$)V}y5AV>-ng)wujPMj zJ#pU)H{ZCMbfQerYf|uEQghJ<-io=V(J%B4b%A2bhIM^gcASP(b|ObYEG zblM0S1(}WtJU!#*8OrXu@3IW7^Bpcg5~}0kcQA`thJ`E&FqRgimPag~HK8RG_X_Y4 zXP4d+UUzq2QTMAQhlCK$x4xpkqc*`9x1~0cwENYfQJY3RF~z;nCLaZ>SCzXgD?WEw zdIcYW5ehk|xt67^bvWj4Oms7mFZ=&}9ro|uGH>kc-zP@}XhsV^+rrT%%C65sq`X?8 zMYWmrPWxYwrZeNG^Rn~&WZ5UceRUjO+tP7&+!k zXG@NG2dKu_6kT3QLU*M}=r*?Ao}+Z`(UBE+T|0?+p#=GFFL=+pH$|%I?2u%;F-=z z-4)voEW}=Qp6hHX<{EJyPdbwhL2thyu-tQ zAATRoBF_EcPtPn8@pn+_<2(R&V#5lMxKa-2$33Z z9hR%hLr1Dp@v@@|g@;KrDN}mgJ7Hs@a2(ZQipXIzqsb|xU{?z-v#TTM6ATb$8)Nug8%S+828%p9ehk2#dxh~mnPV(+I;RTWe@lM+W z2tR2dx{Iox2Sn+#90_VuSOk*v4?17SKP@kz17TwbgV>~3bxg~ufv)LSrT#<*L6Yq& z-8Q{cbh+rx#6a&er8hC#WSdb>Et-U=ul5YU3I7fj&>y2!YvjNy&61b4wLotU!vtd9 znkoHGP{cNY6MAqq!`II@CP&`mgQaD&5052TIN z+nvQJe$}OaEl|lnh|Vhysinj;a%e3SrQ400kz2lH`+Gb=4kra>CpZWoUD<3dZe6Z6 zsCQ~P@T1-%sMk&^L3=Y1rgl~P`IS=R6tC^UPnlfQU+_e_EP!R%>Ku1QU!M1#j;%Gr zo0&lW8}LkO-CiX0YFcP+W-UjeCv)_oE|`dMZwv0)y|r}}-C6%j>B5^6nbqE+u*R~r zTYDAib$8LN-{*I73r4)@I=Ags#l~2LQ02W&yUt>>#M(0p_Ve1z6rb2;X1~*ZvnilE zQN3~AYm7jHdmP3BaCQlo$=UaNW&D4)?tj{^>5%-+E^B^15p_*3oZ!V@3b}KU6|mC# zE4}c)E=4z`DYK?1UcJ>>bSqfDe~%n=fo)Q0l*}Sv4Ph$0CL+mTKj>y*KM}6Na}pB^ znIa$(UY3C9(?-LV3UA9a{Lv`3KiZRwaKfn4M}e8yu5hG==2c5xB8>)ZPKetPMq>?@ zp8Vk)uxk27YXN~wf0DgT~V-$`Z>mM)kfF(w-g(Z>_c>je9%v#)ylI?=vPvabgFI++(W{*agd zuLJ3*3d)qO|Az>N@N|NaM>_3hB`Rt~hF)h%cmF5x>C$D{s{I2GQr^<{P6^uLmzV%k z*nC^qFk4u%-qaBk)UCL5=??}9de$_e^mhXV^$xb`C|l5jKd`N8D;8Q$m!_3g2bxDK z-YdRU@z}X2*bQIJFU}LcrhWHWeqW(jFFZS2h=i=1>vh_+H)J*mi%xD^ANju+6A>PB&HL`Mght!@r!y|D_uDb=qe1#5=6%L|18GNi%Bl2|i^ss{VontA zIIrv=N$kp_9rMaiumozQ2x=v)48w1b(5MqgeIPn(qf=NCubNZXyl=d!F_SEfSCuDA zj6Pwc^a)PeX3gLsI)zPSK73rJbOwF*o{d*EmmQdlWJ-_YXT|Et@&s^MU~%_8Q`f{d zZ_%E0_@r=i;iN(;8PpFv1vmAme>}4gzX6#dXA$Ge!PC@dqn$-iqnTJ{O^ns+EczHM z7Rx*mOMP16EP8_Z=YeXq1JJr zgtGQ$Et98H7VUU0IcmZ>f4K3JmmCY~z$R^~&?7c!Uic&uxdjG)@Y~=BVN68cSs}1J zcQ84u((qh}6j*L|nryN6A}C-fUzETAEWQ677ikjiw_5mVI``W(?~W>R4EQwe^&~hr zaK`~GCoYBBYv59-(H5<4^cO0MJ!Yn8e9}W#Nf&|=aC(XVA4CF_K~vC5p;Hw4&7gKV zGH7e14j_%}`*d!hIlE+kZ|-{yZM5kefBKf@{NT5NS5#QJ5)jkJ=h&?HRo=oc8nJ>` z3(hfR17$46n$bsZdnL>%=uGKC-fB1G4Qg;)YGOuKkttn5aB6#gb7^XOL32rJ`;YMQ zf=#fHarBJUS%3R{a_GJEmn06xfDpr9$rum@Beo|Q%2#Jf$C4z=%mm{T_{WUm2T2rd zCC*r({}?+K!}mzeuzV#`I-IZcR5mmu@HrOP+RcqMXZ1#x0m2g7sd-jLd`dWy^A2era3T@z z7R0mdOF!%iFz_{28g`CXksrgu7T_H2AcV0p!eY3adnwbY7qb^vVd1VF2CDXrOYJH}E zZ@f?Lu>zDG>K|?JW`B5vj6P~bLjB=o)4{pvtN#-1u$&B4NNH{^Fg_>#(%krg`KCe!?RjO#m_f7#ay|aX zdabCS=j?fOHM=m(gfis^>-kW#TKtI%MWdTx`~S>MGGqepS{_Y_r5p16 zb31a19mtbyKmM}THBXe-=cr8S!!NQ5?U-P5{0hH1MJ%qE%AeHs1vwqa?hRShrd=ch zrDxYW{;^d4!NUENcp4=Jh+-Fz>{Qa{!QbXSgvLOp?Sy3p=L@R0OzBySmG`WD7d-2Q zf4$eJQ1!FTqrp$j!|me9pRn28KTWvSU}eYNwo6$Y$FGUuh38|!R}*d|QLZjj-2{GE zx0z`c-c%mY$!$h`otk_c`9jGfje)c|ZRsC8MM8<9$%u382cMgU{M#|!`cJlQNQD9@~Q!<+d|a;~QM2|lP~1(jg) z_%Ofp&;QRDLh|hNGWN&DAcaeG(|4D(V0=S|TEtCx;mlXFg#R4aG4JT%qjiHdE&_0} z-B<5zNl(v9pMZPME^UvrPOG{~mGC}FZ~qc13rv(*VpA*no+DYUTgZVbNpjrwMuE<4 zpUumkL}Iu7JU+F3w6CQAx-pW5`!nbS%rl@WL8s}DCS}Zf#F|7S;~|St20#+|hffE) z+Ay4%%5#pvHHz9874++H^xTQ{v^@zWANeoJfR%|AxnB*)IFX(iEv} zD+xH4eCCcpx@P!L8r+~#xBZhV2a%dYFWjvCuHwBF3uYCzT=K10p>mzdPpZ!cJ8+HIObLk(HvUr4MbZCVpWbGG?p3U7Tx6DfAKHPtZ2(OREl ztxwP>Gwjwwf*HodVIFbchO_M52Mw^mSsFOO0qXEjQ~k4sgbJr?4(q>Mt%#Ub=!}tn ztnKvhHwC-QY#>aQcwgmn^#9`3)+w-#o37H}H~9`CQWb?}A;K@Xz=5VbjlZWrVrJ{3}DLpX|fup*sfEzVV?8k=!`1)rU2 z>x!fKV@4^9%SaCPHEVPie454Y&0&8yC749HGHiqYcB0QA0*x~U_Rl`EmxO6n|1rVo zCQ$MbgZvv~uH)!BX7rf9ak2qwb6MW7if0oyCknR1AiN|XNZ!5^mF=HS>d)&@|E2&} z>GkE?cY!vevuNGvK|?LSncKdjgZAwQUf3}qm4#2-wQYKoiooWwq>|3yPa15U7AML+Uon73gr9R6`B4edp zlSVdAnN-Y4oQ}dWBu((7)o=aqXR-9fnJGQ-$%X)cY=tkUO&Y*P4J8Ir=aofrdZA1k z``0bk%_1L0Z6O32A^>l&hE_~dpMs4 zb!AF#BNgWixf28?qgVP4mhNtu@07r9hEo~r6EmeZs3cmi@)^(UMw?yF&-vGE`b_R! z_N7={rGVxr1J@IStbu`xp$8i5_SqE~pa-Iav~=EQamsT}`%R3vTw)-cd44xir8>J5 zCqtj&ZfeMsRzE2kETv!$O_~?-9aWxsfH0-bl#a29)+&)^o{pK?c-zNpzGF?1TQyh__)rN3~a>3U?UBwaU}v?dRD+GtL| z)57~9|BrIhkuH7MB&1Lh_#YeB9n%|4QI=Ko@4x>u(oqr#a>B)CM<^%cCzpRF(E;F4 z{k_z0yM=9E4miF=J({CU@~8C%gqA6Jq>TRT*sdJ9~fLB!TAT%QO-XcFfb!@ zXfu}TJPNo)jO$#m^Se&^Lv>JR7~eEKT`#++MuG7%JS(zW-|ZOo<`1+$3|0D+Q2vCs zVx3AY;k7@02as*@RBXa++fb!;maP)e#U>fMAJhf zdJ~moY_pJ&se|TN1??y^r&)phk;>oth#;pk0s%yTLThrZ|yD-0D8t41JE;L;!`Wkvcv&L=|_Ok{kjg5 z^cGeBS()ddm^6#VHDzh4afMj%zKlBTB^Klsny@)D6BF;=P)U~LiQb3p>lVPun_7k6 z6N5FsQfz8|72$cTQ+{fUYX4^+eooDXG43DMGj*o9S4{l^d4ndAjaUF=XB_v5$iN&L z-ku5$SHlk*)pc801W;PYJy6!dcYV_;EkOIH`+Z>$cgQ=MW z#^?HD{vSpnIqiv$&oJpT%}1atVZM2GlDWhA&>VB874oGy#`RfzX^y$mM&}6q7MZ?j z#eRwknptC3*O_R51}07bpwFW}1e4mPcMU8gV@QthZ^BLs{Bvo0X723jl^Xu}jp~1d zt#%$5=EhId%Xs=Y#{MyXI6ai{cRcx-oLb5NKz-Sm)0g~gU#1N7Wy(NbrsVeJb4aV~ z;PTGyN7_2f4A7;-OGh!rp8KruS1|3FhQ%n#;PE{hfdc(F!0 z%NZ~7Bbm<9Gf|=Rwz3uz?kb+`$FQ$;-fo6rkR%e>E%GXT%{A0SEc2b2ljYUCc^NX? zBx}%9R>6A7?WQR6+q&o=)DZrehDOsQsswF(V4V-cH_(FAo1BKQt>X%$I`4TLhvS#_ z5EYfe&w8qJD_e6O)2cB!8Kq70Se?V$qt@e!pY^kraQ`s359_GshjOK|FL8TwhaG+# zgYy`J@wJ}mB>ZGV0!o_Zt*QlcEs@H2+p}C;umyeQplf$C>$F~&LO4+nI<@xR5pz)y z%mkDct|_CVBy@zbp9f+;6J5xJkG#(&{?#DdqZ8>{Ey6WsK4bm6S@6ar9JO{Rp91pz z!=ygxm0?fyg9g!V)-YF2{HvKaT5uZnV}?Fi4A@d z-XHuh(la|P=K)X*YvGz?Im^}h)2CRYgm1)FWv!V-{wWf)2-uogjW#Tr4a+IO%#Y8> ze-sS+&iNzRu-yFQwf@dm5!?45e{y06@X3&l2Q%8_)U;k=ru7Ct@_p0kaoH(P0!V7n z(fGGA>x+bgOV89JkXqk?fOD9c)^ypTs;-1PGP|#58%2N7U}y7Wm#4V*fhA}bqgj>_ ze}4(LQja7Cipj!jF9TMpqE3p z=G)Yvcni;K&~x<7=g*K5vi0vg-oGN@&f~Qt8bJzTh*|6OFw68?dj9cbn z+}6<7PonJi%Y5gg)#qS;&PBxAcNTw!q!^4}rT7PTiQjp=Iy6}TF$*rhtzS5Jm19kx z1_w{=5kAb0Kch99+~otKcDBtiaQlSjZ*ZQ@-fe|Q>G(Yc2p&6e*(%Yyh9I!&y*`}s z=xhM`3^&|ZI4b0yV61qY_R9?cw!#0|hn5PO#qWuRLQQhobb}8cZmIjeI%0zTC^=Ss zxvSP09aiAD+w4H7em%n&K)&AzMDVBNw0$Pfq|I(@80Dw9vUF~Vyr~vIPc2$4%33!l z#xhTc4wF4@JRNN`6f?r3lO;Uz>a|N%HmWGx7(+)@S`X6gw<`#h>Q_EO_!?<0NR7$2 z%-)E3!&=9DYGO0Z=LIE1_)TLB83vUQl{r-;vzBvaM)QMb|U#(HZ2lbX4~KMvC<$TcXE4gN8F z8#XC>{g8-$Gg6Rmlac5^zTHb9fzWXEtR+h)jSSt!^IIN$-@~(v=i%VdcXrYWpWCg< z+^dK5CXu%1bhl6@)1yM{w(+j9E#W0jr@XNTG%QH#@Bv=qJ%ao1N{9e6U!P%gf2;)O809(|G8dd%2_o<2j*0i{+@r+{<*O>Fett(W-lxcQCK2t%mV$tpCHLhkAjR?g|cEYlCnf&1nSW-Jhzl9P@Ojfyuu(f+DL+&3>!8k8ytV=K5&f=>}-zEaF9>Q;g z*DAZWn42#;kzWs(Uj^PmjhXT|_bk*{x(h=Z%GSoEQnlnakK{7L-nw7^QiP z*ZL@V-Gv`eG&ho(x29Ts6Ib@UCL4;Hq`b4b^?MYo;(!M;Z(nCw7ZKDntEPH`)BY>kZUounI*|Br-oia;8|H^j zs5$J`9Na&{Td4Ic+#S9mE^~ov7a5R0o_VFW=3oF7>i-5GKrz%`&c_6OjN{{5`q+z) zZ|kF2AKHNmzf)0HsdH}2Q?y2Pk-*bA5NDc1|(cfK|d_NM*(I({sLkhq7za6{=C zujj7Pk#=>;+nsaIZDy3X1dCR8_ZJYL(bT5jM4q^N9<)Px1}6g9+xY0MOLMZGAJ~Y@ zct*+zaWJ|MBH+W05FZ9nXbRM-4EQkfdlx>8_4%^ua=>lRu&aLZO|z@w3~ffQ77^x0 zH7|%mS?_NlO2NuPVBD)mQ1%4ZlET`9QX>Ahtp#u)NZ`VtegtO18nfeG(9Ml;+=J3n z|BiDE^&B0Va4zU&xZwx;4-H~$lMRKCr*1X|ycs4=UtyqRJf=k_qgb;Dz4~tn;pD3$ zt&emO#RXqyv2Sj}VeJb%uk!TqYz-cTf6=o)Q%8^DPnx9rWs-dz-3^BSYCIn_j<{@SMbRD$iLw=LL_#zs&PR_1{YVhj{$p z89^JfPqu#jHtRE&pAri_Thx$Yp&RuT@mGMv203B)uh|3qmsq$i){G&b^kaGOL*MuE zO#x9p@3fzW<-0vd0@KwNT=FXpuFa76roz)9m8fv`PW<$Hx^LmFUG7@|Ra<`hCz4;J zzl{6>EPhbS%6qlpC9$mA;D3vwQb=nK>`5t5-o7G|{cZ3Mun|QaCSoVig+X(`gMFts z`QFHo2(c=bn!mOZOq&jOlbNU=!zsW_HjyIX7T3McD;*BMZ33TGU^@IQ{Yn=vu_@Qt zl!x1tXV{c+oANDb6Vk=k+LRC5z?mjVah@``;Xm2HU)nO~*_5R=@Ns2#i(l3+H(X=` ze`izPVN-tcu4&TWY?%+*lyBR>41uUP=ag%E4|m$Y6^O!Vk~yE}hWE2&K1CpI+s{@K zH|*HJEoAQvpGcT>+a4Zg!+jHe4B8I7EJuRh8kj`q;6en%ko5UDxnlgcJ zTf1+hAz8JFB=`mE+`zy>pnBOwYJ25897g%Oqj5AMTLUha<10DaeHI+RV<-LDC!v8U76F7U6ee*}3*S5G z&+enS;$eP8$E81mxk7)Y?mB4$%Kt%scIkKq3jLV@Dx;g#pZ)HAJK7QdoDV+RNq=_n zJD=s~&p5Anou-%cPK6uLpE0GRJYz~pbHiDvTp?Tp|9dACYnwfYY6^L0fI<$zfzbecs%n{H33RFXoIeAs%_%Xu6xp? z7@K*cJM9#`C%Mz&@7Flv<7Kns?z9G|<108BR(j7plH&dN#*=BXtj8?}zL#aa9m{$b z#k`mM3%s+IIm=Eu#qhbW!|oY|nl}r#W;o1hU)-(fhXwtRX9uE$j|6 z4k`-4$Qmw|%dTKl-}hF*ZFj{u(OQn1&6*+#4H#J%?{s(qITB8MEs`8BkBYolp<7en z#Yi{Yi;Yh7);wGeB;A@(-n4k!oxg$SnL2m=%g#NkT-f$BjDLE@!?bT>EkaSlQ;apt zl$fOcQUZ%Ozw@+-NCYgD4&>ZUw0I{ofUIPV7aX1=9_k@nYh=ZbXTwEtg3uWk`e6g~ z8_!id=kZ(=JPQA!=L+KVD1HFB@R7?eeRqzTgeMe<;6h;l-`K#-TSevzoeI`1rfo)b zmeuB3=MPN8JKkbcz0>9}*S1A~C0kgm^A}7If96vl48zLwPMf15EMa3zng{BSCcNY2 z18Ala$UZw|T*-gjJX$=>7oLPsA8VZtY(J(a4*}30j{rsy`4iP6E?$Q3m-phPv>9^}QP2aLne%3QG<6!PY+{+sb3~%mnlPF5rkBn%O=2PDG;y7t`QFh^KEa84sAnQ6OuuAAPfan(ha~R`l##cu+7~Y}dc^oaV zgQSfh7|(C~597I85dXh3o+s|V(|A4#d`&;I;~6K#&g1!8lPG6APgA0u#`BzWv*Y;- zPD(PK&--RPN0|bxMO&=%v4QbCgL}3a&n1YXHJ;)0%!+;tsx%=QO#zEdRCX}unJ_z; z9m*rDs=*v?0LQ7kg>4F^07mk{k>nBz1ikv_;u`L)`S z@>e3|=lU_c#AWXkH27Bb?%tcAmM9qE_a6lqp=LYt!FwK!B%9c)JZ~htDR|GW*}{AL zgw3+9KufcQ5a0ix34DMz_xde5N^hb_*iqvrJRFkp>2EeEX1T{9jvN{v4NBSK|8bxc z(hV)gn|i!TS!7al9EW9HP9fgZ6HV15xQGM~(_84H)u(hEH^Sf{+e$SD7hyD8B~2k= z!q{~bcEpbzp5O%Syv^!y{dPfa`hi4)*&7Y=*HL}*PyX~!DdP~%+W|rY$zWn%b;}ZD zfXV;R1~eCHW7@vVDDHV&pr9`91 zIV4kO=6IHTfv#~neoZ=W;XI`~TWD&s zEh^{%Io-1DVHN2vwGnyTZrp%9kimGghu-fN?CUa8v><@8-%95YwjW?tCoyIN6?g*v zvr`U5XwY-bQ=ouvrj!2eeZ~a%DEz1@cSlMCQa^nrQx+s>jbyuCG=R?$Qg^Fll0Ms%EYOTm?>i->&%8dI>HkTgvq*SYULz8Ctjw=x7C<>&^sjoxZcl4}g}tEDE4>8sv%b}L+{(BrrBb3H%n78aURpVs1Wiwi5)3{Cdw&}8|xtnML+ zMh;CgrI4cXb}g!KFj@cEsn7D0r*m)Cn+fkR8n?kMT+FYnZhUbe?+99sTp17LQen_wWEfw!OMRT6M`A(5fN|op+BgjfRq1L_A{g zbkK=H$O>(5+U?E-I_pSmjoJ5m@ z)m4!~>HkS3qH0E(C}aYcl$eA=g2;DTL^iMovb}$@#dK%9>CSU-GzKVtU8`OF zl1Rck6;9Zue8Q&8Hz}Xbru0n8AIzC}R~z-~Fr{}hrvUu-Uo(gRA8B3(zwys;2OGG1 zmwsTQ_#y>b}r~F6|@GU`I2grmx59&8_CPC8-X89$77P`Da=@B zGQ&!s>*kPduF^G^#yzivub_ofO8g=UC3^Ni^qe8leVh&3V?aLt9@kF{+shws7g}XCnksYq;wlrR;vO2%HF^HTrGw|1Ldzg;bs6CAfG>w=*jJ|Ajr^oSlt1&HT^0nl_G! z8k7X79^grM;dA;&TB%<9?eMoyq92L7c56C#mhjvxc59CQ%;i^$J#eLq1);_o&|94I zBKi5Q)SoC%B3gCnOyk*T8#P3$?yCi|*0gK-FLF)07AgV;ZKFhiYc(lWV-Y-Ivs^~c ztjv+Rm=EVZrTfBLMdn!yBFxsP;s(o1m}tBtVHDAfIz_MxH_l{!47Qeps2vf|<1jrhM5bm#-)>@UcG|_&%y}vzePgfM8#8>a z)3KiVt++znlwFeT=hLR2Lg@5!o$aTgJqG)E2^9?K=Vwygc*Wm(&h&G3u|_J}&$F`q z>|A9UZD@^D_mzYFv>{!D1pPE-Z0hH4RBqE^lfd@#%A9^KH?fvaAKFi~H`~uw=|Yy7 zPwR?@!D;^2+xh7qxCiq@rKi*S9h^owLxtNA-!a3;2xm$c-3s-PuJ6c{US+=Elrp84 z=+n$8uwWp_F)K!aQK811z^I*VLjx-_tE;snuW1(IB3Hvsxf&EWQ-O#Vn6unTq%&Uq zKU`Ts|N6s5YGK43nbIvk&$jVteSPURe5raR*0887;iZL6#iajnH!I!{zRhuhpJmp; z&%5Z$HvA*N$!$63&Hge(UnV^r=gkh}xC67T{pWO)Yco3*^R8a0#o?q=d`o|Hra5nR zDqA7QaHsQTF&f7mNQWvak|;o!idq7&?D?dB`Lh~ig8lJmT!tPwI|cz^_Q)C5(#Cie z2UHsrNlq?VF@92#o|A$vf4(ZKPtTT7_(-yAQq^8G>n!O+*AbH3~ldw%3B^kt{m zKF_aHe-GCAvIEqs;B1*`6+QaZGXpBKI@WcA4*MW|z#wf%!_(L#p!)LW+lybxU`bIr?eXgYuizHMx!u9 z2>YZNS|itkjzMXpv@!(5_ZFwUOZTG^YY`kspzjDWU_ywT*Q_l`CxX~EVg<)J_~eM< zZz;d|xYYK-=5JsK+q@q}@KP5nA&t3C$9PxbMhLg4A3H}I(JLcH%qRzcvt&a3SPI*C zlgDL8q7E-n7;{IL^$y!kl3B6T-2D8@hxHEolwVq!Aeu3^*!4VAj0~-;_@QECGnxVR z2~Y;d&>=e-kUw%m#YF=$$g^O1Ex#9>Z_+`C=eYIK4bOU#Me4btGKG4wx+Qm|2?<0i zLn5rOWrP2stVldVzAGpF&HEE*D~dO2k@R@478Ng+PTs3O+iW(DuMZb5+h7PAIO63i zSe>pR_en3ZKAZk=n?5s4>G2>!d8F^K=}kiK2GRN1^#5hkZ#3z@lTAOBKU2vOlL)>evqcL9V zO#ZU_Y};!1Gtc*0t#qumkuX*gBCRS&K16hJG{!BAyZ;xX2|lAS1}tTTy(7Q*pwy0G z3yM=aMl2ZHy2F@Zm&Cl3vBPdNnfgcd+7FsYKOQhM)Hw{&HCFwm({?;F5b4y>kI|n2 ze>UC?Vt%;dSuG6)4!!Iq&N6GDoO_;16j+eDHyZsJqw2J+Wi8jGJ>{uO+d2~>4E9j? z#JkK$xUKi{%bPkkD3ujn$>eXLZB|o;-ISROaro7U({=+9DBMI?wy&WFwn?ySZ8WgX zHYb=46jdG+1%4Ci@Q-@aZWi7^PUoJKa?-UHUfGG{Ei%18ng&Y@VOvQXnM+~*@=FAW zjMgIlo>za8>3brlNk7x#H{?LC6Au|T)qxqZ%`+q?nh1q71 z3I+6$`n(f;bmdO;Q5&X@fl1L9&_|}>7r!>7;s00kQLRoBZihZH=f>U*=p#cLiB7Wg z(WC*sUbvI}A#LfSM{z1F$p9Lu`}hp#qmP#4(nnGo7%CsJm0`>W=%c6AnIU@3OO?>l zI=d1_na_p?#8IFHooeWgK~7neQ4m!wkpz^OC1bqf3*91@Gl#j<5RIF=(++x(0EARFAfM10Eke4Tso@Y?DRoi;gV z#ukaDT+*_j5(t3Z7R*VwXW=RDN`vN+%&XJlBFi~O>2@SX^c+{2*LMc7YycfM^G?mb zB;>T!nzGa&(EZhT2|uYsUBoRvu)3PhD>!q*Q*!|&UhUj7tvu26ECmb7<%xoGBIb-_ zAdr%MTg$gY&8J|*hMV>Jt8opTE*yb}z`CZbOK`zg%k_8IT5leSKJg@`*J%;wo)hCr zSzGWDc4_qmk0+|1OE~f8@u6Jj)?Xd3KL3KtQ8s?m-x&AKzaZ}YAfE7MT#ZEjs}#gt zQCEzNd(+Ah*+0@hQ6ClW)KvTfs%8zkI{!bYC+?j?MKiAEE@lNMn${)?Xv9eo^1N8z z1XVoaYClFob=_l-1vDs=xr}ix7zsJwoScjm^lrO6?w&T@0IG#|vG^3L`0-)Xvlb zezynsak7`byG)nYgX%-1PI%#~#ioi@YS->l=RG(ZT*ImDIlN%2>bNfi56sWv!AK~y zvCexX;nueVIQ9E1GHK@ZrvWtD5wE&%CSs@GzplnQ?Mu;})l9sbyOQa~NON|#FGZNM z;=hY78xiYiE7OL+2|R7tvk_^0WxLrJ@_AXA{$EVqVC$}SbGPmf*&nn4&Q5rL*VaAL zY~9>mbK{G1-XMo6Ul1zX8L_<?*5z<4lg5;eQs^6 z>P9oUygcWoRc^b6L*~!zoJQxP$ZgliU<6(3jd9!m!nYZvs>wxc>XPPTQgSO@k5&EL z6yvmA$}ewN^vDcT#cf}1a$vC8+rE}h@xF+ldfR2h#{>%Xwr?8v`Ws)8T=lj;%U{8> zxBW%_GH@X`{ebzsg})K=_1eIf&zDBMxBbn5udRHQn6MA{TV%ev_$x0Ez3q?irStYR z5+x$Q>K`8XyTo(1(=G}9iA{G;R)b^S6WpudT=6yZKX0~tn3?J=y0gQ~1+M2@p>lD2 zu8MGcZf0J1MTB2wr*W3q@pNy}=*HdhDbBLC$y@lw3n~MnL3Wm{iajhFb{Vgmp@kY8 z^}+BE!%M|sl8NV%Mj{<9Ae=GVG~oqrWIWxJ=cex@PIPhF4A=2RZu(w@Oc`y*%5>+i z3R(15jfAEY)9b+{eB0S%CdJ?^GoySnv4MGf`|W%);xX@UnFjP!bBAHa{%QY7HPvr6 z52JngNjxyOn^}uxSM#u0I{*9)N}-lttCm^rtw9mFHQD00Lk8>@b80{3=B7mIv%>ks zDoy?En*#C`aT0}$X{k;177D9IYg3uA&Z1Kcbpw($%L(M$5B1ll8{FWUB^t1T6hq#CJL5Yv!-XDZ9fcnuKLF%oEYU-l7 z-6F#D{77oc*0_7|Bg~4wzc-wd0kowSvx`{gZs zh>@`PcOho0MapDKlXl6_+f+9a%kl|t^?gEHvhfxMZmZ1tYT>Aqr?+Ji4F%E|BVL)ywpPBLndQ8*&N-v&{e*M) zTIY<-?>lF2!i?&P_nq}u}5}OHxfJQ91ERi3~v6#E4%*ffQ{pLCe+%c$l zn;|&k-Ql5F_dl?`ew=!1B-f;O4ClxPN3w#SGLqZ>`VBT0fL>)XB*{@&?+Qpy(_!A4 z9g>8_yx}oYwJ;>YsLh;dxzSWgJ@0R&o=*7|uyVwEp6-4%KSn!c1VVK`dqARWq{K%C zb*VtrRYYBV7gJHpI;UZQ)HVH~g`r@|v^-!iCzDI|*j`@qA=;&*I&M$iD~pZVO)VWy z0mgKt&fD0J}yjcE@z z$URxSQXWQBu>^ucS|Sx^u++@x<0lBNQX)G6U(zeVP}1HQV&Va7(%zaSTc2gNm9C$! zE7UOcTB{MUQgH*NNqy5OIu6@auH6E#I|=5-5+yf?W)>t|J!v1 ztKbNiWJ;41W??+3Zv?sNaBZ5oL+xfkz)NK*iZ{%}9wW-eXcy9@EpLNTwQTUMl1=qU zF#VN8qpy;TWr5OR;E+uxM5Seto6dsTn#u=KjJYuumw^do2_~9q63W94wi%!aSP4xP zuXyH)k!%Hs#Lb(8r2Cl&T=FrsM81+25e5wcZ)f z@n%XVUu~r#iA?E{!KYF3A|SDbQ zR$#&!A+wB4Nm9`^q7jGy*pNSrBE7AkT0|&|jg8lh4-nGRe`MCcThp+CX*e#M;4%^f zW%?KJZ5j7`t$Iq9_6XV^$`huoA!}?1Q0lxF@%Uq$ir1zu`USjBmqywP-_R5AIyK`s zHmGYEaX0>+(YwxnnR9O&d365m9d`No+t?Ik=!6QiW(3b}Zp~LXbGJY7ucH}u+O`5t z6ph^Kbh>Z{nhhXy)E~+EZ{ zrquEcHI6wmxraG3xi{nVDN zv#cgu&}AEy+nkzD)SjNgGK8Gua^C5J&=Vbj+pn+H%x*3wV*$MoxyK<>kl>%}BT9frQQiFHjgdKB%{JR*$`&fA z%-K0boeu1rPMh|}!F}Quet9*Y)UsiZjk(7)#Jrkv-jlKb%GscPKvIHbw9oP{eNV>y zJMB&}`v)$NZf*d#m1Q{yoZ&Uk0pjIcbx zfMeKnW;E*h({fhT8-IpAa_%`5nI=@rJZ`|ORhoen^fE(Jb(;*Aop!Mi!Di2a*w^hw zo_D$S7UXOTW$PT|o7DGP(hk|gYqz}vCec!5D+g4&?BlO!ga9xdGtgutUJ6rz}t{T}#hS%D-E=~<|jGi&TTZ16T1QVN`u z*x)@kuu0axlPUemT=k>=8SbyOUmJB#o_HwB!GSYi?(lpkE*!-4@s5;Nw^yX#aD?m+9+01&^BqT-6b2mtBVFi z4H7jHYH8ILVOOz5+^~scxvWNfQLB|&+tR9)qSl~RlYk_kBE}bpKSiu{)3p`RLJ(yC z-|v}w_i?kq^#ALR4>vo{Gp{pe&YU@O=285ymR9*?7da_*wQPL;5<)%8eH+|qsnz;( zp}F#KBdZ&ZW7@5iXF_ltSs4Uwhq9wg3orIZ3!GlO+Kja$IyHRt&Z*%A*y!w~i0Ps{ zoE7jp65nw+I~a?#=o`_Nck!BoaUK?C5TwXOc(Cse?O0tr#;;{V^=B$PU?VpicE+@D z;OJ=nd)dGz>OzDpi*&~(EYdlZMY>^bUE@UE|2C(kPv?1}WysJ*B04K#NsnWA0 zTjlqOl5YIMJR}E;JR>*#WIU!$AnNb$71ZbG%9A^37(jec^71_}+0gq>{7H{j_HJHy zB*os%HUf+|u7ltd60S?-QFX`TNTG)dmp_W1h~r7dg&ij=-$yFtJeBeo28IiNtm1}8 zC1ru~JxaAmyoZHqAbXxlsjIjXRmvZ;AnXHG%4=Sglpm_n&GOFKDuLTn%0JK-DV(iR zR;oZe{)Q3?zm$BAuc^RKR6TW-^3N*pyHaf74)|aTr{n{y29d<Ge8+lKlQ*nyMKM z4^{xUG`M&b0~T?XBMPr=h4G_|;1vFmc|u~m20d+_KQw;KF~j7$?^(nub$}p3ybV;^ zr*hxK(19U~zNt5C=AIL#KxQB|KKiEXKr<0gDr)<$L?e%x$KF>Qf@mHnu)Ks|hz5H; z!l;2buA;wj1Iq&+D&>ob6Z2&oxtEHADaS~wCe^$7I9H$8d921VQ@s`6HheqrMJ?kG z-EC|;CRaE3h|N0k?_y6)ZI^_GV>rCBlblmhYV7H%e%%S#AOUn$zeF)$SM^rc2KH6; zwxbZkLs2LQev|Dprnd9VwvKsNn|1_pLK<$gvLF+>R0*JsH+kc`w5z&X%z0M7o{iy1 zLT{-Z!txRoH%oXCP^}WKNR$9E(qKx+MNN|>&{$}O5`L6Y!k0g_+TiS8LTX;!aJ;$` z9mrlb99!T_YvG}|6ot-veJJFv$vUhYhC@v0!!cGL_M%Lyg*PS2FaFB%rzOij|1jm} zXBDTEUpyOyN%_TA`9Df2|I43P?RR};`R~7%X#cx#4%GgyEWa0JCfcvcAKIt|fvrL# zcXM*Q@i#R&)*uvA}(4t;UU{ug`>$Pd)R|BKs(gTn!jUfv6M4KMQTuH3bNdU55UIH;qkey^WK7JyB za=1!wE!LB`Sf8F;tZR@sKDzA3ctAK(1!hEcey>E|`@L!3WBol-}gQ?$D9Uy zl=B{@0OGsD(>;bHhiz@iFCMoseT>n?_7&rOZcIKrB#kAa1eXlt{Ap6}7ogH&6?t7H z%LyGQ);t}(e-qkWxbZif{VW2)hV9!>ZO95(+Bz6zKvyd3Rbudls%6|JL?`0?F}J)j z3nR=yPTKI&T0lr&f7}u8A?`1{jqPKG@C5WWmZIm}#-!eGixbnQI=re6UFbD}^m)TU zT=R{qM!LhnXu^YZ2jM{&Ea<@4y!#LotpH=U_`LCcz;y+@j8F}{TO+{7;3omRIMq`E z51`_v7@?NJhZ4_Vps~pgTMr^`F5R zewEeRs>AiG0Ikg%cC}a)bhRd2cj^tD=*etEuSC*^P)?}B(XU>+5w{Isb|YPTB6D}b zg%{~N5w(@whotX>`sQfMFJ=!KpF`izq@jAlyCz+<5zfE;fGeuj%*#^=dh03^qPkV$ z0yjWk@leB}Cr$AV2_CTOH9j^2{DgRCjwvRmi}Ib8H%<8txNBed_oTlYmvR9~JaQj> z1BY#(I*@0{jEIjuOUi;N>nW&63|3)c1%ln4mftfcB|5}X%kUcCepm%RH@8CdQZ_CX zJ3uYe8xU8lZ@(978ot%|*5GS1KZXzVy?{7=j2HTyypJWPZR$Ebtp9CnRLi1T1){4S zBENJir#SRl=WqctJ?GOC`PFK+B=Q`jRat+XgW8KZFG*r8T3GqcMOtOz0e7jp%Julm z0T{-nMT%6!C zZWk(Hyb9{zsod;=`2r8j7hIMwU$Bhu25Z1T>=$@a>=#Jxj3x~5puHImwgIAeuwbU8 zgESKc7XSP<-si$rq2IH%=K31?xE_n^ZQS^CGYo2eY%0ejua1;+)->4xx1YxEd=grN@)b8UUM7E3V^Y& z(f8@(NN#pzhtYZc_q;hvxV`X(hj@);vM~WZfYpEn4M|P(C>xIpbnfvhm|M`rowGHJ zUGe&4W(I@e;4BEqVJ$s3yfU8WlEwoc>N8+hLf)eAYXXHc3cqTS z_%(s}b!rm7$`pP9UK;b3eQz3q)eymMebbI$1L4;bc#g%6U#qMzt8w_{c%;d542T%^kgCbA-5z@0`>F_31{^8@JI8+xBkG=ETUTilO~F3sg2Oa0uT5z?{(F z)tgF!rU&a2crFHG1u+@H;%FHvk3LF&4~qM}jPk14*z?L@R_~@^hp9%d2j`_>$1+g; z;5u`MyFH-sg{Hf&uy(k3nCS;|aV&ym?)FRn9iQ4Ts^obJvfQCBv>PVC>i>#IRs$}# zfgYnPcB0AW9%J&kMJAt%*LJ$_P=-<6ZUpKfv3-W>WO_J*xC~4dfcH6X)?l^h<|CkN zMS)p&EWg^2S3((jZR=x`on5=Zgkp68P z2fqV|+t32_V#hDGB;+V}!znLz1d?I%l{2d3T_TMDTDU1qvrdZQqknr@3d>q7EbIQ> zx6u~SlU?^6X%q}#fo0u*P*d994r%{}Xhj#Fe%6|KfM8s-VQNEe3C_RT(Fr(e{WEfc zMISv=)cP7fMrV6-HpSn6-ie40x3-Pw`J-|vVHjpVk&bXPbec~6a;dz>x#ZZo+S zzC)56kWM@vv78?EvtWvT?)Qdd@J#-GCzh7^gW6= zevB{v{SjHi@%8=gh^#oip>XqK_+Y-9k?yVx-!~DaaFR)d6ND>C(n?K=hVbI(g^GC9_NRx?8Y_JA&Xn_%76`+z9ep21 zK#01OTKHkdZ;(O{7y9qQPsH&dZzch96sf>-ab$@qeW0>0M<9+#etQQ`P=15Ia!L|$+$jNf<1Z&zm!l6Z z9QVPs2d=qfp2LMp39-x3gdhF`c9z<@Th_zs3$Y3nQy>`X7!x1;=Zne7ixFkK^B%j1 zzQQ@IN5t{+CeGbQ2@I1NyQb)Ii$oAqJnJ(74Su8XV;AZK_H_4yC|;e_@LDkop!^lf zBDVG#6$p#D*!&3P#g3-xZE?&2(u#PPCPKs-7A+ibMUHk?I}d9F4j74QC{be1!-CT9 zN0|E;ziHITY?QGlK6;llq{`ZxngXtoGBvbp$ndqw8LSnarAL; ziWN&g#5;_;7XdhZb-6=7&mXerc><6KJwHDB7Q~SkyRj$f~ zxr=g)g}I@Hxmo^`o8ybei9jQ*y}D{|79qo`UQ9J?(+r1tRXm1UmTYMo0@huEv5t>^ z8O}t*65FiQhNQR0>VLP^)T?&59&}1@YtYCtOV(-9<5Hh7`h`|3@v!h1YR}gzvb5&YiDwnAe66_zE~E1#uv@{K zhQ+%JMU}c8HA=jhT*_BoYu(|=#h9~;0H{$%^_^LmtMz0}-y#d#gO?ZsFZ(K>tr^(Z z_ywuXqUSt(+6(st3#T9#34(haBcdO{rZ+hnMJEbNC3YIl0`%~?*!`Ycj?aabl&%MS zt$6{6F#G&WdF}BBB+14MTK>W7RhNj*@!@SOK$_QC#JGvq;k3haZ1bUzZSy_$f`}C^cW9hEL675`we#5xH+(~ydXH*Wz z-nLkd&)DG$kHw3LS`)PX5jI)}G*n8KdoKS(L|T~VJ_<`pUo3|TAI4T4*O|r{jdw!T zl*qEtlUp{#mZ)-b;9aI&UtX7svo<`{9q-Vw8(8#7Y=k>(Fe?gtD{=%ZfH)TwdyR9+ zQC_m1s}c=&Lw_Y2#;g+_GWHGD1P#d5BN!kf#~Z<80bwY{&BPBX2w67v+^9Obe{Q0u zdSPx~^%PK`_r;?RrS2i2aw}E#Mcnz^A0n?qM|E^VfeUrydn? z_@>^q0w`1d{6Xb^aKQZC%Lh~b3dzs?wvP+3>~W__8*nD#XtKlTq%pUYHlRn$$G5#o zd#5-$4-h3dWyTByzvTZI{szO=2mhb-&on-B?XWYB?~(z>r*u&H=MR`ay3E$LjOEWB zF#qa7<)1!a{<(w7KUwk*IR17R8OH|;5nhg<1)EYh>t&;GEZ`=w4Dj_#_`3o6hG}y! z1AHBvn3AcOD4bcWGE5by#40|lZ)&c1Wv)Q8z)@>2tE2yX-`qRV?9cxB$NUHR2Ws!@ zErV&Vx%pCEItYo2TA+%~BE z_m{%gTPd;ZS;`2Aw1f5!gp84y2e?fEnIua&=l`D5()GnQ}FzyJ7d zgV_Nat?$QgCGoREv6vC?I@z>0=lDf>cD*t~^}BmNljdW7^vgeUQ29R?F#j=w%Kw^` zKSTSM45t0o{OXTCEA9C+;?KbJrFKyHRrv$WuTgdw8P;pHekA4>Pd@57({O(Rouhby zf#5&U*sqViYW`+~pK1Qq+F@txKZU=le*MQ_RDT#5>W9bR>anNU1nE}`+x=Xk-4@F& z=X+(7c7TrK)RB9xK#qq}2FKc9S`V1^t-ZkZBkhcR8D4jVG|pvGvf}7pP!2ZzNa#bC zgZ~*;UWdn1?phx{2HlS2R`Hl0{pWXiddc3(jPrY~Ab6(yeYi83Hop&>zklDh+4E-{ zAFKTS`4iA@?25dFIGVuqs{b6UI zzw-xd-xz!T!?!OZzyCV!+@|43hW6>}55xb0m@MQzBjr5RrCOcB{o=fMfc^4}L6l!k z!CJjyzKf%?6MdSPJaA;{-#*+owzX}*{vD`(yyI+xk%7Jl$xF=oc^PUr5d0bcCHNWV z|Icl8&p7`T{%6YH_P@-(@PC=V{6EUypMLcH%+~(H&yS4qoG0usGRzNie+F#{pnzMu zt3xfWGgHxE!14bt!Ot{)eK*?LpK<&LrY~*w{2BXi;QR{*m7nvO^SA%_l@BWa^a1nt zEwr^iWBn%&n7?gM`6mvTf8n6=j~g(5`JnQTH1qf8ANp>vwLjzdXPf!^@#pK(vk$=E z=ScQU{QZrC%KzDDkqc+S-|}<-1Mok)1VASI>AT+6{*2?V@((mWpRmIic>X8oe>-ZF zl(eZ;Y9RPC{*U2*9c6lBD*&sPM#E^D~Wi zz8zl1@mBTWsf~KCXcDaB^`UvtRI}KA9Gp0w@!LACgHI)=3i5H-VZK@Q)u{;*Bzi*U@U(xMF_UjLzSnm?EKl{zsVd>cin6G!Je$3Q=-3x3@ z&e(q|%<}t>XNx`mVd_87eDL&#@s<2m5H+&Tw@mGe&i_x^*PouQw&%}?@7DPAU(e>+ z^Jnbef%BIRD*t?QeEOFky>2k=pFLpy)q~1EUGfh!zH{s_20@R?GK?=b=(&8du6ON+ zUxI%~`g@dL>4Td0lYkw`Lko4l%6*H78&fteUC1g))qaIA6Q}!X6CzR**WV>sCi|xu z)3**TeTv-V-F`We?VJ2jdV3$V`LmC~)v$7|h}&IT6|5;TPJ=EK(rM^*n)p;{YNR|5n)i zJvRTyf2F6NZu75D{{H;~jGb%kv@Q7^(yD&qd}C8n@HM4BPyfV9XRV*f{(KN|srBDw z^N-t|9zWaWe^B}Rm(NYR%$Kc5kv^J-pI^nFW=Nmt?F~6%j@m2`Lmx+uir$Qf4A!Nb(i%|F`*5=9{g4oyy;z z9w*k9ova?!s#5wZ32$OYdV5#c{GB%cE}MU3XL|mL%72*p)F4H_`Wzs^nn z{5=DepRzuUSZ}XEvOi`cE_HoeV)H*}^Y_^Ndu;x38`9xTw)vN&`xSmaDuF5Eby)m) z45`7TIS+$_iT3?p!|z?2-k#nbn?L)7^!}J=^Ut>Vmni@L{rWi*1tr(d1b*$Y)o0{J zTm5bR**5={+YgPj?{{qe={CQ8zx1FjzSHL4WAl%+?WZQ&{IhNT6*m7`F1TWAl&fPRE~#Hvjx|zex`yaIo~|d8Gc& z=*`Rj5&ZZ51Ndft^~TamQ1sF(w`{HbE%pN5|E5FV$P3%XN{3Y|PTtK#;A>XIUNSq-j@Wbkl15!+4L`mVVHPm-_W@|M?)QK5FB5 zHqwJ&z)Zpn>iP8ehs#bKnm!%jBV?cw^;h)hT4b=ACclT}e}1aK4~qZkoiCsh<@G*j z^Y_^Ndu;xZFQ?Oki8lXqn}3PT|Df_`=r2wn)n9)?nt||lj}6|)E$Q`{Zu76O`PZiV zRe!%Mfhj$H*#3S6sRv8{dwbH$>)oULIA6*)ZP>v;T;VmBQudA)$h~?r>ulW2YFxh( z_iS|INWJnk|MXV9;%81jF0hS+H?Sw>)^Q_8H?nal=k43_Ah^KYC&W(1JsaM&nT~Iy z-Zj|?p$1?SjsSG`I#_ds2NqpkapOS5DD0cbGEv}T-{Vy<97iRuJn@R^q@G^K73QrR z^&Zy6x|rp}E8Kf=_sMPSg>Bt3SNWgkqN-YxGIAGgfhT$vK>8vN@I@@IaikY*zze98 zoqD($0v4%y#yb1L^PL-)wjviAbeljLDV4hn*S2sI>ND7(GD2;L*YU_9e&o@i^=O#K zsKSGRp*09|?`wy}O{agBt9(s9j7Hq43m{ z*1QvreN{EQvPqL@E%5px4K+R^7B~*}m)7yBadcw^>@n@jEnzDE$E==vFMPCK#0*;V z`}k}2ir0vgqW9c?hN+1n4{T_mXN=YY{B_4yv?CoK8VJnx8qG}BSnrEJPpsg0wXmmQ z#jpjhTtsJA;ufKCKNC%@c)S}K{iEE*g}$k{_hr1;@efCE*AO?}(8!SW9Au464fT}- zbl^^`D%9r)Ox7zN-wGgsqm4TVOs;yp7=6T(tt#|2>Jq<*ht0C1(Ht`jnEqmPa}j-P zGc6K}_)ZOfc+Ds@ip7WYnjyx~M=hor}tR6>HmBb=-7aLPuK68paIM zjb(JiPQg6Wjm_~IXH&Z$yuw9gp{LsrF$89%jb*Fh@>P6`%AUiFB?KRCv#P%FM5EUoOvhfDZN! z$358;dYG_>RLsk>+x0M>ceoML8E4|46wya#f}%u1tdTGB%X#>j8a{4ncve0vbR*R> zL?Aq3K3Dxnr@)L(*abSZ(1~k^>S88D*4CX{;g^iUi!K6*3f-uKy3`>rsTFJDqU9{O zcu^PDK`@i&l&E)MqU+1i8Id!aRuyKspM^mzAk;s_UfJ0=bk~}8AjIm6m6G%^)r}Y7 z=>84=)MWpGmKw)`zW!_(=_}6m?ex_b{xPavxON6Thiau6L7()KAPW$s<2Xgs$2%@kW zg`rM=5A!1Cmu8u|@mBO;C5?2Q4$~R=-uO#eGmN4#{b-~Y68{qN^S#evzV`_vMyIKJ z&g#Z9x>PVAAtRIVW(SKB1k!#AXk8bwsXs{+`vs~pi&cqC`(w(D?BcBG3FU0THeL#y zt(zm=<#Hk?s#AC~;7F~GVyz;-;s|(+^YVS+r`_xTc--%Y9T8n1Z};vOTcR+W2w3ppoO*D^UeyGoeO8u=H++*-auUy8He! z<;FPPcr`eO(9S#X><6Ewu6bInUirw=M`{F z1JeB>Z=?fUR`i<~VNA=sjUf&=*1F{-QVm=n?pe--=Dw03B4B!f^~Izx$Kx9F(VC>a zIGk3VbkF^Tuu6lg|9#%jS)U_!Z{SMw+L-Aat^)voiaov*^~d6mv3fFntgibu#tH+4 zKJSi>LjAqr+|LmZ$Wym_$A;Ii54=Xf=eqGmbgjBfk9*Qcr3}W(Xe4gV1Gj291ZgJW zCfW=#>3BCIzKUd2jg#6o-A{9G*Xe3FtA;4B)d=!v#f3EPEKRlwjo7z;BN zSf0vJJ+2$pg@3fu6+Lybq^9+8R3_ypObRsbn}=>JN3ZNBDaKWIzOF$c55xKAz}Lbx zP9`AU0YXhNOiNXj+WliftJ+cOmzbsua<9RIoY6cF+18s&L9HGjrUU12Wk4J2fgA4u zg9JE@*F1)6E)XsM7eIrPpBs`DUmrS6sf)^N8o&Z)<)C|@T&@;tX^cI7Au=w5W(M}lBLI0na z(*Ic7&^)}ysdt6gTKRgiWDyZ5fo^*btlUKc1bTxV5O&Cr$*1A2q_qg}G;s#YnV zC2A8ou6G($bByz5#*JXHVg}BOz9YZ-kjJmIruY5 ziYS`YUQt!6-P!Jj6}qb0@Od+udlvpCGC3Zus*C*+mCgzPUiX50lmPIt9HXk<9oqRk z>g@?v`4lNElVMCf-JraN*3(Wxb=Pmq9@5VoT53Ev4#8@%$Y)W_@AfB_bL;#%;#d$O9RdR}WN#-P zT#fGQAh}!5#Hn)>_}KVy8H$CfowF`Mt4Te1CQGU)P(V$A7!B&qJxrveALkF51y%ehYi3#IJe>lBnd_Y zv!Yi$Lla_wBXI^@b&Yn31+L5YdGO|7k9b&SObViyFVxHf<1zX0x9@txP2W_N6C;DT7b0Th5poo)pKQOr+}@~PFchye!E9I z1@?-x(gRxQryi|zv)24~&?nReowbMxIGDKalS~^eJEd)#{0`$rPLzf9q4*H()(sL_ zg-t@sDvSrLnE1!Dp`-MO4jNxo4su&+)STvyzY2Ri@Z*)iWQd~;d9o_|v|AS`IOT@! z*Ped=_yx$D12h=D&*>mVz>Xx|N)iDOFcfnf-m`4us)=x|^c8pfjv(TCPeR?1`vffn z#v#i%Z%pI+NE5s%FTN?X=}^1_m75%gnUyb57=Rbv3*ab6fV`RpA3>jaw3#g|!>yHW zvPxJl)s&iDhRg&qQ-JiVo-FDDd5e|#7G`d!8p93f(i`cCjLtcNhPIb1@53CV^+B`Q zStjs<8f!Qh;HQ{v+9)~xlQw-K{U~h;BlDnp`zhp;#A$`0OP0%av6rUq*g@s}Yb1%N zAHvtCq~s%!h>7zgvDsirwu;FnBbjyyo-%b7_KryD5=pU|DTErsoNH_ew%oMQy@I*XL-ZAF-+wO-WT( z5eK1w6JHS&2+qQf3Sp&@%ivJdt|JEHk`ubF&xN~7oABv;ENJ_#cVJe;0BQ?*1r^+y zz#*hUtGGd#rr#C=C(RpBE|vGL1F z($??~-I!MDZP@Rn-~g(BJ%PMQ?Y&@@K(0Hpi14BBX3=`I*9jKQ34vMkHN0bjQ&4#+Z^hM6k7ygX=g11kbuz3Mm zzB!hUMV&p_jh=Ms4XxdgHz7>J4=aTxD;lJr~vX-Cp3U?9!Gyu-HwlTz^wF%yNA;S#uWL zk{M>kE_fAP;ElISF967*=TgzmDWosHLd_guXAfsDP1cthtQ)0TX|Ieu7LF!#wa-|| z9v3@HemJyCc3}3LbbLP86l{O%b>lj$$%{(n!rCPkCKnebOgc=xV!h!xKBfWdT)@xu zvPR*t31YwpKono(k}o}xbF&qH?!{x+{!{Qb$NzP`;Z_-MP+AN$>}PhfyK@a~#shy2GSwC7^*bEj5zYRkuCWHH1y zedj-IS-c(D7H#@Wo3@z}nOm2ludZs0tBxw21Kpx)8n0b ztkA=4GK$K~xwi3x^=3Heo-f<$g}fLri&y zbZ@?fzZ*&8w#0Hl-7w1$^;SBK15*P`B8_tiVXLuNMPZ4^;Z(!6D!5IPjR#k9mb-H6 z0-Coz!d=;ZLo__C-V^rD5iTk`tuBR|O5^_xcU>B5Z^EBeO8Q4j$>0^yo@K(W#8fSy3--K1vQ=u zZXLY4xiRL>8PDedc5(EgM~7hkjkS{Ti4I97>CIiXm3BMQ#&AYpLNs0>JV@%)UR=R@ z5^3=I{E(Y-(eZ_{HP@E&H3qg4E#i)+o+7k)DUFu(2IpBm0~p-{{Z_I5UB2E2YD1fT zSYyy*xF9e&e|51xPwXtlMy+#U}HAR);x1qIhW!g{5s zu(2Q$F~Co+b_I@D?F_EE)e2!FxON{3nO5 z)cXv#E*rN{_mJ4gy`9;9N2ohHmcO?Xb1T%H8+Pm3)4N74a5i3vcQp3J8@+l~R&G{o z6he<&FhW8PsL*_{!n;P9DIYi>DV4eZ|=F#3=3LeH}CDt_v1**jhWEyzZ9+eB;?ieyMhJM_Tcv! z)fJo}KCaL7<)_7!r}-$406YJEjKSVcrym<7eIFpwm^}U`I~y*{EFkt~NP8mZF2w0Z zarEg4e1r#sT*{Q>U$E|A5?+j?#cpG_@iwL*j8zZupNPNN{^RgB*FU;Vz3$B$WFpGN zKKgRZXc}$=d4cpwYZ^`d1`-^|#UYvWM9#^Mw^H&(`OE?Q!T@+6&p6QgzPNL><|p95 zJmJ=;UdP)!(5cXx)-#r`5SSeA#I^1cAN9)jROEF37yG-Z-G5r*(WV zw5{US56bs_fH!N6FDCU^8NYM&j^jIGxyAtl5BjRaC78H8lc_G}!@ztM7+mg5$L)FK z+-JJxBIL9_95TDGpR4K%--K6yOhI^h@6AM$#^E~!Um3pdm>?&IB!eGp7$ z1q$49X^(wd0<*IM`RbLg*w-Z>R{|jGgXwh%$j2dIs5+~1>--V%j`3UL>%F1Q{K{7r{SWaQ=>f{D zKwzY*BaEehEMu0jw(JkI2T`0r(uOdeeNhd`P7jClO@#yJWs)?Uj|VKL)C-!QN-iGz z-vgiH$(yESWkZL$SO%#cjfs!WTjShEs7+zM!6U-3z zut4DaJOL;BX{(+Ytj71tnrv07A$b5!g`bkBzh(KufOL1E$&`VnLF4!bish;8PR=Rt zrF zaxvG;&q_;wQl7m8&lW>Qx#K!W->Md}fuKe_X#%B8vRqwmiRyhFsX702W5Y%6i}lFr zD9wa7ew>d{2iNafjXx_Ff+4`~>RR>NhT}cR6diNVG3AuauAw-P&@REDg%1a3;i+r% zNQCbZfY6@>wzR0Z9iHfz1v#XR5jW+LObP& z61>R?nH?Sh=3YoUWqHXOI6~`I-vPpeRyhkl9zt=zDUe#I6c3dImE(z$dN`Qo%r#%; zieq#okqRLv-TTE*C@|E6Ub**8(aA)3jq6K|TSlRe!qu(DEn~!Sr*X^i;#ld|RU{bh z-T3+viQxGcdT$FpY^j|;Xbo4Jx!9*H?AklS)hiKo*-DY{8;$L^3y=SURx5Uu(YQf{ zU512pzg|cWHW+_c1V^~~A)~Qd9IK7SZIZ6;7eV=T-t-Uv2UdlvgGS>!lBNmcq~fk! zP54uT{CiPTxVnXo%Ubrj%d-6=v`fBu%fVc1NKd#KKWM}oTImL@^hInIXTE{?M==pL zjJ0S}?W^2Qxgk`zVFVKHM7yH+-4+{-zZ)@OJCJrKfX|G=u?^8*ny?V`34;EP?|%?q z`!WB-AW53}1kV9dn(~k5TJ}=>eYE0xC!^%p z59k_0*DSh@plcdk2hoYKb3z9kH%vA&ms*)opM$Z}m}vMRaQNel7qNDaiEr|cz?U1} z6mYV}u_N&JkZgnZ6Qd6D&lec3sP`caV#D2Zp8hL3-^5OtvH#|uxA+HRTDzN$mmvgt z;!Ki93>c8T=*}}qLSv)Qc}35Po32MBNgP|#jk%TYY0LkDvubuP#!z~B%3c{D$iyvj z^HQ92WlE{nILd2mL1S8Ys25++f-dtKi%ShrM#B=QHN81PSmvfJ_~nz&JY!;wsJ7Kd zf`$S1R~w&1UDxJdQ#z+)VRiH0v|Ha6NEbWxNOKTQY=pJ3E+_;2v0x?WX4CHwhGLgu zgQp&2X*&fWKq-q{mMVg(l`0DBGZgWqju(kBRRx4d<0U&1X{}UIWI(X!EJ8?Ub>x(_ z!iaEv;z89_*TC3#J5c@NtCM;Dv7x?v z|FNOIq1Z_F4GVnD{Z~|#rv3e>Qx>d|OD_6RXVR9XE$DM^!@q^!)k4Rjn5o7q($yp2 z_8ONviIWfi3qy^Csp6Ds_9xpJ{^TWMU zLO^5@vMn|nG*&BpJ(a|sgq0F7+disDbDpqGON*Pji;|-VV~CY4Yb&2xcYn*<$eduvc>YC#XyLlA)&UHRIgU-#Y% z$liu5Y++HYj_UG-C;5LYKp{_lffQ=4Q!9N3)YlE{n>lj~gX+hyckq2IUCPZU=-5pB z)^=mP#+rQjRvZQ($Xw2ge9i58!w|C&%(WTK?Y+e)S)e(km@yb6tXj1n;=~0x@znv) zv~61HYjC0lwXZYXcK#uu1c)?{bpZJ?@N6p1>O+ShtB$~PRjaS!XXrn*@t@q+e*iE% zS`!Z~sSMd~c#u2a|1;4)&J^eLUryy;o(^}0ys}U}1!2{yR z)|wwjdSAu!BqX5aLVu<>*|!ZXl<}h?LYbB$MvolNzQ%7gw)UIwzQa`Gb>H}HrvA=S z!ZLo$Mni-bSjXXKpt0G}Hvpv+r}H1m-9oEOPOeyb|W803u< zVCN?V5wZ(G$jB;5N>phX!%%`_@#VV)vw-^mr@8*5pp|I=Rl5b zwLGm1iH)~=<4_NH97}%h2^e9FTRXmPd|UBt!?zP3_fg#t%HDwSz3o1LMc776mReT3 z(EV>P+!G4Fi=P|vIE6OH3OU1&XbZiaK&b4%*TFHA?{oRlWzN7+i0fBC>}y)bC?Y@E1JHZA5T7mOcvy zH-B!R8TNgr7+$54kS9|hb__KP7UZ=7o$zuUJYQRf?#R+6cYtdN>QH*G$7CSx(_M=- zyGE_zd}o*1?=DUbm_^_Z#O@fyYf4J-mjd^a{RiVo-sVZvL~ocH^eK40$Xx<9GKv%i zoJDTf7rCE7zHs#_-E@+R`^U;GV35zzbhD{wmA|_wPd(qlO&h9G$WHAeaP1 zgO(GKie?}j;zmj1%SPmzsd=+i-W;Zx!C2rOvvx^V3HIPG0Q=ff^P*T4nWswKothPe zA{bfL97ID};qnZX8e`OaLl0`rCxEU>vwcQj4fpMTfh0k10K>Wt-ICSR?$N5>=lDZ# zfc?n_q>x~qCho}vxw@?Vs#b{ciV#x8MKcHRv8gP|nF^-4p{p9)RmV=K+Pwu18W#*5 z?YK~|8c^MQ%5S|3PhV+Gw*#V7KuV6SNm5)VViFYh_a?=Cmund)VKbHTP_E2W{8qQ4 z><#EDOjis6PZ2)_n$~@aIANa<{SsoP{R@uIP)9S+86hqpEG7xG+9-h`pva2gPI@;3 zT?o8Z6{8i==WHfYAvAzL+;KxrBLU84;*=FecP|+lE)dNhs(M$0m_q?5hSgasMSW&I zwknY&Q3ru3MLwm7L82lOBgNjP$OFl|v$OXO5kaOORv6^eh^nyjzH-({w~jbuc4 z1O>vCs76sFOS$h60weN-qPxua2S{rOGMGqT3y!Afe)@Z_z#kk%D80_aD)@bbCKd&Z znAf-%yb-#9?ML^`1TC?*U2j+>N8*XK7rez82 zIuktdxl;03H58mnZw%JG4R06j zqez%xtdauLqa@5QR%eKku<$c&h~m)^&YCGimMbf+3*|9joYj@_fQIKb2DFWCm4gn{ zYm~PETUcL1ZU>~4B#!4AX8;5c$GDfmSdiU7F{0Yp4r5_0{Z4uP7)3yp{))>lo3-9p z+K#dD@%_FKUB(iMYqiHDIHx@vqKug@ylph@?k1qf1?4{Mz;O`oFPRs=XD7lu#se#n z$`k%2e{`c+N2hi*KY})4jfi)-_{1Be*&-qapRkgB9&XvmJP;Loak%4zu58r6wR>Cx z^n{j0i0*%?sokOF5RYBD}L3___q00D2Fq9}Y3XSW40s z4)JgAFY!mNzXjodSSHjrJa8P;eq2UNEu#ppe%M4V;b{wwuXY2#$%v zh5$}x!Be{eew1V>2vq9EJx)n%l%pbYi(p9~BK0t+w*rF8e{|xe97~SwDBK_KeH|Uh z=YpGGghTZ)^0Ig9d9xmT)dl6Ail@#5=)fiMd)Nq~?~_v0c`mu3ji)8?Kyzb0;*8q~ z8Vm;xs^o2x;^>TVdj;c{AWK*1Ec``(!bJ`T0{X1jj3n60)4}H3q2?!`9y(D$JuLwh z4ihR}M5!doC`5^k#8?dv6c|g{+p5nIk{y_c_0{Pq5&h>6A+-m~17^aAbOViz=GXBz zXHz(`4ZnCYI^4XK!BgseMs-%WnfU6(5iHKW<<T+#mlulS%;^cQ;ml3({!KC@Vu{>V zEGotsK``}U_wgBm=Y-wG8G`k&dyFmE6TU9DU(mPug21&?Y69UAuzz@~FH7od~I%Quy*%o;$~nx@bLx?Rr$|1x8rZhXQk3wp(~r<6hY$zLss zki1jIll2q>Xy$g?dPb7PTM|h!d+~w5<6JM*$m76AJnzS^_|LrB?t|8&w3ui%Yl+ zbuIv@+-v6jmKpa_`EH}UQn^nz?;`E?PqXeXosW*$L|Kp2kg&T86>L0IOvuKT=w4~l z_4zhntfK`m@FWlY%h2C!D28Vxe*k%c8peiGWf&Q{Hgyyw883jjlI+1ej2^Ro2mD67 z23;T=h=OzA?*fNO($Rq-X#N3I9=+>g{#iVdtwFMAph%|Rj0z0fVo%!s^E_;GJtegq zyti;cuXspw<<}%JtVUeuqPbDTwMQQ>kie1gu1dgI)CC$Jy<&?fs6jvM3hPAMMEs_n zz%X-W#quodmnmADGDSyaOqQIl1I1gDcc6G{CJz)ZGXm3ifOs{>k4EJR%r^Ai^>RFJ zHlsHTx6mT~G26R0C{&1=aJ=-Ss1Z6aL5+r)Dg5suP@zV9EKm;kn|p6ZzMtay z&$*RdQ;RfQSzEaU_8P%*`XTNaeb>9P$j)4oj|d2Vkz+G+h?*Mq$>M1(MZXaMM6Br5<02pJP*~yjaQro*9GSg zK28%w9S-$^o-+Of*M8r={Od^0dg>?S`9WCK(`yy%AgddH7!LB>_jeH zh(EtBfJhm?zi`U$%#$GXhkxb?>+q{h7(E}LuGf&jF^52LQvtFzZNlp}@H}{X?E8@3 z&mYc0e=!OGViS-uOczqVP6+~1y^Y3D(oX3(53=jtX1#gpU&|xjgU}WnriK2>jz}>5 zTGONOL%-_%f(64lCT*nSvGeH+o&hJ0I)ZHT0v?%s5v!DlvebyVl8tFlC+z#`coeHL zOGR)t3m^xtcZGh<5jmiUvFtjO+?97YTJJ=DANM-QGy46Pd4w_(JN(+wZ@}%2*UZJF z4l_Sa(I<2g2I_+Y1!s^*giLatx*n283<4@Zfk|!m{Nqvdruh(DPB?f2sC$UxuVz>- z@4JYfU4?UYXiOm6s~pcBy0)s>C-r4HtRYnTnYx>a=&J2r0QvE&5bU6cJq0s@7pmESv>T!A2!#X;^`lv3=tIxr@nsO5k03B$_)CpNtrVh1T&N?m&FXDj34=q} zZ(+J|lLH)WlKVWe;lhQn(oRbYw|6yaN3~6Au`&iJj+Xha9|#80)QDM^Y+SO zoDUB)eDQZqNsXVn3B(!aNkuzM^_2S4frkh=;lh`oo&xO`vJ2F#oR2yGY{@G4lsrFl zHs-}U7#bPb2;`_6n@XaH#*PB3EhMkSR8lTC-U9y{S(@HQ!@F#o~?bJ%|rtmAbaMYRrSR(rQIOw3&UtnYKGot{!Qm>a<=N4P3If zN_YB?3_h!Bq>(ZK+Aw)MWfm{;?TVBEC zF}cqFLsgOaX)&A-(Wxp1(w=iba0j}}{~fE9BLyxS89nl=8@EX{&XrPijNk3#Zm>#{ z7~Y^)+)lnG@DqfSK}Ded3N=_x#~E*O(RH?%YeomvnY5X$&eSPFEiQ1^<^tw0x>qU2-a1d;v z=zq@R*w&MisX^_(=R;xK2|_s@m$^!DW>8C-aHelN!ojAWL`vI&mPHruP~^A@=mi2& zZq)d((PmWaSop!zw`)x&BGL#_q7hbcJlaF2lHSxEYHVvIZsuUSmXA{kh;*mz#oaQw z34{Y7$YWjd7t9&lpenC`lNUE9P@N^B<(SrUWvl^C&YQJfn{ej++rS%@zH$Q(gU>9$ z!W09CREOhQHm2~v+qsm<2d03rIexzDFhvfkJh}K(ggZ*86jm#(^gTgM))c!e31od2 z4OCx|9oriLGU7AB#6vv$${X2N5g&}!YtUov@a+es*BLNZ1yBwrDO&sz5Y9zbFK=nL z%u@kbiGW2afb?CZSf~Q>C7@Mt_dS7QycMl7L7GAsKw@T|*N_nAf?X#a>5U+36m~<1 zlM=>Cg@>dCv07m_#5gI*ShKJja-5VfRxa#@ASWe^^$WXsMmcan z3%C#UM^|lA*nNpa0lUpB?Rn3mDslmb=f|S67@NfNV|b7>D|T{d|D?c))Wt$=vgEqF znhM`Vv^fo~Y4KAfI#CcfiK_Fh?88bws)vIt|N_QAPOwl69bSWvq67H-0V zeo(-lLx9~=J!yxh;vU}LTs#Z*p>V}zvB%rc?p`+!O~bX!^}g}l=&t5ftf;r+{cQNX zM!PR(OX5CnE?)fTgeqJ&=G|l*w-!x482AWUL*Dp$Po;ofgkcgUSC3q@Dq3ogYtWkC zLPaLUC+$tuN24G{4?R1A@|`UIwWK1V$Bk3*pk2NLb5ECDPvMG>$F-aM-$$oy1x&qC zq)&d>2n=y@!Gu|5h)5ndK@Z*3niV)o^$P29-!fH~^N=rvi=qCFs>(V_dk$9@3_UWoL~{cGgeB!tRaJ4VdbJDHm0*6sc36)_gU3j_a_6aS_f* z>R4u1DIH7BU`&7oJMrh|Td}jKYKLOw6|*i|FElciI{UePUF4pDc~2%1Q@!wLbE+#A zk$j7{p?9jW)nn|!e3zL%8U^ws!`kcM20FGos|g_VB{XI8{ZC1Bt5bSH+Lfbl3HKnnvyzwe4jpkw{LtDQ{bT95zW?dcQ;bdjJzVLXv&AJ zvp6_o=kk0PT(AV^RI|bTF+z))hM&fGZKjtxyw0ZlGsIi8TrD zr@&Flb_6EEPGZ|c%6L?9;PxKmnTqQ9XGesDJW zaYF%;1Wqe=UCI_K<-Sm->?Y38Ln5)yqRB@k)mJA&u)u_KA$u4Ph14cUZQGLYW-EB# zO2ES%>U4N@VeYk3!{YAKQh|XqV7CJKcu&$^Hg3Wvm}{Q51chPIODDC9Md8x*(fu9L z5X=c&DNWXA;sy!EMoLaDh`)uf?J3!-c!*^yS<$7`^LwaU?q^-peQ@sIWbcO~A*bId zg4dL@ae!7l7wi~DuRro&JT@LS)3_?J@P3?g(p&$AlBZW;Ah>Ohq!YnGv`i{B8J;QwwdTt&oY!v3_z<44~<-r8iR~zrU zjcwcw*8>%@qR(b2o`{yNbP&i^1nS0PWcl^xf8tJe_1NBH5tp;0@jwuP{>hC8kR{9i zUHo#borqsF%6}?;^YJ?lzfSxfi{E1Wj>NAEziRj1y9F??8N>yyC&a1?MY0ZKUVRKh zd5&VLeuX5)8tyMVm4CnKTND#rKk|TZ5UdvG*$kN=Y|varKUKu&z_pciB{LT1$xbU) zPpflGA*TmtmSqcT1QLYYp7HBF;IwLP%&*Sr5EphiYQ+(V&=e#i7WRV#LN}}oeTvoN z8mIw&GyX*!w;oHR6=n-Srd6-qSF(!X*sr)RgXV(pwdyJ}287#gpYdz9z-{dJHtdGj zZff)20!O+*8OQRdX)bb##se^%W}fO`PEdNMR(eNH1+=DWbiT1t_0Eeo;gIvCXst9~ zYo358_D*r4cS;%k3#aNlC!*Q>Vt3`Ii_PIUi0a_bw1%y#AO9u}(`s(abLYHDhmS^C z{UxO^BwB5};Dr?lZ8>DjSyLmI9`r?iknin?K|Oi>`H|fF5ef;~SPy`8#yi18=5)C$ zUo{GDacfm?7@dR`?{q`<*LRq>g9FADl-Q!Yp$$%N{6#|ioWKJuu+4E(Nru9qKRr3@ zYd*+SNVDi29_`jof|(3+5ZTLVoo~$~bN-tLsg@-P8BfYkTq1T&p$BRJU9b;=04SqsYXn%OkPZqCdVGYY0|Rn8d?; zCQhr*o9UUA4;)4jI3b4^aII}QW?^y5U`f0|zRFxl+X zsxSCNRehI0?O%05N7cdEN=tJyR^4O^?!mtF@Dit+EcqJwDiUNcgsNLp>-65gSf{{r zR2_Y!;ys2NCUFuPCX3KQcA?pQ5)(aI${$cDXK=)T9wg~Clo6C!7zpf1M?bNLAokMB zVC57XueWk*U}SaECS`vF!W0q>;2h*ySeu~;kG6o6-a$IUW79>_t+azIL1>A~7g1~> zMe$ROVNA96p9iu1NkB`fL+bj+9d@+xIqsB9wE@WRaj=muYm-_&?F~rHzdw5UdbyMQ z`|spIWPTf|CQT~V;%FB)mEA{5=t8V2zVHK#jGm1c6F3sIew*eNA7BDKyj0fB@KQDu zK3Q19OJ&IoFI~lDHoR2MVZ&Hf!b{s#$Qu6e28d;%F~J|O2ge521pzKA@C~*L`lf;6 zjUk4>MgT8OBNXO98J^!F;i}E40&9VX@!TGLQ1~CMxf@09tJ1kxk|>}u*zs%4zo*}L zT&@0l0~j*|N2WjzfN3zOEKa(467nMgNGg;%@pXX-YzsZ=@uOE;nP9{2`&u zXU6`-j6GH5W#KB@MP@{iM3AGsgFVJ=Rnp8XXlQW)kGw9ZZLpuUCa#>($78BmuV6QZ zL^1-Z{s4kP*zDqH#7y-El}ZLk9g?M_;!u1)I@?UTSS6K?QYV!uNuy^;Du09OHuj;_ zcXu#H^mr9tWsi^MnBd2zfmhQeS>ONphicV+z}iH(_mj8OntNnW zt8ik0cT!&jG1QG3k2`+*R`d|#*CHN!HnE}k;PVs#!-l3Fehz{uAjfmv>ZecrD2#cI z0z5tZtEiCls`Bu2J0<#--4YODjV%QSb%IHzA))hNgrtwtf-G$g5a@5dkkICk9!jeB zpeF^plX$2wWxUyMA4&0c^eZ%DH>p@v_9nlHexI1V`LK#rxSxo9)r^fuEY74L8X_ly zJ}ixvoTSbG=Sk#@5*_^;z4;B*?Xx6MxS0`!w zGwt}x7ghA=*(w&Y9TJTs_D4^WhyWC(6j)+OdOdSgimzK(jjf34RXwb5dgMOYFVT*) z4SLG*0C~;Dkk*vT064C2B&0RP60(Pc@Wwx?QF>Sq`H_-(MsdeH>7SOlS_*8+7#x0> z6g;}O47=6H=(i?vML^2vhkRI8@IeH7y zn*XU9z)=!R6)-cZm9>Yq0j}yn_IjFKA(J|jCM6c+3ST`hda`sLXuFCNVuyv-MDu(z z_KzyoHVOXmk*ddX6>FOWFPX7Fk=Q$ASxYCQ+=fhn5*C}ND;P{=A`N(U*{GD5DNdFY z83?)^+tIe@Cm$-XpDNr{g+oDCA;ge>t8siS8EaI{HIEF!OGG=hsxG|5g$`E20vK<$ zqTR(t73QoQFJP~Yry;oU4$sZCTo?~Cs376WPq?7LW5$A?6<3!_R6Zd;P(28mr-xUk z5XE##AY&c9JSU+9XOV%>@7mEtUlPkr)WnIk;G(e{%4isSNKd|fx=2rmD3_u%0T@HGD+|qo-bWsAwclqBUIr*lyzx-Up$0 zJaJ!JkiOyx;q?9Ul(6Ye*>C!=gC>)dV7XJYAm56ffjcUa*RYgC)NTQ!i{(YId(ZFRxvZ{^C5<`>Oz@M484~cusa6 zZv1E9R9l0=Br7#s)rmV%RW?;_YqGN|{>)ux#+GK-ynYI{;=j?-O`q6X%EA&YJ@swX zQjN4G{TwI-=}k3X90q-eflkr~Qyi@||G^x8jJ>5q^or_+?b41LO0_1QU`Uri+sNc} z1^2iUPD(TR~xu}SEIVF{ztz3($vn27yY;4BaN1Wq?B z6ZVXN{Xsq|!F*;aPsc9PIN`1sQXJp$4_xf&L39GnI8=E^;P^D-X)_&JPjSaHv*Rp&Ic~#UAMp%{$8tj5aZlye>xZ_TjHbdM-nuq) z7?#N%f00+o*Rl3sR}Pc^WnS9Q_mA-64HRgcCj!@TDDmDE($kfiejU4?TI|dfrpL;K zC%+J5`b1E;9<=BF<0!uK4$7x2AgeheSXmwzGbC}#NL$Uhq4Cz{_P_^r=MPe1Wo zxI6a@<46ALiNN&D9^*qENm!-}abcZ?_QXOW5&X&&1RrSxiQtrEQr^UbN>3ac+Jv4s z5)t9k5+xPJ^Nk=eKQ-2!Zium3`^#3-%pwdi)+s}b?zI>X40ouF8)2aT`NB+yYL?HK zDY9-Sg(G9Q_5YEvggm#gmO^ghUd|{Um!3BluQPaz2YGd;m(R>d$tlJie<1-d?$|00 zXO@2{(a?W4XA=T3i~P$>i;b%JG`e_ZO5;y4TDPJ!x3Qq!jk_JH)X*1kzau>rybf`;2tFpo-4)O9hSB0vrW$v!7hv5n z7dYiMvSIOY)cCFJpm>+qd~9RFMIUlMSIoKxz#N&z634j1Fy3elADg5#)A&p101TA2 z!U1~V{R8O%3|=(_uci&ffx|6-Ds7kEMWy75vZUJQmui^H)e*w zhS*Fv9wy-cW*i63ku>F)F%3FwNMKU3H`54|7>jdUvKBkgk{ zi--A5Tucke=r+7$6m-M>Wiov-aWYIgR_F^RV{73h!?U_B9-g%Y-y8VeF+YY6=KCYk zxiB{N?*xQjfN!Ds-2%AQXQic|^hMsg)FaoFbSJmdUC;(STwSaiPX>XUP>g7U z@^`qpjV^9{!Z&qu0v98!J$lZ)Sp8*(534g#q>r9-qHO5D{dH?YKk9FZ4ZV=sNQiqG z+1FzyYi;YpH@(wU&5M-s3e8Sv)RLc@3OpzCY`Du-=PLuy+S5CSEjR{m+i)xX^hg#t z`C^rNteJYByNnVwKT~l_{`65yb-bBszm!g)gjMDF#Zu*~$5~ar@`Eqq#w{dDEF7m0 zP#JN&v=%$ch{@wtw<6?egh)Hk6)WNY8T@Dxk1g=xj^kl?t>!Uou5k+~9I3>-Fmy#D zA($hvOn4X{5r1{lNBqOSbPUopv|UXrgeqB`h4Z8NLK4oweHP5uddE^1>gHV>_f zC+$GPpyRVs_S9C9LPuR@kxBknH(+!AFE39uHlPk(Mi{Y*o6>2}i!M zm?yNC#1UOKK(xQ47Eh}_Y&GWeH z&h{EpYPgL(##3>_41aFOTjMkuJs76&IWt06);u2@EfKI3?hH?W!V^vGlEL0|YO zB?F{o4yOxB#g6E`y!29Z&b$SAUFXcp!lOxs>l$`eO||iNp4Qfe&$$Lyu35HrD=!VZ z|5{2=<3F*<4}MjKYRDt9MiWh|XM)`jNQ*Dturve6B#rXTS7%mi?H^Xr_lK6kGMy-iz0JTWtHUc(n@B)`Yi!s35i#tF556P8wgZwSZQg=lfgx%wz)i z)_@8sNQ>MsRcIJA(DzNzN4fp{-wSbR#{;${?jH zCLT<|Sn^S^+-6sV&L%~LEK?!z+IzATnH<{C5kDFD9$g_vxS4x83B)WG+cc9s6-HD% z6Ki&F%pCkEg-yuBW@9g#_0?3PXFSskORAoUm=o2rJ8C|sl-Q)Rrl_KKz??ll^)Ip9 zdajC=$LoHi`jCrrE;RusbR<)mJ#B-$ZB2)$d2p2))N$hqJzCf9MrvyI!ZM?1PPw0v zPhdTHNLK5zA3=6^3z_2&b1txL)_&}C1TM^L7YKe?pOQyc`W?4!QXN2Ox{jTwAm6qn zhlmjLJZ}7++PgbRwQz#x^a*`QD(F=sz2Z1MNLOIjmE#51P0XZy>E^^MoEi6}{Y13R zz-_@6ZDl643>SBi(64Act5M^h5??I8hNH!3!|_j8zX-3@f~J1!_Jtz!LFXkAGyCqm z_CqA95C4`_<^1m@mfH#QB2ctlF#_!gozc652B3xkFc4V?(Ro?bxbzGA{EnY!+zR6X zd~jwZUzB`yBe=ZIvMhK`(*R1N7|n{csi^CQ&z%0ErXzSV?>&*7Fp4(_)sO$*7qit} zZ|5WtEE!OulcRWQezjjqswA|DyNrXny^s3GW*IZii00ONS@!6R+cpW*U4-l-Yn@j& zzRgMTFZqrIuf=Qcuvt!Nz!7b)aXpL+Jcj7h)gV8|2D3xl1nU7V)8iQ)t$w0~L1A`m zZdfc{BJ*Xs?FCt0qV5}|nBz4zq?QEuUP4c%pJA{!?pDQg$5gJ4=7fI zE8dT68^D3(2_k5MSEW_%_C55(*iFJs$n;$p2rfn$ylBAs!7%Wm)PM@6=u{L^-3!rF z=QY0_Sx8uQ-+uUy)!+V4tv{;X%Zuj;oI-36{(`~c;{6}E%J2VXnrEwxg2=djqp;Ip zBEJJSnZAQAc4#=F+JgK2GyHJ?y>WUm;$X!CdMo+X6}?WL zZbojin~)@)X}9t&w!5dIky_VleD+6gZofHzUJFF7#fwpWtazpLlV^Bn0XuRn2D!FG z3%eh@;P2pFC^o?dyJg-#a}19fsAayIU4OITee_(;u7UWdD-a(8g2(gZM{bD-2Zy?a zi`d3Yd8QZut$eqiNZm7gn=2QHJEums?-+fbLbL4!#}zVrqW<@PGc?lgIzk zz7t$%efO)`#&?_mg^lxFXqf%s52{h;A*&xa69EF;>c+*6Ny8L0g2rcr)KGwf?>ck4Uv@7q?QAgzyzoOkkm`)_{ywJxFaBE{Xm{F(ep zrSEja=~fl3*$|)nBlR`@!}U3O9o2|Gv`ZiE{P|NeM@_}~`*>WCA;3_nAG^S; zwOzN0RwSU5P&rlWyaN<^gmRUXeNCQ>+e8nu$1X*Mf#@{2^ zizpx#tna~I0sZHgpun>T43=qzP;}#O{ipWSJvMJduy#yW-E~r$nETO1+nw#By2re< z6!FJARCj}7ylb_BRLCE(=&vD(-G`0MqX^tHxv|AtG>SLWSSU3XOrH=BeyCh^56vq> zEYN!h4)czwTRU$scctQEcBzal4wB9?yph~!}YekgS^BN&MfxI;OS{aSO*nNZhtdHI;G zjC~WioZy~b&K$Kr>Ev}`mBXLuGfI*iK|P5G80$GXNOR5;mSzDQ=Id6{$8G~D`o=K` zMGp*k9geCGEea;#crz;r>UZ)-dcbkmr+$V7Z+Tr!2yG!9Lc* zJZXMK;h;dV7ydkF=6pgXW5 zRt`YQD9Tq3Z;$2C^KaBAk3jR)LUc&x@YGep**w#^2&xZhI|d=vI#Eg81{haQLk!U) zl{4I#Bu`A|1}2ZiY(}!OH79vOvO-TJRT0u-1w4E8w^8NzBP9nj&Kv&{yK>wA(1uv; zojZ7VH@KzwQV~6EChttBd97M~)~pfLC`f6$@PorQNt~9LTHCsk@8oBu24^>Es0KH5 zG}QDC9KX3CxK5d*WLY^eIJ_E7)t!8c$Npv75D(f+6AHgD!9;v;?zsG@soWo_$!&;@ z+0g*|D^};)wRj%ddW?9WLXWZsDtWN=&3XtY zs+;_-omj9vLu8t`POdGyawRhK;haT%0^iX=&zI@u=uXap2 zqbobOqqMVY=fDhxj_&I0{d~uiqxQ?NyO80u?!gpa61b$t%ll2036|EG+c4`ChM4ff zhbNtVH;3Y-%wVl)2S!qH5Ln5liNGwuZCZggS3GPPh&O-F5aZ2joyaPxYW`qHU#VUSDM(#K9BcBHvgUv^X(5!?H`DOEfxm5H#F-iygL+On1Q1)d|nkMZCIS5t4)@E2mp&$2J7f3aUN zKqV7{5j#ngxk0G8_ZY$6UmLs=WpcV~@pnz<0>^bIUF?kg3QSZIoZToywu!t#WP-f5 z%~yUg*ju}%ljwzG3oOwnAUL(eG2yvBY#417N&2xxpN?m2qs6)~QSr!3nAQr|!AY6@$HPnKBUl;%v6onNpFr zNK?M2E8;Esn_ea*qGFm(s&7N_ z?Y{iOgL)7+2;;`_8tOJFCT86yc?Hif!=WtR552 zs%Er6Y;hB2LwTJ|`vQ*VH>k%_AB#=M9=c8%q(**$yX7fKvq!Pnrk`r|uIr>BjxZa- zn+P+=NL#V`bUEXh zi4GM1v62>!-`)@eR$98NB3t{&Te+S_g5{E|Qn=(_ifRz4>K5Mf{0U_u{A(fL7^ zJ|Xe%V^A+7ZLpzd2!#c&gyVXoG86`sdy)*Oqh9~yU|I$|kL5-f2j?oyblQfe-+CBK zx$#1Yrxvfj+N;g1>{L3%D#1x&=)^WALRkRe>Oy4Euf$*fSab9!D^av$(W1LtJ70PDc)oZfl9UgfU8Swd5J_PR%Omr}ZVO}U+E>!I zbzKyb@ap_^$0vuE^v)e#@)v%u^WzX;KZU=a-!-Ir^dP_SgiYc1weWYaGzxRnazFX6 z_$?63e)Ll>Nr)zRhPm6)#`yJ?^Hx@hHydzjYYQRXDXoe~4vPMqgG&rMOQS46`~D{-1ciMxpLiPtIYH^)GmJ}3Lfzc$o+m6dcoR0kY0HvOg{~!rzUq5y9 zaQz$|xPA(qt8dmPbx=vvH?#}(>)TOk9-_DR>eumpP}HASto8Z695cPp7i?8oUtrhl z*9|GV<^6xRs)6~7x#5KBlw$tdZ7Lb1k!OEf)~^cvT(U&{#AMfFW*>8=*-2(r@hvsV zSYd^U*TPXktZ2^6ELPXUv51m<6Uj45@h;;r=e@_{G>wPoZP$uz*2CZs)EF&dW!F$L$uk`MF1IA)K z43NR?OK&gg9;Q7yleGs-@$q(E=cvKa3T(3_d-s9eyRb0@zY*j9>5T@)CxK7gd`B_u z8)XEyWWRkps|OTA2exF7KCjR#gI~a$V{TEeisl zvp-yPKWKkgmh|T$`qNE+o=F}}f6zNxDmvt`Kes$PAp0g%sUI9gWD5K!kwE_r^l!gf zbddJv*JEP{r|+=7wjDU&hBtz9!Uk@Y4abkj++p_O`D)h|wd+NO(^__bu!1#XIEgM@`tdCA;CEO~K+!-&l0VpP=_sI;F7mT!nzR;=OTE& z4rSXqKFAdM+z|uZ|M$J8@CeB#Mg9CX`}~AL<7~VrxBo&dor|xZe!vb z9ZIVC97R;H<_GQZ@1-TyUpgg_`mbAT?tMZeI@y+33ze-gJn9z zt6f@8Upk=QK1s1J7}W#(uLn59+^5M1@g^opVHe}XhKE?ObqAfcRmH<{b`gI_^9Snn z<&pZ`D%!7>MSZaNOF2r_VRL+E1G*TrYVL0ST(wiCykyU7N+*A&t>n-7%lR{F34bna zk&Q1FHT*r0OSLJQGc+LmH>CB*Fuj@_YSU5;GecMiVq^xS#<@`uP3(l{mpgh%iglf$ zqB_e(MSWD!gZ+*v`^3TWu?cr8Bf`OIK4`din>%W;0|A1SeqDF+OQsH2bf0c^#1AU8 z+tQXtvTsIBXmpZpzY>tp?Yz$Hl|YPCE9`=Tp5?p#ZY`pG)s)q90kRSUSx zXX&XU*mpE5%pr;52j}V*HG4A02sFLYYw5#7NlF-sU&p$KQhW0Ia=3gR26;EegNG!@ z_zL4imacLr|GKWE7virH+;i4-rS{Y>+C2Y^IJUt)qir5SVnBYJ_Kn}XX#2uSOCPJ- zoEp@SDe(g&M&UT_%XQT~wBV1>1IFRZqh4!5(SAkszP}%NCHf*ye-Upd+My(}OKwc# z0TRS0?t#L!27C8&n+vR=P9Ulw$o63|W9~jcD1!#G8Rxt#J5@(Sq(`Q={JL|asRgE3 z%=vH?A+c5M{LKz|b0E3S!9d!XHAXCFPdna}Wxs0Ldx-8KqCV8nB0_MKv;lya9468+ zquk!f;g#Efx$i8eBrJK<#L_`0H4j964=6kb&8^Pt7wju3>n?fZDoCp`@SBt^Hh&n8=S@!@(cWfQ4jeF;;rSkx?7`NP=>-f;3 zy@N}#75Bg81Z>so9;S9p_s4*Xrm0dI93a?;00&}vpkdi1;MnaZmPwBU?P3M6b~EK_ zgjQOGEe`SRLL*UE(os<6$Y)j!WeChrR8ya!s3v+;l3jM6<5Qe&vyx+0&W!Y&z{fw! zGSu%ia6x@_-ZE6MQbsCe0tzYI*6iF(&TykH)a%=m*?g-UO9qcw=={jEa1q7lSk z()+avCHDF|ScN)>Nv8i_+Jh1jZ|Xm=HY;pMdW+3Ccxc@maQ zG`4z$zyctB_=l#zIbR6=!`YYr7XTsA)_8|+yq)Y%6`#JUu_Spo%;0=Bm62WQqOcKn zgrasbaX4a+x^k053e!L&U;{5RrR`S&k`7YVoXi2_M8*8=fbc(j~3c9+A6)K z5iUJNC(rF`6lrMGoBtzUH5WnO<@f6|`|sBu+i$vvq8fUbTvbJx@ImRX#-?rm-3uD?-$4%34ZuD^JWs=*Hh(pj*&IR0j63RJxg33|3 zTjmac( zD15T>vt-4{lnzja0g%r3L4J>BdS74rN#T zkS(V68yF1|@&iwQ`X2CfN7@hO%) zx}n_f82S541~Zcc%$`jIRFXw>8u7GN}iZM-}nJt#sUE2A)^R>@D?t%eq=QLR=@5l<2OvI zhT*<~4N2vk=+`}&gg<*#lV5v=YGn)fKC`+K$l%`i}2YbO}p1-p&a{|%{lb4$nn+RsJYsaX5Zc|xdO~f)%Y3p?liw{ zZewz+(W`Ke_8T9aKEH=cb02?T3=n2Ml(`qGeB@Y~#DG8wlwC}-)F6j4vwyr<&9atg zG*KvJNLNBnsM2A6-HbV@Qa^La9378nK1*X7P{`7RG}lVijf~IpJJip7jRYe%+-04A z`=xv>T{ZxZXBSvS8~^}4@NOTW7a|;>q}s2u*@SMcBGo%@kJ)^VFY?Q%+RMrh| zdbLcfpzN^f93H)s>+X*7ef2|}urKLcF8n{JRViA5J~-LOI7+eZk>rQH`!`$B55SWz z8M8J0`ao~e+TJohGst0U=GWGX6hewO8~U6Gj6I$R9s>YVWwDOvvFmIMI?lz~66ZB= z-@(SYdt!x%@t zwWEC>!41Ixg2*z^&&YnA=G;ut$AgUM<+yi$>!I3U8P-_qPR#&|8^)?4k>5+9^RpU1EM2Y*Q^vY>ji?{q73RpuKji=9}CBD+)RvFS9IRT$6>`LqBsX|kH^nU z+E-^uk?ye`Q4LYP-p{F+Qz+&};q!$^ah~wUJnqihZAYq}qWqS|<;SO~GGqojLgOGT zpo0B7y3s;XQJ%iB6}d$Ler7xC;dZw-_8y5E=Y7Js+rD?o$RAx^3eCf(IY))%z8fyP zTvhDGT7KdBM1SKujGwdLN48s4p7~sQl5PA7wCW>e(r^cK$4xPZN3GGFwfB@pSYB)JMSbCKs{7ch8kIJYmiB@_UXSX;0wJ zX}tDMO{sUo8E958Os5SaJMN*7iQewuu(WDV)GzlI4I=?Ud(A3l{hPC+o^|F`KH)N! zjqDj*GJX$~Qhifxs@b~%ha4qK!VD5|RD;Mn-gbFjA#P7vZ1hNq&5X#F`IjNT##2eY zj_}M<525mf#_YXeW%rRlz5D_wq7=AYV4SfT%N8@a;$eNEac|U@^VsC6L0WoOFq@)5 zy23>xGm8=s57MK<06qxt={TEz?};ipP&U1|TwY{Nn0Tf~=*%-qnO;b>V3|f@&%|*9 zlY_kJZ^IJX#*dlZiroObmGMVT>2TL0A2M=Gckb`Ju@^LX=?hf8H|qN*@nj=kwM?tM zvgD#X!Z)oMap(8fJ8{72S=h)cYmyh(unrmS1I+>&woj(&rMM^Q}hxFDUd z&dV1)-xR^Y^@-S9L1x#k}f=nZp;!}LRTuL;o0Jz<&F(!{?Fm$kUR*6KCM(>F{KQrn4YsA} zMefKivU4g(KJ!ehaLv4?l0P^%oOy-T+`n=v`>j{K!OaQ2gl25u_b{XKOwk&{iR0LA zA@4tEzIsSuv&TKHCZ@HC$pcuuNWB~t&iEbCW#>LWSl6bqs`R`BQiTlh1poj*Sja_4!Ekb9nGbRn)Y3VTK$zX5v; zXzODpcC`RHvs#o&=F0he-$MPcq=e1g4T9|Vo`E?D1GVK0{jf41jwcUka`4#Z9y{Da zj0OU;?y=iF_UX})j`HX>!<)SDHkya3?@m|pMx%3?t7dnnZ&EBZb*G!cH@`c5i(ca= zo!OmUUWk^h0+(<_;q9k|x0Qvrdkb%?3U9v%-_Us}p~v0kE!`ESsnA6S1cvt|kD z7yuYQkkiVW!C5HN?F` z$flRHwd<9GO?ThyQd9q#53X%vh%z?8!L?e#B++h?No%HqYZqJe1bf%Y$(Sqp;99Xh zs9AeVx9uVZS81VPsB3XbSSx~%;M(PUusC>kAhbAq%cKQ6^v-MhIZ?6TZ^iobMqtH* zNwbkKgr*pu_^5nS%P;lLJUvx=r%c%;4^={vg@(_6M#6AM^Mn1}Pd5aA%Ntgnpi;mCx;xh3u(Kx^dGO3to!XI{bITWAr2uynrH^Mk_Jq zxlli{_7tyeJ0V;uhtHX7jBuD4>IZ|lzEsnDWO|K;e!#*ZX9bDln#B*}4i@gEO6B2MTYhCTl!1nfE!4tJhH6{x$ zhF2!}HnzvR$}^1&MQk6UKZZ?jiA*!OWBW4moAv09UMytmUPIdz3iW-8Qm7k|*uHQq z>dYGag4+!hoF-@t3Hx`)0dB3``%gmvnKfGf2QKkG9FR$CjlTyb04Kk1OtAkJus@D3 ziH@F}StCr)ZNwNTZ&J6deZ7I|wbE_PuSr-UQIh)Zw=wiBdvfI0eb5?(smJXea@gws z1sQer$JKowfAC=IA9A<<`uA(i3&R2HpM?3fdcgV@11;|@zOerN+J*hszm?E${VU%A z>t9P^T&=C%g(nvAAEaH};55Y>qi}#CQX!R!v0!?^F7b~5^8lS@HdHfugB2q+L7j?E)oHp0tlx6G#wYas z@n4s?Q_qE8)=6UKWp+9l!-;Z?It3R-Qt7Y%2Es4BzUd-e)YPDxat6G`f-sufOd57w zf2va3AtKhHd8fUnP|>6e(m6}=AK0)K}=(Y1UUWaM76s&0&PC>s%8m-UX>u|RqvF$Z=!8U zDdO(2rj^s@FpM0*zFJf9T=?;jzkEnPdmW*Iv%$f0#wd=qy_71eZ+kvjuJh`IX&Peq zyF%5r5ts!F?E#2i*BQNL@`1v*g``j zJRW&e?(98F+LM!nmKuY<*4}EXYiyDJ%v7p;!p3k^?mL=BY?8)zgf~L&w}Jef7Exoc z&YAgO^jIyN70vVq0~hThchPsrE8XVV@abr@sf7Bel1Qn&Qu*qz5w@FDPJZTnf*^Awe(-x!cOlOPeA@k~Y=O3>^2 z@7-`W3G(nG{IW!Zp6j?H8q8zXf?dHnyK9zyV_>R|vXZVWQMdWB7G4t4A@5v7?>Xr= z2BqrBzrf`eSzO5fvG>T|dgI|F*ZK_B;pOO9-ZlCmPU{;6w?_8|Ly3(>GB_2G{uG0H zl5PzCDywX2$l92P|2$I7v(?i%Omia_ z;vMZ2_So4A?C%on?}9@E_}{*qY8|JBn8y_J7<^n}mg*p?m>tUVq+*_=w41707*67E zT|s<-%~QxslH1I(vWobrCE0PXQnYMT%F1^xMF6H!?tSM{mWQRRa;1np_Sihy+$GVq z>9hZWnC@0BZ~nU_eyDbXnHUo58>wi`y;UoS_u6jfukdYi@OJIpTFTxH8U7aS@ANRO zQh5fdSNlEh-`9BXT&8iO*)Uz57xlE-PXO0Ol|>!4Xjo^Fv_{C{suicnu((R6jJ0Tw z7vJ5Fe7IH!y1B3UNV06Ii(qDdcos7ipj6ofeR#Do1Z=e9)p9^j3V_vNYPAc=5FrRD zEx+3BLQFVKiRzaNiH2!394^EULo`tPVRUC-A-piD5r&Sa{;vWZF(={93*+}po%Q(i9PQz^MEy3bzN3Ya{NG>wU*tCwjtBzM$zvhoZ zuH}iu4b_?H%(^b|AAw$5j=1m1<;@m+mqfBiquQDNM8Q%^_)E~~E7yAe!)I-rpnR7~r7O-@YL zmCUFG{=|XNkpr5fL-^aotSt>eu0a=<7dx+eD90qA+)iyscfU1t%pazX`R&w>$>m>N z0+%ro-RF&6Cp555$fQfiq{|N$sonmpcFh-GY9;QMH#71qg3@+nY<%;tlUPfG$p5(V zKd$@^O}$6{^V&;QK#B67H}HekA8#*L*3v=N{?d1Be?z)6a?n1=L$nri`v~j8z}*dX zPk4)8#{5G($oX|oTn(Wsa(2w_hK|zjF|_g0aqn2m!E49~#W7ISa??o^x!~swGTpdH z=uUuVgoIpyA4;vlaXSf2)`Hr8uDM-^!aU9_0K8ZOWadHU|O5U*>O9-r4?%R5hv56@HMazmD0Z5`wQ;k6ATCyRmg;w|1l zJMBDayac~v?pqCL4|bei-p5~R2(E2Ws`R@2yb+?(xHG>M*b7FqXQpKHsT_3fmm<+# znwj$Adn75(OxgWzNdzB3qJ2bW%4>ezZ@tB0UxY_P&R=-ByL$3LvxiH>&#k4U_Y!!AgC3uZSFrVv; z2Rk}WT|_jPsMMbQ_0hGy+9L8I?VU0ZA0mj8Mh#Tp;z-;A&ngW=&$1QW7V#~3VtE)m zvD_7raKR(;!6O)9`N&NDAXfL6tH&nBY>AKgt>4jRtbQ!$|8=4~Q@e^w!c2fgXQ`ii zNUo#l=pwufIw38lW@KetyYx*wTZ6;-+d`*8jjJQ@x)Kk*ua$?3f>fmv-o^*|YdS=I z`mb(sXWL{jjxlh2YCfs@(Gq+c9T9K0^Oo)f7SR(*{f`h6+0`hD3ABo9ADH?Q?&}2i z$#X;IM(rvsyM+_O&)^BJO;iqu2Zo?yL6>(|w?AtWvC5U`C~a5IPTr@o(;A9gcb%26 z;8&ussLlaUF|hFt5nG-Jeus|=12wl#ld{|(Ej)#nuWOjK4Nn$6K35lf)z6Hs^6|Mk z6@CFOS2_2uXK1I6>GE^y5*>&CfV$;;Rs3vr_Sl>73vow|bJVtSIT8yf))N2i|Dee=Fu1eHxzxtz7$815^yR2ahh6&n+3XUmE5Rr+!Y4^y~(0)DYqtA6d z*XzwUk%SC(VA7u=|<{w zbk`xHI#VyVZBL!R+-Ghg+9lqr+fsL+&L`V2g`+tK@{88FVojkYiamqXhUh=-^iQVC zACKtOVg|sXoEP7hH)mjY{`aPAf_l|3JO58&OsPhv$3k7$cCp$tpWuh^vPZ}z*_IWb zBrmcliVs>x(}n%$L17fL-^wN#& zz7E#Eynb8A)HC=1(+WhUiVa!-ks5(Wl#%6(j!%#XT^~!6H0;GuqOH%O%LBbrOu-|C zq&PCMlrPEeQd0bxSk9N^$@oDuR22yZW-M_qu{2}pf{EoBOQHjBqfjVUx=kjY`l!C5 zDo}#)lxLqRvAVd#SO6!tl8{&srA#H|jY5^mnjfCD`nBCLdqckICqj7Sq?G&4Zq3F4 zz_?TMkUzRJItF=+PkuVyfq%l3Xz0u>?2$q1;WQ~TFlf~PWhRyai1t#hz8@X5S}!sj z3ak^EC<)Yw7$V9%7=M8JI2(<#`cyjSD~Z!MZG|PV&UN_J$_^Q2BGdBi^~OGgvzKGl zbOH6Ugn)X-73F}t^s4~w9d3og1{{@m9$ikXfNdk9y|u0GY9j@C-#LzAbJqU$qJ4AkguZ*26E7HyJd-tb2Xg!bQ zg}hCLyzhIyE-ubL`vc_n#*Xa$%;1vC59ejrgM&-17%n(!qXfF<;I07a?&UrEQ<(2o z6|*09e;@GIm%sgk=cgM-<@>Yt`}zJX{^#^Z#eBg2pgS4VGQMBo<+pxm$rUrau}3fZ z(cqG~Tuy6kVO;}qw@3=sdnhqO)OK{7j=t`fwEbid6&ncD!C>!!?1z? zW4U*Nv62g%+2ahKAAdU9K;L{Kk8{gIJ#s&DKElJRno5$FaW=5+F7UD4C@n~_ z?~-4j)<$aesnvf!wKfFpMvUubf4Yk-s*h@mt88+|4$5Vui)W-CM$?q`msbsCnrs$< zNYgx*%0X_qhKQU1Lxq8XVMpe;f@Fm)ydWd2Sm$JK1Ct}&^#q%ELfPEWHKHsQeycDX z&tuobwXd)D(swZ+UiFLK38z*evdl{IG>imyH<3Y1?ANGE#{zUIP3v!FMq39-Z`T&U z4PN7O&$xAjh0bWLaZfmCGoB3<{?HL@dW7E}3AtbNn!{DW7m zhL~F5t>vz)TXe26>f%W2eZGxL^KJZf*hbo&Q9IBYrGd7`HM8jheJvXOL>tp~VyyN3otA@WS%d2v+ixNFSWo z74a$x26&=y(2+68`YZuXyDhxa;^>R_$`2YT9IphQthN0`)-~^P!^jmWbddvOxNT=A4T-$cQG9=D#xF^G=B z=(o%ioF6+qi^eaA%`WO_m}vj{{mjx^Y@)(RIdFZ44eeL!Cfe)@e1GY+2E+86I>9}m zymg%2QhCFqaN9Y^aiN`EEh-cgp7rz9+Bq*~tbqQ}W~2{f-(zKhSaMo&31p{j0osg88oL+wGCc=B^HJluyzQ zI4&MM7YfKvD%!t--?;662ZL&ojat?V@`Ed&myUbZ3I1&WWW;e8#ygMAYoz-B+=qa6Yk zKpVEBZ0mi4c^%|urqpy#ifV)QJJ_1T_{Fq1pR9R)%t=imUZnM-St8wy>-CweSWYp^DB{UnT7K; zfCuUzsr`Ld1sQ5grP;3S-S-#nmV#SzUfZ2EkJs;{HgK)))l=~G!s5cbN2eduHppcw zKfR_}Z>b6_N1(N;k9?TdrX5!Ft-HNt`f8uGa&5&%ol#I{0^JBS;@Cb+t2^4Z$7}l! zO6KS(f!Bz9^+9Pe5mzXOg>`5zIfNAH4Ak&s?W)| zpMG#9-}L^3_~#n&!eZ(e%j==(P=8&u0`-ccUVb^?gmar2PM`4bQKc`3t^@Y;^Kh?tGrhSgAvKx#f0VhC<|dZ5f6wf5ND}b3PGX zTZ*u~?oOK^@o);}8C390o&piuI-i0d%TNjAE3?49BF5V!G*LA{X<7*F<#we@)jw9s z8uUK-HNRu2%1U$ut`mJqhR%_AG^Wf~7;Hga^2q_&r+zD-utO5foLO~h ze+~6Fvoz!=F5n5egK4u>kW?9$)7R{cm_B47wAf6qn)5$=^}8ycS6|(iyfDAthW^h} zCls|v{@b=>KTkuPUb}0D6fGB0`+mO1xq+XrGVfzO^<(coCQT6W#jq>1G~dV*>(s2y zWSv`~wf^YTxWGTjRh6-!3;c1h49e#DQD{1q%o?TaTQ9IK?nfwASnZ>uZMo!!U0FC1 z)yPi`9(`aCV~~U5j<~r%o;1fhCD7?7b*P|eF#PByzPvW96`MW9arKK{N|m>9`wvxz z{4fUXr?T0g!8IJK(9g>r`7XPZdhGnW27^f0E4X|J=bQUvkqVt%EQhI4>C32AW-`{z8yTuJtQBWg(s+vto3}4nr_5?3cdqi8=O{D0 zpLJJ=nM;=ME2K992l8@4=<%p!3V{nWJjN9O%ilYVHZ4;#P=A>FiLb`IZ*1_+@8mq< zD)gGxvLmQ|rI~kf?RAE8&6VA0&}0-*rAL zpSe`?>;$qU`y3`RgbF!tfJUS#$xXawW)9H$_+GmjD;`Gjh*;f*E6UwPncktXF&i?L zN)Wznovc`Ri&!Tm!CUSk#=?&`1e}`PO@|7_UN1;0R&(7YiVypG*t39xbE%W!th!Xw57ZZ^@Qat2e2k z;SC+od+51BMuR&^R!~d+?TS8?8#!j}BicfKT%JD9U#hrO#3(4*yAOsOO2cE&kE*Zg zv3swe<8jj84P}f2dM7!t;oFW8$OYQ+x#Qq1mIrS+?qYWO@nF5+D7gd2`1)0TbWe9A zIg))qBlT!@{_8?%*Xa<1d~(I@RGos1i8}ct8^*l@82+DWgIahRq%r#uOaTUL&Z3vR zI9v_df@@7Q&MSMl1T#GS<-{|ZkpkJgMe^ct*iUgR!QvBvbc~Dth2xPwf8~!Vxln94 z7-+uRC_SebSuP{{(oP^e%4vY2W$}iU1_L4zy{y=rj8&mwUxV4_?l?+CA^E@N3>MS^v zcH2KS(mQ3@sjOG8?MH+PTa4pN_(`FAyL6*Dbzy$*s9mLN+$pXHBCnGreS?N$mY9%J z3d8#-Rc@5%Hn=#m!iTHJ>gYKClSKlNyG>VAG6u#&0%25QmJoOvW-aVFhvxOM=B<*@ zKLmCR+QDYfZ*^CO^jlk1vxunRZmp~Fxp+I*kCA3^qQTbwRE$-87J4K~oL_rrYNTKL z`SO$qxCa^hSnljOW=SN#dm*U@8nLu%Th6M6g7c8xxsj zsuMdS9O0H(6`5g(#+nixYlK(!XXgfX7t+sszmZ(I=$riW#11% z|Mo~OH#PWJY|kY4!Hae=$Xp^P8OygqNsE+)hHcH|dLASNOtsWyL>^Q}2-@7IiA4W1 zRD{0wST5IlHV#En4dGmcGxeE}-t}jJsJ6s|Z=1Ge*UrJg6KD;VHk*!6_V{0Ghz!IE zT0k4sty}1#W^OVgqq~F-B<0pcurFoPr*C&VAD^LR{JyoRHyr?BvHl#h2^R5={Gpz& zV8_bwH{cI&|1fXgv2uLglt)Z=luD}-K~M0C5T|Vpavy;z(f~R1!l4Qdz4n!+J}irX z%`r>|K!0HVN8VOmN40m=N0^tMNn~OB6Cam#aIAua8WX`SJ9($yBaZ-8n8Zg12R~-+ zdJ-L{-F4h+In|OH68yR65z?wMZxMtsx)XDor_P#GjoxM3Jub%cuD_GFNx|al<~%jL zq+!sbxm~f~q29w*M+oj6vARN!velJ5g0&#XS)2W?orC_nbQSJKV^G z`6gWY6kcY!dQ0;GV}fV;Vn0gD2c)K}kLn>x7)TNdJ={^(JGXAk?}NRuT2qPT;@=X{ zhw+X{1H|+kivOr>v^(79WF8?_XS%ivb_CspyC_MCr^N7d2Y+1Ii%;jQVJ`XQlfz4H z_pRhz!0)U4zQJ!^_*3}% z`8`Xz1k<|z?}von&+oDDH(@*vvWGs%4c+43@zn001#a7A;_*h~swTKb`^x3(qE2qquS?eb@BfdlK^ z1^CJnS1dEkyK7@CGqC3^iZ^?~Ql~sf{O=X7wfzq9zf^qXJIDWkD79o;z9k)J9mLyL zp*_8GIwtlx{Gx%bnY}YQ&N_(CufA-xvCN@(m~-OJSdh>5aYGZM8L<2+>a9{pcf<#PBL6-xb%dk@)jAkdYN15xGXutV3J6g2Ui2&L z{dD}KO>Z`gqGbn0xGAzT9Q`#BLV8E6aX4~KrNwtLCw;!rVi}C)+_knx2ew#n(@l+* z_t&{+V;%lM2h5W9{tI_cipOh!3h6zEOa~nL z9b>-%Q18FGHMzXcXRkt`1|=){$Y5@c?bEeC;#*O{vQ60B2E66Pp|J6 z_-*00ir<6$Hikcizn`BEP+oPA-)rPQjPMh}-?#YA|MKbe9hEihPG$^JdiU20q_iMN znkk_KpH*Mp5yQQj?bNXv`0%1icPbTBX_n{s?cNFZI)~sV{Gw{PVqgM%I|pb_vWt6k!JmV_P{_&^3LN`b=0;PCy;-~wKXbEKCOpJH?DSZXCU$XhFNrOsSyVm{3aU~fG>3TiVx+`}L77mByHn(mrX@OYo!oqi#;}n(c znIKC`Gs`|#W!`OIS2bW^*&s_5q~_{WR>epvK#pRl5l|2K7e)!e#y(u!{XzbHES zVb|)>CtA^<@g}U{VG|EKs#~)!qXdoJD?0{m%`RD+%kAAr2xr#+)`Vh2UF66b2AabK z=PP#VGqAvSGcIlyy|i$&uHZBVk1YBFp1Vkb4FmN52R-HIHm7=-p?H<1Jz)l&xWj91 z1gMp;^Qz9{5D4GcQUM|1{XU3B3)cZPUNzIgtF4Si3$M(cMEhheUG3ts@rO}HhQ3u_ z4uzXVNZG1mh?0}~m1;Ey4?(LA9y={OgjGmrgLz2kTfb){bSKfe+-vf^ypXe4i7RL= z0gmd&KQEzK2NrfaF0b%AzE){22?i!I$0aiV!XntLYwb>JhXqjvn};K2dTn{~V~N^3 zRA=%CIJ4ZF5cX<0_PbnkfkN$-}~g4&%$$EUG-5 zcO?U|K9TW5A$={AtSvjK3qfS>AhogfxD+OpUy`MseCiZ7QvLg&tgAo{7Y~!Yt7=x!n0&mg@1YZfrezQ zEUaK6B4@Iz*uJ!xh_L5_AU1tJqbIggS|~fTow6Y&E@6dJRdDPXkL9QXuy_>0v)f25 z0g`|nD?g#FoP}2)bLgwz*{hhXd{-!6FeFhsyCxaOy*7X-LpY{4mTTWh*UgGfV@=8<{_;TPG@d^<}5XZ<2Hb8!<59+*5`=h%YXrP(CP`agEf-p7aI z)&9LtMJ|!~Nju@rM8-9Ykgi~v`||}9Fvc>jJZF)t56uzT)C!doN~DqJ2!c#B&3cBYM(_YDh2 z_rY5t^Ys$hSHvWWjoN~j8K%(7x~ zXX~@3HPAEqv!UJDe8{d5!yoH@n{us{w=7TX@CtJI8Gd4TmvH_}3 zX&h@_U@C+wuoZJjQ&POR#DKt`N9gah1J9w7E4RM5gvPOhe)(TQa-^PH%%(6K!{I9i z0V^9Y#S}c7fIi6}?GsOcd)49{R8d2Z+5FU2rD9ku0ylUTtmGDj)XuN*+P)zE2zT?m zHniBOELxN3IJx-dgV|RdkhkYLFmKNlGoYWgC|oR`0t;TMrGUs5=Vnw(E=qCn zx{Ir-ylce?S#_LRG)8sQuF*K;85|XAKosG&tqe zYRvNE+_|tZsGc2zn7?>cb+CyAp@M_MH?_X4d-7#sqv6N^*)65=2);^ zg!ZNf=x0ghysAn^7>&H-V@6tRl84w`J-;CmOJm+5-TaOR^>Oo^dp#fitS>}4Y+SLB zgT{B4ysU%9Be`Ag>@}DAV99_P9s42??Ciyx#p3U7%V(9NT)D~ZJ?22yxV!IUPs#^z{dZd${cvXKoA9~^qeE{tyPNnwIG{#*>OW{nse zHi`By(P2{xO~7Vk{h;S$WGr5HSylDrivZ&99|jQDu2Da{wyzn$8{m0u7w`edRB~au zK6p*cr%$-^l1-ydm1RFW+NKT$6mz$`=N1Yvj@pg9AdqhM^Q;Oby%qj}A(uiJb1$cY`L zwYbgot_91L#0R~e+i2Ig?@{#&Zb(3$po}ef3u`J?`=HSK!cP|DofyNDC*s2Fv9*?^ z_Z^q|NUpnqnTyp~h6TU#Ve$?UR-wrW<1laz@IKj-I~ zE6EIuF`r!tahSigJpOrIT;5+6vG6`*5yLfaVpr%)d{AM;Kl#FP`D$uKPNiCLdL5{r zeS3LDL){U51WUM=pLX#8;sdjmQOGU^ZuUR0m{#TR9KQ7o7@A{H!+)a{)+ZOq&GYA|n#lFZcLt@_}_ zKK#-Uc=3)i2S|VhHWsQenY>x=6>(?A9v3{R1&=bOa$?uyJlXNqZ2Zi}cMc`c`oDk{=Non^1~iNMZ}(dotvMp^4iu(8 z&E4Y(RAB{;FDmGGv&31Hzx?3&W4VoZUB@28IiL(vFA;`XMc+l;t+c13?l|a)+Dd-b zoL+MvJe79&9XC}iCs9Es`(r?#l1Xl*2)yF4vg{5}c0}yW9HoeMO*Vw3q=tX0v%Srd z_Tr7Ss6dg;-hD309R}JuW8QbyJ2l4vQ-k%nWh%XMq&J&lA!xUtK7VLXS_wS z`VsGl4s@r+J706fHWI2nzy34#9pyWB{Z9TSYJb$pBY8O^t$|2hf=iM=$48cAA2~%% z&;L`g4Z)Q121wit`_k}+0G}oZ#HVJ?=Xcc9%q;N$lovk|N{vEV^Y`?H?(F`4Feto3 zg)gCS_3s*;Iw5dCDO+<(qU7EKoJW$}EbR>CquP!uampwCLHgjBJ@&WC{$gFbOT9{c zBg7|K&d0;skUTzKvwXRF_2K;_&&waQEO-koC@&uwulw%F3penKEe%}gpyiP8 zNvnl+HJXEh`A%`^15L}!PAlz0MWdI2q@glKPn?{nM$Z>_$8L1s;I=LW(yB_ur-{aEh4w1k_+Va8xIfo>7iFqhC)B4*sSlK7YcM?8%MhOjF5<90SF>3Q3e;@>6yH!x#)%HP zUfy9}l(XevI41im;4xn~JKmP;)lbu|umjmn)N|x{`|F{-Q)72+$=*t#+8ESIDWjh3 zMj2a>2TY99pj#0|w{GWyPI>Misfqz4ga=GlqA4Ak4z=ldGC5LNWr;2=i;xLtgxthp zi;b|z-`?@s7U&zD1`yEfsPqb&rS3M)>|5e$3Qq2M&Ts44-A1rzexTJxP8*@)5pE06 zE!%7Ihc2_@H#3lwfdkY%T9G&mxVr*0gm7S)Etf(7ItWXXRRRjWxAC(J zgjbA;?TL+RiF)_tR#8j|*DR!2cFMLCR=Rd@b>LIEc&%B)PaP@#E=*I7hmRU-Dpe*P zu9A@5)Rotv;Q=R2&=&-fh)~UG5BcUD;vz|at?YIR!SW|WP}p6-|M7xUYj%$;OFP> zA>gzJe1?A>{7IYu!xiA&H&+fu_VKpc-ge8~#>nYI<@{vq>*jsrb>3dJHx#``t#*(+ z>Ta!q`nJutL6<#vZ3f97A70(IL-Xh3t(uE5d+MFJC@xziuej&~b+#O)- z*t&Jha})ivwXEcPhc|0yrfogr-@`3@G+GpEZVV5yieug>n=rBHjqUuPi}-EKK^?G& z%j(@Cek;D;BDTeQ;JQ6v$$snoF4?|I>IYr6vUm57EL~fm>0fElv3A8u3fFEj^?uiF zU&{`*c0X97SfKb)(cK(QH7&G8i+nyoCV#li?5|3f7^JUNmR{d{!8%*Py_?XFdv|?T z^EPVg(K7DpE+j7l(GG?XAk9B3z-@ zXr6nq%^F^I(%A(W{&EX3BmuWvLP|FN5HBn>Jm7rFixAnQwD8J1d5Ty53p>`uApr|k zuj)eano}t4lQ&J}H0`)sQ6^NB)!`K0&ji-*!X+wsjE;?9q^Q?+23?X&$6KUJd9gj~ z%e}VsywTkvW#r(Mc(6BH_TM5@yhV4DC%@jEI#O~-a7i*Ae6xA)21%-uR}$Sq9mWKQ zHRu#Cy&G!D3BO{|-;zkIC0jx_W@0q^^!$NPah$m8gGcS2&&2NdPn#vX7A-X(dm9u` z19uc=ZA{cg^NUt>KQ;w4ZYEaA4|k(6Sd}s8q^_bfl;{JkH zQYd7|Dy|xp^p4D2MH?=q4Rb3T`$%h@aS(^pnf?32k0?LGtKz&A@5 zo}}|^P4G7C_)0%LVTe2q1tW&|5CV-gAr&y!T-1<^mM;Aas4bXQNh=R2wDK~w?#z!n z@2p_(k(ZK+6fe$~TiJgjR=x3q$FmvdP zUS;i!QtyVf6a`1`#R|m1g3RaAGv${~^UEAv3M$E-`z@Fqh{25nj zJrZ&EM5W+f+uN*O0ZW>?hfZT)+_t+ijTw`n1HJ@Y7}-;S!O5ABTvvC@Os%P5X7 zKS(_GL(DX9mu`PW7j2(Eq3+z$t3RzaCT49^F&Y3tJNtT3vAKS;0@Xw;G4B z){N~Z&&|f_-VzQ40gU|9=~}AGbQ)$Ywxsen<;P5X_STPTwFdKvq{2Mkfr#B7c{|6q zBJ@v{?$4f;KVX%rG59cI(n~vQ8U}Ty=U3oF07DLJ8u&vlGGFm9Rv?a1^{7f=4`Q0$ zVwHu_3GvgoTTx0Nv^olnm;9NE;(Ch&8dn|3;Z4 zicEi)$qxQgVS>c-Xc9yIe@-3BHB60j@Y{ID)PQxD-zqOg3Bl-yCMS z@uHspq>sgeb>Mgv=@YiBZloDB;MMwIXYgkMVOjPE##3A4MrmvI6beiPzn^;PQ#FY} z-`6n2(pOasNcyqvNfnyL`pm4+!QdD>buhVpH8D zCJgpzg81}xiQr6jno^7_%5-wk-V2 zjcR=RjdN^#y8X;KP&YSfsby|lrLfG6ojkg)*CH$_`Br@6nH9)89$cXbsL6JE|$4Ul)B`p*$Zxw%F)RCK56*U!hwB2J~2l~M~9f~B_E*|-G*K) zKNa;M5cH>@Ut(XB+7z*7HUizLW1|!}e!XD0$q()nu!{=aNs_#agG8_k-9-^D^QYny zLImO)*+&k48v*I!Ds{7dd~T|agkfWGNaoJMb^z=<|J@oTLA-snuR1cT^_4x{Q$M%h zogwuHF@4*qHy8r7d|G7hAV7R^mAabum_Q@P1!tC`x(h1^9G8&)aLgS)kow-8799gR4E@J~tv=K_PM z8znlTl?@%=F@YE~{_N~PPy?d676wv;VGZ)SJmw0GL#*WHN?2T?gH=#u(xT&wl?h6z z%>DufWB23=3emayT}@C`(`wshc+7P_$~Tv)Svj|*chd2y1*NwQjm zUiOkmeqhaI*k>-`WK+PA2aG35Uac>#aLu{(r|x;|?_L`OXwS*wvwR19%IGHk_^ZU1 zY}J_QB_pm9UAS9$iEfm0^QK$))7-B3rMH9$%>$J}Za0lI?}W=xiPE}>@OMI$VvI$p zmpj|Y1n;k#-&gphPpa$Zhp&UiH(8 zdsvlg_jYMEkZy|#F(=TQc#{+1QLXZcLX=ETWOne5%lJa7hxPV~Qa$ZbQOT&xK1*d~ ztyO|8G-Lx?FbuuA4dDN4IFE#jSF28 zw=14Zqn4HfFe)@_k?R!xr2fdDN9&6O!amb1Rr{;>)3_qhfhx>}eSN z$nBarf|~_Vv)gGFc1>nHLG+BRnkBM-`7&m_DXSbByo?4;@vrC)qZYYS5Ta6_R+=x* zW&nQA?>CCSRa2msrK(6Tcka-OH{%(7ykM@nXV@h2-L%7f-ztF7w**TDfUYe~x84>; z=-$QAH@{q_k}?hoXDof1NbfxPrZ!jOg;M|Qowv?A?>S9CmV8SsJ&Er8@36GT6lD{% z(>w2Rl4SA?Sh`$E)O}KH^UgDf6z8(lI_5R?D7Cso9af6ccuhN%#72sIn-%9Zu`ijA zDdkX8i;`~>U@9eln%2>QnKPu?Vly7NU@OxfluR#>U zgY4kn35^FCftaWh+dngy6yRGZu-=>br2gy_i@Vbj{lYkJqJft4t;mcK-H&ebuj>OX(;0uzpFio(%Ua$l51{4G%XTY!@feuh>h@pt=gkM1p%PQL_B(D3 z!8-EqnvRaiD1Wh$)OE4{^R}nKn<`)PcsMR?02U)RUE8S^@wWKd_2Ju3ueCC~nbUyq znNt|qnPV6=37a&+Pr6Zb5xWWaBLSdJq2ZZ3RMfQ&5@z7VUb~koXD1)pp}=c1Sj002 z@g$dULDORl`gZU7v(+o|Thn88+UL4`^xk;x;r9ZKU(X3EY7PH(q2b>yH2mB7hDWGi z3ZOFc(h*d1K+6^L{#ver_HX$lmAPNj#}zldW3rlTquz1OK(+pZ4f|-dzEZ7c|2nYs zig|ynS3w7~{{NxwUErgtuD<_3G8!&%CJHtv*0IJKE0tJmO$^!@GDFV5Afcdy8WD?+ z(%M>-1hIeyhmf2eN1@h=m#5OVH=o*8TdjcFngAvNR1n*WrL9=4o-|%iTf|%Qet&z< zOeTnZ`~3g^_w&AgK4i|>`>eh8ZSA$!UVH7eh4Y}&BXtfme0s8qoGE?bf4}q z9@_qJ>GkE`E4>hXsPw{lQ0adF`A5^y54emek=k73q`LXrT$$=Bs@WO5VIM+owC1T` zdY{NU9t?f+ru8pcJ;L!#HI>7om`WopQ@^qpoTq`v_x+)VYKi`KmJFDVZUD=pcB}%hkW3957(?gWzt)1ENbM=v^K52lF-ZPXqctZ_}0wjisxXQ46M>_$U=d}~i zVV;(0X{{tCrdDeGH7`;PB2_cvL_=>!Dv2p-ngja|^kBR}-l6(3xn80u-&8uiT>k(s zTzqlW$lz()nlENNN5(GtB40`!&55Ovv3<$Zrovtsho?3T?VT?*#-`pzenDLFbr7qi zgeik^PQ)hEZ{s(Go|ie!SYhLr((J#O)hZd4Eyh_D`7JKO@!`<>hEQoM*fBq7epENp zc8h#|mTG>i)%-YB^W#j-j~RI|e}2r@w@y5Sz7+$ffETT@*FPMFt517xM0S}r&Feu` zT2V7&;_?%vG(47;j5sJ_=NGN!wLThLe?x)h3r?>eCaR8dMpl_rskzj z7Dnsid_5B+Ey5Awnz2uD;n5ek?WkQ0kW=S+?J%!Ve1WZO7l({uNqMNu$WimT+kpM~ zLfsXRJ(@jdo;havM$)}_9*b&R^1@?}(YDEBQsU&&1wu z_xn80OrAI?qxp9P*LNn}`FeeZzvoi^P!^~+njU9%`@Z4nyxgM-X}-H(wF$0&ij6kO zim6TigeF1@i}kx;q<$Mh8t4&?lTej@=D`^{MsfudfyP($^LPE=D*Z9mL{b1SUd`b8 zK=Cgzwm2cIRmmJpV4`(=tn=d&^EQQOkPU~XvDXyXrJp|qTbm$fh-?>so%|Vb)GS}j z`bUzd8Le*xXZ!(*eQxmyBI89bLHiHAQHmfS*^+_H&rbd9*6k6!rM#AUVo|PXHU)1M zO*`qC^-lW6u;er1?l63fWL~Dl=G@!?ln~va7Nd#{+w`N=TB)~=D1Snnc$!uzF!@lg zJS1TP+JfbjGVPaMjt~&?I*247VW4y>^Izy@gECk;GepeHQMjqSQRfE{%wT#>+MI{U z+1mgghhm)NAGQeAU3h#D;AHv2y|seaf6(XZ@#zLn9Sv*vC^{Sxfe%=I2-yhKx#u*_50DMA=mRe1lY`^d{W6v__HF!P3269ML|l3|EvdueJ9!d|^)J7udilk=h~FE^TkNNm z#^5nnVGoq&4xFdYUy#YvUsxqvPx=jS=zPPShV!#$<6RI=c#A4vdK_4`x=!XyZ#;Em)sww4+D3HiJ{3LlpBCn@Nsr>@k?w@I)&Kj2heoI~n9(6@pJdzLoq;{kKojNFm#*c6$G}wsrizx| z!^c@?a_-1D*@~Xek@nOp3mF1y)TBJ!b@pjm)caJ-`%+QN`${pazX!#JR&SBJy)TaR zt{UZiBjhev8*}H~8FLq`BWZ(v=B?#t!JWzURU_SoweCX2EmYhR-WqqiOYTgv`Mshu z!@)w4JBikUjB76%d*M>L%Rwq5IP?~&EP`{QV#$fe`I!MfXfP{t)(_&f-02_yhUuKd zAFbMK2FzP95*UGjrI&tzF*;|?EBt(!fjsBp7va+y$;34D1uOmx$X6J_AIb=@jw}`= zkfVhK?AiSIB>o^duXJvacy3hauY8f8YhEGT(50Vl_;2ZC?oQmsni#F|{reb{?!tC| zcvNfoM*QQ#3Fa9`s!{jjj8Y_v@yv>~I}_gJRZ;iaqPTk*dn}9DJ6RNoyI(I(bk~LH zCTXMWMZeL;yqnc5MT;JaI7Pz6S6kU=E(aW2g5f!m$?d<@GtzVWZ!Zo1U+ljjU)fDw z;|Twq3Hx)q8w=S93(Rd`W5o8Z!xhl(ioGb0>HTl^kc)r!1o0&l<`-2s?$wq2Rq+>b zuXcFUJMMaM3#YqHJVKUHyoxWFS9iS`^y@X!yW2FN72VyYA#L9@ruF8Zz)=LdmE&GL z53CXLjiOEv`4M>i+xy>V5A%Ne z5wU@MP9V+wq+#D@ivhex1t6vWH3Phe&4rnfETn58Z#R(HEhE3yLPoHrF%yU_Y9izx zgYSAZkoE_h>f4rlk3;CE168bMIt&jj2l@)RCxB+qCnYy({0t;_Wct>`5F4O7J%<;a&+q$ty>jYJ6~>cH(44)M={nwEz8oQf+oVymvEua;DD* zGiQc~`WsG|_0KD!uGE~!J_@J*Ii0V5*Y4$wkT}bzOwlS-e8T?$_}P za7lRtxj8-RSE4`~_cBTqb1yrCzloGJLRoDgUnWtk{gU#E7-_g4s@~aZkloFgrfipd;mEPSq7|E9`5<0k}>2k-LUg58P4!5fN2+C!EfBicj z^m|>hfQe{SfL}*q7zlD-$JL|cch_jsnD@;R@w~4(lIKGjWO;>s_Z=0s&C+Z~b5OWH z32tkpbrjFKojo6>rCu)n)X&pjCNmA1pTA4lwiC6=L6z9y|WRf z72HA4xYOyKLX4fi=&!Q#tO*tMFdZdzAf0x%x+=5Wc(6BPn(jT}e;F*3P+Dz<6V#nUUg+7y6st`Pr&77V9zH<}QQRQ9%dQIxholx8NjN+az; zX%V(H^L8~e{5ESpm}j40JNJ!**PG$K)8_AW=40Bs!@qSumOp!fX31MKcVaLtkDJ(& zvCtm7)+wCJD*44=`*%&<%*rNKvp1N&Q9zuYUD?VDlTjSS&&W%Hr>!)rrsm@nRWvmn zyQDIBT2YF7Qweiz>Pl}5@J)3b<8>{l7cb(igIF(K%$vUNuPuwP*tcskiTg*LV~Rv` z)-tWlr755Euk%IMJN&o*p$6*XK+O)nkM}&el0k{>VUxxvUWg<~4)#Gbczy!P%uksS zU?wRu0$4?X+?mhujCcJ7WYM~R$$M;$XsS~yCsDkeo0uV!XL#?pf=+7y?YD4}Tpji?tUo*MXFOPx}xkA4fHq>*&fdf{!EYGmhJIlsTZ@XRzjL#GQ^x) z5e=r_aE5*z4-1J*Q|<6Kys38D-;C~ThrgXbda}8f3xv5Vg{Y=lK*Hca3#=Q|0um9M zrmBvDGIbPysiVFff}sD`)tjiY*~(Ft4~Y|5`?SIGBL->IZ>`8w)7tJgO#PacQHdkW zk-MHIExyjD7k4&Y%G+FeaCcK<@U)vWl{Oz4JndGA19hYyW`4i)MLUbSWS8raTmz~gUspkLm9bnX*HfAGgRC}W^D|3UKdckeUoG!N zPiTnN3w(MkB8}{R;)f@_=IbyxUVb&h>Dl%RZ-D%h-rr>P<4${&Q(Dc#apKe*;P#L{ zog4IyPNt{bn@q>saQ78yU+#6s+bDWLcl_ST)27E{?^Z-G+W&imqSj{)=Q#Uv^Cj3? z5ug{9{QgYxEUgX7kNaAXi% z3W98ckP=k6@jLXabmKoZ3GX;`!cUXXeE;#GznAbGQR|G6!wTA2%OlZ6r)Fi>&|xUy z3Q)CTV-)t+uz%rjcRNdn;YPUXeTwg@RRq6AKlaYML(Hm1w-D?`_Bc7Z@o2t-d-n(< z#`R7SUJhp>*WdEi`~BYL-qipEAH47eOs!(>@|$DT%WnCRAS(cQjBcwP3PD zluVZc`@}TwaY!MiYYBp_I)>vNJuRIqFZysLGccQSFo@}fs%VP-rg_V`@{+BM%1n061tbAu+jC@01Jt4Qx1J)r}F3f|Je zXu9j5V!QG0Q*zsd5|d3Q-*XU94&tON#P>f6;&pPa250b=&Z_v;O{ddol zPO(=4pm|(EV1*e1N8nn*7C^$BS`Ggz>!Z4Sq_apAEUJywK*edv<09?ev#>DJwM*gX z#!5RLdWy|>c(!g}JhU>laP!oA9i%DXx1t-*0J!fd1wI|!I6;9C88n}-^xRC zjzQDiTV>G%SFY8TDnOCU_w9%N{?{x$?Kt%J$FkpFKJ@n=X216x`g?2k`|F4P{vUid)0r4< z888@5oQG=maeo+Y2vh_46VEmle#BOm8_iVw8NIGE4X{VA5;ffTbEd9bx^OUO5T7-Gb-YDGDTd+he1V@IN`?MR=FflxbgS&Dw)BJ+bQ|& zLuJwYMN_=@4*BgI^Nk&b4_B@E6Dn4WV!f?mJ!gv5T;j#sG%3$xq)ITEcDM{+zs31X zEz>J#*6c~Ni)00hRuel|s?kF_+{jwNB=gI8RGm&o%w!>i8i#cS&X9~MKx|~5St4k8 z6lQ-4w(eixBlD!aFuAZF-{PimAQGOsOIvC%eW7n1ZKTpR4PJ(XTN8%=Nq{Q6n3?#$eEuU`aUw}JgvMi7iU#C zbzaTViOc>dK~&21gQ z9xp~8QA<1?2h*e z>l0)PVu=M$2b`Db=Utp~FyGrTF7|(z`^ho_AM_vK`yVg+wLA3K-A>G<^ zB%hMzQ(z-e=4P4<#FCyCG7wu7}-dN8pC7!u}oC?4xoG zw@|t1hpX7DHt0WgP5!!j_UR9ZUOXl93%$wu> zyo%TERk7TsNcK~Dm2v7dfRxfK;bUGlB-em*f4+`ifBBI^RMbj}>dOd$_u|`lZ~lf9 z@Za5cyP{T=F(C80M+u0@L+bxBO6}6sOzxc1YVF4SwPm z{E+uydN(86>N~o`SR$fDbVN|W#Kuqo);pgw zL`R{tPxqM^M?7NQlQHkl7!zH4(O~}y@pRFcsMneBo{n=Jd}V@pq4W77r*L|iozJRI zZyt@=(Y5$-c8rtHP_(9FS#KW>l6#WgAEKvrvH>pEG+c;z&aLZm&+_b`u3A?6v$qvTov;wbgWboe2 z$@v}rcg}>LRySL2hIe7FE8}3!-~iz=%fVVcQjFq||mV@bEEx$rX`^wNy7Wc8%tt4BHWIV@k; zk*tYrI&k%28)*N`IZ?CU%15rpNqSr1q$_ns)nEy(yi2cMqRgqDQ5p43w#dc)gcshIFsCH>?USYN8D-i=g~pk*OU|?y?lTw)MVxeq z|HfZ5Q`mEbI(MIi9%iAhH_*jd=*<>7O#ZpUq-2~oe_I~_D2<xIkd2Ot%87lY&s2l@<{d)LtB{?qxiW@kezrRbXCG4F&Iqx~ZbzkN zTd(B&cX6MM_=)$t%;deLnytX}^a%dV&0$_XhW&g0EUK%erX5WaNOnBQyqO{3pgA+= zr%6WN=@RA&lVq7qQYJZpCf)Aef%?Pvxyzf`y=SUthORvgQfaQ+w|1m1CL$g|G@Njg1qW(ohL-(aolc4A!Tj^W#CAu|FkD^diP?L@CuM+99Pl z^+rTj^VniqqR7#AIFG((+u|HJQ^olrXbgRq?ltrs7GCJvTyde%aEgWAW}v^6g?`~V z16^UEONuPe4-L?z86fR5Jq(-~clMB`p?@P!XXb+gM)&+|tU6lN%sG=pMa=8=Cu3bC z-s2url<&T6+VS%ymm9K0X&79TYb?+)1_(jK)Xq3?$vdO|+dYP~O^c7V9ZVZWjLfYz zl*2saVVwN+_{I3jahFz^Z(X$$*;oY9)af8*n;G9`l@NBkF_O(|o(-<-R3TXWL5EVx zznXX70(4&NcoQ7Al8b9iK*THVf~@Aa#~P0!uqBy9tlMvDAN|~*Zu_DcahH>y?J_|w zwvZn)khw0aw2&15oM!>{e^#jSyKAIiygxfNZ?pbIYE-4ExysJ?x2ZZzs)sTyE6wQd z|D;seR>>KcsXaV=+3t$N@@qPqj=pqtw0~2}l8FUPg_=&i0%DtSJ-n+4rxr&}=#WKn zVcabqIMkD&mz;c@8LetvPU&I-k(4W^ckqR=qzOFDF&ez-1cKKd6}0|)j#W&s|H;<< z*S#rQVRMG7{>2DLs~GPmR*d6UM>M=S%v3`74#6x0mP!)jh@nk9!KV12In zFMaEkr^(@GR{m&NIWK$@M>NbO_iQQF;r1$HzGwd$P{O;9` z7`L-k!Q!j?(h<5B?VW${JF}Tf#o*-2w zv)A$8r8#0Y&%P~&VI88sjpNvsN6K5M6L+`2G0nOIct_5Z$EbbB4H{3jzs@klZ5~#A zd0BAf&qcRWOrc%9XO}QpOl_~SG;9!(cRwi)Wm*?x#pT<{%(zJ zwTrT?maSY-$5FOVO~#SEr0R#O~+j+0~i$i+O9b zRWo4^I}DPck4t*Dl@XCh*N&|!YZ?*~b|?+}kGd+kRVw-|iI-zXdEFb;_VHfy)Z`OTOjo;Q5Ukr)Ehc z>I~C|l?DE{xjO~(fy#pB27G(5Szj2QJ0+>kLq;SlE^N zE#Q=m+8;bbkpDt_E9j~ntGU;#eQZH8zebeia8GilyQXM_yog<~EqDPY`EyD({#s|r z=al>>ne%jC_#|@}IxF5z0cf5dn zFGS-wUhk#dD-P&f`H*QCm8_gYdJT7M4@rS_0;&N)(zv&j)h~9sn zNs%^fN@tZi^UXFs4GW7m4J*fGN)c;^&-w?hV3(_kH~DBXeUq%dPpR{|#>;d~&!Db} zwcoG4Ib_!)-9@2T`=YTb`_Z=SE46uLT+wgAXVcG2Biu0D%xY9!On;uJ3gxI8j9}RG zX_chBL&Xhz&Gos)8yo@qJncctIxpI?i4-CbKmrhz@C~df^0es!7WHBkvwvKn6JkJXO z`G*TAd#C>a4&OWd#`|BeJd^$R_TNOQDAj# zK@-;JZH7eV-#EB$<11gpbJqM-HuhEn12*m{*`%6$Wfe6cjIwR|b-ZR9;0URT0r=$* zfA%CJwSG&*t8q`FJ)iaD4Xd^xWGOxwm_AZ@sys{F{?rVR)71($)eR-{vUKZLpv!zo$a9I(f;2{^|`Hqu0*RsH%L}GPse2 z(zSA7-!MH(#NzSk{5yZra+^xK7n_S~Ov+_&a#Bk0knM{^5Ao=^_`ou8c`{e)glWXFcU3)S!@%RVrOnlTSW+ukx zY{|lZ{Cl&oGUL=#w8v`^e$$E*I`RU8T8r^E8(&21QL$BviPby)L|kDq4qAUgR|Fqy zJ0NQt=@ZP1JYm1vwhydc+d>n+ULD2BfHL*h`gtO#wgU71K2UrJnZN=*aB$!q;?i@6 z$UWj=?pLO-QE#;Q7*{;}xOh)&-k(tC~1W`2?og$I0Of@J#MC7`hDyM#Bk zTqfil)C}Pq+mQQ3mHrP-K;x_Bx>oIrI9~T)JmRL7iC}pxa8nC;Ro9H{PAP%fqmR=( zr6xHJb-BzPzq&Q|s+`MiGuyoqK`W)(nvx(JKEpB!aD<=WH`^FGWUM<8s0?RhmBCY;xQ$wSugy{ewh)8%<2N7>}r!_ zsht7s;LbJnukgkRyLwMzYur$}k$*(tVd-(`(!-qe9C3y{VkSpq?uV(eT-ZpQPWs`! zru+MuUswd5bsIk1(#PG5rB%{B-f_=KdE;pAkQg@Wt2-J9h^uFe84tQ3gANEheovw1 zCln_}={JPqs-1)otdOBgqoeW_zLc~q=^-ma1$$`;Hj3S$Q7=-&c{?7(oVMdJ(wzhg zkA&Pw*w#fxxszZ+tOgwI2nJXFige`rMb2x5zC<5}zA`d+${FRnTovNy3#0PZqlAa@ zH!Sa@=y1X~>>R&Yey%y1Rca7Lxzu2bJYw%9#$b((432+HFdWw^{R-zsL(x!he3xMM z5o7X-jtY+7l=YYW1?kUJ#AY{Gfmol~Ql^Q|WeGP4s+<%uF@qTtSOYiwM8ir8j)NKt zP_-958C-df7#6jRd6UYb`#Xw)t?k4ly(tmLn_^Bf4+9tHT|0H&Rk((7;w+R=%`tK8brv8f8Dcc#e!cO65 z`k&;G2Q8rv{-*6HH8?A+yn=B8TOFVzoAdg>p*)WZ|Kq`m=Rsq-A);;&BgK2 zCk2U%HvG5P&WNZp1i8ujFIRs==nvTaVl6~cJ;k~iVSlu&D7f-JDI1GE^LeE>Cxy(X zD1sSk;_Xm1aHzp{b$zB$sndr@$dr8$2}M3cLZ;ODBxH)*>~i^r%K1Mi8b_OKIoVkK z=yDo;+y9}$I^Gv5MW(G6!kBWz5B=_+R93`BRx^%{CaDfhn7-_cdd}FIDPtFpmVV1d z4=37-jIHUpnwxIF;S@9=9Co#aGQPFVs*#IeVHuuJWFTj$(WNc?I0Rd#&SLK&AFHa|DIu9c_Oae=Gy{ z1S|f^eJmVN4f98rzp!X-aQxGY&nNVRe02mHamzNBVJD|I4R{_Zm0|vL25aNF{Fqq1 zlyDUhlccC7Jx5|e_`<#z`tl3aJ|OmTjLh+?7;>EMndLZ6H zIuMB>LLh1cxm-*%@GRvI(|;nLAyUVdd6p`tynYiEDVt2c^{L-p2wopSwg7IPnEGO+ zQ1xB`)oc8{{Qu{gUCQLAN>S&~b;a}<6t`19dvb|ZtTi* zFi#F=|M&WAV6>Uu5n?miCJS+Qrh|Ew)|s)E?Xw#Y7OB)cO{}@<{Xgon|J!ON84I1vH5zg5iN}I4Y;+{j-{X-r={><)IWAavR2avrmDcg< z89Lj-Aq;;U%KDb&Tw=|nAdQ>nL?jiTWwBKXTNpt3ceU8$&{Zi7HhC!~ATPx{D*QjQ zWuT=%z0ROTbP9hS2k*-`a39XN$QW$x@%ZCNXL$A)e$}|(L;i4kYZUf8%yF(P9PC_I z~r1BJOYrjokn`_R)YWRK2+$zA{;e8E&NaKVT63FqD6rs)WMl@{MttQ2J}>P=xP zLOSjMP*WX|Kn$GcaVN_tAh>cJ-(_m)4E}1=Hgm|bma<06fMBwwq)ugOe%W)_qB_wH z^#=8J|LS8|-gvc@E2fqeXjup3$GOMc!Jo3*;Pj2wo#y7fs&5!Ek-kF5#Wz2gEzSnA zW)~_iKqr~p^u?4USMI^$vgF|f8CBG!@k|GUbrGK!?tf z(iu@9b2BGioiJ`P_A?&0PrQo7aM!f-jBskNG6^?bobdLbDovdF>?Cj0QPBxUdfT4r z^*W#ONA!4|o&He!D6)@Y`v{Hbe0%4KJ8PaG}7{5IeCWT6190vGJNHB3rCx^VK7okMO!udkb+d6^MEVbo`w>`ZuXesdo#P-JT@x z205~^MPpO7Iy!dIMO;fBZay{jQXvPW?&oUi*e}9Y9Wl+jfTQui_jX{aLMUQGzchv` zbi_1oX5};lFpjTa&u|Ymx(RO=AyJA^HDmtW`&(|1R0Pm6PSYZMg@M%TAjqE>NXE3| z&CQUz85vmOb{mgo1tR!imzO#7AIln@x=Y7KTbHc}Hw{m^D&N$qKDsv9C^G(^m3s4}C0W1bb>%(0MPI6bBR?Wa!c9I**YAHwDKwVc-q zz4lE{eK4eX48S6qbd(;Bo)`^}=rrm2wy~jW&_unRPyOwqaHS(QSw(b2hl~4lZ>Ga0 zyD@#nAl312!3EGX_7S)<39S7K0j5aiY$hZ$QPE(O?h+8m9*NyEw^uPi`;GDY(3vvUD z^zsISxHZSu2(*K3Q`C*fi(KOzc?_E~hf?W^M0~e^dNUux`gpPOn{%-~vPf-sULUvc zv0NX&9MZ=x>myP(k~be8<0EE`rD{N2Q;45bU|Y1+zgPS33Jfqg^p)Dhs$ks&YkQaD zkxf^c#g%*ppb}HJfo8N6hY%NW3!uCqsd;6u_pz-lvabGygNeB291lA&Cck1#B{S2( z>`E=jnu~SX;(O+j6{T>$UYWYAY#mS1$Q*+*X-^weRhXN)ld8aAnD=mHB)on1I3BK9 zymKS4dv_9LH2}@eWuoEkTbpiTR{;guWMcpkro7EZB;1iqS6_yt#+Bpuq)k( zOf_JcYzmt6uBepu`7E*9h!k#F{*~|=SP)W(g!eltk#HA4sS7IoON^6s4j=4k=DdWl zD>S)2O)f=gUemzMqAaj&4+t{|f;7_e6`fH_zouLcR44~~F)13MWltW2HD zBn@cqZ(&BJlT@JM+$62mq|ls0cqh1WhNbjRKx{^lAa_VCDG3@vH`)Y4=zoOBku@8; zvRWCg(-gr&k)hG^kCJXRlz@U77L78RoH?u&jYCIy5o^G2X_B33U;>xlY4oxC_-rT{ zoL4fO8ZVZF`DHX{a0GAaSZ~u)ek`5nAF(s~Hfz#3C`?4Tb9%i^ntOKYp%En)t}N^3 z{LMxckJw3eZ+hh3@D~k{O>ZmWZ_57n(Gxq2j#Pm^ipc+gB~cy5Iv58>Puv=iupw0{TvF z!%JfY=h;}541LO2XPtVawJC{iWE-%+e`Ld8v(w!EoBxTMxY;{>+_AuS*GA~O0uFm5 zQ6Z=D?=x`RHDN@YoCSdCe|t(m_lRtx^Znu{-|s(L`%cR~mo}S&o%s#d4(N8*4MxG^&4F>n_=Ibu1`Z_@nc(5tRPo}^KVm4xad#T8 z1Z?h|aRP@#aM{GoF7vbpaE`W9A{zWmv6^#Xc5<)S%~nk2)K#CExa{ZLX@bGtU68Nr z{FAlERQt#=tKI*Zz?p&PF=FRTe5KZ9SmI3l_51ya^dse}bt3)Ka*?>>9iN*|DO>BS zPB7l>)a-5=!#38&1E$5E6dM1ZkBDI%+xM(cXb201HL(|pm>A>1>HWO)zsXOpA*=L0 zMX^OVWO}tGB{%tBn@w-HreqT&5zeWoF&#@<2Q^TJUehaVE)5X*9_>zVW)SRdI(Bun zu{o0#`hr29nqP9#D@^0iqR2H3jP5;6UnAk&eU~}eQ)Otey%y@{|L$J8*PFTkp?_X7 zT{{nPEa4$#M34=l$aoR{7>bb)z|^MXKeib<`))~gavDlwXi6CS%K`IjmGGEM0Z*fV zrU)uK3}`n6^lnoZP)^eW6z>~cWhBg$Y@f4Ncb7*|HMSd^zeo|c3@|&#xHp_IP-m@67nuAbpX!b2; zo3!^GLw6+)_hgP{P?pz6*zTG@Gfg3zhcq@c;{4CjZ901+7V{tpyCc{;Dz_!<pKs^YpwIMwSt+OFL2;FT% zdJs~xl1>jo>K#IQ5bCfYJqY#KkRF6~+K?WEcH591g!bBy9)x@w(u2@G8`8sDRROPx zTGvDUCIG-{3!sOSUM23uf}**|>+U<;N&m)#y&&{gGbit+_BZ>+xL>3(Wo2>jMeUdv zaPG{rMB^5f8{bW*3Oz&}$uMSPG@bEyXBo@CPd}cepQT*`^mFg90s7Gm#{=~9k9!B` z$N4`)KT&t-644OnQ_apGWQTo-3JC4A58M3@@3kS@ z;ScX4bf_-=$WHy=+oJ>LjS`-Z!G6-~6$dDhp@gPnd&0;od0>mW5q%PDz&||GjeDXS zpHVj&B1VR303ht2@^ej+`wTBI3>pqG&q;4+S38&!M7l%HTqSo=$bYZ%{r)&&Kse^k zWwDejFL%!^x4v84$rXBGVLBPRVDyo^aE+FH>bR55GL?1fWJg|x>fOop`U0n!+@P0v zyv)v+1W^s7*Z3F%j$q6|O{fe_qlgL*{0Rt;>ROk@mLC<)e|nMhR3JdFwdalJV)Lrr!OTt7;lyXC$#=u zdicSn0eaXS7@&s}Df~h7Fy^NN^e{?H;a}22-=qIG&_nksb#jj>t)UF3+jJ%SzK8Cj z|6P3|9hY4nnDc37dB71(Gf0mz)=YWFh2+w~D;d^lyN3Olz}ZCuT{B-@BWco%($r4| zIPMTlCvL++rs{dQsXC~cdb*jZr;l_U=H|K({4vBcGe_5j35N-1=IFZ29NpGID=}Z{ zfsu8O4e0@FX8x{=kd|qtE;E1EnfaS=1Mv-{T5VJ5L1?WF=|O0n4e3G13`aMm2ci4y zH$4b#upvDN?X)312<^5ZJqYc!Aw3BBHlzokeKw>Ap#wIg2O;S)sH;_Jv}s@xGUF2? zIUCXg$TAz!gHYIp^dMAWLwb01R)(p|$S`d!Ha|UpthA7NSXPmh6b!3y(yd0&XGw-! z@Sj>@An(EqjzKBOV{%qQ?Wq9OPfo<2An- zpvRvL8KB1p2GQeNc%{fnkUIPEA$mMQ^mwkJ$8#+`PR`Kdk zWn&hLosN_4Wkj=(%-D@`(+FX+`^W)9Ej3x`9JIVVc>QfPf$3kUq?la7r@X_Qnyw~v zWh*I=sIj1*TgSVa_fNnj?X?wr$BQoz#Zn^_di9lZ8$6lq7nTyO8%fdMUGv_u-A?*f zs;O`qgrzxuLxb?K<#`akiNd!Z=ke%ZzGiU!5nO7n9IoL973#xCDCQIXFD#OZ3=+=2 zK5W*7&;B!j(nS`@S{gdu@BG={A2<|0utul#F4`P9PZ!$Ha#;6=!M9;=i1pk0cj=o` z_u|#2gmtm;581jiC}l$Kz>bdPYv(ee9|R$Dl7<~#vzw_O_SR4s9b*RkHop}$uhwG2 z6;7vjVzZi6yFSy^svs5yI}7}u0hjsi&oJ+!H}zAU4Ny=)$}e)(I_Vn%g7^Q&Mswiu zD2}S!1xPm49VXRG&go3snIW|X6E$t8-@o1@IZNN1^zxnlYeaCEzGYc;eaF(tOLLNtQSGJO4>HA)$t~ zsUFb|dV_zbN!tAJezx9YUb>R*OyaEF+o>Jb9c-=k%6}8=_m7%)?1`+{-?SA{bQ80-V|{=rSwPQVysuT z6cn-hN2cB#Jk$?4Y`Z_mtG8pZ{a^r_Gl1>qZ-GrJMzCFDv0Y`cJ;( z&bQb`QMQT!Y^$+0>0`lBa+*bTvPE@q4%O%LQB_)0BP^;hpklv^o-oz?71hl7CQfT? z$%WeVH>uc)EgFMt@6EjcKidOaSs77Fqe>1TjT-hIUZgYKNAu@&rnjv(Y+%>BVgu%U zgVDW;lN%?Qq$%)6eGdYJG>zi4`%K*`Ep3TWoUR6dQ|r+U5-I#op?ERoA>Lla<7erU zK&Rd*aDuTOsZMP?j5#7Eo^j=sJB&Lh@+5;f2ZS2l%rDvf8vo!zt?aBuw2efr4lx|ysuHlf0zH!pu``w$$_zdtq0~}aIoa5fKV4R6OU?W$U z$hHDOrUNfrpO+U$urgQ546g5KU8cUX4-BerMbn|{yV}-w*oW#{{1HW;ohbv~sqczk z+4?F(eTRKSqHmU)`tn)zHNb)I5U2VMH<7rqPz~3Z$hHDOrUP%Su=O>0eN=tVdCb)J zGHQ_5zg4)}JXHTKwDldc|KR>T`Xh>dS*8qpr@m_*u=Q1l`hM&q65W2HsV|>ZUjrQY z5pk+-nTb4LBfn=N+X@7k4ix6+HBjG!_habUgZE<;b;$h~eXvUNf&1DA)5||MoAx`I z7RhVB16Llp{R(XRJ^S~A+wYSf(G(|h@`grO&3D>w#{IVa6r%l3{)j|h{Df&gKCAr< zaNttn)P5Bv@_>!J*hID!2oisTxNgnmHPC*8>wAQ)@0tG?RNvx{sPA4l9{iw}<4%M4 zLD`g#DEgVU3?aT#--~}~>Kjog-FD!k5`Eg!K6kxOjkl_s*S z#fF}~*3{SLm0#bi>ia|M>EOy&;C6=3zrc(4t-HlN#l;g|nNDXplD*}zV?3Xo`NoHM z>cFsIn-0$*Fmzn`7EW?+XenAV5`P6f{m*aM3-9!L*rh9U=5KRv62jcH@ugpwY2yy4 zCA#rjhk?;d8}^2izuqnqv-K)|>LMUYxpHjipfg#QK64`G2OZ1wJ%L7Ag%-1nW>D_B!ifqg@3>SKzG%*1i zvlJtT-bYN#VK!zCM<{xKLd=FS{D^TybO?=wT)ukRs6LKR$=hvjOv)?yqqgL>74Q?0 zoqaD-yN>BFgZ!#D0tJ1wRDbKeAPHL}AG|qG{lDcSi47pZaHGdx`KW2eKlN%X94oV% zlBD}dGb{Hdv=idBYHem*4R6Ohjuk~=e|?2H%YHJM&LUHqJ57GkjmH|MuC>I|{)k)I zX?m ztOdGWKwi6ma93AR&~!Xb)he^V_)o)jaEJd>3w+)n;HrYA69Jx;1qLvF`PQ?esm@Y= zsZCIBi?G%d;n+MticsO7Z-M%MYRW13vY_chK&M-vKUko412pPjOd|nejx=h3Lo~nb z{|S4NtWML>(_`M#RrOq25Tgd4#i)YBO_W!$g`{RUoCb#Gr7-O`)Mm zx{E{pEueAIb0d$2N#=M*q1=!SP|2r%V%X&8;O)_kPnqe8-T0T+XwYsBJN-MF8PX+( zTd0tM`dtPJ=V|_L08Ds)PuBd^-axB)gngssD4nQ5BHdhxFR9>49n8q;m(mvql>~XtCCf%z5g1r}u8mwX{un1P-RIk-oY~~o> zeRk0oXtdE9eI{BjaG1D_*6=pbdLjBW8@*1^hl4~fDsk(1bYsGsW;)?;7-<|z^5?-m zX^nU8Hf=UEGnGX*ias$H_3vAq9ov!YPEc45#Pc=2I-(Do%r5KdwXE}*DPgj77>&@G zKf3bg1L!F|hla(^42K?=%(|mtO36eN4RN5tjaERVhTSkP`hWk+5GGv;)>WA4%AV%G zJ2I4z0&;-!h@e8o1D74B%sFo~l~`tBmcny4GY)Y1x{Dd%^h;OAs-pePV~816HKe&T zb`d0E|k(^-l1RQx&w9sn-ka?Zu} zy?afF56sX5L3b(Y`=w5zySDx_WY|}jxloGKzVf;ysq_kCF>IF+aTAx+KDZN3U<$XQUF_jp<|WR3xKr5{I5r`7 z5wJHt<2=v5P7v_+h?ACiI8%<}Er;QJ(B$Ow`2+m%Ih+JS?!#h3=9gF3mM<7tPA{*Kgva5Pxk-QR`Cp899_s=NA*wL<+kHa9O?}hhq}LJq z`J{VY$iF>JYosrV{3cAg)p>K@>EAabaMmk>=DxmfX6L>q&D=M_LX9#|19RUq{w4u> zAK(r#*!ne7z9;?fuCiBMnVwZY!zh*{jR=z3lA}=dQ4^5fV|~9Bwdy{}jEUu!9T>dv z^Z0~+Iv`Ta!zE)dgDK!V7)W;|Jh`Yk)bK*YhgHA@z{_hP8Z#)W3 zr)4RS8RRk9&+hDvF;bLjzQ4eo^Y;t$~RcV`jrd%gH0 zUGZJKz38Blf`?B<$MU_=52QFWf~Au93&c?{^A8PKX*d)65lOnS5OJ*ZEDiVo@eQJV>^_1WIPBg!`?o?SJp)(jPCaTgO&1?qeZRAvyfet0Ls4V&Uou(NgV?n9PvyD!* zrwlQvk_K2AsDj{&5J4f##|9HUD=S(3%J`m5VxC4r^!%QNNNri7p39DZGGZuN^~PZO z8%5r<%TX^G`Wtl!`fG0)On+7EN5bahFzL{9UCr zFQRBkHE_Uu5t!)4E7X~SeCv7xi7Ieugg=IVNyq}8ZUCDyfYKp$3s$u=l#}lcdq96z z8S|Lby%})dXX9KWL5r2V{Gyg8iY|HJ_F`FjSHv&xINPwVR7a^8ZV%b`vmwfjY{O|% zLbq8JjJ?CPa3yy27NJpOm?je(67i(0jUVN(+{~v&HBWge)n*77Di2qEmCUx~A-bfT z@Xn>un`m}+Bs-=q zW{=yntZi^x(ad=I$67O<)+zfz{9Nq~{lK!!^6nph3E1TtUa(Y)lbIFhvbaEY5x0$BI>cZ6Cwg1j z_oD^U00^`WnMW@&b_5VRUSH+$80Xu6m*>8P+4YiFTi@SNQ#44WI;pYeW=0rCW(r9T6* zMwRW+B4DcHRG-pxzQX8)JJ0Udp4cnibrt)XT7aDG=D{lFV+5; zbJIn8sYL?$rGE>&K3w2mbDOPDbBw!~HsMhkKhv#0F!S^*%)P;LGR;cIc)O*Wjs4kQ ze+}#CJxw8RbKf!QupblVcfe13%50g%j$$oc;MA^ z$6#^Y_}`@uxPU2;^r!c5sJmi|nA@ZxcSVnRDRx&p z&P#Con&0wZ{#>(@XV;2f^E*Utq)N?);P^lAdYfPtDe^W!;Vi&B&HR7cZej)sY4bC= zxkEjZ8J;>llNsBOSPyX8Vui49##&@TNZ6yg&`jm^w#?=_aB=J8d}jQ2neb}To#zKnS-9Kjd?^r1|3{&dZaktY7%B{griOy2MB0O=IBSEU z+Av{U!$$5Vyn%3p_a6HEnm`Pd&EfHyE%D&=Eit!{_DLP+Umi&H^!E+lsNM9M&fxUU z;OtisH%=NoyRg8ml~0mMIC*<)Q2_sLeRAO_XN+5DoZ4b<(#VbbcK7$!bS^LQI{N}l zH`5>E+@3cnbWl{tn>1=r6ljkd{}YKaq0hcu$D*kgj}9TcLyh08oHi?`F6D%4vC!z_ zE|e#S(%LctQ}ExsT`=1PvrRC#>noi)R_Vi;^iS)XadwGMhSHgMIx5d(UlQHmV+G5- zUeVxm=FD=TtO$;O!d5UuF!1yL3P377ayrqeY;oB#uBLNYFuFn3r(Tau+~ZCir#ve& zt@9`4X`FV-Q$=9d&y1jU0V|-;lr!XD)!@E9Js3A@uh68b42r)B#TMnem*~;k=9p^F zXU!CvGLg!vjGOulp8fH`cv!uKrbOiSvqY@|;G2Em!I?#9^zD;PQ5HoAOp3`d#lrj^ zH6B`VV^LZg6B38U$RYWgkjO#eFIXh*aJC2;fbprHgGnM_ z@|+68z~}MRf_XDX*32p&*L1x3h{Nn%#+f!y!3%cv*DsK?!!dK+0R~)UJ{++WHxKS5 zvZJyy%YvuPDz9on;YEH?9Y>XyK|9uKFyl;z78IGcYm1T#|*sQZO&S z7YPZEBbWtQnBjw9Ix;X51=E;?88HY36$x!HigKSJ&vi7C=^3*zKG5RLOO#hcc;?A# zy4tcN50CCaG1TO6e)~4cS#zNI3g%g(udKeiiVj35@p{-xI-rZd+-L-SrN|GX3abE> zoAvaUtGM3J9Ls(p+P_-K9Pfehc9YXj?GZh6Eb9m-y&sgf@WkR*?DryeZ~C6LB0)CB z=pV2^-o%^=r$-5(85xP80@H(`%%Uf!4iqi_gd-^du3#O&F;z`T&l+CkFMPsW`ylA7 zq%ml3NHRzJn%_``0lO6ClDiLLg}$}p_&#sGao60JpCAujjm0M?<2m0-G#U9I<1`O( z_Ko&68ieSc)7Mm8x*G8zjI?m|I2?B3iIZsrnL2n1ilJbrj)`PC6A8L`#ncnSi_TKA zA`Z)Y!a1mIq)_ahmwK;g+5P#NT$}*DfB$+r9tMzC%AcW2G&!`C?8aWp>uCbVgPQluM>3EGMb)K#rqm5>|WpTWVzpearkR&s8 zH{j8yVdq=H8QYjOt}fxjXD8Mda(8uCUwv@AtGW29;^6H4iugQV*Jyqh)X{<(Klh-PWWPaTWY|cykWxmF6d_6E0#Rd67%H&x;2<$6={+TUQQ`aCLHIr?dET}QN-!>);Cv+zP35u;D-Az$7*ICb zawX$uP8}06a1FKUX#LEY?g+1xvib?tG4ppV9^o&1xkL@#tr^+0I@u$e2!eUPYw<|` zTp*11@i}jUVG+_v>7sG!6-bTkHhJk(|3oet=pPt>@uxWtPfZhc8Hc~P76J54gi-%% zov31QRJihI>Ou|EAK2l65dj*Ag~ly#aCU!8e4+BK7$fB4j|B>TBcYHul+3~L-HI-G zj^VU;jQ`V@r~@A0OwaPtfP6KsLwW`kD;1feoGGa5OByzS-6IefTK@C zwRlI*!c~3*9A3n_@RUxTwInI6qkrd26&XyINLheU60_dzAc>|Q*lHBbxsC(h2K9^lwMjlk#FkP zF8@_xARpS9UwT06=Y;}^sKb}2>$S-`FK5D&nGf<05i=I)>)r`$*2+F-D)vpf$3_omyH}&{Uf6u>3#= zBmt+GMR?FLSK-WaxP5flt=WY*OaCgBIzlm7l4GZXh0$R9qP0&3U>{rrg7Vizx#HS= z9@lQSxodpQ$?lqc_Th+9-8J?0VFUzsjphj=wFKlLrthxV!0)B5nGL(lOiK=Ca?Lkl zI;g$Ormo%WMysQ{gD~Pidy}3c7ost+dsu(LE>DpDCuLM7y-y6%)l9iux|;b|sP-3L zjf6Ww&8<7J&|f^+Z1flC0!QR&FA7oZlJj%?1G8ZKjT_9Xyr zG?fSY`F`s=Dq1e$@EEE7&`tp73RFPmjh z_5(geR=(N<@s!+sy{YFAQ_tP%1@uiaue<0gnSBN+crv|=4nP_oI@=r_wdXZZ?IloL z%-=L!Yklvjq&u=)Y6~ns%ZsOZjav8bX&xR;N9BbAcUd@R%_tsFx!mE#q)aF(Pq;;# z?jn$IW83jCl-$mqa_q=T(Dbmg%p2O3=3sQAq&OV!SzJlJmgPcOMNsCM>3`%Wb$yw+ zjW>Eey5aO!%eS&{Uk4_}d%&-gOi^;&<0$zi^fLnEuj|LW6$Ve4_Av~87&z>u1RvZ7 zXN|ebU+#|gAwKnY$KMjWY)JL@d=+VR5?oHC-XCHydT#dd;01s_bx4~lHN;6_g+y$)O+rs$4P-}NVxn; zKm9QLJ$)XQ6g%9H`(Htfa{T^ zi2X01{Qd*;b=O3suXY8;b+v@${||l=xKf^BBEQ+`L zUqFeD-{Mm>6q^F)x?lZx8Mh-Ut=M{3Ma>4KUiPHQ%rVZUQ!9e467TW1WopivVF9hs zf%%hv{?DyV%6#Z8>XGwT%NJaGq4l3=pw$RVv=O~9lY~orpE8M>vDz{q=o%LaVo4V1 zFYYx4&g>k_DqoU%=m+Fo+H@qRvzL`GSoUM%8L;e3BM#v1Y z(Uyhv)_)WF7mXZOO;X2ARj9k%R3#5LrStEH za-W%Z-yM_2@huy}02VZJh{NtJhr3dW8FX9?yE%CeRJ>)R1E}oHi5y9Flkm8iiVf$hOB9D#rPY7LYu2;hLhXJ|K#pnz@w_J z{{IO{AVA;*L`6l77-}q7sMt2?V4Z;p%)ms0mm2FWHrCRreW}bSR^-xL##HP%_Q~@b)5Sq_FLAXpAo}#uzR0d ztLtD-=U(HCuz5Wf7r4BTDYhOuw<*&`60@%z@*(@3-mz|)D9A4KAbUz+ zWXqpY%d(}8W`Fam9P7{@us9E0(G+qO!rd|GP|;EzeO99zc2129A#vpunbjkm-o4i= z-hMUv_~UAH_D_$SntuPdY3zS>{Ao?O?=r#-gvErPx z=oY6?6}dlq>{Dj6E1Y>X_$f2m1MQEkhi+pgof|S&HXR6m1GS|56;B(W3`o)Do%Pm3 zuSL4vEzT?jXaiM2WOjjpsxao;2CBlCMwQx-FEtezwtQUV?y9}7jmI{9C{;Bin0T`% zdnSbJIbG?2M05tb-W-rUC76nwaCpjH*|IwOwQO0)ej{W(bWKyJ_*{&8tBc=aAWX03 zt6Hf!4iy_|ekW`_ln!_Oqd0qOaHSU4A+g^KuB;@Mgd%#qw6mw$_qJ~_#XX;U9e4^M zPfZw-_WUygwC$N56GT$2-GIkuI!+ooyiWgv(`i3X|ktJSXN@S-76G{l{=sg z*?)(oh@?i9L^zqRXScDZS112l8zi&OYLh*DCZN@}78o@LFH3ZOqA!ck3iApHH=o;7 zpDIB^xQk0)10tM{kKd9i(b=XpqouzksY5^714PhvmSAH36MH&z?K>r8@NZx6R_6BJ z^6altTzN^V;DYk>Hm1MvW-v^O))k;d&tuQa#Orns#F z_F>W#=!061s=QohaB)Czg>xI7!rsm-BH^+Du}f`ZJ(3-Nl)YXfqdOx@HB#w^vE1oZ zXD`*-x4DNoii;WD>3e&>i9Sq~D>hub#Tm(ToX^?nWks>7eDTL0TKsI%B!8-bhivjL z@It0)`!5W8#-w^*h!Xs{2 z$ldhHe4-ID%|5d^_-O$3*3tn2ize9MLu#E5| z;W;-b{zyXYhQsSt`FqJfoNp((;VhnB@aosQYhR&RdU$9`uw5kf4~QLw3_3PEvA={9 zz5S(D`^ilEsGW4S3zQBl-VF^TS}B@3`qyWgoAGyF_pGQCoLeu~HW6*^#Len}NLRWz zdyR{Jdt)wi(Qj|eR2TjB#^APQ$=$#63Jsc4vnK?Xn~mY9peZvu)Ujp+Zk^l-TAkJe zWH(^}a>?EA=5tz)wv9Y%bGhiXg%fxhAeF8`=|Wx%OTKO75;t9&7i$}GpA~h2y*`5N z{bJiJr>h<*@^za}v^7t^Hz@u{!e2>u6-_uaJVE>#!qaYe zj;9yAw0hq|C@24+LGectluzaPiu6y7>}R7PIpUWs^L@Wrn@vr{&wqef7o9 z!i@)AI-z&IH6J!hXCF38&pB+Co-vJLqZAt{em3`7oxSQ`Oi_C+Q*=g?eQ~(>;*bNS z&WTmR60d}y+57EPk>-tT=WrC6;_Qvi*55bsDsSiC2nFV)jH;}sy|Pj>3-|rvjfvNK zvY$;&6}6Ho?}S&$j!DfdBvq7zJ>TA_eg7Hjq4S#jFWoSDYO18jzkMDY!RGV^wD`m! z{s*(cJ}(fqf2if)e`(%T{@piSo+_E_?+T|%Fi2R(ZWF4Sb5muK4M4|?EFol{U>eB* zc$pANR&z*uDW#0xlw_p6L^5FLB^osT%0Thok|-Tz&on8b$?IWBdyASwDf!gMOsdVX z8rGnW13+y*fT;V+2&E-Ecdx**H(#`++-DI^CVZYS%?*k_lJI@fWw#z4zE1o%3IFDX zn|OM`ORx7g2+t9INmxO6)(wh3k}#p4x>f!z@|W^F$_>>#z2McacdfU~CY0y(!~NI0 z{zlHw;yH2r3PhKQw3a^q)+OdLTai#7?m5IMVEHUk^&W3?UW^FK==>S^1@iTMNGf{e z7aADGWSbc}QYi5h~ms~Jk<6ce$sk)HMhgPVA&f~jZRN8D-BVFKu&Z zKC2U}%lwZi6ZQ#3#vq%3TScHLK$uPtHy)&!Q@`y~hdQDMWJpc+@662)a{_0M)nLff z8P3s~#i>&DehzuM()%VFM8_>4?oCbJQTtN^W>ebNL2R7tQ$^~pqlRE`dKrm4)r(KoI zgoZ=>Z5#LijU!L@oO!oZy^qt(^fss4W(cZ=JXD_-RE;iFtZ@U+3mnKASmyMBbb_+g>w$e;7QIag#v!_J4gZ&^y za%tzkJ_B`Sgcuu$fcR*Qy)IH{gUba-$Z0*a(UFPHYH}<+Rgm=14|fsg3X1yV$lhWo zu0xV%zoDxB*}M`TMVS;@8e zrf~BG)yc<4lQ#L=G5iguzHsHZ4{|8}#BLL3a@}Qc?%frFg0?kVCU3L5_wJs&tb>u{1Lmns%3?U1SIJXk%o1oQ=O2E-89H)=_I{|^{ZOHn)Hhf>CQFOM4KwHpShHrpiAsN5GV?hNKOTJ25dbnMy0Yn&^52Wh79pDK8B zU4ZKrOyb;zcsf&00tP0y^`G3*hWX|~Yn{|GGR2YR%}8y+m{PLZ9tL)>c`tnsv>x+C z5}g&-BnR*_@V*PxHOZ2hdjGKZ{f<5@c`UHUOViVvW@B%f7G>YBG`(^3z+-_=h`U2S z4)*rIaN~9 zH+kDNoM)NgvM(ans^XyaP*Na#-bx=t2veQz8!ee?GW{k9Z2Wj3VJob zhj*RtyS(lz-jFOQNYX-*4@r{m944L}=phXcZ?ZD$#`M?a3$6BV7j$_K>(YU+B)6fk zzZWv&cJMLrxVm?M)&7j2r zKbKK@_NYG_30C=^wGU=XrLEv&%5m;yKeP8EX6)v0@jf|0eFFF$&eM?F$Mnz{WC=wg@v*M@Y8BFjq4|D5Xhf>kUG{ z!QA-)en(LjDGTPh4N4FB&1|rioW`|w$#lIv-?8t2zQnagU&3fhTzLh)8vp-;pPxlH z;9uhB-y7Wm=j_~}1=5p(2XYRjv{jk~-_oia(N2`Et4M z^nSv2^6w@T^G#t)LGaQm?lr<=geM7W2~WF0@kbJl+fnYT>L>hz{Cf#Q_@*$bAb9B& z_XOdQzasN|rQCPU-<IHE{{?yloU$TkX!m_01I^+bq1ZNV%j zXA#}~FiROOVD6QdUy4WaNK?pe6^R#?fIayqBN2!ue_8dQGNn%Z&Iuo&JBSw_Q~E+8 zMfu%|O!}TDvO+tX{uSvLu{-sV$!+36S8;O2@$Ef^E`)7A?_{HGfM|Rq+tdyn)LHKQq)IrI% zRo!PA=wKR$(}31PrUBI#<`=Zg8q~yGj^li+;6wT4Hi3XKw=2>T1NF0y2Wd60Mq)qZ zT@kb#D+p&{2yJt?`2}r3;o|2_$Nk*Y-NIikC=Fo$h5QRZ#u!?`dbGSExHt?Y=)F$m z)guIvRL&$t5mC^BUW$dh=C{^V$sKMANI{cA#Gmyj6xCu8JxwCQ|U1wUFy0Ffff)CNig8hK= zMMLg!x(ET`!2ekJR8AYi(0<7WnpH~Ubs8;f@zT&$h57DK zK03#VV~UZkLU9N4?JgkrF6(Xh{i63Act!3hhgS-;Vf^oz?-?SmQ|jse=Fon5dQa!G z)!9?kM@JcXZ#cO4!lDCCrS3;aygpxDkesiO9)pdY98FR)h1ikTv(Ij zxvR_`z+VhjrggbE_%3?a$>1*T!6t(rdY#Q$U2hneh4HPK=e>SA91Y1a#{cX1CpP-i zaE~xI+nErzNW_3kA~uLb^zd{5GYyG#C6UD1GXEnYo~)d_PQ$cjesLYpKGAjFop`pBF9k0Au?)xKQ1)-DB?FPjkNjUEB z<-W1~gm=jQ5n(Xj6h;*UFTLWPBrJQY-1p$y<-X(7PWT1yz6@tBZm4_5p(8{~=%11Q zh1m8+Uu29_RR--e#}nqZ)E|*B?$Wo$#DM|v32n0{#0J^HDY^C8A$9}{8L*;7Ie*WM zBbR@ME|VbENML10imwQ+7w^w$%^J983-5-+S))t`VEi8EN9`lq`D-ne7zg9qB?bFUxOwU)5qmW9Dr$0SqdcjA$%uMp{0r&(A+SwF zyE0uw>WbWF)t%$OeaZ;i1F(one!&a(eRQOPS_y`=$|bGSaQ| z1-E_RnrV@olPTY+hbprToESDBBC8&8bZ$FiCq?ZJaqRWz(vEZrbP7Xo9L#M?94Lxa z(A3z_#DNl1wN=-Hg`VW&W*a~ox?sZ8KBCC@QJ6Zmq$pkRY56DvP(h3{bqI%BAhZ7 z=og&%Sq2!lH;D>LffgU|Q)50Xe^n`5k+juk;iOqL-A0v}tv1)4m_jra>XSf7+99R0 zWiz(G^}Fel{CTRBsL=;6BV}KGaK-ee53YF5T@EP{{^YCS)^`n?VV6F6ITmST?yk*v zD@UVK9f+VzhXsv7E!+i5avwg*F#?$UrJ(&zh<7enaJyS;rMNCRf@`LoY7IS%Qs{ju z!ld65Y~TXY6IDVjR{QB?B&q#REmsy3bn4_iA*4ah0**R^RNveXo7p@{>tmTpw5M$0 zwqd;4wuKQw{tdUD8%#|tLd=Hsg=6!Z#cCCU2^-(`s+#LTa+7O;`qeb|HMXDgN5fABx(#=-O%8!+5~yRp%k9|-h zWk2ifSq-X+J>cx<$urFuLk)uHymI5Wd;|~d*PO~H6t5Z?xgEypPFiy zuTR?RsW@iYTTO>Po8D04Y*o`6lS}ofaI1RW+p3-&|6+O`pEAyyq!kY>|&?%ZTyO=4!Q=Ym3-)jLIFyuvVI;Hu17GM#47hC3YgM~7em zU)LeEA@{skpxi|z9a0s{MnVpSdzI-%u> zs$C@a#YfoZQFe%HS5*zE>%d9Jo1cYcrRVX2bO``6w$(Ee!rZnRZ6PegiTExMJekOXyX-zN!@+!U2jH^-;! z`>v8$pNlEI(b>7)`D;PkW!~v)K^#80mvoHY@0Bl=c>CGCZ%HZMQ87EsUe~K(cD&Jq zFHEot6!UC$;N%TDYt;(S(Xo(hfW;iNw@HGDY)0r9{WKFPo@p4_Q;{2%n0`i!VqW2(4LHM9$XZR3+7w-xcZy&!U=)Yl# z7Ktx;r{=Fg-PW{S#ek(*gy^d#d0vgXYaUnoZ#6enbMSpkY-}ynS#6lXcKjG&hQaJm zfF95uJSm&3X)`mxY7b&z!@=(zR8(u0h1J$3n5Tu3GinmIOv%N*`Y)PyHAzFbS$5_m zlQW&c#Ea8QR=Yutw7wxfHSK`YSjx5!Taa3En^|a344D^shW#JMhV<^U6ckFF*HEVQ zM1D|BC$+2J$0ouJW!W+Lu7s<}4$r@3u?zo72z$igc>yU(G*AF$(5D2)XHzAgvtKa> z>MxD|TgYDRoMqe?p#A4fDgMB}+YA7`K0X`&i|V!UP3w>#a$C}&vB#uryamkHx<;7s z3M8%9bj;XW?)z|0xo;@XlL?dEp!g#RDbiitb9lIr_&J2Q8E}4~JC;~IP|Ooqc6FYHw?xAaF*H1M zB{pv`PE#f)<9Z3U_V|1i74f40Tm*$3j!o{w+miXl4UX8kO!g9Uod_*)uBtYsubiuW zBX+izrYL@<-KwQ?jrCsV2Vv{8vI)UIM(!>1Rgy-8yzxZX;)rj_D(Yw6VvyUaxwAOnxb5!P5)uMSdCd_sQ7`OH}TQj ztslzbf~?iudYmEP%d2}@g~ow$9-^G!ir=~g=r-i_l+lL>SC@HU*}=-b#(4lSu|IdK z`#m`u^}D{Kfjpo$za5<0$Fz?#UeJq`<_?#PIG~X~;HCwMn`1@sYowfiRoD)OrE-P- z;27UgbwFXA)7^TR`wLT?b8jn6AG`k`J<}}* z4d}%gB`=CJYK_TxjJhV1QOo4IhEA~x-uu8GI~;y%;;>8hmH6hleZcMY$b!ON=#ziJ z;rRpJwM}ELcekvp$;MA6Kyo-{_P38Vw1v12QSGx+lxN{z|yCL2>@=u`4|JZnXBdLd>xVvWXOcqEShK z^hayxF>W;n;zt3Et@}@+n%SnZzgAx|lek4)P_nA^N{{~+-Y^7Y`*&a;Wrh^G8`+5I zR%dp}tgM+Th5gg2#vRf{2ERyK%NTi~X_)v(-8>0}O}SP$hW1`SThFabpNg2l^{bFo zMI>SWa%wBU5yB6$CSHgMR*JdBuyM#bZxt4rS!wI_9apeNuf46*mu~z@uZ?nSY3W-D zSOlRI7M)YGC&5+wSH&!szwtq0`&Y&H1e4q{Tn&nor6?}UcTK97%6C!N-xaF}`8USk zLw#_DyvKK$X-9zpEN#LC_pYM8_047;L?#)lQlP1<2?~ z!E51q1pMm5)^i@8)783s9bB=PK|$oO+y_-9ern?+gJ!U|xgmCJ`rRq?4QhUyL#c2P zCK(2#|BLU=lJaB_E~?9~cTYc1<m~u?t_?XM583^-xnWh?)b1#Aha<& z(qQIflxq{w)Rio8=5xLOFR|}U-ciqh*V~x+4L3yW06xAN_zX{Zs0o$ssiPe*zE%nh`!~fG%S;7sTyQA1 zI`-LK{VNCmUQBC%;cm4i*TKHZOerR1d?(pJ3>}CI!uDuko{4Nx6^Rw9+84)MQAJY7 z1=ccs*UyDnNN%6t=J0QiZ*|x5X45s9fAsXx-Z$sh27|V~t3}Lp@B3%vMMS#{98Xj= zm}a6ey3=UKilD`En*iY0HHxO}O)y`Rw;eKZUOz+g{9H57k4cw&*-4V0IIH#9wIjD~ z`eP8|Gx^$QoBiTQmp(;qWj_k?^Wh1f!j;2>&2c1zF4UpoRb_N zG(6A_ULADo*z)r_jM(b5r&>seME#H_PqQs+PcGHQJ|Bq9ui0$zfOSI|u|H~|fq8Re z#(pnF&Cl1jz^xCvxk~BT&Gj&hTmFeE8be)MZ(zS2kraQ#)7Xgudpo;>gFgYa%x+Zz zrwYn7NYmXmRGzwar+RZIrRupwz4~$ti*yrTQ(y9ZtDalc2t#gUkiK~xO~wDQ#05aK zff{))PqU4vtEgY!^YtrHZ!49wx0O+QBPRafO>g#Q2?YdKXy!(mw}ky0Z#~Nx4yri% z8bFAof{N@+|ICZvsq4_1v~1Kcicx2b;*Sf@+jEg1Rtod zRbQEjuKi*q0z%RSIF@o%%3I%+XcUw&XGR`nv=9S3YdxBY*t?{uiy<7;V)mgWj7|vb zx;p78VY04(C)n*Q2 zYFoGP1^spYMo^-(xz++DgRQE~)}z~V=U04rdwjTk?gV?rgvnjzve4(2&m^rptf(ZR z4M8jJ@ZuW`+E8;GZG0V>*)ytZr&q_z>={k9)0==y*Tb@%d%6NLPCF1Q6ja#O86UL# z^ZM``OlMQK6y3#ih8AC4HOVB1T_lm5skvKwK1R#CvVdv4KPzG=uA|qR?-<>tGsdws z?dd9sow%o~EDqyjZYsgzO=7VnJCOaQUp)RmuI|j-o*5GYvCm_LD^4q`!9fe){Yq~e z%+00klqX?_$s2r3ImH#HY)t341R6z@N+B5LGvl+<`|HCxM zY0XKDw0Lj?JyS$Ya$>SR*P((k=P+WLC|27S_~pzKYsu;SX0BLwR`R3H|Dn}(EI;TI z?Lhch$kZC+e%4Z--uD!apGl%^F%WKk1qv)ImgrkM9@N9|K*gKVdma<}vj8bqyE8>h zrjVqW7jrIR@}QC83cHIp$%zX2ed)8GIS9k^GqVp;*jW+hF14EwD+B2hR`f}MQmMI8 zt#PUV08;E*elQn;_o}&Z0-MuW>SnWx(%HrA#0C@{XL+y#?`K{S>14j-*7}VZENjUK zQK4+s;kq_pa+WoeiL<7>1$EuAT2NZ~&Pbf9sZfFttOAc)lYE8g&C;DhdQ3^($emcT zD`jH*@-{Qk1EN=C5nd||+*&?0k6T5C8KU=PQ9-AOr^wM~j__yA^`I~oRvku)z?B+S zJ*(a4B==e4J_9_3Yw}Co{-M^GmQba$+9Ab;+HF;$Gd(KH006qIHg!GVpwHGdf;7(| zia%t}VjC$mmK?<=#&RF&LVm8?pVz4q>Muyb#nD>C-Vi$;6~Z5lUlp;pZS6sZo1QL$ z(h>U*mp;~Ei6mJn$aIpE2`=-Tg{3|xS#58U&ymh02ZU<>V>v*?hjZ*&w1SP)XVrBj2Vk+Q z#A=gPhFA#WXS0nxvyF&Q?P<;}Y(vUQj4oOO^sD8zCol=enh6upx|4`Aw`qb*vpbfl zslECmUGL!DKs*Q9BP19riS~)zgS33XnGf@UonHIemy@ld27?{X1f)RhGnjj?&Q^wM zf1$$TY=EX(x^gZXQ@GYnD|%q}pn)ogMa24aWcK4oqdY3}ILAJj1dAmM(Ga_}gD=T} z*@4~4N1A`cPFq*U4>$Ai1(}E2#@upOy0ofjaUDrG%T%E#6*x5=7q;`~jl=APYB-8u zBxe6isAcMrGP}hzs~E)MGFLKx1fmE?HfFd7W7@KCd<*0+jS|%DGdr)_U)_oIldPO=AI~iNMnj|NH$4-)$i!4br6%4Nq$vEu6(}4LG zBZSBglY1553)<>HQD~4|#^ym7jyx-|;$gKX7Vg$+puXgNrlU51D8p-5F#s*gCgA=x`MbKZL4bGi3;Ij=v+9} z`LGULszI{h553?dNeh06UOCo2=>@l0(-g##!kffR9ol#V-h1MeS!IJ-gXWe91L44-yS)yqP2NKF1I(=I*UE5#FrgK>{0WEo7j(?*fJk+qui7~ z``Dzc@MQzU9__|HD(#PN!5~2`NvSH`o;C3uFhGDsxY@ z=Wcf6TD-XL)6TNk(TU~>?&+s)&{GX)m8D`h3a{mHAOH|LNkwndqeJ zbAHjEepkVM8;l;Fzfbu!{d`ASBOI+$rW(xyMraUNq9&Z%X*e=(<8{H7bjM2{_#dVZ zA3=Ip>e4sAAW49G&~VOcC3GkQ*^oIU4KDUYtVv(2PeXP1kdE7F&mbcr^aOL%bL^RfzE9tq8 z3JL`K4AzCnnro7cU(Br*5?Zj`nPP#w+{>F~(od6z+r0eogfHa@-d$Re5Z(~@o-UVeqFjXu%c(Ky(>5A!Bu=tF2Si^@(km(2(H=KC5VDSrIHxdFL zkhp?HZ@xMB82h0vK7J=?boSU{>rz23$4EK##nH$*6Su$)jFOOEr4VhT{ZHtV{kU+m z1fLDY5BlQ|@*10@`()i_ShIR3`*vCbUtNwr5p8f6}|xe zj{G6p)|=@Mu()i~YZw}i)i5}U#4=uMN-_c3?&i_yJk%QA z)K5IravmK#9K-nGWOAqT={_FGyB>63oOGI>B;VycdYp%ku1?Nwz(G$pqEaZnaLOpy zc&9x{$>+Kb!PlJcWtL$EJ&zA0U6g(G)^``HSi5w{@}e54{a6X9rl{uTbHo|%6Px5MLjCU`pi2;YLK>Ekk8e3F19esTdH z@8rKz`6b=UJV2s6=g&2?2dX-OCH+tC{u(EwmWpg5xxG3wM`^hT*J8TmPgO$7x)?W? zCr8YHVYT`7tygRiFAF9At(wrJ+v`hDJ{@7{1{{clgOK#QO&Qj%&(?wo!^PI+CNcp=R@{0PQIg*Z@8>{l4p8T zaz<13X#aGqgKG*B!Dp*|4ZrtHXB1$r^RiW|O;==sxwW_~FRAnY(^~Qm6lv*0S4zg_ z2hy^Koi^6!bM(xUKF6_T>IU>VUK=b&3lFK5Q1Y?uJd9}ovq##)J~*Y!H#IftBcf?) z=@aBtuHcH3$?q6apF0$Mkz8a}3hn=z#&|&~Q(`=MGT&mlE9TpZF_YwCH>OcBk``y` z+?eT#k@Pt;*^N0%G2;|-3Nc>)=Y@kM%!Mh5rvx;*c^_FzSMdW41ZIV%vBg|8y;tW; zmJH1zLN!n(&jQaG`61uUa&Im0eiUlFK5&6W}yjlmLLIbH)yR zoMvuLzwwfM);^scN*N-a96VyIa{-0!NjcCsm`JA?O@a>bT=Eh_s|ZUP*969os)t{- zWH?`|a->=u;#IpRPyB2uJkOgE#&Qp4dT#m(t7FgK-p5Y=l9tdZ!yFaS?g8|OsL<{K z72c20-j7P}2T!H(lj~SQCE;|!nQl=0r-dNj6!hJLUC&f(kWig`L?u=pVM2!Wj`Au2%zf#8tRj6X%&wuNl1@yv(w_dB)sN+*Pc1H(?8}C_ zN;*MweER7y4!h!~FhqS62Oq#HHh$S=IEsUZ_VG0xuZ(ZmpY4Wk@$`b1UhjS9FNdT(jsj17xO6I^9KFfvpIIHNSYE9WEQsw-?3MUl z4YbDj$h1a!3M;MzEG|XI;U}1l@zv|JF)o#yRU6~_0n(M%qz$y?gl#sZOW&6eyP!62 z&2gNS34^)4cXK`=-N8!Z?7Gry#;|6u)Y;FY?}@Vr{thrE<4agX=<+6VMX}06Zb0k= z{658wF&m>Q3iL`#FJG+#_SfDVKwBW+rKiXhnsF^Jzn^D(~oO zH}AFEh8ycw`Og=3y*|*GM%ep$-w$88cH0<9#wpb;X+qFmn}0c3eG@-U)74((X}aS2 zOj@o{Yr=N=CyuT6t(lhrpMJ88&vei17svmeX9-&PnA(aXg+>p`CxwEu|Qmduc&njij` zZ#X88!TZb;&NS-A|AiSF%&iI~FAar~7la+D-sn*6wV`+!HPlWE$A+LYKM+ygEb$!P zTw{VG{0d&a8oqM(xM99kgmr{x2+z4e@kbK;pBd)+WPHUhvZEeGA_o zBm9!^Tf!gRp!g#RW0~IP_7h$q|NDetd{elN-(K+2>)l(=feWJcHk_Voejc)R!AFUY zi((@Z9}kF?ed+(dZJQCvfS+BJq)53LI(2V@Q~z5ClQz3;E+dq3Nx z_x;cMUdf+Bwo&iLZ5sE{z`<5Xf0dds~Iq~RFMwv1s4Q-OW&57wAs z@Ep-wdoUF~%$D?_ISW$~JWqyyhioE#RDanItwMe(d+_&U`a{!iN%oy61~1 zRC70~CO%1o$#^bQBp+GNa!lX;b&QKnGYp=5NB4>}2SJ|fVIn(mlDc&A=IjVJbHcN% zBzD8HvN$J?&!qq3qfc_dKOr@A4tt{oC&K~nWLSs2u)?v4o__xdE=%FB>;v%$mo}no zvQx`u@iP8)WlFe>x;R=jDUMR9IWJn*(m`^dG2&Hj+B^bZ0^!4nQlfbRD#kBYsI!$f&xuH)9-#K9k-@kJ)Q8drd{N5NmHh zV^5kl>8FPC#bMm-d#f6OF$7;Ig=M_cwpE4sk(?&EO^9E{SM7*tbCT1Vh`E{=M@=R< zEhgH*-ZXwy@`8}3nUm{GP79N+!IXgxQn6#@7I&X!H@-k8YnYKUs#IQi7;XqAAJzy4 zYnP{a-1fyts$&;F^7e5!$d&uJRb@`PusyTK&7BO!f_{^0!OQu!A7CIvr#j;-uGh>l zxZZna8m?E9P|oOe}9rYS=%25Dk+yBjS1PW z8@EOE_CDQ<$24#c`a+E|a-F;i!u063H@}~YL9V@<`7^~BDiqUQ&PKMAa-bm>mejaB z6$+5{Dm)9l8^I+{o%K*ABUz5w!J^ISJ|F&5AGCEH`a!eG>{*9=$bL^%g}kcFy-C0d z?tL>f{+-~~e}szPF)az=y+>7NXQH%V91nr$aN%R(zWA@Q?J`M@qR{McXnpfm8e(6# z&S~y)AQKF29t`1T$GN~h`E~;D?#uj0z*q3c*>HP5wCF?cPM!adb^IzFl018%>RIE} z<9JJYd;I>b?-lP)yxpU!vY+pIZ(wRl4$o5Nb?hODcA41n$vN{ZVOP5jV`LJjVbA|fgoygtEko@v-8qJ;#jUV^hDM|UsfkKox31z_l1Ny() zLRQGj*BKufY~8QwZyX#<1y0F)5s*xkHGfD`rPVfyV|CkTVTw!`$Q#w$Yh<1m5a&48 zWUu4f(nkP2>e%^q&hv~TJII4g0D@J^Po6fCpSwzGHJv>h%}hhcfhfMCG^sN`CapK2 z3*#3m-kr|{@!9LWxm*~DQvQ;=LS8k85Dy`IOKB3zb(WzMh%hr)uCw~k1a3;>Ix8(7 zFaMwezta@42Zih=F8RJ`wdokm!|xH>67CFh^k>vV(4^3NC`>0DjC#*_ov&KlIghFx>eGna)Wo;rtkT@xQ@?kwZ+gHuU( z=s>PRSkasya90^S5AW%f52i3vtg*N$jfo~{Oi%$jSzbZ%)nq>liVl#Ciz9~=_H!bO z`xIu%F(uOO5IPo>iI33|E~>LP*4wL@VsGaf0%{ekxM@{1RQz73cyDO@+g7`bR0^)^ z2y-Hwxv?kk%Wo8QZ)H+3`7=+*@oY15Ok%YrPIti3F9_qCS|v9ydKiJ_M-i8~m1<0C z^_{Fpg}me@yW4ixR^s`A%q-GJ=^wO5I7B(y06D!$?gdSsPawk3wx=pxYS=j&oyptg z%_>&a()kjUkTiFbk2vk1~qfk>rK(k5)AW{rmNjAANef&jgSzz8NlouT@;8 zHMh-cvWEX`jT%g^GyD{QVsAf#znVND*yDgoGDW%_z$}!;cc8?i!jqEml zsR#p5192>*J+qk9cddm}8yoFdMm^?On90|sd zphOAE^=D+Tn_E;+2R8nzkylVA7I^H`!>SMh;{2(GfDmEedGv*dxE%Wb!AZk>QwfcP z?-K5CgW``Qlz)Dh@92KQ@5#S~@TMCEk;V&Ndc7|pe4a3a&_uY=4T?XK@Eqy>+E4fq zaSsumbi+=bUhvZE{o2XHd?N^_6M}@Vx$oUdaChE^xF}9%hF<5H@zp+1g;S-^!lY zm-5;FX%y7{ObeO&p`iBnOF`{76qMcRRdfh(BnoPOUkYk}wm%ALf7YR(_Gd*w1)OI5 z%58@4D_%1UL4f%-ga$9kp)19|oLNY+pn>?1FWGB@hA22R8lvxBJ75a^OYU_Cn0c65Gx z!9Ag>2`yqQm+|&zUx4HC(@g%5-Qv)9Qj$i}3rexm)R9I324P7$dji}^j7(tdu|^cU z+fGA+xBtTmWm*rYq#K7UKZOp-?BVdlr% zpBntHJkd7Zp@P{>!eSCnH5;tx(UUj|!&Y6#*+uL(X454}(B942 ztzNZNaE!Jsru!2Cp3Gfz^EZ;^a(W5c}5&NV^UT;m^WnB(6&vBrxUJa3re9LtSLtglQ48$9*M z(dZ^ilA(D~p6>pyk1<}}!eqfhyiUnk8vXeHew{<>S3Ow`84<1H|GPoSt@is250bb~ zg(4TmqQccW$+@noS_Z2*C(3ETHFIa5`&OFhv2n&;x{Qo%(Gk?^Z_3ue{VG5T<4&SD z^$iPibsiOPec>#6= zoqLiG^tVyri`Gu5!FrI1D6fguUey>ci6(ERT2I4|$p6$3#0N!_E1a?LKA|PyYHwHe zrYF)^p240;#0o*bJ8y;M8HN1VIb4=-6a;U@$NYI^edvE@ki)DWHCvF~5Tw{w$IPIeR!Q`2)!a%;&@qv;}pwMgn|->^jo2GI+q zB4*<3^SlXs0lZ`S%YXlv5xGZXC|#~X#WHB-Hjs_q<&9M=}x>Of+nsPA1>8f{z8;#0jt|FR52ed$f%F8`Y;%zZ5MH)r-aP1vtX5dZQ z3T+N2ok;s0XSz7RJ@SbGuI*d_H{S#9`Zo=5PVRfm7}A*90)Vi?*`fHD&ZocQ6mpI! zWT96`wNr>vVb4#%X)~(B{(G?YZjH!owe{T2;Rm;Vb$z%rTzg#XSho^xEnueE-(iOC zwe0ZVABs4{mf@?wYH={0K|s^R|M=Ln;>mio;(iZ+-@IX3v4tAA3W|hvTkI5|?Q{~~ zWfK3~OZ+{P_!hc<*u@_WWjtTi3Y*3H(`6T?j4TRG0-Of`%RZkb;XSSj=x_UE7}6XFWw$nR*)b83(exQ8nWaE@Z;aue|=T zwp@1)fRODyvore25ey+Tv#acr*38lFnd^0ZZhAzz=?2#Kw)s2#e^961x}9}r=Bc#8 zSrWS1wvG|h1+#t7Okr0;xN1K3-U)dtT-|Mk{kwM{ZHa;Alw`qZ>>nNx^x;j!A@ zqBJIXClCK0*7G;cH8X<^al9a_tQhyS8>R$PB^BI`8O~|4f7QGZ!QxJC!EmPBP~l*( zZnI0W;}vR^xmU#cs*_E4MT2&~=5i!?zoT~MTqUzRjM`ahv7=nJYOVoX_Cs*BCTmlg z6?*b;bM#SEd;hQblKU!`MGk(P%bJ4)+Xygg9ZSi_ODTJkQ9A$OuZ*b;3f`2y<&j>^ z4^T;sbCJzl5)t3y-sNzGUHq6gEG(W#|5~6U zbttzUXAVFwIRNL4tErI#%~|vpp5?fJ5+4{$jv(IUz8JP(69<09I?E&4kOvw=uzCg(xu4~jw58t1m!PSV(EcBR3b z{~gS<38`E#K?iXck|64`dB*1Q6IG&VA&qq)a8_OFrXp+Q>x1W&B8<+~+tUy|VjVZ= zUsq>^c1z6YYuk47NSzqk9b!G%mMZW;SneK}L4nn+pS*3kF95>hO{5-RQqjo+zGGeaSIzk~XXGqnMTQ~ zQ%<#a^*YaW)IFHkJYrZ*G647Tb2tn%fxPL zhDvkT;d+)hHxyvIFFwPt-Rg1Y;H?;Eff|p+J!Y`tS zun!f(K9uVxb<*Tqy}i2*8^h2=nQ-k2^`6x(VgX9)iQR@^Oie5Gr7oWD@S#2wE5+lc z&)EUpXm1ZE+f9$_EFd*weCAzE@kHko;>Di^yQdk`V%&h%Md*m()yx;MVj~Z=h&CSr z(3F>)53%KxoSa|DPZic3kW>Y#$SJ`2;EeYV^qqUY;iQO)A>0CD!`Dw}(aRhL9q!?3 z9j3e~nbsKYf9;5!_9LJZgcwU^%c3Ne%y<}i@O{%f1vHq5%Wu{lARdTGi;&Ub+Riw8+*PHJ@ z`p-u@1$9XzIi?C120?jn7-S#Jyh?svAP+=1hU~hgaC5zLIHVgUM&fF0BczTV`|$fH zOWYBjErm0bwLjfust6~{CHLxzhVh}>EqPy0_PeN0FE&M>KFyf~2=brB_B#8Z^Z9)5 zWMZ!lCTu($co}OrpWt}HJ}3jOPU3Mujtz$20H~+@wN3_6*CQ0*S!WcKdcdfa65AZ5 z{vM9q6M85Das2+fALo){L!2pMd&BR)dGrlj;DGO%T^4^odmKE7Lst$BbB7_!EqjMk z84Ze@FFI|YZ6^CQ$!TYWlh;<~+O^YRlDY-BpyqUw?uE6YJWGvhVjM=IHB|BLxfRrai^WEj4mpV~FU$uK>M zu2N#TXl);6DnJjtwJ4qaVy;6URgP`Snbnv+?sCUionwJcoYRZxQhcM)jBmqA^Zny`0X|+y@c2^YM)mTvAbGokWz&c^WlXi zI*(HSCM)`qG1gRpg|)x=UtaJ?~mZY8IF;9s|%9p6vh~Zr*{IMUWNm$iuzaAjZeT&*ivrQ1Dy$HTR^tYLr(x7zL$$n3F`xU|P8)z}}^erxn?^%4*U z>;tlQg=oaSa8Q|qET5t2m%d{**vqC!lp$SRBlJ3Yn|9VqD`qCIJK4GMTj8HKdO?>| zLm8)GrDMxZzAj-zhSrWCY3q1SS#*i%jW<)gi^*5uK{`}1- zzE4-0iJ)N|C7GNhQk;v4*zwS^DhH(mF=PnejB;VJ)quvwNn9g#V0VSLsDDP2txh|P zL3G-jOsYX?WPM^(j!*qMCkHRV*g`fX-dN+cBj5z8QBH1~6{T+Eu{ zP@^mUf!QQh*Bisd?y@lVWt{ni>Cx7%2a)2Nsgs`io+hSk#QFm_Au~)pvI|8jR4f?4 zGA_P`{p+l@@0<0*4Dr^Z?R;}GhHX)Y8u1D;q+i`=bZL#Du}ApLiP6u*#niR!h;w0H zR}FIwO;l=9{J}|W0BGm8Jke81GzuTRg2FP%?sf6Nu=^G2O&NRPuZ6|gA zXfj6Zqav8vy%ZJCkeV|S2%WKIbk4ROH7c?wi=G*Eq=<<~LqHQ|EXhQ)X|{|EHyig> zk;IfvNDht_J8>WoF!q`M6928&ZSQSRx7q5`l~)R`;r~>hvU;3}c{%=@(El{{DlZPF zepl6lHwAY8G893OB|QA0yZg8ALX;P_f7HkBE7)QmG!w3F46!d$A_bDQ4C*Ue-X& z;HAuv!MomnlA$d$q^Rwn`750rvc)z;{jsXKu~mA^k3Ams$6I3m2chsE!l@sqNeqV$ z%h{Wv(d6}u^`lAWl?~}RUpy#cX>r*8i4tPDqsC|7LO(tb3qqOII09|=Yg;E z8)szpAJSyOUCG0GvPXmy2a6UQty}#qv@<)3(&(5rnJY7=V@jfqt?v;8T;oumU%xB; z0Y(6@(o-2bN9D69(8VGTv*BTyY6qIsp&ZqZa4dr&wSXV1g4t7KRaQa3!vK)+wp zV@!eELz!;dv&Zl4Zh`;6EQbT5@oq;m2gT-kF%yA!=Mh7k#R8b=pWm<|-JGVOuKiOC zcojBOln~XS@L$GW62fZ8Nr-S*6}#xrxe+Ok(HBkn(~y4cRLHF6e?~D4*oH+!116_v95{~dj1P}`>da^-3U2$JllcQ z_9!3o%RKRQciMB8>KB^wA7{3zCmF>?p@C`NWEF$D(0f~rg}TJf0sbDV{l7`V-9X1y z!rrlfiV0COflne@-^iAJR zQX|6lMICN8X0{`-Qc_A|+QVq10coP}jcW zw$tmNUsBPvbCpDc9JF_&i^l?^QWRarfES}I!*BXCs+z;Oy2UwYo>gT?KB5}wh=1*^ zN4cK0Oa_<5!s`p4WzZf$E*^iIHS4M$Z1$rk)Qqx*Ki^|0XjaG_hc zUKUX}1IAe?kU|Zi)iiBFi`8}qKkJ=iU50k@w)*6~RUP`A{9~s+wg2Nb6k_Y<)?w%6){aJ*oyFJ?%-6s@9%Zj2Yvoakc-4Y^H1FB&* zsX(ZTIq{L^M0Y|BR3t(htv2X5(=4o5LzTjco5KWA&eD?EWZIJ+0_a)3U2IsUxYNBS_uj6Xs#c=MM(m(!=nm7bm)g@|AHu9V2 zU5c|lx6v_RMZ~2GtckDQaFsQ2|s|vhkC--pLFf)h8-K~4ujpRZy;i{(pY-yB&$^H?cK=P z5Q&BB!1wcYh@CMmiqd=8A7w|ZELAry^G6yjgG<6HiQK_>d6?Ow)BVpTHlqmh4I*=~ zS>fhaJtNe`KMe~(GXt(nK%X--u*Z(S5K4Er3uDP4n*4f2IJH#Vh?pTf4?S&IPRa0ZR5siGX@6Iy(=WDZ~?sPSNG_Bra_>H?yPHGd}VjKyCZagI2+hvEv5my5NM zmrEXCJ0lfMJy6vNJQ4fa(Gh!IWyHRvI%2=kYZ$kHKX&YST958WVg!z>5v~l7m*Y-& z>%@w(AM)F3TgYFd3Y-4T3V2)g$N<+wkz?Ac$0r{AfzNlglnHLAQJR`i@_t377yS7X z(eij#t*VjAQ9{)7y2LN}R7{vpKnnv+wuG~V*A8l2?U{$ZNsyBmQULXiX@w*WR7mc_M znZ3%Ixca6cQ7pBQe{}ZrpjG`GIB1Jiy~?WINa7a>I+FlFjc6Fnp8y4q2)k8dRJT@wkC**D4{vz!(W?YDZe_AA_bMc9FWN^t9)k-aF%p z2e3{cmPyA>bXLKAAM!_G5zx1?*So80FmP0a#{m26F(CBV80rx~L2F{?O~--HZydtw zMqbz7FhqG)W^~}KTul}FJ9m`+&Zj>vyNWKj?7MXNWj7zz+v;_CJm1?JY3fZwt?DJO~ykF%p_Dc`SE}oKbAXSd z_*lkMLnBZ|2$T^wj~0B44uAi@9Uf|6Z0Jejha|#OSgonBNmC)4jmTw6_0GbnK=*36 zSCO%C&Afs1TRJ<|s!nI|=%P9DGy{9t)_Ftenk;E9dna4M&v$6lx5k95YE~kDrI2n_ zM`7#OujX3Sf2wL>L7D}#iXVV;^jSaF8Cu1-@JXeb5Ue3bK7|h`cFK{FM5m;O!nH*t zo2e!Qm<;P<^8tyido_OKa0PR*=Imwb0eap@A{8UhFYDx)9o9Ey;+hrA65ma*CmR>f z9M`rXHi1&Z3{8br%_TGSXDY9zyc-8<^iAtn4I`$4Ew|LyR#@#{V@IcTu(ABTx~h`D zpcF7|>l&e*L*(y?{X^pxaz-)ul#uydbx$s_e~^h2o3FV0OkBB%6SJ?lHWO!=xP}Lv zxVgj~YJ^ty{UsP3;vDiMFv-uU890^BLk6-jz3HjExqS&$kuz5pf>`P|pOzasx-`9(JzC-t=jMKtd{j#wOzb#(j9-y(oIj2vFFPGnzg;anzee>*G&gc97EA~|E z-_L)+dE0DH#dGca_0C(DJ+*?jmCoBE_EZ#N=Ks!l`;{j5S2>C;JnK@I6I{M7W5Nq@4^AJ4S-Tq<~~ce=r`84h8d zgb`f1{8YxXZ+r>a(v*Jf6iUDDQ%gUAWL+x#2}(cau+mk^&&4EEQq;TvMZv#+O2e)u z?Hm==OvA3UE`HOR__Vcfo-jFk$HzmAQD)`& zhT4k)ri?jR5KEV}a0g%E7_3FQNoq~}&|0{G9~gRJTU#vB)eNY0=OZR|Orod4y7M>u z)@Rlc_ceQ}8utD3nZW1jB!xxtwFYyJ7;Zk(oFRto?{Q7{E>#wlM}%k6 z`z@?M#;Mwz`Q2LW91$ijZ_q%vhkuv5eo8q6MuFp02aE&@pG`pi&5)PcS>Fve?w{g`N4&11hC3X2xML&l6+H?Sqfk z7%bQ4OxN+R=DBB;%ejx_^bFEuMDkD6$@8w?InN(G%(G8sYDi7Zp{;w<;N)G)oUhKQ zTfR-|5QF~$;bx5Zz9idci_V0OH%`wH1r4v|0^b6F>r@f_S6VD&E?6Ty0S+;HBpG ze4TmkW)p4u`8@uQzYoLCd+u}Q%$ak}oH;|pb40{PM%K2CdW+ByTr`gAA`nTr!unnl ze5`mhx~e0nbk&3a z>;yLm-LSk~+(KI7E24hZiKY4s>C^gf2cP|YV9<++phlJA>jw9wLVPW8Un=7bBa`wn zO@x$>Ng|{?LF?Nil|w0IAdZ%o5;XWm%XcSez>SuVCnyY|L%7;X6_)e8hHq5Lg#_2R zAaY14{C9kp&}qj!e;wl7X~#Xy53v`Q!*!RQ2b&%$-KSi{?Bt;>N znR@HYbu6Prqqevv>k$|$Bm+nb)MF|bctp75GdEebt(I-<4WnKrAacF0Iket;)|NEzHFU$HC_zKFR2Wm( z0N*eilwrZ4h~=@1*3X{owe6`1$I@Rx&3GggDO6ZG((9n-skafX$bv zrn{)13Cn|D&(K|?g@XxdUb@c9A=naIhIdYf?r^}-DPE<3v-Nb*X8E>Fg~R>X;=9zR z!&P<2y?slS5B&yD&jlX=;U4f_a{7AdpeC-Dw2YlYiTUFn_&&4dlLN1u5iRloo3u1J z?&Pbry9&EblKao;K3qB5y%keoYW$dvrca(1h{R3PcJ)ey>2&s9S zy{tw)OyIo6+Zi~D-mw44(^i)jTrS_c@gnlolEa$`OX4zab{RR_L6pkRjm-$TSxGu{ z0u}Ye81yta=0dOyT;enK#WrNeru6S$_8zuP1WQZB8<+*(W?@P!T~fanCJL!oxX$~b zn=I_p>%6Ni%qu4NY$0nPCI#^W;s8DvG&D6zi-dj1u%F+NK^a((-p<=U&G~0Fd!De@ zW_nt@3u$MX4c%fuZRIWCMuY5=kx>}!T<-~7(Qq8XcbWeOY7rp`45NY(YJSI?1qCxZ z8Fk`l-V95|5)x5k-lMz<1)}0?Ha%@$ z)0qx?sr8c<(&Cd_KN0H`|2n@QTl^?~(Z0qH<+qsM{rN>j8{doHGJbdEH_WdSKzqBW zLzgdfZsPs!N!CNO=B@cSVA|+Mo^uD*V1QX(o+349qk7$>J)(By zgKH)i1K5wcc5+x`b(ockx5Yo7syM^M6kq+8THV3vmhz?gPOh14mJG0dT3TiHLJAA3 z-n&hJjCdc_&Dw^k8io~#-6D)?Uty}Vw$;P%nzWhT%?=tH=2z<^YoZM|)XpKeL8B}O z4Kxi;`ti*USaK7o!Ied7-dhmBcpH6Ulw9e?MB=a)QUt$0A~Nh51?s&Qv_LB48_avW zF8Og`XpzR$kp9-E_37^v*L7!x*7dDEIbA5fngxr!Reh^M_pBb)6RCN|8*@!0H0613 zl`87PnPh$W&i|11>Ay`IQ$8rEF1e<(u5W{C{HH2UbTrhgnqU3}jo0;cO-|Lff2v&M znfJ2p(>AfVSpS^M=R?(2gwZ>@Iw|v!Et1&5k;+(gt2l5(cM)P0&I$k=RP4ev#Jnh8 zs1Mk4O+lsq(fej@!j%>6JKlAwsNP%cpBs{0f37CCAniOQix0J-`(J~eirn^U2{sAD z5Q@aEc*&y4iy1-^3+yaTfUIY7HpZdEp2?3tks>Zjp_&; z*-VNhYYO6DbD4SDxfPL6tf4ID=(X2j->K0K?DTR#$JO*7hWOv+VjAtNQ#l9@A_B)Z z8$}i;a5uH0=K3(?V}2P=rmv6M zq4D323WYhhEK1jw zazxK<4h8qkj3vl(zUkWIGsBbr8peIRk;=`|W4&+iizm4~Q*<^LIj6=&N)HtCxQH{L zE7mj}Nwm~?Z8nl*hY)G#_Gy*jP}>;<>#HA|4VN2gKba5jI&B8t!gc!hRw*vMo1`7B zSqG=s8AA0{zb>+JR)w=uVBal}*B-CrsfR}tBv%*8o;q~Tv)!)`_0RY%1$dMdOwHlB`sA5tS)>diQW-<%Lw({W_P@IQsSXb0wQy$wZAA+Kb%UEuEHZAzvxpg&L_hRVGu`d9yp^(2$+@-O%#*W1ak<9NUkeY|H{#t* zs;_@3$Sf$g6vEJ|>{5V!t=<_+KVWCoSinv@e=+C}8kb450{P4I59)7iYe!Yv1`y7s z`?pnD#F1HScC}$<{19+f4+0bhx*}3M%;mpQ;kH2VfMIH12w>pw;LQQ>g;Y8=Q}WP$ zbQ*H>ISK}3u~~E1fdOX~1UBVLt&fk>gY{+Z;Mbq{yN|^VSFN_HEF>~W`3j1ZLQnk0 zpXZJ`auo8vraO5sPWhZXs0VP72TcOgq?Q?fp=oBF0tZP`d7Oo=q)4@x!wg9(E(&C@ zr2>r@?8t4#q392jjDTVF%;i4OgLp7<@7w?wAdUa<{Y z5=T%giI+IJCYuB);34+eRnoF}Pdnu+%!cb2BBlzaj@1UQF6L5vB? zcw24QjG{4C{d)ld`Z;xa#_Wh2{pUILW#2ugy>ITRHPDIqV2E{>KJHW>C(*}EW4^eL z_1-4&9kZj}Qw`o4*I~^(m$y|`*KKo`m;x?PXy^E-+)TTG@q@N#|4;oN_aFLiVvzb@ z`hV}g%Krb>|L{bP)8DJ}d~CMBJ1BQ0e@F9I#a|QmVQn&s)6=H+-XZif2D0{Fj>P}9Q3IGg0KXRb5d5C?j+vBnq|inMIRY@Wv_ zDa@2l)FXu>n7+zXEj!Tm_;A8Ur?9MCRNg|P(o-p_N;k^#rV$qQVt8LDsIkM@Y0T&6 z?Ep@+%l7fA$bNZ?F3Zkq&-PE_{S>-_PI_*%26g>>p7%AgZ1p-}F`R#>9#fcI~VNbe>lJlkSAR4a1A>F*y3} zT?)jx5%@kH78dXzUCA%+b^On8U0fSBL4>=m_`ya93S_v#>_0V0{>L|off^<;V}!9l znbTwGn_6yDfpz}NH%q7*jl(Lozgusy9TWFS*UeQrsJ&mz!)%#*lH5O%EsV1W8*sT> zc7F?%-wiq}#E)tAq$eJvzJi};$EtMtxeAm!ABB!QX5EE_1y{JEEO%^Y#o#B@Nq?{T z)~O2wDeAt}_3WkibhD=vKil~`jlr?3!6t9H5)c#%geuq}Hux=ETmcH>zcBAhLGSZ= zAPmy37sy{;YYaAF&=&u1=g)UnLRCIcYy6zq5LYdg)?2@~$@^WQChz8dKY7RfWbovD zD{u1lT@p;*}GNIkJmMv0##XFl(qZ5wz`Jqi$vX z91Ilc9g6Ok;+Qv~JXP{A+Ze^zySPf?gh!CgGjeC9`6@!`A3K(RlG8u(9l@OB#@_}} zB>yQJw)rDsOI}3(bYh4xB)+T6G3*^0-t8t_oOnHT{Y*|8qN&z1`3bbtj+O-YApN?s z*@_$Ua#$6B6; zCs%6cE5HgNZEv^6ywX_Bruev6^$&QJ2umZrxP@QjPaF<&VpsBnvdyA4v++8J)pZ+o zYm(XO*wJ)3PinVH|BWBXeERNk-4U$wYLP-8PwduEeMxbsjRS9e;^>`#T|n_FtxMk& zs~c*2Lx^7UVyNvt1-u__(hr@zI5ulayx#laGJVT9zj_i9@^ySgyr&zywbeiDBpkYy zRYsHDZhco*#rHt2vKzt0HI`%E+r2GhiFuP}3UhLgI}Yb@$3rGhnw~nkJM-rX9S(AXKI`LH!7hG zSfe*_&F?gW)&~C{-w?fcC06rc;sI;FHuE+6Jx-XR;!YTW1yUtt&NVH&TGQ~vUb(KW zU#zYM{eGE`>`hOeDx49(|i~bfs&vs9E2H{r<-?bJHvSHUG}?uDVd|Q(^*}ux;1sK^$J6crt?{IrzP&`xi8zg%Mm3iHRgBhJ~ebX&2` zAqOiBb$kMmJwfHZE=Rez9NHY;O>PkYARGPK))m-z4app%V@kF*$;0H`#d2g5WnHW% z)N~=5$MbY8y2Hw0E4Il@#;)(=r#^La7e8h>w$8q<-(o+lTluj;giqCN3*JjkzJnU2 z7lO2@OsjPpcYi;InE1=D{j{&P>W?wT5(j6}O7`z3(%>=ExjNU8!7Wa6$ILcrW@BcG z-;n;*7O=UYy1YCwx}o~Ka>z~fFbKrjcGWn<9v+rgj5=>pIW&jcOQE)Zf!^8qwZ-P> z(sbx!tj4^@MW5;P#|VkC3}UIG}6pLr--PnpvX zX~g{D4whqzGs+@K&lI1T6I2I#`Vu;-KI4~z^VLn6gI)buNUiq|dGupl&2Vs||0}zL z7W(hZa3_YN5g8Ad3#7ecJyS{rSNv%ZRpTzroI@sEo*5rWes-9)4mXqSbwDXt9|Pw* z>}kH;3Ot%HFC2(G#YCPOrS{Z5Bo8_g+;S`P{KYr_q@2TrX=FJj1%8J0hBS1u-va9=}6ttS?VGh#mV z{90dMh|)%t@{Hb~YanK~x|wHkEW^9>VpS28FQU8^9bjzCpa;nVqHMZ^B!3_B#)O80 z8`t=QS!&(c=uePz=FLHCc~Q7NJqsf|4q0QN+Q(xx+u{efoj!f?&dg9*MX>T;z}GSxW69&D-#Qv%J1**#JbK#*9sSq~&xQUb2@lDKbUUdae)7ca)%WViYC%+2 z@U!$1uq$0pcX}_@dxaIT3)e4I#ISXdpsDdRh0o#E#}!{=b4>3b9j6Mq-aEMvPl4;FrpKhUiU5cI z_>F)feXl&AKGLGN()<^joX-XJ_GO5e@`^k!FZ zv9dxKbQ-?CRxX1=Wi3KC`VW#5RJqBD_ebCEqUQ~YUgYXM#_IiAP;KHahAAz!`8n}S zpRLK1%WO^MUkeQomAM=WWkF>*)+mQ}ua4IKJ!XVU9cJ7_=0TWoV30JAq#S1Gj0nSy zL73r=o$@imkVO~*W@M4Xzx~IySag_E5Z}j3s#q{NW5Tv(yI&jT&sQ$*US~(jTd;3wuK`roJf zU$1{Ea_ir_cP7l4pjfTm?Ax+nd_m%fpgVs#*Xc=5QFo?}ACej8`tx`YKS}+WI-coV zMkNmKzW?)lyz_o!h;=lS1;~<_uK1j*5#kZCC?j>e635CRP2(^8j$>5B?I$AS{~B<7uQXN)XhI^ z-(lVS6RU4+Qn9X^3en9U2gwhT++oQ!5F#2SLTuqHjvo$HCnw|@?enP_9q+(r7 z3Q^M^gXEVRJ%{$TtJ$-ok#(ifMn=Q`&m`ZV#S2JyeRxqTfk z6^}*JQ@Ekbi;%I@Sr7Q9Zjqgh%-L`-{w`})7wFS7uB!8%mTTc+=BsaUn16AGtEI7u zEZ&T(@a{Wy&Ym0_iv<1QUG86flR=bR(OJTwv0NrQ<_-#(UsEsMf{Er-{ zC_#(Y|LDD3LX~`}C_!t{-`bzBuiUCALF>)$=}#CQd1Ox-rjK8(<59@%CZ3e(l2WUV z2Grp>V9oj0$UloHom z(O)#w{tb5R^BB|5IGl>f>V~`KjAGS^ocl!C| z`sW`QC=!bkmrhKEQ8EV#IYzdkzCm%u@|>;iQQG1 zjOiyn>A(IgH6+)>VACpv(5eN zbUy{q^!n5RUaPqAh--S-O8E5x^8&sNYIJP@;6~#=Zr$$-X-+m3NJS9LzhmFcHSb#Q zWsb%1TZJiSoralS@UMuRo}-_*{yc`_4NdMG7O#m`eY-qYBlcsMJ(EmKx?wo}emDpo+$L^}s3)RTVK+QKl;POY9lp5|Qed zMK$YH&B$CeGqXLJ_k}%)=X$cgdcr04&-LW$HU_3zYNJ)ZTt+xPX<&a2r$1LOB_Y?P z1FTC!zOYM}6%|IXn2ID<6~ICm^8!*kRIj?4U-Uh8pax(hIE9XQrU#e*%5XnxiQ7zLZ?M}c z3f)rdZm8T~pp10173)$;Vr1wDJdetX$?n#_9XjQ}+S3aQLZ=*lync>+=ZfP)NB)V+ z<}lQWJX2S^$1W;vp{m})Iq8?@gZ>z9RrGN^l>9{nOO^j@ zZuFeF+STy22CHFRUj7V6?qEt@%%6y{tyXX_{lpA09$R5N%2;l)Dn{F}yBU4mQeNo@ zjZ)59jlxZec?{}?agV7mzK1#f5Iq`@4YtZ8BGjZfldJ8}q|DWs;M{1cc1bK%+ro_w z5|-L*VGKvOQ>2QU!|VW6npdtA_tY*%quIw7($wVfJ+-%NQ)l=FhbEUP5GGKe07P%H zoh&vI;Mk1&00hDcG!cj?&`iMW@2%);zh#3RL5|UoiaeSfCh|CFEP1%1VBo*mhU*pm z{g(lmZ8JY`W{_>B5dg3l0QMHC!&E;a(jy!yFsKFYQp6;gNfa`*=sYsZ0!kx#24 zZVPdA#6SlSrWsgf6ELvM^`0&d8ec#$R#{v5Qo`P} zxr9WuylL|Y-A%}^e%ioVqH)U-rp&>0k%34%PxDjM(z-@49PEzS{AC&+yajZu5cIsF z4hfRl%xZCcywlFnb=;iLn6CD)q6bxJ-9a&yEd64 z@C5=+#f9v5b_TODHO$94eJ~wUIo9~jCVez}Q@POaoh<~JiK*P)_|8_v&*h^D?{{4& zj|%8S3*W$=MdVEd?zM}(sdHIG-qd-i+FM|UT3oiJDDF(}lB)InJ72XK7^#D})XWO` zuXON%RVvjC{FOrxWCDDnd1tn}RLQltEJvm@<5gifVB% zF(P=Zi5ZB$l@I1|n#nAf8C@s6*68{{oxC;=)OH5}VB~|EBcd+^HMNNgqBdLeQ^N`v zs1;}i%={RL_3gm>e*xQ=T9Pv}dLO)w)LH_8hTvVaT%oM~gWwsj;s}hI z=H1^p*&22A3&AzM80XMkiU-MutmoIU$O2`yX76!-;mb&dYYgda{|n9|K8mFy#S_&vo2vqSKcjy`zw+x>eQ2pe;$++4iqZg$Db}UZz?S2TO;7A~jLA z*8CfOk-u!^1mCDL|At+(1G@K3kSuUgoO}oR3y^Cuu(uUQi4s+IR$u*76Cob?mV|BFpw~{U6{h7X|aSqIsoL|06Vt4cU zGAJeHrMoo4@;@wvRJ8iS*`Y=IC@Ot}U5fLst9RN>c|{Gfdy(1IZI&8Zw2kJxy0|L1 zpI{%qce&s8=lPX~W6erK`W{(b$R;fen{~`1Qwv#P3F6K0TpHQ!7zXG>hIc3_5NMqi z=v0QO%qdDh_E?opL?SRmTb0pkw;@!w>L+oiI=t_D>m0kM*+Rvh4SJovm`S}F6#oxruKos`6wz|F8_b9b(mVQOL6nm^l? z?$3|f3SMj~r9JE#R;i_U*=tyMBvyl*gAM_Sq^vTt30mQZRD59G<*b3D&aGco>!AC; zx;pZsA3`f-G+9?%&pQTx;VSd?$jY-0#!=o@pl`>#GHUUAFO}97qo*frD%SZsizKPY zq$JcPvK~#JJd{IYM0hkGW|rW8r&t2URse#jOv%ACMH|~*F2s88LRwIx(u%(Fy-zr0 zUE|JFS>tdD*&Dq;9b3p)I@$ayVGtfsIFB+7r#H1Y#v`Gzl=MwsjipYeDh09gc^4!1 z)O--$bf@T5fBqR}E!m?^|2n>c6HaW8Q_i|`;Q#^>L$XHmAuF<2df80aYj&5#zylv~ zTW|;`w{fv$Y&E+r$?o{!T4W?N^e&i z|6=kTs=z10nH0zE0iJ5zCF9)sw?QnaO&J@Hq3+ zb}UYXPu5P_#4O#pivBauCiU`AIa#p}AW5aX3Fe=QWdpJxcJ2dgQ3bB{KO;A{JZ6X3 z&Nwb~@pGv3x-<1t@j|Xj$p}r@Xq|`iQtn=p@nV;89zP85#n2(OEulji z7L&3_DTmZ9O@y%AxOm%^zCQm-V2pX-8h%0*pCMlEke^y+eH)GV4FwLKUz0AN{?rPp3|*!Xi~*2?dn+GKs?4J5*t3 zp{u1+Z` zGr!T;e*B_yvXy+4jiVoO#bn4q?lE@L&q40;lO5!KsYJD)QJyBc_2nt_Fev<@f3?yB zC|IOgP2t+hfyDo|(ly3x&q*J5iA(oum8i~=sQ7p5)aa{Lk6)ogFhS56x6!5aVhpZ6 z9QPRC{2ucVzj@)WbKd_v>@<63WaTY;us@g48QYpKy;vu2>$E-Mq^js1WlIgoU?u)^EalmH5jXcU zI?5`FLYx`4_hT7*Q-Ph9UWSPB^{Iwd}Wn@sUhk5yBb+0$W<$i16%(GfT>jjY_t9Hb1C z%+N`#BMKgbBHH}er2Ogs4VaXpDD(MANsR3&^5={wz!It8vBUT$^Ie-EPt!4m|F%H=y&v1C93$sFt1kY7F8VFabi|QO4l42fxWWGy{sJ<)Kh{Wt**Wqr zci{3b>Sy{$%hsbDFflOr;vZqxfn>Zu{3Jj z75r8ip zf9=gK<~@+z#k})N7xSu?Nb(^W*c2pc=!{Ruf2E1e%<{Bq^gux9o^`R#D;~XduOt6b zK0LPLwb)@##GdJ8mx*=vj*JcQW{*+BcFz$(hxs}!R^1t+<~Xd5xw?UkAJw5NTtBlz z!*tP;&wkQZmzoj|ipA2Bh`JI(y^Vc~RZ@)D6!p!Ohgo_8s7dGu1H)LX`XTwii~m3% zi}^>;U!(;L^71_{PfB@91thYB{n6(+BO&SZ!&OxC`MafaX9m3qcg&p^t}>6yU*K># z++it9MAowHOVumes5TyAnBRQCS)E)%MD;`RG__!FxOsVaJHIE~hj@wn-Zi_%lIFb= zjL#gftW7StjZ*&B_D}k@PpKTDHw`!V-}p&i-;ODj^tvF9fw?uBTq*gs08yy5Tb6Ku zCv&wGD#MSsP5JVdOu{nT0}x6A2EzmWBw(DeTKXe1uy1{*NnrMhzP>2OP)P$jaXUUW z@QUQ_TYdymR)(v-w;u}BsndJM(I$$dP}`pgM7D={w4r??L2*o#{wChD*Zlp1YB<~s zb=*giE?riJ(s!wVUK`pd70^s__+xvF%CoNP5@A2V(&i)O=xIN#aQ4Q{e9QC4o~vrG;ljg^cf z5HCOE=%)MilE}&(493QB?{`%BlqO;OD3io`A7eP7L+&dNQ_=aMOXoC(&e$G0BGDXb z;|(E)zPY1-I2wweUs3O@Cd83r-evEn)d#Pn)vN*#e+R48PFr~kl}iVG9{T>Rgtf!y z?eewBt=lC3(!t2eJ)p$o)kxIw2Rj&=^|na8WkKVtAA1+?Bc@X-kEGV;#4j|aqqGda%ile9k-g$qp$r+w-*T3&cCm+L&H=|XU&Hc;PcUDkV z9@GPO>EU%!6T;o=ML}jlT0%0Xi%wt3{K(uj67?BO7|@0sT;#XG+PeKJ29@lY-S_nOw=oiJ zeg4K4bvr3rMxxBPFTa|iSC6#utg!TC@lOU++LJt*2-BG+D|4axTqqWVVyWd-1bdRv zTv9ljluqh-kNlpdlXC~fq?RusCbfJi|N8&(Y?@?m=#Rx?5Z#tln*ZSkHcj>*UOK5~ z<#MkjU&LHH+r$2``3E8&60Miu{PkB^SQ-dFU2Ap9U7Y`W7cc8J|3>O(0!&E)Ft6eB z{M1GJrIvRJF;dHoRHc@itxM{n3Svb5`LQ#o<>Co?lDc$Q5LQSx4kei|D#13jywNf& z;omZ%dy?{AExLJrYWW?Oq_c1p33n{leW9MDc;*6dp(nXbp;D_x>;kpzbU#M+(n%Rj zuOuBD3zJIcn%xpec7^XybK~3XZ8-k4O^L4OuChIK@KTD4O1tjRZ)WsH7*kn2BQf6B4_jkSkU1ej0m{ z^6cnVki0s&kX%11#7s+x1bbSEvghbN{^NI&ls^21^-Efm@F_2RXmMw*qadu3RD9O4 z+59`NJWiH*CjeUSDf^zQjbk`FG4~H+?3pz^@gu+Be#U?tiC55kj0|*@nQ<%~EsKep zgHHPGTcv)A!bw!X)RDZ7QD}42umOl&`cD09@oiw?*raK~#(GW@1~W~R>Aa|5c4+Lq zQhX65WtYFtJx(PhqE0Qcc;ETE5Maidi?QgnN=@grsuqNy^!^3q_T$ zOL6tNkepp>o_ms;=z%6oOC%di{cJ1LCdO--7zy%IiAf+oGnew?tw!C(Vfh<_kB^>| zq(1I&w>Xa?{ap_fck>p3ES51-jJ({{+!U4CRg~zE@p&(E6 z#>YleDJh$JS|!ivKU@(EPhGDC?3tpg_kAS%&IVEjIB3=TOuAFU>4MyQ_;$X0=2ZF=byPOo4B#E+? zTPpPlfSKqY-jEe7DpZZ>S zkgUbE*r#}=o8-(c(dxS-QN)Y(1Jd)5KcI&U(c5np!bwF#=NUIs>oU0l7&$p{Vv6MPW08>Qup^$RPH2WH+^|O zcC59=i3!1BfOEra6Blk+E&lZz`v{zM#eVxtgv``(<>trsC-29)@1bJnQtSp->?|ub zGh6IriqVKJbx_RmdnFgTtVdbaGqPC^P}X!(oDW%5B48`(#qITDY;|qhoAC z`?v5{a)xWdoYPX@3f2jgXn(Co6H%r~%q7~c>%{*7@x~3LJ+l@*WsNhDS44+PbeO|HD6!c>cXvmZQa#)h*>E>0omGgrfzi~M%iB%u0>0RhYlpNGmW@SrIui-#9?$8G*lv)_0_> zL4ELv#7}2}QbvqifZ9ccx6M0E)+lR(&@FJ4CE81lHp9ea-gEIkFyoh9@n+sN%0sFqylmRx8_5JLUfL9i#u zuFQYfd)Py73h4;xj97Z1lXh-0p@_MJMM7^gG?wPJFBcH>m|7}^IO$G!Q&)1p{%-v6 zmWS=otbi+@-c$a;QiG?ah|x;yp@nqN!~g1YI)!f-VCT$@B_9*n0E6!~!93I^a~J>} zYWpYA(v6w1kI#qyrC%#%+!ka%OYnzZC^)|hI;6*4%UfSAwo$Pv80p+qb#M+g-=dP@ zp6b&)3oJbl`WL7^OkrcekRd>CN|k^ApL9I#!xus-H~3dP^e>LVA2)OR7>~9h>t83f zLTdGiUzHO3&lE2+4#yjU0-$g4Qnlcnp=_?gT|KwXy%m86WqV`&WqP z20uhQIDh3@!j!7a2!wyz$)tT`Y+pg+^U5PyHqZONW*EQ{ZHLqRq-M^pOMOLlat?Y@ za~R5U+9;Hbq3#g2>rnGIcktV~M#~}3k45(U65ggNXL^MS4hMh1GB6<|UV>$XenevX~v0yW4?|KX06PxzUl8>kNY} zOGhpXX9)#<@3%g1Sw8O1@||3k6=Z=-w7oDK7#^OspQ6j%&lUXmZ|`Bn>(keWHIJ;E zVED4h-#=HyC9aBRp0_IgY(GV--On0+{L`+rQAAcs5f;GjjbCKPafCW~U$T&XNyZ4dggJ2Ms3Qj*IuQ&}z@x82n;w?E6?O=9Z?$6Sb%d)GoRMiE22_vQl4c(E;@(+ROt@Xi(?�bn#=N}vK+NbfGO-L z*;>xdWsyGHfAt1yh)Iw@MoW>EO(TgvHka*cW!q944E#qV2L0JRm*pH~Nt_sDS<|28 zJ-n^C%w>5Wgz{s%OMjYOm_J>b zZRU9;j(!90@VUhKxx`K-UiyB1VpA?r2d@5*g8XWyh)OWdTy zwa4d|oSRF$SBZNT<&X1>Tq4|EfnR?_e&X>#Vq(5O?0fkM2WAt_^Z)$29eEuYlTA3u zZ+$Gk6CVUCC2^EL^V$3of6gZC>7Otre@xv$LVQoL9&Eg$#RL}ny}yRHOdaO+WQMPu zy8jT7X9)e^Js{Y?@I!CUONHGL=STe}Eb{#8+>L2_s+9Iy=S?(mP|Z!9teM2F+EUoE zh^7%-wy6a2PAqkgaP zi2<4Ee>k13<}a8KH!het=)HR@E-SAl?DObZvp<(NsM+fdMxW6XRIl`A|GT`uO~Nj+ zCvHZ)F|&H|-1z=xP~150kDZgPJG9(Cj_fFcMvPnVx43FJ+_EzXueAg0ODz-(ocov5 zLcL^#3EuDReodLS@-laCL3b0f{!Yv}?b)jh((JvJi37arRf&HEx(hb)-6!^?@a$=) z)!ML=Ys%QGfd@WP+4idnY{TAb%BS#JXELLtRAt@k7EY7glfb<$H?IE65olIlP~9mW zCw?r9(zyHCbnR%&d9|fCxYxx&syGE?tO0$(y{-!Ka^dHC>+Tn6TEK$9pJf=wFX9^` z=H^vOpcietq4q8&puI2Dp=DP?6C5KFs+zK2Vh``ff{d8FZw0PiVQTnx-Ai^ZqXPvP zW2Q^K^~Y@2bLY0$Cdvy5+Q546$3n#@_oThYxq7Y>L)`AFbf%VvQ!1>Qqo`)Le_M?; znXRF3v5E|GdD|GA!a5TJmO+*~{G2}+S)P9$9z8b1#9Z8@ephgqf1zNoYd;KNyfnL~ z^^adiY{B^N%Z@)cb=(b)Rmo*czvtnB<5%hb-57%VA*RGL8o`q~a+dr)^BCXFnY)3E z$Rl!eE3x0G|^xUo|r@FQwa^4;ko7|Hq9}i}#xys6Uf()}>7`2wsJuqe5lg z3w?{b=n=r3mMvS|sl6~hJ-@!(dSK0Q=Q(f~Ol|dMW~gdZh-`IQEIe002Ssx808`yr zsd_8Es9s0UwAT6-D;NEF07pRaVvx8gk}AXmVo`aE-~;{DC96tgNrW6ZCO#U+#L%9F z&IW%#o5B4xUeaO00K|EiahQ+g^ZaiHK)(*SCQ-gGIu_Q7DLOBdKAaFy*=KG-(H-Hc zEBC|C8d-4}u#|4_Bbl4|Xwtl3RPig6*YVxb)4nPf`iqGJBWCNm7itbI!K^6-x{+d* zngot96b({i>BE2Yd(Gv_ErQX$vDAfw=W>_F`?2Iv&y$urC?AD3G^Lz@erk~o57b&mnNS`s=RKC<2(2Yp5 z>GWP8g9w$Hmp-IL>4O1V-C0F4wle>&XLiWvdd6AG4vywv1hUQ10=ozOQ1`NZf!q@n z^djhk8UY{A^&D(KL`}UOBWjA)7&H^jH3rW_Q;k71F*7@@)hjoti^t^8XKpPC*_EsT z-u49pbhGTcvJf5nsUJocaQWI&&UC!LeNphMXiNZq>$yfL1~P&|A4 z#XkCJze0h0pLOl5^(WG)i3nGHf4_JQjv2H(5Z1HK3}THe@?gqYvthquKd~|KO9K`z z=U6%59;(eOEOBQ4IuJ#RpTMSe{O=fc-nQOv@v>3mAnZ(Oj3#nEOQ&%8slrTmi7}0s zOAk#QFBZ}?2)U+ngVgxYXyxzsSj+8?Ezn0eg|zz^e@cw>$8i`+rF$}e(oWE>y`K8K zn)I8ImDB*M_G0NN@>>b&&pv{x*N5=ljbCi(HV(8oI@9r>RpOV`!>W6?Awsolx02fm0a8L8O9)Lv{LN_W%DxpbK!rP&>B@`^SI_kmvkcvNfA)tX+djwdW!SJa)?9zE^m$GV6PM zc#q5)3*@5Ep58bUDw$lPHxLHAm}~f8_xA)`b1BGd-_O}2AcN62^x`H?o9A$<(qY8_ zd^J^Dnb>e!i}GSwNz(=K(i}e%Rxv5c%-^zBMwNEnQYYW^7^kHoEmwkVri+~Dx^PO+ z1x;!ti1rS6M9;W21P7c;v+{lmup(_gqD2A%xgwb-S0tTWA(jGuRx8B1l^e~IPfpz2 zd-Lmg9)|jtqAh3R+i3T=3DZY|irZL_xRK5&EPGco1{98`&M<}JzRPsf@_Uw*)Q%5! zD3SFY20&$m3;d^#X97j3T9t&_F};WB=cR`H9`&p}d31q)SCu?R-%>6^oH}o`v(m!5 z<>_d>r3BxzJ~gY1%r`6ZEo2rW^UWA~?<0kFsVU9UT%IV*q{K%5bY(#h_@3IzMxIAx zPPZA(BOHKgrbC?7c+qTDw_{TEW?nF;g=c&-Fpx~&U0$Ul_SSc_$#T*$c2;oG(JuCd zo3j&Ns%OUzH+a7Aj28otOy!WjSYDV;Ks^;nc9v4MFKh637;)QIH6;#>cr9hB6dGHV z+&XvkPXC{Q2wY4S#M-LF@Z{fKO>Tr~y{}vpH@v+k9N(+nyI)#;E*$Ez`_!-YK7&Gz zjG0lS2uG3|%j)61I$eqJi7^qcT`eWIjvu{~I!bY9`?npLVabife2vIUA7SZ3FnO{E1FjaQ(>-?U#ucC}4f%{s14RpRyM;c}lICyoz2__w_;W1*Eyb(M##@{hBX7top9QdnIh zLuVGbt%pX{rhAQ|62)~KIov+|lfLsKp-bC~DaCe|F7i(()W-KU6>Cv@0FV8oD)JcBAs^a|(gO}EfOt;$b+sqpYlg`;W=O%Qf0f$-kHLxAqz@% zsT9_MW=~8N?w5f9jf>u@S2f&+{c9{#`${aipt2xQXS2-BgOa93L!m=%7Ydy#CQMXs zz%2izS`=xjo8*f$ZmU-nabL_knYTKg_d6TNr1;!?+pZl;0-|EUjwdM3=n|LJhym5q zX6t6eOKaY3w@bz17MGek!G5Eua5T6zJ1G^3kyV{?Sz;AImbpz9;K^ME%eZ^Oh7J~v zrB(Q!dTAMvUBe%GL z$RS&8iY8mvh!Q)S;xo`Bz`Jo`H_U7a`Wh>Y+-LsaCVaFyFmW@jW?(9Vg@;1YCcIc1 zhncsauN+v3x3>2ZsD5q-&Fu&B#&>sl*Gi0-!qeF5Zco#r!?v<7d~{}ZUnrd_z_hR6 zr`~&H89#c97V%pby)EtISZW3?XlsvpQ^MX{ZJy>&zCJa7DH#`&+zHbGDj*fUotn`> zj#G#%W(j1SYuqyy`taZzrI&F?U5eK~o|11pVGD3gyxR8C_lsNK=tH@Z8AX1qqgb$Gp%;Bc>`XH}ZaYW1z#CO>AiTgKT<|^~!7JEVMa6VfPwUD0&$oVpwSKEw zFIMZXR%+qy6wwmT5#K|-_~|HYE7D(HjVYHL;qRLPm$F#~^hll2iL4kiI@9Hp0p@hd zd)9yUJx;0-u|f~NKL!AVdl!+_KzayBUWX?g(b6_8th(w4TIh6qR{~mx@sR|yGW1#s zd3F*E@`Tzl?n9#twY}m#mfFWN{2Qr$pi3X^Yxox^%s=V#P^e~Pk(GA|3T8U@rz7*` z;8PsK{`WbMOa3}<;ZhoD@XSX>gSW7SuR8CvxwZ$8Y7+rydG9xH!pGeZNQ58zHW#$E zw0HHs!z6q$^lse7jGjs>;i})uUO9fITL^A=iIW-HFHijZ(9Zt3hIVgmXrCS7hK8Nq zI)A_H(6A>t+gjd9=oCWW`}mMK(qI!hO5hO>PS;-a7uB1ts%?e}q)UnhBz`wYta6E) zXuVbf%!~evAmuAA`$>H8g8Y6K z*13NE)+IhaAn|W8m$=v^E+aAM=Tkw-4&z}T|C%D982PA$! zNZenEtj-JZ;@t)sFJq9J#a%#Bp=Z2E4lah_w}RPxE@pf2&ws|M!+cYgPS0u@R{$nQ zM8wq{ak!gLGkLhJ4~-C%f{mif(Ft3~A{G$+v9@$}FpnIP_HO1k9J-%7#!!*qGW&ZU z!bgCHp|-i`-yt`lHkq^b;_8|*C6ir`M(6eD74=ATtG`FLOmICiK6B$Sl2ptr`V;EQ zc1lfJr$TMJWLr90EmgagwoJ3J-}ck~vG=H@jsYzlmEY1I$J6Y8XeseiZG}0i)ZwVo zCjYp1Kkkd%H$;R9r#_3tu|fAjGSC{;)1u9pHOJ`L(uijRs`6GH*rLfgj5onZhP~ad z^`nAtLBSP!#?on7@7Jf>^%F}q6xXK~Zc`?VQd+NDMo0#mn)6Y0-gMq>pH`URX*6$L z)a#0RPsF?#7@?p+k97Br2U8*~uMP39{5y10v(o+?tjE9UB%~Bp`c2h5JmQ^JoEawl z3Ak2L;N~>3w~Zgy1zj<(Ls}Mpf1Zz4#ayn_RR4wTqIU)VM7&R{6L7V+Q)d+Kgr`W( z&hz&P81YfJM1G51MHf;LyY)rZf;VFcsmroy$8nTL+H{7tOueg!Bu|*VVE+g{)M$Ax z2+gR=cK1%4TeB`+BHykDwSFYCjKo*OxP%_uI%dx0$sf!Oh1%eUq+m?dE>m}~Y@Xj0 zTJ&AE+bFy&TX!tfekz@BKy*gjc*?)wWQjPOhAIY%`;`BqLZL{>m9>UkyPxN5i6Sc> zpk{HcN3oX7?@sU6ut}ipQFDgV_O6+$y~%TNFB@-3?%b7Uk7?6rw0QMcpuzBGq&3d? zl;qCCLhauY7cijhJzU#;QEPk2tif&H4=(c>MeoC)hrmd^^_0`7*X#n+d^>+-153XSdr=?{p5UG^FsB>PxcJ8oeh#EKiMPHHiJNJHikC@v!RI? zISi@Bd%pK%+VMI!sVelaU`^@7%`i1#_sWvGmDqr6GAfiDO`ckB`k01U({=}SN6XeuoyxT*H>$^%Efr$IiFKK($o_4A>wt=AzPJZBaPE<ju1}Af}aZC7>_J>}D5xGGkVb*H_WXGJay-s@N}#qv*=Smc7SzRiY*HjL$c8B#lm&7PTSpURdg2e zX8Ahvz}`!UOMVQX&mjPyYlglLYA^axMcID^G(B$w%(K=9khU|LOoK`{XG^<07j^B@ z?GNJwCvzlN*l1wyer@=U*9`Km+_-GkeY*WZWi3>MwD=DEUb_HpSRD0!CG<(vb~xoj zs`VC2V!&PuU3gcO4j^vigfQIJ7fLN6F!3d#uH`OrpP6Ii(Z_W*18f4Dpvt;GyOk+) zc1Zy_A1SrZLS-)c4WVL{ndRWp9x9lg7$VMC#9 zy%Qlah8-gF_xH&V28vvAOV~)vG3SW!6KNCg;GbH-Hn6()EP7;UC5*b-%9LE>3KUYn zu^Cx33SNO`W|h9R$d7PXSG_`n0s9-zD1@l$yp!}$ z+*5ubukvI@)TfM|*ueeU;_pKyIY+7UK52hx!8hprD<_O7Nbmj^x((_SE&Wko@A*<> zWg*sGv{vSyaR_7_cc~Dw#5i^?iMEFNP=&R${|h}JvoJ*(1mvaSw9@H{_sa1EK>b=?^tVz%@EzD z*raMhrv;M+bSYcga97){pR4VWgV=OTJ=o2{HYi5fIl{?Kv$c+ojf5V2tN5}}{Je_` zU)>84=%q(2o5n&jg1t+qT{dURS~>@(m$i%Qy|N4|zU12DdEB9kam=_rJG~PDq*Dt@ z^eADHfn=y{%id~!oqzW;rW&-kH5RwUX$2GCQ2l#fb`sSdo2~Y<#o20)Q?;TlCehpv zkh01^4!Lv`bA?rwQ(p95VBaRTzEsCCbB9LYePS#O(qL7FYdfo@juQiwjSc5wcPch@ zM|nXOY+gqP(<)UVm3Z_?e)ipfLB4jrT7ElKh%4jk_+>@m&gAr>*eI@P z=JbNuwwtZ(dM~k9y_#$79~4E+bxQBSdr=v$8m4|4Vu8cC0ICm1g05UF_<#osR=`cz z%rr1F)fseICI6fh%*;dFfpiP+{|SVWKn;X*zzl8JmuObDzoS_}1<)1eDYY$XqK=2v zkZbRy-_*W$=<2%&QSr~R6@NQdaeTns>_x?Osc90W6Uf{H)j?l~y)mi;hhF>E;I+_q z0N5*qgfv>hM`^O8``{GJbVF#euDqPj)-}>0Wqlz^m*v%VM&WOGGY@4!U2375kDD|d zHhsMHkh)bkL0271<9+PCzrAG%QDvd_Z?O8JUPA|$)QDi;ckkNO&vFW5+vy*qF7Aju z_{n?P>91L4TL>?={l}et@czU56J5+lW9Iv+!_U@{-Surd&t^Gw5Ca9W>(wNyRU=6Z$jY1&J6zRAS97-(Z1SDP@@lGDEx4j~sSB46>^Vx=PmqtSOJh|gF z?}_f-;Ze4eFs~uw3@r5EYoq3jhDhsH?jPA$wi6&8Kjeq`z78?SUx?Ir1!K0eqW zc>$;^sejc1o3eYh*4AvjqHtQeT=eC&QJ3)&z~;nm?v#aX>WbpX_Q%7~Q0>-8 z>svUQ`3FMKY^}-kjM7N*si98U9Zg-*;=gvK7V`FZG~!*W=|*&_PJT2bF{Y>e2Bwq$ zN;4J7kA~(&lx4o;Sz_{|VJpcH#)*E)BD~rT?IKO}IFU=W$0;v5*RG~h?HznZV9z1c z&!^fK30G3TYT?H(dCM+lFiJ>&sC^c4nqC$8tNJy(4#&k3pz(s9SW%a{#!;R(@#?Du zXDP%Q<-rumVj&9TC)Uw}M|0$;E;V&##Jk3))6B@RO!I=H>e4^a3Be%yO*^xWMR?FP z72%|ARdH>N6`S`aH!{6TTJ*?eQ$y;3N`@9m-6TR4KtK7`zapt=lf3qQn9fM+Q!TVk z1j5>-jvY>YcS3NmGOgJir8J~&GD4f0RsjUb+$5_i-p=DxBQvtz`_9tLbv7WATa}hK zc`RY1xM(Qra-l&Y^_a$7o4Q9v+qQJGlz2J{@qqp=Y@^qZ)KdG-p1at~6uCA6 zP%)GzG8|6umBEVC!B z{S&(fso~5hul;BNDm678NnS8vAun`H;4m^WdfEg4F~MuEBz4)4#GYD5+q;J(N|y~y z6m9Pw%7RKxpD;92q@N*m9t$h2TMpih6{;^#_ir4i?ngnng;YI+#r#nS_oFfIN4n11 zw|FPr&2b>1_LqgB0xtCXrLP4W!!J|WjiF|=HU=sKZOi;`mAQ=pzGt0(___arm@ljl z?6r;ml3cbf5DH5Qek4MqNSB(=V|< zw6bF;E6sT5+Hcay9jpVX#BmTa>}4zn6v?$0H|mYwOkhy;x=&R*+t!1)O1IJ>Q}M240TL2;6Q$h@jjk7 zgRy`07~2*PV6?eefZ_0JrYS~NuwFvfP9#ns&G|p^8anG!<=wV2qcyX! zw~JwQnqeT2%caa>M8=w1`OZT~=`nN1x47=QQ5pTM98P%cOPPP~M!7;{8E_*@o@?4M zlwe`WQm!2r&iTi=L^gTtYm{yaMY%ZG?PfrSt*Yg$L{l1J4~+J8Wmk~$aD=3*H3~xE z?hb-sfh2pLX8MQLEtD5y^d%WNH+X9_o=v&2B(4xNU^iAo`W8N{th1ho>BWw<2oWn{ zHQk{_e=@xqEmqI2ihoJa*L25AIKr?4HGc^=^CHQs$_qsw6N&1?lEiEyTM<^qK8f>; zBEW4bHzs_`D4m)9x%r*}Z!w}sFE-slUnWzKXg(ibP5kd4k9XRHzn+ZsY4 z!#?9a&JX>g3!hJic8QDM_0u8Ra!#MtEH_YH5(2CM%)a0UDCuRid>@g`H~4^HYvw|2 zFYqss9rr0m%|aClrSIh5I`29oHmQY%vnrg5#Or2Vr%wouir0JP>uj!i?IW>NFM~T0 zHFY2L!4;iqC9|kDG2)%N59r34@DKZnaVQ}4myJw(r9_oFG7*7x2yfE=1R1)@KTNy}3ImDO?_vMU~7@?-|h8Emr?sydLllF}>N( zdh-Uo8GyuVdkd)8#2^z~VG`dexr`@JSx*7Co(ReF_K)8VYD(O%JflKaJ9Fp$e7qbF z+B)tb`O!#@_6(glYJJ@ToUi`L0;5B1n=HV))pC0aO`59B;-y+|Lvm+vA|y_Dt|>Zt zwRzO15B%dl-s=;u@RbkhLKCJp8|xgphg>^e!y8DX`|aVqniwwihuS4Kpyz5r$Hk%n zJ0w||N^2ZxbFa3XMc>EEO5SO3hyUo}Z@m^uH#UzsLm;=qv^%ncX@| z^)p7kxKNv#*@4j&osOWwco)JkfDw#E>cy! ze?eST8_n4^BIy%LIuES-QTdM74twI6-e`Kvs7Ug)otfY8Fx3g&{%|6?BHgbI&D>1R zy+5CGTc(B1WLmTnh<$Aa&%l<52g1BjpE|3fpa+c2F_)1!oiu%+g z9T{x#N}`9`W?#~x&3>L-A84}|HzlWYW&WBy0zT(DdN0mwR+so3U-~`c%&s8bws+)r z8mBMehU)KBCeGkFyuB}*K@+b{uqJ+Um72IF+k`|n*TlIrQJ1PU!QJUp4zRZRS%}^E zR>js1ji6Yo^FC-mAfl429wVz+Y2TI?nN_T`JD&cxB98-@`G%}kr53R!;HBEzm~8;n zDbC*F>Qe0@f*>h?cE(lh9YjQW+O@o-V2PyKMW(X7aaxr~YQ_Z34&}x9X9bu*c&TkR z{4gTZzS&z9=_C&*vVpl<#z|tAq+GZ%*6Ou7;6y+zig;ZzR1hB#uHqr&^eZITcdhrK z#8L4&`2$mn(paL)Fw1;&Kh-Xy>fJ8E&s8hUX1$Y?6jqJEBOZJN->lEqj3?1IGMs(hb0 z2W7dKN@_NAA4&(s$%u*BDlqPVgA++=LSo+%z!^#ax8~1%UKGG`$-WaVYl~VI6>qFf zEwU|BjC_}MNmFXNzFLT0PTd#rKCXjR1UcIWGx`>hMMuZj3-Y*!n%0~t;UeMeA-z~& zpr%HUcbYvh6h5sn-buBH?#I@pZ!o{-%=kcg-DBf)n|i8MDDDJ!S9;#&y6T4=D}S(K zC!$_p|tGA(Yb6E|05t(&OUIo8qH6=LhvdiJ>mYq4&{W;LM$dE$L?Jn=KeO{%$O znzQNhXD@jlxciFaC4zz-?M?ivm7l<&Kx`;e``3|khDS_a7Ko=*51)cs#h*Ash2acB z?PW}wMyj5~k5KwbRiv>jzyu9FgU3acb;vJd;1En!YLUJhEWd{@elRGMd|Q~K^%}ar z!zbLv8oGerTKFeTg|V;l_93QiQo}4{4P!1@QX-FY+58-1D?Jfc;a2}mjO`8W%WM~U zzVCJ0sbaI%)rIbnKi^@!?PRolD=#uL$F{Kim~(A6%a553LVMDw8 z_cj4horitc;;rPV_l9^^w-{7jhz+Y<7aO)I;;!DY7)-^rp2X;|I6Oh$<8{d%v`cpz zJm>wf-kZO)H$-yV`UEy8&gj>9v$ct6K-6NXsTuEjwZXK-hRs+PG~h6&?P;JGtDfJH z7!hN_WAQPc6MT*Z8S;3>-h=sO&Pzg9i)7|uT}XuLvXN2mw~b`U9N>h0@3-}QaT$Qj z5Uu!_A>lyW9$u;-X%W5;(q}20Nc>) z!Bg7RdeG-;jZ!NhIi)wEYCqROcL+A!mG&nO?$dBeJ6nmN6px@5Vw^(?IO_Qi9SpSz ziSjXFw!S~tcHWU*b{K09FyNf?xsJ>q?M~ya{2Sdc(POsZt~(ejN|Z8%m@@RC#!OyS zQIPnCam6~aJeG;oR;A~f#)~Dr>~)=?mYm_5D!)9d&+10x(Mjg6GzDH*^)~JGDSHwa z``eiXGPrJFbAZ|7BC6M&!QKW2Qg89SB;Rs59!=3Lk8~oh0EzLs9b0nSKHU3g8!jE4 zRA1?tIi-tYE8)2zsql!V0JPmT7e+#T+)Kv%5td7a&Uf@?XM2Y&oaWY zgxZ%F6lZMX9!(_X@q5gbMs4`*yRB0i}WZF5uxtz$ulsB=L za=8-z|BzRi{9>h#cD^?Ky(#L|zUg}7HEctO@x2*agAT(zR1SgER(Q2L`6=_yJe?m0aasO`+NC+D_bx#z@NTH>r+k2H>TJFL|FQS(@ljP*!~f(4As5a>6O9TbLTIA_ zO$+!0qwP#Gfio~s5R?Q`#KuxoS`lUdD@ej5%5WSXTJ@=YY~Nz-MSIiU6!6kqAPJxl zzzg7os8r7|UcyBZ5SjP8_BoRaV1Ipne?5P^`Q*&mx3l-!d+ojU+Iy|N_A?_Xu%^AC zarsxhVPA!^C#yY|H9vT=+VAA|O3t$dBZ;y0yCc!$SmWKw#`)AD{ZR{GZ+K?8!+eZP zqLa*gHXE(HhI3=t%uGiunGCHZk0G&ktkRN2Vyv;DQD#Rdlwe5H*%c(anhtLg^SNYj zu8uM#Pj!^{zj9|XgmrVY;CC z5wzf^W?*_3sh^P)TJwS|yr(*q6j1z)_-pUspb;mZl4_S<>IkHmuLR_XgjDm1CuO>t z%36A>9N-;7P{(ObE*NtPyw(w5VwsM6WB+2s=Jmzq_KSVkip`D3#w()klemdPk~$Pr zni=~aZllL1Cua`_&a>`AiCf2$s{rKYQQ>>!hR$`oWwVtVmv;w5wWl*}v3-N=%dDX! z05uW!@y2-p4j|?kZNW}gAR7aEa@0|-@V%B-G%O#*K&KXb z16hs7_#9QWyC;F0wHGV;Jp(Ij?u`>h3X0gd5>bNMxJnn*RM;R+Z?&5bZlgJ6NhkA^ z((H(gQl+8FLW#n!v1RgYoz<|o%_|yXv58i=e=_&H3Y_{x#TLO}g)?`^)q?80y%iPT zb5Yt@vbvY8e0E#NtM$HLt7C02-0E1HoQJdG&4Q3+ALCIfCOpzKG4d$fzc(Z+l)dg3 zbB7QEQ}=a)?J=WbnkPJ_!3x{zPcu_5gmVioOrbwlR0@vM%+J_Mvx72kyGS+AHx^0* zaei4f5KC4$Vwq<~(I6GGh*BPR5j-O=TB!aVq(Tu5x#FYi9vSJY-^;ei(X)~{~ zDF{Y#mkc(KU(6((V(z3=<32H4FN2Ys(9h&M<36!p-y0;?t%vRzBc?S;(iYsnFaJ_O ztv(l*of1Qi?hSh-qOPfkZ_L`+(#;-|jNPrlRN90ZKO({`IUA4C9=ZzKEh(bW&>_JV z6zKnkH%fD%#?hnK)XgI^dc;+_@uNzdawoj8)7#XUXnv)y1aIhhiHyTyeWi!5xu36U zC4wTs#ZL2gInsa%D!x%sR9;xlg}0oo6b>PbCfvO!gF-5NU!Y*})iX+Rb#sy7Sq znO`M=9Een3d)91_y8A4jThtL-w&Z-Aj>zQ- z3>%s?@-5&BKFs|m`_<>MJQWj%TBQrGaY|ra^CFc;DWo$?sHYy90yUL4uXE+RzAtB4 zof;~)U{kKyeaYvsh%mdHw#INQBV(S|*kvK#Tw5u_{Xywf>TXVDP({pRVO+JEGoOk( zRXt2~$sN&4jXLRX9wXHIP5GKv zZDKK02$Gy>bg8#R_IfRa3N2)k68oTPoddBmxt&{h<|ok`Vx}lo_XqYrkN%`cX6rtx z1UtHsQpajkAIJ5bN>PJr7mY)8Cu2xey~bfhg5QdOnAFVfD$e2 zFndt-`C>Ll&ict-MMd~;`7&Km^a8gr2yUKJe%vT2>15gxA}thG5HwHDFN^(~MdmM# z%Tf!8DM>{3x9ZPUnOeio2T=&i>LTDx4P508zM#rW3=}GoIc}@@*KtA=1DAwn43SUk zAB=zc9r-kPYktwEB6<{xY{~Lig?$UNugoUx;D=S(c7Ed(36-yRmo)m(m>G008!SWa z)vlFu7=F&T*5|)W9vJH7;6L{a!YYE;>GQ17Rx+(9(q2Q7gmB1`gFTgA?|xok@b*Gq}55$hrTP*)14Qg3MAvfwPpof zOeUzyyVHrdJU6l};`bsdc-_z>&gzRZVIYO zyd)MPN332}#^R>Y^@2L^|{T2KvEdY|0^k}|z zRGgHykoNR0c(r$&qW}JgP$?ZQ&HTa1lZgE4^Bppw2qx=kO&OAMvklTAB;7l8F1QND z5(NXx!LKCmA$O&0Gdb*WaFMmIJr0`JcvS|N`N#|1Hs;3(aSd0v*i7GGQm%P&iUj05 zCI_SlHxFf^dn)Yxsy?;BbWg z-pQ}|#JzC>)x@yyQU@!;if6{{4z6h=jC~mS(!ARO;3N$O0MD4W*#IbG*4)KQ>3Umv zhZIk_dwDu}x_Elb7gxkfnWIX1AYZ-`I|LSuLHwK3^jgA~S=_E*7LyMkvT>{1N`HeO zFGy7oFy~F1W{sL|z!lOjcUZvsiH(xEqa*JU>V;s-@UyPPtl$uAI46q=0lPni78J_4 z)%?ZdacG5_>A`CsNlk~(&(p)#K7b4T0hph)hvNfHT1Sq3FBf!(B#BI4_>Rid%;uoJ z02P=Yr!&75FrZ=rhV)3)WdwMqO83q9>;T>DpsgJK+c5Jyyha#yw@dINq+SS1?~yUf zI+=X!uZT~IW4KksXc4_{nFnR|mw8S%!bRjM=ECpMdDm?gn$>H`AbzdiVDsm9L9hN; zK923nkMCW`2zV<~G2_3UC!^(?7fV*GR^)4sP&|t#{}0Z$_maHX-xHGOwMgDx8|IsZ z%t;L;K*UvkQdvkVWyDgNR{yCqr;&L(C6a<6T125z+-t0k0z3gf98iP$fJVCZZzzhx{&~pGLRb7bOj=a;Z6>-}a`IqlYut zp=D80VQl84^qUW((FvWD>m}GS6#4WUy&r{rgP?(lvNRuPI6t1kYXDkCl3D(1M6_*s zU8|}|2|O7ktynEYLS4ZSoaj(9z}QdY%~A;bZp`l2{tTeChAPmfdQyVcP=Q;%v~G#v zzU25f-4xJBXVe2$ei3HLt0?;3Cuy*>!Mk0K0Jb}j)w;}|eH?FGWf!0O zUnEJ`?NS_Vun8-;pe~PQTHKp*5xK)3Kdv%s)P?Vj6M-wKlSokIo+l+iT}>UO{&Hc8 zdxHy~NZ?y!IKEhmkHzbNPbZx2b zlAozOR%{b~TCTc+3zjh|&p~t5SzvCkz}!$PAi&tlhbwkS zNgwrZn`!H58|o$7_R=;N*#-K!BT6{nr`R})EMyI(RtY4gK5yKMDl7mfG%O&@Dj#(H zi}L4@Zp99!$dv!yAyZ`LFXk}0P+_?e5KBEM`tXB}SXTMV+GQ1;?u|6F%$0Bzm@s;# zt^9A$)|fVHt0d`=j6S|J+0j=1g1Tg_yir~x+$_<1CHnRoyqdm^RtFHGSFya#NPOfD)wdbBi)+!w1(S>5MbpZHPjapEV#_)d%yG! z{PH|s{L3OD)PTwJSGu+5AP$fabMd@*kxt@U%hx5C-}*s3=nIs!&Cc87-cQ84Yku5& zK)j_3;@%Ftf>q%Wg?Wqfh(ePEV!0^NeCXmhIFFND2-%s*i-C&ejC>*YHF7|-(Hxr* zFXRsS3KDlIdp?=}HHbU7-c1&hjgfgoC{k(G9%8Z@P5VZw3A1*LT{p_@xbB-U_fz*# zEpd8yVSb(-`Z?@6WB2c}>!62TT+d6pEHF*GY^4iQb39v?;#;6J#d^()8;JCU%2PcC z(^5r|&){aWUB=D|19PtxPWPT3ePfq&47vttS#G1t6Dm*M)zfr3QA`D4FJMdqIgrKo z3%ucS&0Df%8A}+npE|qDG3AtB*eT(97)3iy)8!3FkWK=hF}r|7^r&lls?_!76E<&8 zP;6hLY=`8*U|b)bIr@|`J5`>`j#jy`6J5ui;OS)T0VUiF-J(ZQ7Y$xW->oB=e|6%Tq?_H*{U>Cetr45@n%VI2b+@jbV3O8yur>--T8$6Wf4sMCpbk;lW;3vwX+JV{%08%09CiPL(liF17AynEf%he;l(@uFx zwrdYekj*3G+j$)3aw2~%@RaP(!u9ks<8^nTG_dn>`5BgPG_$)2aR#PTf$mUhY#ZnX z!9*);yJLL_CoDT?H815>ZQ+Sf{{JUpZQ$ks+>RA>=(w>tdLuot#cTLZrJBDQc05*r zwT%LwXr;cP`sM48SLu`P7aNj1+I4` zWDFtYF&hQaMWq{SRdl_o7M^{ogA!8B@TrW_H?96i_f&2B&v@G=ky%!rC%U)vLDt81P@gi56f@z1HJvT)$X6=2^2z)q>p|%5~X%o(`S*bc_I-pVofzTanPWA>{lGWIq#4NgnP8#og*{Y0; zhiN7$J6Yh6N~^wD`LFt-6q7Xrbnnp~m~>WOe0}BJ9;3Cquo?V;#282fhE%)L)eD`B zwOfc4G*(SLCBHS&!9l4-imL7qZ&leT8+(y2$6lEl88txj`iiiRj)(HV@KX>$ud$83 zwqi+m(y1mB4FS%dqE4;ou{OfPU`d3kCc&EK>A@DBLwVj7$jilO-KVoTbt+RXQu|6#I-Y0fP7IjMj?6{l3Cx zZ{aqD%J!pW5Z3eUI?`ga8b_L_SE*JtGb>qMzC=~P4HRG(uZlVqXwhpb7`|=UWcPlyLHkw70{T)Tt-!^^}~}!ihFE+7vea zVq>E%jt!%|9MP7IkBoe2qnY_!tMMt=*bEk0c(?L=3^ssTQNap@j!Cp{)>Od>Qz5OA zHQ6b%2S~V4p<)s(nl(f4L5?(7)?{d&^}TBRN%GB9^&yRIeW+S{k|ds?zF=4RR@Jbl zS6=HYeBW1i)K~bayRciYX{Ftq8KVFcU?FkRRhm>=Ua6YYGfpyqxKM6#fQ5QRu|Dn< zv-K*tF2mvh4T}dfEFQ1`9mQM+bT7#%)iA6MvRX!n1d0?Qga zk*eJ%_ebGM)9w=kF)CIaw2@;MKax!wgVnj=!$$OeUs!+DSGboY9`wg;Oh4r|+yyK) zlhKn!M*j4)F(|nj?mV2XWaS(t&Q#^h6=#NWW{cCQoN`Rwm93l^;>=afRB;YdPRZMq zr<|w6Ss=~?apfm<>^WJMG&8+Gk8O8{rWc?=OAu7Z(vvs=&tTs14;T8)`!!I&3V zZ8hYBbd-S&*$HHfH`;O-z~!C|oPx*#PC;Y=ry#O`QxI9eDTq{CDV!=WUD9j%T5XsG z(Xc>xP7B>LS-Vd((s2#a?n|>=Z1>*}VUU)5hlTh+cn|i%n+v?zXTz(2wBS`hTJS0$ zEqE1>{TfR_sowVG|#SzwqJLNSx&h8&&Q|5U*i460xY234?yI)x?G zW~yKSvkK0(3eFBZF{dSPr?kLZEYJtGz(*9l4tzN&JLBxKRe@I7sz6nWOIjtNZ`}13 z2pyHt<_!GFs_FO7Dz1y-WPYB`Ow6(Mv+Ak}v07HuO4U`>3LvanWmtt|1U4$1Cu;XK zf?vUY;JZ@C9*EY!Iv$fkRxDxTnXRRCbDax-3L!;C<`EWTp&)TaxN5ShH@?v zXR31g#hI*}(u|2o9ZBrXu-;8pJtt|o!uqu3TEksxkpiZ~2Dfug%euBHLme;h{F&!B zJdg3L<7wdeAkgxt2G>_71bWskS%I^4jGlD4)(*CV|3z z%JLS77bhZH)$|wjaTHfEQHxPY?rV{;dm#19$_iVd_#vyl`F5qGzKS&1VAvIm*T}A5 zyhe5f<2AA?7_X6C!FY}A3dUQqz^Y)+z$)1_bXnCOaz+Ky`#6#Ez6xp$Z`wE&G4(*4 z3Ol06YcG9O6|9*)j0#Jwq{52U+ZDEJ7_X9D!+4eK8pf++*DzkC`~g*h>PT0y`$imR zcF(a9sv`SgFg?!3Xbm&_DkvBnepc0Ne#XLI|LU9rfAQ+rwToBBu3fx3cJ1QTvAf_I z7_#eQS3q@){uPLGJ(xo3tAI>^+I{y~96RjKY-=>a{)n|Psopnx8Oiu)wAddPgOLtd zGd-K8lv;cVzT#D|YZR}7-RJBo*ch>UuU!M%7st<86^e66TEpVL3JJ(YFNYZiSy-iY z7C!oedk%cW!L{)b2iNXTHn=VuAE&IYX~U~f*}uhmIjIJFz-tYNB2}xJz1&rqm`s*2JRAczR=4L#@kAL=;hG<(ys-ko>ic*X;NOQU7lnMKKhjxudphxe+j+pTBBV;pjs;RVJ|Bf zuaxj?ssqINL3?~rKO6mum6I;lmwzuO$9leZPLaz@&SK|Wj;S>>;pb`+)dnc=Gc~!B zW>`EOF@Xd9vamEe;0V>FN|@M%vEw2)xP>C)B&&9du^a3C1B_i9UZilr&*AUHg1hm+ z&pU4v_Ks7t6-4-eGvF`@DI0EBm}mtEDshyajlt^?AqO_4Rp+@alcu@pwIb-eSD2 zKJPVnuj%u;@D}%ZJ$T3WdP~W9x=u4lVRWd{F%rewo`V%gcAzi$}W* zBMaO+_|xEfNlDFk(U)!NNi=%G*$t#{nEC(bSS*}i91W{YW+!|d`^ z9yzLw*@4M;hojb?Hy>LoN3p}AUD4`4U&}tOO=~6Sc(5~}kPj|DOb%l{@t{`JL;CX2 zoyn-7X!TzeIw3|?hs&Tw2f342?J|^ic(a9i?QedSgnalibd24hE4`tc(TH5;tf)DL zor(t!l7={6{=BefEUtn!EFyIg$OxsOK1EiF7MBEIhNF@Aokz>Hxtn$4s4rZT%$LNb4tpRlpyQ8r^n)boX*S5ed9vCFlwKM7mO*hl3f?GNN~8 z@&;O<~akCg|Z|zXy)FtcXAQ2TkdizfQmt zptP!P0b;noL{*TcW+h3$sp%OGkx&4X4m3o8zpS!TfmTYTy|n@h3+`}5%>BGHX|I-q zd(ZoXo_6nf*B#r=3DA3|`ocFQkJ~+NtEj<@Kx`rVUFbbo7ftQyOz(&_iL4n_s=$Ys zJ;7{Q=)CR@)e^zxRQITsSbJzvPkG7a6&t~N%996^u!1QS+RRVZ^B`W-K# zt548?h%Pke^kKM=5N6%YPB+CduE^m%k|2ew6k)m4tGbgK2pCyzkzd>b0EjOukw{e| zS_f2#k(_Sh3igH%b2wAsCUMlr;1Oc4{PcMptp+FRDh5QYK&l3mQWsS{;K=eyqTA$~TZ;LaKFs_?Xm+qEPqnMGX5=kG z`Zedv70A=VRn7`zZv5}+@fJ2-7oNGgvjQPo*tZ(coYPP7Gej%chuoohSe;-L$E|gz zcva4^$ForZI|fw8ZkuKopmWEG?;K|u=Eso-0Ba8((Ij+dm0n4?5RHQ+2>2AMhC zrqt-5T?RdWB$-xM*O}x|d7d?(rXRElB54-s$$V;lycD`9r9cVNBz%qt@2hI^r3}Pt zd3={eUPurTRJ6E!CA+mCmuAF{+LXY;vh3HSR@8J<)a=uZ{S}zV;lJtqL<`kZEL1mh zSa0<(wLd`_f^dEn#>?Uu#~~OmvoWs7Kk4v;azGqH-*q#TK}!{G;ASQeglkn7@!XQ^ zP1>$nhhQ)*r6`$MFRm#-Fr&&jW|ebHvLkO&QVv)b4>+d;LAeyzSCXVr7(YjWlChL1 zxavc?DzOjgxCkvUyH&2 z>*d~?PuwrDv~;-le4!iNI@9ukj zdpYo-Tz;{f4eCWq^tF5yYmB|JtHmmK)h~R+qD&*@!EY9;OEc|jQK?PC@p~@{-xO;) zloD%}d>{GjFof>YT0OQc@F|3@^5(f#qsTGFDQXa?OLiFpy1_9O)*PiC9N$?q7r%XjInQ4o>s9^~I zmWOVG9-f_w$EW7s?0jE1d$nN2ixQLYmxG>4a9kH2R$CD+&6vMVdgwi@pWHk`N1f+; zgQiG=gu*y)U7HLu=ge3uzn;~Mw>C?5-Qv^=jxgUMyMBwf>WtMSuT;O)d+AFuT14H6 zxw`5w397bHHq)_IDFfi7grJlqdTy1%8CHwjIm?sQMMRbh3g0F%BGp#2eVGiTtYUtg z_pl0-m7o`r+)ZkMtq)K@4Ok-+)OMjxgp(Sz(^ff4c5nBJNmZ`gA!dg;DR2fg88 z^@8Rp;fyCaR3BeYOXI+9@SDKM2C)&8azL(D{lMaecTc!%0%E9dZ(Z&Rnw z*p6P!ll|mlWHAMbi!O+OYfUx^T&v7tMSz8LlC4uzOq`_|QVJ1Oit*{7WTD`yDt1lK zNvZ;Vdv^0m{?nQ4tZJS|WGRs-3(A+LyaJ`L!QSxr7j)wlv8lv4Yz{7<7V?UDk5Zm5 zPX%;zqVh9P62i_w@&^0-nbck7X3Hkp9UaE-6vieRF*J<}My+bftEy=z zRe*EefY({NSE8qNsze6?8STv1@nlW!;@7DQ8&PV-nv%s^@hqU=&Ko4c=@K$uHBBas zQlk5EkVctuP$i-Ds!CNlRC@$J0t6kxd4mKxT~b)pG@`0X2LK^WH$_cr=uQ%;(xJy= zp;!@+X_7{?gsN_kgjFtL`(QYw2FU9S5Ov@Tea5NbnSV&t3)?t{5`-Q>XEq)aH6@`# z!la;x(k!}RG#xo-0X2i3^-IyDNl_r28XivEepDWf^+OJIme@a?Ij?q1c7?=g*5Xw?%3x z)Nd{n4oEjRa9qiVUH~Oul&i+G(v}W>G*7#1QM-28@(sXyZ7n1E`8;MJJv_FOi@dQp zJN+7Yjor38jn{;h&*gRP3wzQW5Odd){GjXy0nfbX%_Ox`kka*VlB4c(IaIK!7*ht@ z8QcER@^eWr;__$Josd~hYv4u`#3o-v%e}^_sLPA1#A}?6Ud6$P=-2t4`P4s>H$o&n z`rP5>#^h5aM_05ay=j%DJy@*PoSXs{a_RD+nm5mD%wbNu zqu6UKag}QYWgYxXZS)%N$CZd~w%c8=X~J&AO&<)RipfnaFULl&=7x{h=!NQcuKJy( zeoNKwc=dae`h7Nj8g4t-3@>ckFgZ1j8T z_n`XyK>eEhp1}&7Fz?`O;3i>vWcIi2-9{(bnfZKSGWIbL1GU}1mspj8jTk-rP`e}! zr+kM5dT18iN|}=;q*jI8-$6VqMA(ouduVcQX!0;ok{|9R+86poqkJC9XpRwFbNw)# z>;81E>%!iE9B9!)+3jb?Jo=?E9G&@+Z`OZl%&)#Q=E*OO`NNmSJku{m>Z0nT>hrgA z$8f%c%5LZvIj|XC_|llhFOAuJW()v?fAZEjLp%G0g7Y*bSlS6xrY6qt^?A(K<`Wz_ z)59}#{EPbdzsLgwTPrK;_pJVO2?=`p6Su2MzmooR$7S>h z(}VcGtUp~%f`R?1QiXhJf4Y?D|JR@X*Y&5{gw*m?S-{#7glY9*VxOJhcG_VlFPMOvNG476finu>Bx~M`4#RoOVYSxVZ|y~ zSY635RRRHwz;*(?Fu_i5#u+L3+R5Jdz?6W^9`P9|&rFo<#uTSzx4QzRIFDfnyP+Eo zHS%I@?5%4QKEnK~Z0%`T>@$>|kw}V8CYdk^<^xtTH+P+!E1i>c>m}W-b~=t$ohw}` z>4X_Dud&myzB*UB4AKb$U}oFtGR~bYmvl1Yn;)?OBu&f7ss8y1PbKxpCS9YX+e|uN zxIVuYkC-cy%8>xcg`n5syGP1V!K!P2EpJ+$y$@L|sV&pW9tnvczmRPSt@17qRC%{x zt@pW^5NQapPCK+xw(Upneo|m^auY+=RJQBbwllKZ$8nC?nWkOY zv@~72GV=$t$N24fkZnC`-&E|bN$WkSU2Kk+@te$;hfer#=?Fr%X95*jgX zYujWY^^VZ>*`e!UhEvu8gdUolhx2}%EJzkvAzYGib1tEGTizm^OD$(H&Lx)9rH9!E z4NYbxog15+4VRy-8yB*0Vez5>YfiS7E(4;Fa-K6ZYHW(F8Cdc zllpcIS1k~)?+ME*^*wGmrM^ck=l_=a!ZvGHwl5v5%}QwsLwp8wcKC@6)9BOv0ypRb z{fgfZX5(TRj?5M!_=R_{_ZyYm$mTFqF0c*-axs=MJ-5PW#~i=UK&Vl*Zn(RcCt1-j;VQ<1>{7&=sUcU=}wmDlqgu_YDQL*%j zK`cm>kg$sk#Qy_G*7KKGB+DI>V~ac`rP%=vD^6j5Y;%DH{{VU-MlFS&a7SN1dScQ< z1L(;c1oW+GTP&NibUH9ZBuJaofDcRuP%ZiA>}8;_$zw%zTmrq{ew6Wp@&eLY6t7yVCT2EF(OM+wm1&>pvWMxy zy_cs`86%r+;_Tw-3G9tNjEbEHG-xeZJk!wzY_UJVu~&TRBi^QXy5y%P(9u4jf-OHM8OrO5BtspTW-ZZ2!jmQJB|YSq|Q_AA65uam8j3gcZs z^cjb-rxf7Avfch+X3a>JxQ+{?hIN}I5r-D5za81&74u4s{sUrCbH5%unW(M)Z$%n^ zhLt{P4sJ45?-%l2yv5{fs=ULu$HbbWL)_ZaAN!IbC`|RWhnQs9;zb3nuvPE=Ob;(Y zOmjMQ*;mD`kVL#@u4Qa_V>`7qNfdXT;Xjpko$-fLPCU_Oeb*=G(S7DkI*ydW9eb4t z{VLUTulq`l`wJ_K9lpXHYQsA&52F3B_ntwgk_L3I@noqMG${!vtSrV^C0CSu=4TA; zs3?4;58i+AJ!Vq}eD9U-egF3N@31pHf1O@(bm=8}(%WpjFF9WcakpEUMu}N=!8)S6 zC2ud|zAfaty-|f<=q0C@T7evnryW+2{=hOC1NqGx{!3wPe1&4)#)coIW$M3``a7-q z)9V63bk-vG(AD)M^6OqQiuCj>$r@56@?@2@pRBtVUt*6Z>3IW-_D4A`j!8wmaJyi& zq-n)h>F-ON*M-2{l+X(bcivbV_0WPN!7i76M~;c0y5#L8&MBd4FdVWlOe#Lrf~RD4 zVtg9eq25-{65+S>G#zoa>UoCM6GgX8dRzbQt4Mc0ir0rv=%mvZLP{)jy#n*l$h2~O zg&h@I>7MWUjA5gljD(7kJxeZ_@2-2#(Nz(C%z<$hcWaV_Vnxs3TgDok(`F~dSn>}z zt3`Q7WR)wdr_0#S`q+G_G3Ib=tQ~=h-RtvV{mpsPSpq!g%fCrCdNy>eLY;0@`}~sj zKn1a_=Ira4MH=tDJlK<{J-7`h2ki$GoeKuw($baxAF|TjB zNWkVyTmemrD4ANnX}0(T_0^V4YJn^(ia>!&uT4%9BA>tnD7PwW^9=%mX5#!1 zM6xOIcvG@J(+WyfA;~hGHbqhb(=A65rh19jRiv6yyJWV7j0aM^MvIzHDMJ+?Gwe|b zw8Vo9?s^&>{PfMYdCa$^k|8&2r_tY=^00i^=?gJo8mKNvXpfqA-Po37?tGQPMnvwS z4alT7zjZqOh(WdZ?;FU_q2;2Hkn2fvVU)WTKVW>M*F_|SvbN?kGOY4^TFVfg>1>Sn z(%40rnU;&!>y$7yH+*S%5>_BgfP{BSI8&R?1}xStp%3ks0d zOurF&Bu&r@uc|*h$2xBkyb7F7KLlaBAdVx2AjGzb{g9*(L|Ae!lHv%O)`y^A1cp=) zjrG)oKrey@TL^OWE8^e8k0-51TB3`B1wpys0^ZS+M#E)W#c(k}C@b)qLXULO0rge* zfx<1b@B=OcExl;6@YB=}KR&xWY2O}cUwVQsji#TOCP?s_5{9OOFKw@cbpV&bkf3im zi1b;ISqMrcFza98XA}788%MGpM}OTXN?1Ou3+LU)=A`ivGm6UWKgXctj~B_ec?0qrG?G-PG;JF$Wnt_6ZDCh?cYduXb(3Im^_8i&5a)y5G!b5On8D5ILby?GHjitk%c}^%#J?; zO~YQV#R8Wbp9q(kXO5(s5ttHn>!T~t_}<@FCL%oA6#DS&rkHf?$%z)$Tx4SrI7IQ_0d#w>Ag4& zjM-r893!&I2B280WSNfgb1Y}|JxHm8+fhsF(o0&jhJOGxBE-1Mj5;?hVOAq99{tjU}9nWaVP!O5#va^fGfOu3+&uSf>u#@H$AXsPK*XpGt2^nUEq-d*;5aNEO`Y%^{iU;{q zi@Cq8laRHO65Lle`ctoN)*3pLKM}uHzZo}S^)K+&!;_NMrpkqZf5PX!y4|07^)@aM zi8V@S;1f@Akyfv?Ca`ZL?)xPpqWr_pnb<$bQ@ki4a4Yb|a-z!<94`UBqoj4|4RUc9 zQ_U-89b}fCQv?Dq<7B+PQLMi!EMRSP9+4~<{P`<9YXT2gmPC);Ew=wYQ5$H;^m!LV zPLgeJj#u)L`D{*Kuh@p0+i=Iy3o!&gPk0r-uWn^M`UdL*Wn$6K<=*I`B&+FV!Dbb8 zBSkR^{{k!ID%tM;9i!fykjKEl&*(Z%i$~s|Xb-oS`vaNsS{@kW3oXlweovSw2AnV7 zAItgr-3jEw#ipc{a75YU5X;H3!&efnJ;xn#9__iA`8V*(jUD`Y@~@MCDdLymCARLd zr#h4KGoLIcEA|kj%!O9bivok#1HPYLzA-w#1&j|7+RL?F{1A9^)alcE=z8k4BJYd(AbZ~sBAPhmUGk61c%XX z{^NXAKrH76WDc!1!a}OV`tlc_K+0H1IAvG2ZnKcIUX2@dA%h?YYR-XwwW%Du_Hs8S zsC8rbl5y$04*S2)Bog?FK5_VB0{l0dZ?06m3m$*?G)ck~GevCUmdj|q?hg63hZ}jI zjs9<#-xPmIn=H4|Yp9OHt6VTG%~6_YhulmO_7o>X)eUF#7+LZcL&n*# zWpcFkmzehY%`w^LS~zoi!i!E6jhW~*n_{aNL=A9ye8=zH^xq@zk6j{%job1kHjj*?ecEKe!2YBRW$7K zZ)ImMRjW6E(#{@G;gw`f?_XYja7})eKVW-r)0<4EO6C8K9dwhGVutOV+?T>-2aUH< zeBJhr?#*I^9df>vz**mfBEHcyWwThA~!b3KA-eQdp?Hk zS;Pb!YP2U{sGu$vTYxS$q4u%A=xvIQ$CSwZl41ib)`>vO;jVi>2EM&7PzAXj#Niv& z;jW9u7y{~Ab;P;e7YXLi>3ETW!c7}djGR=YzvgW^G~C^EB8gL17{+TdM|hIj%fiW9 z#da8Wox<)UOw~=%p3Z2UV$5vqVOtPxtclxX^Sz@sa}W~yzO8J~LGNTwxam;7x@@HH*-F(?BjT5+|8^I;&8ZFDRYLec@QZF>7+Rt9pp)RO;6hGEqQJ6XVSXv!u>Sx+U+#4 zcaN!W6ub%M$_w}V(wlvwn%v>C@!SuTA}FK|}kV$;@$NSik1 zkI7$PN-xo#8VHP_TSJ(pPz2Ci$y8+i*8aT`yOkRAVpA z@}H;tRr`);)hVY3Njp@Lt}^A2a?jn1`z_9+wnXlv2wiqm`0H9FByd!-UeX-+J}M4k zGhIeTyiGI_j&kyQQyzghWp^T+*+!P6EVz_FPk73^dc$7-2o<|XZcAU}<&K{V7_oWi z3#^9g_<}4+pO;E{>8Opd=m%7CZ1)ma)~4vUm`jr9YqQ>#t&KmT_%gZlaJ!zPPExS+> z1%CT{_oxlq-ZY9C9R(FP>M8BWs31Y67Mk`Y)By@{@@_-n|Y+EQHgPq+8a!eeJ)y(Nq4?L6!fRf}YyXz7?UzZhwM zVZ8@_!B_jC0MQY$3RteA->?QK%zua&m|LZ3KaBDdf@Ab~d$k5V5Q#rJhGkoVD zhyMbjww<7clmpw4?4+8G2PHmR7rjIk31h z@)#*S#Vb3t`d{K=O}{tzxU|L>kssqXD-;ly6JRA;3fa?*^1Z?JR-*a%-NBbK76>=7*`IO^eELPuM$jE<`<)v0HRuw%HS8^HATwLYFD^g;CBn(zs03HC6 z{548rl zXI?e9)I45{b&y-t#ckXtO{1!$X8UkC8$?u1P4BUsK@=!;N+Xd~fGB_yvZjX&gFPwQ z{h#8%;xH$eM#3R48|$T+xU4#NttZngTjLoGBj_(wqQcF3$+i`ypx9UPp|+YED`L_n z{;%{ySTsuorT1$hudzAuloVo=w|gco&klT(j>2Uk(ocq4ortqd_a8I5n zJS!`hi0Cc!&qir!>M3`66&rf8sz2=w183oMh2V4ut*CJ7A1ZYZU{0kyauvPW6mywv zj(D$=3(I?ZoQyecSC+Zj`<^vd?-k(dHrMhRxMpF|9l4e5c-c3zXb5wR3(*{tmiYu) z@bLC@slX*%_wHh^Wgf-K4o13p6E0Z>hadt2$9TUrknFDoPjoI@Av-60xK-E6Pq3GC z(Ur2?ku9I^{e)ro6(Y?qC{4AcdGszRH}lvP9QrWYxYaUe$nCU)+B*r1nV1qKLT)bI zZhp+yGFGF%H(OJrL0Hi{%;$TZ46^8XW*e!@-}DB`=G~bKBN=%AF#|3+Po_sBb2&vw z!H?c1y)ST~`8__TEn+!WEKuu2(NBj?_NQ$F>MaT}QbVp1+otGH^md_HgUuh)=c3g} zNjsO7QIJMK8?458Q`bD~gHmA*P{ndaQ?y;@J13@ekEPDjq|PU}t%y1o>cP)Dm%b<= z9};4=Cdcc4cKyt!h*Z!o`ksP*I{r{n^fhx`JYtp=A<{A-|EFvSJPse@C#+B@uBijoAEj;^B1`)CD;>l zX^(8d3cHO$j-$!~*CmKh@*U$vPEj5<+X-D$2TT!vWnIm#X|zp37Yy#BDjvVe|I zVVvOTA~Tz;NEV6A{9=)r=g5UuUo(^YK>98qS!i4?HS0fSMYdT>FPB?$hC(HQ+}nN3 zSJJ-pGQ{ICKilRIPuW;o@s14s9g^^gehGV)JtCS0+S3QRC+7<3)r~0IbjJ1h+@`Zp zcJJj*!FkFkN+r>DD)%Nj?kfLWU(K@Aa+VC!v^9CedP_d>Xr-TVve;L$RlENXkogQ2 z3tYiQoy}_?o1V*-Vb`-&6c85Zg{GdM))KI_l;Wdv6t+hmSDz7I&T6s5T)aTccyKe1 zx8%^$bj-S!8%MbJFv^Dd7LW0nx4X+zcqE!8&XPmr+TQ(mCHCQ;%Xw&S>{P+nIj!fuoD;w5#drNpV5q>;(xwH z+0B${cj{3Etck?tj#&kNvQF_{qHv&;M`ZK*I+?75&Dw76Bn3kG_?D5&))HC4?Z8~4 zP)QHuJRdTE;74#CKGxi#oz<)dx5Z2soq~9E->5H~dEyz75x{zR!miYkG=Cvi8zprF zd&Vw45_W$a?8#a-XhSAIw$wFw_;Q2jk_1mM@Fz94=#RP$PZJvDl!IC>$dZX?2*TO) zzYKC<^&Jf^iYj2TA%0K4_)q_A$BUJc0$Yd5*k?Z7FU|JeG@)GczliXKbN))0OlHZx zFgLkvH%kD?9l|`0#jx7@c?*S>AP(q%UNKLh24UKJN<(J1jAKL*;3sgUDf>M(7JmNK z_&A1iF9dCB4D=t-Ez;lEw&@+mjmuu*Fe1Y<=I(aeI9MjLAW@m&a*2XrQU<+4esdSTR; zbTsl~lDiF5N}`Kzr3P@FJIwL_EyE??;bu2QVdyg5M~$}&_eT>+NrH6x3v|&MT%~`s zMo*T}j)-LPcD*p-OFCTAvgGREb<*{}kgne*UH>yWJ0ch+?$^y1+}2kI)cATOcyGSL zt@e+&isuKS*A%&!R+J&~4;dn7j}bl3JyRwmudy$_SYXY(+g~Aw(1p~$X-Uw|GygzO zxABoVno)7N^!YN_mvzju)+VY9h)fEy2gFOl<@61RB0(GT%nECsaaYqv`^__OY6_Mj zoh#Dv%7wt6WV^TDbdzls^uZ9yS39gLB!0Jo(cd|)u{hCkzGjA=mcmh0gX5ABkZDF? z(Apfipeov0`%On+q`6Op$ml^FB|MLit~_(oGgN9F+qWZpSlNfHs0*9TRez8KYN#Jn zYz+Ix)uIQcG{RQcBb-{j{IYeAS!6hkkCN3^%mTdJW7iR^I6=(T0 z5Bqvb0I0@^wdK8&7ThOnPqukgFNo$(MmZemZP7``-MK;k)#j_PW1s*LE<>lmxm@-n zebBCRu36ew))UMCvK*bw@HF?+>cM+bW#P0kIarelYw0##W~Vm6{O}QA;)cHEyNwyS z-OVzZ18IdzQjONg2;4@AFP!rJSJNHFr-gSok2fdzuc5E99?_e6QiAV}@EXaD`W;&< zk9$&6Yvo4iGG{ccwm2=27~6u-PA^GXd>H295@SoGgKkp4d--AWXKZa)EfSeco!Mj1 z>gjU|LKfH`M}CQ?@E!~ieN4TuG!}e3^;*qks zpFMxw+Jvi<(*k4E!n2*Qz$dn9M__~yDb0$KAcW*Is@0@%oS&D;0h%vVE^D1(c6gYk31It{t}{UTt;ygMp!J!j(NEZ=8{Hz6lci6MZ@pVV6xVVM#`G2(jCud z(_bJ|gViN|(G;cuAJ>SqZ-V=Ggi^js67w2n2|biDot`W-Ek8VsW#jhHa9tutSdruH z$iW*f=ELaHaa$p77g8Fh4$x|9E>b|pwzFSiqzoo;^aDB*X*AN5hxH^cd`URx@1xQk zP^P{C(kuf64HtC6;g{0+J?&57;_bkownQ+D1}Tg2<|5Q=0xyyuBYuv>V;rD|)?Rz? zLZo=ur^!Sj&Vubhx}vZdk*(ZU+9ywA3wPmDfLgL|@i%Ftu0M!-@3L=*67PoJ|4#i~ zP7l$$59v)OSz&EM)bXvbFUx7ZwE*GTraN*qyXf##Y6=i~Y;+amqqmIx!4ugl&&L{r z`MWc}n9}>j*W?TOeK_asCk2FUizfiiEef3WWtVB2?xLK+ZT(>Cj+_BdWa{^*X|SmX z06MGK#-Z3uZPVghjj|(GNMx7-W20M$l(Iz5v8Y`z5 z8QV+OdJ>8!Y0p+Cq$V~ZQ>q2O9_^(L_pXy@e7R`eO5TL}MFWie9e;tm6CM6Mc_%vp zdTFgMA+;77u)VbQR!4Cieg{&{qBFu*tMJ5VE~yeyS4Exicz__JxV9X|nT|?XQO(`G z|B}Yhjz)(gMSu`uBKDhvzmz%bLUS=HK{k2VgG#w#SEFf0%Hpr2J3QBoH0zgi%pBpWF_l9TJMmOQ$GC_*b>zk>!h2o5H*KkJALEcWUXm43V;+l z7K_2b?&W3E@R2MVmDmq9Wv6+62WyVgr%CymmGVz2B^(iw6dvK3I?SCEK9!26}KoaL+_wM|``yQEdCXE?FYO7!QUw&K44D#I?vft%EZ zgwDs2Vm>22FnFVyDpJ&9bbjdiL81S^=B5blk?h}`9J(33#hVLw@_2IPi`3A~*^yJs zmjaOV#{!Y6>1qp+EiTB!xZM^&2WBNWy7ykPb(9ZPdNnXm{upm(!f0XS z%w*TzQvS%c!`*~ysCrZ@<&W7)`J+-Pf83tDQ zbw6(HEg9X9O*F26e?a`|?L#9%H#?(A?55HwcZKMiEzIG2A(BDn6OUCD7Zz3YbJ$UlSzi7a=L>Y%1(81ln;5Kt zfkt#QVYT$~?5)~tq&-=;B1M85=ch@efSbr%{%ZA6+muM|gLu$e2sE3Q3_;TKaU>vp z!%q5v3ZFp6V^4gZBmyT9R&GY9lr!;1B3Y}>x#a_SSEgKspSbsqXmdLwU+WcGc_8qt&KYfen>n1f{q4Jv&w$V_zc$GwaH;Zdv%jV6(Kq6j?<=e@@~X_-_s@QL z{JAd=5rUR9FZCh*w6^+@WU_CfB$=|8;$ph|;-oqzia0|>7P-UIhbk#&TnuVSJC}YJ z%GE;FNH9k;b2^remnHLgA~M_b>p=w1YDFH_6;0%>E1|+8}LZ- z!idzsId%!T&|)H!?Bo%-q_psUp13G@_+*u)D)T?AH?3bee3WumW}a__?dLnhf0e^O zKcTRZ8CCBp1d?+_WQ=IIIx4Ut(3|xM&~1s!>=vlAlg|FKF!VFVz3J^0n|uEO%=~q& zl1?_y`@H3K)JiwYZWP0I)7X(4EDLcIE{j-7tyyn+ow6 zzfy1SsCMrtj$*tjI}M{cyrVt`Ojh)6R64ySJ9%yKmb}5M)!X#Zc#+7Kk9yBNs@YT6 zN%YcbAnbvB)@~GDuihf#PQ*_{FFrRp2>{Rgn7@%|A0B{PNOYe0SPiKCFQzXFTbjJLUWvl^JLor1$~7Q4|u zt~ZCD+Bxi+Y3JaP{fs+FXfIy%*`&8;vW1K!wn; zd4If~z8C4fP0U6R+DoXM4n4hDnjPeV@FuqMuUd7!JFLfa6iV2aAnC3scl~+O_vxXZ z#i6r0n783TAWhZHym*8_J-apXck%+_?&x8v`oT*3&>Ah0DL9QiKFATd4K`fb^N4tU zk4H9`b=iL^vyQmMQ%59$-%kCOcvj+(=2e+BOUR9O^xwrZS9zRcI}t-lRx%X7ko4mC z43g5l^n8YW8_#J~X&hbbbBTB#eTums3e`zE4%N8}XmbvKCiL#pt;C|xQU%?uf(lfQ z{^=c109_mNve6W5>cVw-J6!ivz9VH5sdn&yv#OKO1n5KMPN5ORweY-;KOgOdKGl`g z6ce2!&9m+c$>Pe*%dWwfIa?LqOR$ul!F7a@Dc?I&zMB7D*sDsbh1K&xf`2{zb0`dR)4`hifbd18NT8jS3s{;~+pv9uhN?Kz7FHZpHH zKONbxah)`FBg^!Tjm)|ZbL8E&;hb?>%}Kwcr_1{3i^t^Tu-dUH%Ip?e2cl&r1xd#PsusIX5On($evns11sUcdFI02Z_HPqY0<~o@4>F5 z7(!LDA)t7wLdw=lb}SxF=R!=&e$rFqY8I()N0M9Qdkl8+yMP2*gN%GhR8OLa+C+zK zK}ynL?w9sqB?33Uka?0lI$c(SYlJ zYG`nV;CE)c)@C|2kaY?=aui@n6k zIV(0f+3yraH1?W+IZwb`AYd*6%xSVG=R>*_n&GU#T5CmUY93(HQq5j5T7Xz6oOy~G zf|RJ&^dFkB-E92TqhmO-lG6n<~O&|3IB`&E%CqP<+G4I#{4-RDoXHUxWJAU%c(#S-)Kjl zVk!lqKaCer=@^WLNJ${g8?s$N0RW%8*!kjSfU;EcJ%BfF1ei1Ar@aS)i zqz4h{V>xE(hrJlO4VhQ zldVHkZtTUu|44!|h(fhmC|(lr%4naPm10^M0nfv_M+J*1HF>o75dmqLZ42bkIHphyKTj zuve1=$G)|6NLx9J`q--Ipm6dfq4EyVZjy~J#3(s`qfbM)V*YQ% zDms>PrmwucRXRp_yKKCM%G;wFXOA$yVooWr!X;e_Y1E-4iTFAZs)875=2Q}64CV}S z%%15$1~t!ZM38Rypv_DuU?z<|#zupWDZt((`D41sHX>MyP>fdwEtHJpuQ_77Gqhs7JK;hWIIOPoF$p;^xpG?l#Dj}Jc zRH8om+!CaGEnFA@DRg%q;|!3;I3lSxkeZnyP`JTOF7r!TmkAuRmktR}`o;WU&qd3w zupQcSt;>>7&JH$ib(d^ja$)e5RCh^i@nwM&wmO!M48D?#;#nY1gx>S8qMGPBz9lt) zl<;G(R{qYoSadcQ2%bvnv0EV;6!Nu-M9G2S{3ZmhHns#i6aA@mG2p0OmP!@A#$oDF z<~ykLSn_2_hpqy`l1$gyE%}MZ_g)g~K9F=;&cP&mL*I6gAkm-LeZbne7WzCulfYV; zMMUnU*0#!Chqb7M7e_%svH7)>FKoWNBfF3D1f9?Xd|Ku zhBYWUHug@&?!sOVw=JEBX+LkIw@sjw90|jiF9xfsa^7Y#QZ-vn3~HlCwdsxcA-nji zDiHb%vG+F}#IvZwmk0cda(b$5b!H88`3Nr!~BylI2 z$#yJlJ*~F(=&9{Fw8x&KwrT*Cgg_E5Lckk})d*hpI9h|3BwXkHK5Ne;0d3#+|KE?# zhs<90wVw5?wVw6d7M`Ejj#B%xk|xBi9Bmzhji~OmC}W));CP9;_TkwX)4o52y~v?vUSGzn!hA1-;; z(f87Qa>9;9+X7q0YrVSf^(7%m`<;vnWSg$HB(dQ+t&c$_3$KvYqpt2e5o%yVcZmv< zKHHrvJkL(tt`gso8m)a-N-vallHVpC5nBr=2g$^YPbOIjR=o}*w7GY0vV&w8)aq}Dl31n+B`+;_B@u9wc-{#Y?YIch+9vyZ6^y~nW_4C2i>s#oBf&oHuvT5 zZj&m#BHOzBW^!-0eyz6RQn1$S9O3;qC{!AUvGk&24 zbpz-pMp|ueK)rVXN#n2+$>~;W%tE9D07`B+O6mD)cn39%_vUW#?(?3?$uK=r3mbYF zkbt?9!oZ$=o!;VYB>%(Da3=w^ldUCp3z0^53L($UR|IE5v~5SK!lGi^pH|OIn0=Cp zPFv(+fIKCoskFnojkNwi7L}Bn<5#JM_JwoP30m?MAy14W&d4SGwZ4HOgW{j>G7pI^ zP#CYtu9*}S)D_(`)v;u!-SU7A#fivRlGdRZq%(;chr9@JP%zJB?E+WO%|Lo)?o3^W z(spcdc|$<%oI;|YLEa$nj^*bA!erskE|W=f^$`&6f2EQTUL)5ObYZM>!D5MKL9i+u zVNI924dtmIB`?4j17?apwbVvH{8P@+ErIlF+le&bv$yU!H%i|RnsRVQu6 zQb7ZIo~UcMM47H1s@}NveI+5=eIAK#Q+K=T86t;fIhxyDPx7U3$8^2dh%|^UaItdz zJ@vgfS-1`5vZ(7c%Go!98vs)2R`~qH1A*30oj_nd5HM!+P#Ky8cD`?uFIhO9g!R&t z+E~sOK-F%RzAKt9|96LT95!E4=}*o@-${=>SyTWK3Xr>9vQAvObVkHf^<7y)51BgAfJw0!UYE-9`6ACLvk)-VE7m|0r4y zN_qfJGhx=fljs}xbcxugmCl6HYiITOTG3cHH{b5wz%0v!SunUtB7On{R0Zs~8d z-mWlaL^=x({gcZnX8~F#nbrT|Ww_!$Qlj9tCxih0oB4ij#AU zy%$;PuZdDPt!zl|C@N5sAX+sr0^%G-$JzL_w6asO@Er0h^?dYUP*r(Zz=bOxP_rD} zQg519*ka{rJKQms7UnXCr|5XE(m)hu<>UON3)@4WgrG!zAt46~xl}^d2?@E*=2Uzp@zgGLwODzn$P6N_Um{F`eXuq|xDyox zMkudfZC3xcd#zi(g9V13$4FWW`a=x0)!QG+FrDih3&5d?E#XV`84fR^@3Z;!^E(Xw zON2?M61OvPj{5K(x5JqU{5+E2<%u6j$I!+OAC;fl55-2a);qy*oO3K#(DI>csH#Xe zBV~r}%`jH^9dN@*T8}bd@{Bo5Vz9)tCr$^T((wfu@_WXd1@dDKi|TU{x(roof>)I^ zHLo_Y+33iOYO1hqmj*Eg6`xyR&RmenHdEE3n^qS2K;001KkXG@9N&`-+xU;SCtUHc?CP)X^h z=9}ty8{+`VJQnKW0rOxWwyL0~#T_mT)-|svh*e}*>tL4{2YTZcO{`--as=uQhDUJo z>KeK<-}PG2Apsv?b_g6k7M~=sky)brFwzY(e73SZY1X$%0_l9o_@%Drl zJiJss{Ctcr_w9{@A=rn&iFVz!UG5MCuJ1fB#IfxA36X!Q_#22{CWOB0B2p4%>G;cu zzw1niKTYB%rQmQ0#16=G+2+Dbs8K zP>ndr*k$eDfH4jnW2|b5Kge5}zs^fz)?Zb^XL4ck*6$O%UG7JGht95WFv9W6K#-(qLWR@6k| z95%e{b(s=-nu@7wA&kJyk-+g}vr3uR;oNGXF9x`g^zj$hX>zrggOd0~4MQB}n;bSF zvt?>QcodY&!6;+}`rW+C$?mr@jtXmTsH$0ak|%(+8laUqQ)_O$_)3%GZk{YY5hSv_ zO85@*dy%X=e#`h>$?tR~sfLn#`uVK0KLeHnq>y7CpEG~6uQYHs_i;Eg6=Y2mTJJC* z;@a&vyA~kB>r{$g=r?9u^;^_dWucZJ#5u@a`*W0$BWDnJ%iPW1-3mBL8wCI`KbF{# zBu=x&?M^1`QJCA?9RhM|F|ARgP3EzLX8g+M4rEQG><)Tt(bGbMku&X09a`*#niMS- zng8x|dx8jEQVelL}<}x$*1}8lx|FOBN$rfohx(+}-{W@Uo zG&*?DwLKbq10rpiy|cxF_uGWRpvvbfr&sXxQv$G;r|juTrAn%#P7i(bEpbF*}tx)P`#mG`<)tdTN(}vjz z2fL(No7h>c`8vri>w-k(!%t#P5yz?7jz|{p8`32Eb}NdXzzL4S-S3EIFKe;4rn}rWD@-x8do~qB z&SGeJ&Sr+32eUid=#VD{^PF3?WJgb+Xjnn`fZVJ+s3Z+r_Zf=~a0z^d3DZ4)ouh`B zTsy`F^}5eC%AC@Bc5yXVG$52yi2%CmvXk>C%F`uy_Kgzdu$w6{`lJ%;M7=>89;v!g z-C|{__6n#q;Ms^Gp(T?TjAq(8c-HMtu}OAamfpW?zP>e=Soj$SF0*ctFOKn)EJ1J; zs+NVRl-HqW;oVzjOQvpGEi4|)XccE9_$aF)zjh+d##~l zPK;`ERZ1iiQDVHe(fSf)YDkB&gj+%%N(gD1qQ?7$d1;x$o7Qur)4AMMbrrxz@3TbM zJTHh3+>^;BHGUJ5`%GwiHB;c}Z4`@d zE<~VAMx(nSmqLxshEp3m8!-lMMW_E@8N(E#4>r)0xpHdnvG=(C_J0S?1{%jHD+3Jp zafY}HNKKC?5$K4 z?#7HVr`RWNZ^U%A73oaC|g*h zhd0SA`ct!*_*-c+1~6B(8qGs-0`2Qs=CS@ru?=U^zqs(yYF8Hk} zlZAE&mVT-`KdaxTc^=y$Iv8WQURoO|8LGm|%4_8@e}?XS*_!_s4ueZ4V`CD@Zp)sm z$F9r3v-P;fnHdcV{m>AmPlNC;rxb~#>mPr2I?8MvJkLWdy7MjFiJQwKA>$~g4DSYx zm>%*3UbU{9Dwyr5|GfY-HajzjjLX^P#5L081vO5Q|}@x9F3_dFVKZX!bt8E(a;p~{fipTT+io*ps;9J8`| zTz~ljE=+ht&D4?zqO+?r*hA@p_2VZ8P1yjT*`0N8<7-!FaRdtq1wP90o#IiMuAwVZ zN45xP&7t;dDBPi697!7@uB}vT5Zu{VcY&FrOK__7Ne4{6N!Ha=i5Z8YgW$_qVt=Rm z-U^RJP_eSe&qTa}`j%eY$<+6F9<#qxN+5Q521%t`B_5Esi}r#aD-CNE`xobst1TM} zPiWq~^dn$CP}He@u})`a(CL?77OuIg4X&7?!k}g362q3aSkCbGo*-Z|lQ^-3c42RY zYp@cBfHtpP>vz5=#!++O-yDSY=n9(e2@u+YCE}1qd$B}dec_8}0F|Ny^nTEzeODWm;9v3alP?q53btEfQuzD3ps@@^1_vOvbAb7Q#{>`pI_PK`0;1{yBI zOaYbsWqH>9Qbtxs;?a;fL>)aGM;D2@6sG;kZ9{o%)^UukkzroPOS%~0>@4>LTGbQ0 zVzckHJYWLQ98bO2{rBNfFH?4d{!Yf9BwVvPb8=*eESO}wIe$)DcFFo%Xx41)-8*(` z&3j!nEz29O%HV0COzUn|tYWM7?n@;tZg2-0mOG{P_#COciK6naCR9HpoT@coR?N{h z2qg6ltaSe2$jNL8G)(B-%Wt|Bj5<=KyH}6fLz~9_F5}}jsVFib&~RfWVBk?gr#`V2 zIRW+`XUSm;yR0PPZo49LilmjB%+nqQ!c;|E!G=*{wiWCeyy~?EPpJNM&wVD{38mV@ z9Z~)J_gqK=TI0*1iOtf)D^|7UY(>O6^)6?%b5jG3-!0bn4l1wKj4el3?5JihT7JdJ zg)q3e>sxy4ieyb$b=Xx?b~)F-hS9i5Ncz7$)@u)0fNW){-n6Utdk6mb+s$5G8CyWE z>HQ$sdm)p2m;>qCp&IJ9u(1$tBN8&52rk@LnAQV^&AEr(%E zoKTj%?c{u@YQXqA*Ur;j6!pu7F{ zF?53*L@D2;18;fSXCddHUo)?V9r(GhY?s>yA?g|LCAVv)WnG7Qk*wx(tud%3*+=2s ziDc4W#z`*+y%12gYZbFKK1v7|lqZU;L@T*(kmIgG<%YHjzcZLa7apoIxvRU{2XEMp6 zWG)i!P*tEPOLzA1F84C>>ak@R)^n0y*;T6S*O6Tj6(Q5GDI&<3hHMR*A`9o){@#76 zYmuQ`#s2QIJQaJ{yE##JT6aoCRoh|T+9xV@wNh7A>w2|x$+6+z)tPfL5hSV~gB5TV z2#;!!5N;w>NuN2!C&1tJ@RI%mhiu<);OKJTl*obOdQ#w>M3{Cr)FuZ`7rJZsM!cO( z6~FGO)22Y3HYEe6jp%e=BquwQ7jU)#*^=yD*(WLVByIrWYTqAxl5V%o z|8E&s4=3sGA!EU!Y#CTI493+xj6Z;D9bcE{(H5ic=t`e&%c@Ioh?axBw~L$`!~$lqXi zA%Ck;Kcv65?*+RO@tdEJw41_3{ME!4&fpxA2rZ(wUTZnWTVmQjOU>ycm3zTAm;F-N z@Y;R?=$B+eRZX}N0thLjnh0@NG3~mNL)qRtuqtydAL7`EIE#7DO%`5^@r^Dr*j5Y_ zcSRDi7=&eF+XI94P=!iqUNd*Ym+?&Mv@gU&hi{j(`ZuL28lU6fuB}7uJT5?E@uLP| zyZ`F7*>N!QL^T5OiAetD&_#d1#EWCmMLL|HE>3$FDpLOL$O8rGC?8@p<_hNZjsCEwzX001b1@@%B zrf62CLvV!j+f+ImQY!t~{&YlZn7t^FF1COujEaN&?+h;xcurC9e3){=wrKb7WzQB) zfWMPJb2{4n&1Vo1IK$tRVnI}@d_W|X5kQi25Fpb~N$eb)Q&UVua-NWXFkl26YwX6+ zf|Ti6Zv7f?(ATy>+9av*&fk3^JPK{RQ}9@>kViei?V0pBO9J!g4KfP6;?)V4*mK`M z_)Ef&yKdrdcDR(kLp}9-iA_y5%E4;N6@ExJW!_|H!}(UM=6{w^Q>=W+dJ0(+w|rAR zfoTe!GrlQZHE4FEaVFtCITIKY%e`m_p7(+ z4P-U9SRdUcP5X{{>bH>7^PJqp*zC$gs_VCvds5q8N=K?^=4i;Yy^vDIPYY0x(UOkD zS;;Hi%k%M}+rW0o13@hbx96p;mX8`m(J^bNGm(kD5fusV1Gj1Aa(6>{VXzDue#9ZA zwc>BYpHVwBi@)*Ze`IgO^o=Cbf`jXm3nA;!tM&LtGYs{l z`JsS0F=SfG=U+H4WGq+R&lsM#6fG_~b&=Ls0Z!8LYssC~Fq#b|x6pFr6vKC3WVoI3 z^kvqU46D9p^=`xGh&Th$iBdgn43dJ|4;~4fr1*b>Ra|3F7L~}9)PB;LDVXQ_{%t8D zqrQWw5xNVL7rF8xVqe7dwI*bCRv-Zn6fF#x7C)6r?IpmMC{xYj|25W4|AQUCBuHPm zDn)~j%N_N6YZMVFrP<|OlD02UHveHof3Hd1Qe~a2=c1vZ;)!1bKcbVVV-I3H00Pmw z?Uo^!9xGf}JH(-J*O_GW9S={$t1cM}$cQ<-7-H)wL+lD?-PXsqjd3KzV-Q(B9dj_r z6qK!woGYbIm(th@b#hfO_NOp;Pi4sYP>Yo6nORm7KHpk^g<7iHE$@DFw>6x$IO#US zl}%(33hv?dV53(4k*#f&oVyOHl zQsk!IHNA4#DIw2Gn=wXyz+LmqDXcY50@uRZ^r}sI6@CInbddB=&f_Gt9L}PJ1ttn) zp1P~)ND_|tPu=$KnW^9RQt|ReucSAoe#5j#xPGFvOoK3$JU_#wD%-`6=$z4~dFsjt z8hx`ob+0iGMqkiVceaYT!c#Y1eS9w*Hu@?(b+4~L9 zV0_PyRCV$FGE=1GS!t#7=%kB}~* zh9H^eH^@oUo z^VEGzn$h4xz-HWCxx# z#jOPo1GgXkj%;+U)2*yPqC;-yd3E|6ax?DLe2-I7VY{8Gbr9&%h^hsQxrdDdf zkKPu4IJ?5L@$$aJD5i=Z6f1}uQc=ZsR?xhh_XG*&vnp4(aqJ<(aZ9Z^s@5gWpxIoX zT#>DG1`@fred*PFM>Nk>N7&OB3S&L?J4qAW(XA7=0UIn!lDq1+uEwQCb9jQ-Ks1L~ zlD!AZ&F0w55;!{dWIEd#gukD7RUHg5^^gWEvp_N2{#M|KtzW`ZCpUiT7>ann_V-DV zB#CX#lK2sz5Gl}Vj@}xXC0HUzl$e_8np9Pre1fQZ&aQ2rFWsx!W$BCfjRv2R^_7i| zr`eluOHs)u%q=tjt=oq<6!1JR9o4IP$lQefFWr#6T{&CjQp=STda{j?PT~`T(O3BN zlA|fvshP)WKdPa=@ad(^xX291{VM;rRGTcUSM|)TVU3beIzE=$wWKdq>9-6{uklTe zxYb;U1cX(6RW7s6DGH(pd;(LiDVpc0|2{)g^EX9i%e^#PP;N5QB&Glb5-3&^2SCab z!->rdt1RAx1&^RyF1nR+I4=$qFQn4qkI0f2IYr${8KY*t`n1>TQv%=M<0@8`Ik%rS z?!ffJYhB1Sk3#P7X#QrMShU1?k)on7qkwTu_}2R5JypCMhckm=dhFktWny9#Yqcg> zNi%ze@9GyN z%v5jfj+%IUm%bWyZUJL`&+;>*!{KoQHQS@jkuKYSrW%DT=&p5GA0w8gDLJJWQ9vDK zqF!g8Qk_cTxCU{@xMJ=kKz}V}cU7iHEhCvO6NY(9|s9yhH;#LqXzR{(9pp*z&}- zNw%fw-;NY&HOn(DiVO?kQdq^sE6Fgu)K2(Tf5KNDMaoWJ=&8FzGO)Q`D8Fo}=g2R6 z=mhy)&a#wWjx!Ixasn-2`>)}p#2xB5vRWR6H0oiEK}w@RP>PDmG=Sq3)r1EmtBmC_7HSDl3&Hrgc0q4gqZbpo z;no~24xh>2$-KZ?bF{=$FK(fz!5u#i>qM%Ge`SAU#N|nKfqHg)za5nsf0GaC(sKDT zPySTOpYovjae6coz9#+@87;^E_S084y)K;5$iwk}7v71`%|*5uS6C1 zpT6Z#d@DJG=MI612;l#J%i;g)Z#f)p7Tvu;Z#kUXVDC!o!Q4p)z2yLoRVsGN0!^HK zDoTDqS_P+jHC&Yrp#>&x!p(=LUi3`{o;N6mY`RRiH);7&U()7QC@ZXfCJsj{r}3mS zq^#gDzY$-479>N_It+z#l4<%them*f~(&gCb>5&x)H8DJ3s=;;_&xtlh^mufm4ki@TL zx23PK!nrC=xIyum{c$fzJ{9*}cB7Qd^$)N>zI}8ky3{N7*Mt3)`YX&8?h12?sbz)C z6=fC0y$EH*kkgE>t@hM^O68%dpXj0J><-MfxdOKNF7X((vQaym_1L`jJablGxv$%E z?^?2&vyRHQ!N!l%Kpxeo`-Ob@VBN^;Lx4w~%yqUWJK1m>go|@exOSDJYU!O_=;azS zrtO8Mg?SRopTd_FengRd!`9Or2LtBxV~I9rXW7d0s;*tuup5MGgL7zpFRQ$&Lg5T5 z5@1ls`9`_C2aH8C_>(ML$xX}hkR8{(Mr(nL*eae^ViKJC~jZt z4f{&>OdWL>j?%7jn;K(lUXso04cgfPZLb|maKw$K)ISY@>-Akt0P+K}h)F@m5UvYSfeE4oZ%4Ho6#TX?f zLpuL-hDP7@0FbS4wrk1Gbk}(bQ=lS(I6rzJ0QPo%zwV|e#j{yiRG?gudd2E}A@8O` z$h15p;I(f`*7T=X@HVR~l7*J#sn&URjAEB9Q;j8EpKr<$Hko3tRh7riYV5#prK&Gv zOh4*~6f3t}*2nXhk7(9WsO!jRJvPhBdl2vgor-Z9omB)AEioo!<{cGx-dvK}XSwBv z$0x{@TRVGnCcIG9UfS<4%q`@A!ilowSZMBiOPQnf&K#|Zns15X(KhRsvrxjV8lB`p zE~Bc5jcX$Rt8iRGQDI`8@NbZRM)ZMt-_-vkcQ;;4UDH^Ajdb0f@QrJ;c|Wr${k9ZV z>Z#|XbQ9B(4#4Fu=jo>2Jt5wjn)nKu7v`Kk%3WR86Xt!Wj|=#o%J+q-?=$!wWk=`K z^+eX8Kal}u@b|d-drbX3s{S5Pe-Ep_ht%J`L9!1RHJ;~o3q>~#W=*cwth--u256`=0e|8fQte1}J-aXY5JDbF?s5-Z^I`^&h z7m#3;vF1{~1m>{E4BvnO7q~L@VYL*e64kR_qIOwl+fio|wJ#NQsvUJIQO&6+hl+}1 zRU6y=p66T9)pMdYT~?io*|&tSqVCGB&gE(|Agob1YqO234$)HIbovBOGJHMM&1btY za)L;97)dScG4n@ZI_!ne^M_F6RZfn@`65k6_*4G+7oqC>H0eoJt zGbdTNf-iHg7)X--zK;cEzAFMob`7Sqyx|PXRt=@P-76_iy;u}>&6>WIy!Qo!op`HgE^u7 zFSC>;wP$NkP=c%99<)X?kU;F#3>*~r8&*}~q@X)k_j1@BUDc;OUy$ILy<7SMjqoHZ z_FB)u_7nxKNh~+Tx~T7t6!f+^{OG>ArUv(hoxz-AJd3Ur$7OPxwTWBBTH8?*{y}nU zSmS@0Rlp#kWkzn&`tXSXrJl>tq!Sz0M~gbhpO$(KQg#oR-H9>&o;Iv;XwpHGpK6#q zI{fIsVtiS#AP|jg)?QTj6)y-+Huy79{)~}79^;TdQWx}L3*dQZ6ZdFycLE!e*Aj^J zU&T4l8)n-&>U2cscJQEI~svhR>Vf;FcFYeTD-jU-uUIlR&;9h-QkgquG3p{96g<91{bZZ ziD|W-KnF>T%pV@vW7=gSahN!v;L243 z?%+_Q!qUvw1LFHSS=gN=!dX;+M8HumN7_ z;Hx%;4_#_gm~B_n@UNHRI)WQ~Z5g1m}NuSH@MXjtiXlk*$LR92%kwioFQ z!B;)?_tIprj{EQ*KsBxIt8m!N4dN^UXZ%h!wrFsN%<35UD#>JRnL+MwIUV^Kwl8rJ zIPsn&+*`X3EaGPCdi1l|B}dk*Y91RY(5vR|AiEa}J=u!4P`NnIwEhc(k%+(9B~=g3 zqzCI|L9cW8spIoVK9A5$+!V>mJ($SM?Pkt5f$g(qD37k^V%^4hbtWPFy0RMl{G353 z%Ms2dgp*ek=Yo}qQS0Ohrxe2E1RCzFOk~M!V=rWQreL7f(+*0m+8kZA!&Cp5M8N1~ zsLc~wsL|oKx$W{<6J9L(dpzVTN@t!rd9Env`{1quJcMN3h1Td%m#1DhhMt!yDzO6+ zVL%~45dvJ!Z+mb@@;JofFuoO_fyHBxw8B&bP&RNLlnBB2x?iLrj3;$Q;joU-36&z+ z6Cg@>oS?`}wX1e~wqc`#$5Uhe<1*~{yX5vfAKWqHc#?x|EOYQStTyYjfA8P+%p>tv z>BS7`Ph^5>n@!2epPFi6BrOQI;$ozf?%HQ%Dm5{K(TA5aa?gFIu=&X7J@+41y#;$1 z)V2mSC{NuNcBGp1XC;#EM=p&w!JYsZ(rfKS8JdZO&SuIYuypMR7H_u7DpDPZ3CqLT z74&_w`mIEk%u@>Gt8xR4x4?juWvkV^zd9{0O)cHBnt*$uyG*Y_i|_;)l$qCNvbKkp zt>&@K=B{jaV0f9oY}Km~uiE3se)GC1ce}l*-KSl4A5T4A%2_hqo;tD9vKRCvY-oeF zqW)coJ*k%`;VLY-(aCUeRKt6{9TnO)pLP@Zyg@lk1;c$4g z`#2N1v=jtdDt6Q|vTaJbb_h8!(ls-0rykA9L1cCTEW`mDTBQ9_m-;1j^w{YM*3GC+dfV&Fb@ zoTRUiEb_pJfA05$+7hq(X>H==P>RpaPVvEl-KELcBM-4^Dyk0YRi8&!HAPpw!0U0w zk;^>~h(xLONIA!V=Vzii8@n7yQLg9y0NR&-Bzk$_Fa! z<2^t71z%?C6|tg>|L0aF{L5A%Zd$m<8FcQqnje;-RWw->ACXhR_G3xJ3)ak3goxmX zXtr)jMQkP_W)@5L)+=DdX2GZ31TFY}bpG4C-UnH7C%ocFM{gYbB8g{Vp`^C9#Ca2T ztF5e$A0ZxzIJs;u)^Qv1I+$@A6tWU zBG5VDJY-LDeW<60;ThKa>!4Wx`aE15e3~qL;3)IoHv>wQragKr)yCbK(<0~K80)4b!}$Bt zWmtZRXDj@aKJSbzZcgM{KcqIhF4z~4HruTozhGxTzVU$FNdz44EVa$}WEgNN3gA?X zhEw4cBfivKBjq_@u{b0}_uslACc8p~g`YFJY3qoatqt>sw^;6mU;(zIJZmvND>ABP zRUb?yd($3J;$ICni(Lb%0y2bFMIc)SD;2f<;qzRG2_bcls&g==~j>mxC^W3AkBG*?rpwIeq*f$VPNG5#q;`y!E z35gzATHhu04!B>GMzDEcLj@L{)_0X4=$fKQr9D%Z;5S|A5_7MkQ}LfmU67aOSbe`r zBa?OgOCkploo6(pQ2|P6hrqm9F50WFCa&Tp>o2<`JlXSHMo*w%d{%hWG-t%!I4h$} z@`$p!wb23bP7sJq;b-OQ;)H_q)cu)38ZUFg zEfhZ|>U`%9Ha7hAI#A1oD_*)se7qd*0~}R-Qb?hRxl8d&t^Fb58O0o-NPjxGqH+`d z(KR=Y^UW~q)BJPzwtjf8njE(bexyWvwTFSk3O601 z-?9AP@?+ftaA@lLgl`WMz5r82bfhm+S!OKeCo$}s24KwC&@60sm|gkL@MRsVRgHP% z3bR#<&B;s_{)Tvaj?)U&3N*@Zn$U-%2golF8efp+TLJTsnjdQtB^sZRUGvDOq^4-~lc(sk%fhhbQdR!)SXa3j->(Pa$r( ziFQU9ZUg=>WXbBrXKXUi$hz|Jog=<%I&Bb67>h7*2tC1V?(D8Fc6HK-R^qiX&WeZ!n-7BFeO_>6G;4_Jots6 zB}jveH>^ZM{(jn_RlFlHRT=Sx>@Tvi#fwV(Is&Yd{`GU}nV{8n>&XeUS=y}LRFy*3 zg@f}6p5}`qPd9oyk<$VV8J4kT;2v>+MaZV9)+P^uRTOuiWH75CD+48jIxGhDfg*ut^2jlK-vjm*+$n@0+_(;ec0z#j2{d(>F%&WN0?SGBEw91S)E z9!TO*MZfPUcE?y=haP1L{{%2tiD$z;H`)t~BSkB>Dh`spsDMwI$PE0_O=Jc_DdI80 zDB27bC-$ZKaDpD|#v;M6*!UW#EVEZf{TGU69B*@F$m3avp5FajP~&AQ5oJ!5V4)Q; z!OqC56#AZ!X69@>@Ul%J?uraa7XGi~N6I9o2nSN#I!OaoDJZ&zNnz(!c+4HRduotk zAQwmsonXUADaAq?si#)h9=>><^@{d%zzc!>o$=P&OPkf}GmX;RYuWK-(lLio+dqKxj` zryJAXbwq|+UxAgh=#J^bt*Nq-%)EE)s+iRqfz>tC&aMQi7Sv3YlOHD`Nz5`gE$PO4 z?;u=*kIjy7lEJCJT()TZPK&W=yu$3ZI`5TN!F$5ais+>ks1l8_8X-heTCEATQ#tM9 z@2eI2X&4{2$1+#G&EKNcuLm2?DaXK(2g+kNW@tu}NXRno8C@O=c8Nla@=<9u{Z`}) z!LGz9A+tuPQ%UkXk6nJ38)S9|8YeNGFoy+ zPLW(La$zCaScMfyYi5PHM*5d>gZmYhDAHB*2D7e2>~Fl66&{Li%nl=7k~mGP?Q)Vg ze1RzBJ|@xA$KU}s?loGt^uD}wq_GnZxQCXU8Oic(yX!P#Ck}9XB4bhE6CO=u3?W?K zzKiSIdAPnk<~)=FLri-?$Tu=&MNa2$Mr69#HrVy;P>=%+<)e2MS^FUu)4p%pQoe78 z`5W8PzHc?>Q8lrlsMMr<-+qm96B$W*_TeF&Om+^Ev@Z2S*y#{;>HXLC=~h=ahf4GJT!lecCLYvo6Fe5K#lRX@f-a#gJ~t1+C=y>zr`GLR;ZY(i z>ysB@lpN?yT&K)G{B?(**gfm_4_%sL?N&)g64U)X?HS>b5}mU&b*wzA(vBzKgSBU3 zR!Caz(o+c(gmaW;s`X2iLl;@xoD&;ddWf&4VutKOP+c(>kN^CsR92XqW z;Ewteq-f%Rrip9nWz$&1qJ0$X5~cn3v=_xK&$=4U9GH@tm<#N+e#6uvY*8mRn;m9Q z;#^0B-YN4K>unZ4v61CW@+{-U8jvzxTq1ZJLu)eDdu>-zY`C* zXrjPV@SJ+4g7m~#f=?1uwNthAzZ6iz zE8*hNB^rM(FGTBV(%*`@851HZft}dS+D^9rC2S9r{Xf9=QW{LbwnVVZuY98@;M!hp z%B2Mi~x7ucLliD0Ngn=7hKFApesNSm5+Y- z+Avk{UBusT(E{sd>(c;z`iK1h{o%7Ihf6jvVA7b)njXy3-cG-RqimX9p@#f z`K@0J(agQr3}p%IafsOvcR0{L5D0ndrt{0eCrI9qp$yodq7P=Nq-^E@%wzBBj z#JQg5uFD9(D+%~EEgPv7qm$fxWvo1Fv5ZPoYybTWRNt9FHCz$U5t7?`Te{!oMm2{M>dcoC{DL*JP{3D7GNt^Ot~@t z5N62Nvez%B#uH1xh@quap^GVmND9SKl~XUq9{P9E6CI+bytqy4ab}L-KKsW%u7hT-z2w3Iue&*Z$lNp;W3Omz2d#yO*OHZUO5*D z4WpLW%&wE_K;#%jEI`SKyUyfWP$F6Q_J=UR(9m&& zzo)vBVg@CG#*t%az`6SVGo5oiITNoMM~+5#k$|na-Su`V&Gcs_HrSP%z|B%u4V<0{ z7)B51x%wICYo)2xBFJZcZi$UBdK_>NqXyJ2bLDp~AP2RTJqP-y9 zo?2#`=V;CyAt(MDn@fyCt|jr>qy@q3sS}c>HW^pna4L|%aRp0!V6Q($0TK!ik;s3f zBDbi>@0=zMZe?e&3U5Sweot2PhP=Skg+*S^eTq-X`Z~L8UeVd%$z_!p;Ypt7$~@2M z8NNfy3XAb0aLpy-=}=8hR>=8ksCY-@D>{~0HahZ(9=rVXb;$P|HEwsvxml%|-^r?t z{{dD(_#7jS2D=f@4|~v#$TE59t|^NxBynofDe{xolm+>ha5W7l6umqz5Us}DMf3)@ z9=oT2oo?L_YG#{L!p5oNXa6zB;i+%p2o_Vb*G?YT^cw`}uelSzj_=U8WZ)|8MJje& z6$_jPf44&`8y%ifc6~kJehQwAlclbK*0`@JL zWn&_{&`ft%INuHxe-haM+-g6Qp-E5C!1xT_rSVyQIG5Yh*bVm3HrPYkU=MAB46VHQ zb->NyE|?u#dES@ud^9tc#e0B|wJn*U;#aZm0X3FzPZEBHoKdV|-+WmBj~3OCodw{x zk7K!_2(5E6-%=SVmY9do@J?D5O~9$J3P3j9{C8P(PyjCx3YcBKSy`UC2)MA$3mRIT z7far~Ja!?Q_|3%Y=CAB^+MzY6EN4I)M17c&$V13(j%myX$y}eKGCwGpxh#*HJ_J8P zLnFg=Q$>Y*J7oReO&6l73*AX)&waAhARju+PmgO9^ORvLbiO2e3_w`*xjc+BD=X^y z@e`<3&T>axKU5!iyv-{g_`Ps-z1N)-Zn<&TwW?6B+J?uq*#*^Fv`$~tGRBeIl-O^+ zA?dY;1?N|tN|wgJnA2u9)Ma%4pinZrCwDJitB~Z8nBO$kjgd1`ayaIbqdkGk4%hO_ zWJqoqQvMx$+e5nNr!u7RKTwHI`nPglRePBuq9lj z0PizR95X-!2{o$=Phd{DvUM@!X&NS&U2c*w$(D0tuQ`Ylm(Q_fif zx0l^X9D&rz<84e{*r|5YTJMR$(I*DQ#cO}&m{w_9x4;it!*KMebGn6BT_D$2s^i&_ z<#4ar`*4@sAJyy);j$JatgWQ7?qtmZep+EO*jk$!Z|8IeGB`f^dzM8QK}>(w(&2R9 z(&2RH?C{{;eST@Gcl1T|PO{|K-D6+1yO)Zy`v*(i?q49IK{|*O_~iQyIYfvnJXFB9 zf-BMeFnsW!6uy)9lhR(?lt@NJK$KgZlb zIfmLfq*80fp!g~3+enZ63TbR6Rh3D{YU8rGTKRTvJR9&er@L+S{RHP#6jq~|eIE@(nBSWipl*xi*c$*x59sAQjdMR)iVxRSy; z%8}8!tf=HOR)Y<&jjsY5`cr`F-NH5Jcj+#I51! z<>v5m-yY;xQ5M)X>jDs+hpxjDL=XNi1TB$LX7KQ-PyhJ5469y;k;5`D&{T z^E0chwpV_D(WBpH;-a;(8Qatp!dGE>84|Bw-YnO`N1nVrePY41w(c9x*LT+z)8L%&FQdAEYc%(AV#h$5n(YfcA%DXK8ljnw@A z#GW`7vhd~#tl!}^M=~lTQG3(50BV5vRf3aHnc$(zdQ!yR=4{;#{kt8iv_os`&>}l@ zuN_)!hr)JfxgDxjA+tsSRH~h8M?5YOF_-x}W>nF{Gl<`)&bwV!44^VgraEy^CMl7+ zPLp$V6lK~k5*Ve3=^<7Y1=nzrSALwH#qZd~)3Yd6ZM&?WKuGAm86UHh;j-XQg~g!z z`ohDE%N!B*?KVCvVREWS>m+6S7l4 zIPBrwY&F~4t%qcF+RHM%E?pmRcs*(f(=@z*9rh<`dM8jr)OC~8iA!fK}7_5{N-YEBqAele|4-eArox!vD1T{96D>}L?i?bFK;{!r9FKyv&|eF3JNHR9ByP6gMGAkjLF^?IUrn3KncnNuhK z4~B1*5q?WKyLp_VVt_Pgh_E;Y9Nr8b;ty2D6UL}mBZGY2oG`}X6Z6X;PtM;zND?qB zVqlLTC{zPdwnf(O85MnQ8*qA)qHPE3cgNQ5g~Ea((T(UuIC`FQm#+n*+srV>3^|cLfiyx6C%LY3U1j{&ySy!A^9| z;yHM~n{Af2bcZIk>*7R1{Mmh+BbjiSCj~4!g#oDis;FJ2%T8fWIJwMTJEh_4Wq1== z+Nt?^8D35%MU1uv8j>iy^AWq40;vp(q`%E4^|C2l%C2O=pl&{uZp%)p95lAICzhHs zs8l~B>{9xmQvIN?ll+59^~1tWDjQU)9~gF0$)HmG(6Eyx^_P06WwAOeY{=WG-q~hd z3uIPOD&RlHQ@G>Zi{C@$67as;1TF3eO?*Quwr~AnAdJ)K{Wf#8*PTJxk9K4%cXz z4X&F(=gtuCRJ3&E=)IWm>=JnpSnAueor6OvP zzEP8&TOcJrO_!V%%Zi3ty1uQDSTkBL60@gf$giOD9lhnf%kn{dnR1&FsPph3;!#>ao^B&Gbt^=j)#TJ){me$TVDk^vMC2 z>{CPFn6Zp#2TClQ^edPIBDV{V?wNL{5Wa~&OJIl{ zu&H&`M?8-a6sa?5FJ++RfauocNr9Jl1?y36+r$y{LPV2iET^M~x4TT{g5gHM~ zE5q*6nkF4iNB!lo6@#0WCN zVEdtDY!cPO>gdI{{96ta^cwaSdpN@3Mt?**=TXDW)L_1WMW$6r1yC7qOJ z>ZSM&fX=J848yt!QhDFv~5(|f2Nxl5w9?D>S59c`WP82S>*;99stVt6oBaPe4>+&k^28UbL#iFbV=Lb_q zd&)=qwtHgts}aoDPGQx1!Qnk;*zj0n7Cu3|9&3=^qW|Q4En4_#;eUiMp04F z5ah+nhnXmW%58G#3Fal+aRV1JHoJXCR@Md04?`wQ#u;jAx4tZ(x72d25UkQ|eMQx3*oTx&kDl-2 zQDZzxQ>8zVBi1}F`G&_{?kh-X(Hz`qcXJa9CmHbNCGu5vy**3(?y;6yE4AcibX7$v z?0G;Z&dmQ(;qyqkAfA^WEfV}>EqhtZtmnH~&j;-1e9~v0(jBsy9I^2)QTipnAcW}? zP1s9x(1V#zj5k*2Il?&@w-+P}9dt~z1C92|H2(E10cN?@VOY{Bg(sANcSf2{;ySVR z<(y5eqp+>i>V^A+W$UfJ{7Yzl>5V#u7qQ8ueCuYfShZr~ib{SZ==_yTNp>>gGiE$f zC%ep99MdBaW8@~cM#iW;Gm*Crc~vsuS|<~eEIhJZIx8ikr|~u>4{pA9n;hdq8Ku?3 zrvXhUs`kP`K_|6LxW9h6E)VchRDTtW=;u#-`9I^#T6&w(K%Z>#jT)6Q+ey;TebUck zj-CJxB0*4N`sif%Qe%cwb@!Y>-5vK0-IZPKO1s0y7;2uAYcoB*aG=M5Z|ZTXvx+}` z=r}LIpKj-}dKRUJn&A1*G#A;Qp>A)uQX5VhQRaG zp@^nhDY??j>Q1kpy&hvL@$wv@) zAowOFoXJ@!AnkmEjSUsAg_1v6cpX{QOLx%!626Ks@9{Ar$#hv8t?JQID4v&ok>i+M zOh=oZFfUkd{ocHQC+xYrGmZHC*ew3$%bi_jdrOxq;OtW7x``385lLMP{2t23C$Q`S zz7IY1KW7}t_PD$fY@dr)c38{D$>=%8Wn)~bSBcz6rxacwIt|ywe6dyKb?Q8{mP<~K znXzqtH$_U?{6lk$1$ius=1NsV;`Nq~Tp}<+P^9j*eXf)h8M}USTfpt+Z9wY>?4E4) zf#cX^O6GM`>#+Xvx@gL77Mxii3x1K{%wo{RpV}P<@W9?1tKPKVDcx@UN~CupRVuK4 zeM@?Iu^bZL#n~HV4Oc($8}LL2NYN+xIB_l|Ak1;bJQQ=k$0(OTQUg;ScMXO5&%sJe z;iUK2zlj~3*uWh-0jJYz9Q-VRA*p-@C>n&drkULVo{p(HWF*CVfS2lJ&GxYyr@ROJ zj6t&jEcMNJWepp^?YjAHx%pYB<(RC_4x;*3XVyRP9x&Q1-UEVw?=(icX11C24|_u! zjsgrcJqhy88Qu^^TEFOT#riKkWjo!TBts)55eba5es0HFw+&?6W|Gm~bU__iqqZ2e z|9nWN z3Pv+^E}3O7K202c?s2I4ZnuIoPrEnYqc*DM0RhMW{-ku5nJdAh61=^jyPV{~bZgRU zvSI8K*R0H{*EfFke;`Yb)zD;l)d48ITS1H~jp<#E@S-ct5nXuZHNrR0>Vf*W##Si2{}qw;pgkHmZsXz{St}fHE0yVnJPpXbpjBm#=TIzlj~+x*@Qe|j zZVIhC&>%`_$G#jz*Wy&!Gqurc4NskrFKhjtdJ&+k%|t1>!yDB`$7P=s#XT+MqB+~L zDp*B0Vbr+bB4OQSwbS8%c}0k6pYz#%ipB$8^MHRjUT}iczi@6dnb{NCd0SS!)mi} zmb>WQ>Gwulp7lQ-onO1UNc52+<7kZ+HtALG6{8*K87NOT_)d*VKRwB-umw}9Ur|qD zguI>3le0WpIP{9q#;xu_lt@}or|2}8TC(QTnv?^!tCf0Hi)QX^56T1L$>{v|alnf% z^697=mE!Zl`f5S{7O(|TVrdd_aKj(?^0~G>0J0em^NmhIx!DJEb;73ZWT++SGCrIz z+kD`Vxa`$$@2PAIOmVN}&VL7aF|$L__O4OZ25P2(hg1V2fpYvtlG$YCj6*EURC?+W zesQnb6W$$YykklkcYg8(Ge6ZjkD>efGIr(*pxs75yX9iK+PO9(yq4EG%gxUd3sT{S zcPBI-{zYf*1wUVa<6e%X2gmL>Yn*CWNeoNWCs!LsyvqezRp_OAL~+gXT`AX{e7&Wc z=QZ}iOH@PR?dTGJIsm6mYswKM36!{XPu*|%Y%DJss!i+g)ICT*hI1dkTEnn(84W)P zn)9tt?AnZAY(a0JAy6_D53S*w(;28>DiwsUhM`l@kduz43_c7g(kDfxYBj9a3(|>{ znI>h%Q)bLS8N0wCib|Pj>1n|d@oiM*P;;N6^wpDv#hdKgLIW_y|H9k#dpr#*`6iRE z({uk%_~fXa(cFzy{eBwlQx2IKbd9I(ViM_1Cgzc#F!P1u$V+qNdQ#%fO1Nqkmbi~# zEz8BI!u&_b$+H_lOF8cv$CA}v$QST%!J0nScCM>U+Z@hUijQ2Z;yXyi&d%aF9V}y( zjta$s88u}&ks%>tOJ?F83}fQ5S{a$@l8g*ZJ~o-WDJVygLM5p&UeO|B6kj}_Hmk4d zsjJ=&-^93X+1Q;NJSaUpwq{jjPMAlCCZ=m{3|2M-rVPc0uJ4^lt|UiXZO)uTF$iO~ zBrkSYLv%6ItjwWS54DCpvf^D?d{P(6oaMedEziAqEQ18AWB`tS8(x`-p#lpv{D65N zSo~qlss#{ryMe6S5bHYlK)0~RS%W)yw%ex}qSBX4c#OkYt4GnhC8v-fiQ6XU%(538 zkKbD82*1xueR!v?%a9N-IMo_EUzYZHl;*sRN2oQ~jK4Yjf50W*o0vbiZ+h5AQw`v? zaX543@J44ECK4N%GSxWjjC?H?Cn=ls;=PGeflu#SDF{{Vu|BvQtO~wgZr(XZD}HA; zFQ06$z_o1vYt%jKL<_DQYSf!79K#%;*hFUwc{hF|g*vQ1&SL|nyYiy2uhpF21=0AY z7rT?ZgR5rW@APpX90EvtAZwIKNt(I`Us4Ft~3EMNn4TGN8ymH?2}XVSWA zX=EZV9e07m(XOx$!RrN{d*zXU#F^=qWK-pb+F0jUi_8?~80L4yk4SMtK}PV4YB zOz)B7kQZ-5`dyza48ADmu#5fr_V1@pBCAGyvQs1A$`BAyq8&YnzW;{l;X1otA@ILq0tX>vmxmS_O zx8b>?woi^m&#$2JBO|QeQag==RU>jfCa#0bco~VQkkh?0djejr*+Ngl{U&7;rJ<(_ zt(pDZvaVBg*yObDpdzQos&pzIH;`>*jSUnoGi;kE$}5sO?aAtEG&K(l^9%zr4p;)p zf8Vt>iMF+Jz;f?gs$>SIi#zU9bQGEMmG$%M){{Q)V>>?O&giE2dr;OT)yC7>Pxzn;^?^vN(@V3PS zo`K6=m+k$bT1dP5~L$iP;=K3Bvr(Qoo zdcuX*<9VnxS$NqxyRuc3f(*c8U5}?uwAhn{=aU2kDnsVq*=gqmdD)<@f)vS8k9MS^ zF}Jk2=1>l{H>8)-z~}c$S4MR4PT8nAjCx|0j)s>zH#03UkXv)C~vEWf2 z{`>1}sm*a<6R{v)VaEv-+ha=>_B?Ob-9}HTr!vFyz%zW}Up|0t>Q4n{6y{_`PRH*> zu=ITnpd5L982RHvJc87kDLj+%giD;Lmk-K5&GWnf?eoQ)R6eptZpGR{On=Wvoo40^ z_UVOW+0~zgCZ%CD6tDh64Uz=CMVuc555N)(GnEhHqz*7!d?$_D_*`k~1 zV5=yPA5xh0d&Xq$jekNw#U}Uw!hfZ-074-?n0%b*(tQ=?2MXi1Q-{LA@lNC&-^&kh zB@F1XXOS-=>w~kB>drY@BZBAT=IJ?++=h`FZxdppD|Rm}4MXI!_E7RvWL7)%GuRsR zSiO{IOAHh@i|}F&Ov+;V!A!R(m)+%Z^OTvEdDrmBZeT zkMHTaug&v79{s0Z>lLx8VCA{@a`MN&03NdB?YEcIpmg%8jQ?y{-{L4_T*l^1ncxUI z<0CbBwGm(RqB}1CtE0TXNU-+MaT#IjKObRe_5Xc@tDdz-Si$l9&qjD2137tw?AFQn za1zwG7E6vMfq<;h#aJKoPt=7cjwlaoQ)=+YZWzuchGPe753dE}OK^(2u;1B)tmehV ztVMog9nYl&vqh1Dj}&uI?C!%TG(9Kw;*Kz50WrU@Z(PFTk?FRVchyck_E5e|Z4kCY zEPv8HHh?4#yN1lXndc4^wP|uLKJ<^Qb*w_5saz z+;guJfG8}&^HsfE_Sk3V8An`^+1A#p)AWG#4xiD{@uoxMF0576CAJFQ>FmK?)rFus zxRZqk{%X(6UxnQzuNLe}{6X%j)DT}z`7|C^t&%}xwWyQ9AI{ZkRym+ezeN`7D%J97 z^u}7qr{Q(PXAob^ni9TCOpZYj&~7|m>U*@Pf%6h;Ksh!Cs36|c{3pCYc~&~j8_crn zx89zU9;|ZnW%CA~U->oO;FCoCGv1)X`WkN#;W)I+seOu;8EM_s-->1O$-r!4=0}uN zyupYaYgG(n{2vsP|0Qn_-G-D4FU3$ZCojKSR0s|#(fS_j@@l4egRvDExRyY&RBpy2 zSi!toa5pWslnncp(9l z`F)?YXC^^yPv7&;dp^JS<)fLk*Is+AXWgFltmir}FtXac0QawNT$7|3E~8n ztJzLgD4H3V0)ON3P&7}hZu;Rv>R5WP-pe<&zo&rL*b~~36a9^RzW(D3<*Wu9TUcQt zlMU@CjmobV()b=R%?$=Zhfapx`y#X>O`-!>bEqgdQ&p00%?w4a5BNjT{(*5cd7iX= z8o}kX+B}wUS8GZGtf@=%%x>#4FI3<8uy(cepZB-Ulc!-k>6xZAEM6`PXf&(8w*FAo z{PZ!qtaP5U=)UTEt?>E0!WCf)<7_lBwCvNod7=lw*s;)eo8P%hZH(Gqg0eXI96d#= z-4nFhYO;I2&F%cLe5)t`cF$kt$hX3SZHBw{@j%PZdA3Ov5jKx-UX7k2E{Y7W&Zo#~ zRRlJmDl%IY(Q0#T2=H6_aZYb2QZRVouoPT4n^?^3HAry~SbjCrYySGLN^nqnh$5cU z2_t9sOF8QbmlCOm&Viz-5?|3(qcM>h7QQo2BDmSYggcZRA9G-hAq zs#LRZqcDGk3!Cqra6d{lTI2(PyAp>I&O2Grhz<{@1ggLphlz0(3Qp@P%}c3f8p|V7 zz6^EeEXY9^Yku*vf>OmYf}1;5J~Re@!Y1tZUBPt2N2<+{{;AXHMSpwp+f9u+CEK;2|oznGzSMk zNA%EE`nuih_DG*a;W{`Pac6*~+&I5q%H3y+5#xbpX*u$w4Z!d} zkgr2$Yg4|!ze13YlQQ&g0^*;;011GP4F!X8v$f6qpl1xeE!qe`QDQ@Z`?>EcD1IG> z;w%Nlr$F(U?*2>+Uj8K%$vv6$>yn5kI0hU4ZXaP)FxbN*fgKaD3FjohqvwR=W3crv+aIA0_adMf+%xe0x- zA_nxKE~l;34o2bJj4O#oC9w}R3~6qLAV&lK)mOf%fQYcfpg6(!Lh9=nm|56C9@@2 zjQ}#bPf{N}%V2@6_XY9@UYTtk=XMh}Z`^Bq)Pfdo+L#a7MMFxfTT80|RUdaD*WJk} zrFE!FSQ(O4dLf)bb))7s%A|>2=DN>k)ic~JYBsfN zxN>bbk4{XYjy&_ns$`bHc)v=@5pJR4+0zh0bNn>@Ni~%2Zdv?zEH{%OgCQ8;3mLE( z3hU=9WnHyr)JS2rhU+jn@6CN{*fUBbvIpNO&&rXH!I*m0z(n^(hH`YAy6^HKAJx8p z)93CNoaHZZ1t*}-q#Qz;uO8>~aE72_iFR?7P0<@~*lx^mkcU{$e0a3%rlEevzVh%; z2_`0ndN#YnT)}Z5%M&eZq?eiEz$u(*D=yM67FKUrAL}_*=30o|7k1AQTmo4qCN#f0 zC|f}-do(C*_!BnnN*ow@ra(w4aS#Cs%VItFS$wf7j|id-HYcY%>|cw1vs?%`@}>%- zexbNjWWCPzwR)es2?8MOt*Huo>r@cZ@d)owC|Cs|j61G4Ej%jShk4G%2-8l?uKEN`mU#b_=wH z<2^haWfhnY+pj*B37oCiiP5pt|JPA^aaMs=D{?WtxV!+#=}MC2oB~tTCIOfkb=MaZ z*Hu)LL>yT#6G#DgI{%mQe^F`ur*#!id+OhTdFgnc)+&V8n12qp0i{GT2z!Cm;*Kp9 z&X*?=nA~nvg-)DL>`EpOPsM@jLMO_!nkU&9p%dj=jiC}(2gZj^%np280TDWJ2S%hP z76gVyH}jV3XzCroOk{12jn1(ZRWC3ad95# zVy{|J9wXR*mJ~RDHq&*9d3vvp&`=P0puj4sL-04K-2<+034`}|CKD4nd6)LkNa$9r z<}jF3;L&Ohae|SWrPchMJnbhJ@t)^fmtMi&+X5r`d#6@Alw9h(gc+&Xj2K9<3JGfw zJ<5Z=VHT65PW({p0=3`kc6_E;Z2ZB1C~n0+og5ImNOJ944x-TnQ@o} zUsVPJjeAewKRk}3=H*~Idpx8omZr+YOH;76p;TMF!>f4?S=YmQ;v;&B9}ucf4HT4% zd)?By@$fFaH9p7N!cW3BZQ669D8(4(n^VBV!ZP|ft6UnT#jRx7Ez01Z07EP|e1%pFmbxcZq_?_Na$B zjzA>f$Sw3m*fdg)xB!v9{rCEHSG*R4Wr==$MpjS1&Pn!bI|E)WYvV52>9Jb^eM2#? zR{H~Nl__`_q!{xW(tdLklC@dqh8nQ^OpH(S#mrF_$J=4Rv1-T&!j$Sx0he zVA1!k#OQWmpz9QK@jnAxI0<1tg5H;)v8*l`sOJ-tade>3TU?IZtcx+I|La8 zrsgOoh^H7G#~>$=umhO0g`T?fG1><4nqy?I`rOH?GYdOJZ*y)e_sOSZolaW`sBIE` z6dMG!Rijr!zv#kjl2x6hJ3jTuVIfEs>}AU^ev&4rp#Ib7m*5e${amf)f7!@@P{!Ns zJmPS^Xy*}$vmfY(a`y%r zgAsf>(YhKD2LC8@ABv%R_4tCD;I_qHAreW!bTOauA4Xc1Z;s8QQQlVAz0qn{(kK1J z3cur>7VnAtsEArgkG~)|M>J_>>-AX$)yFCVHZ4ws2_e1u zbwJKQv22U$IA~RvTqZK5ul}^;} zl_|eOhIV!+RusI>dCc_3D!g=DcL3F zzTt5q0u*Auy-TZomvs_~6>E_hWceEZ;fTtYJw55&i5pR`2R3`-aivO)4rY8jg{JDG zY>R$27x*czLK}E0073z+ZS{w*#9~GzFZ8wGAG2MVt29om%KWDIg#Sp3rLV=LxbZaJ$SA zfodKxyPzY$%(&nH4&;27m>~cU^2%z_X)*gwlcv2Z z37A|_C!I!?lLrxoqKbE=JpfS^5rZ=JBPV;AgX=D|SzkM+%&||tjJ^pfi;vlPP|`A{ zTx{$yZM>1OP{@gXNP|9ihgNfpBP8CbAG4}FsZicBVhXKjHH*oUj`jtpl<1vOqAn#` zCBL$&6{;6H&f_=$F;Z;x>&X^cqz{=AAt_b}?-oR6Z^2+DBb8CVH+qPy)a2wnhts0u zN{w#eoiB39YMgDw)q^~o`Ngvb?fvLz8|<$?LVRPgh2QfFxXoqdK&=508R!G z=Qz7rmP@~<+LyLu%t{fn%DU-#Tk4E{LYkvvhV1UWq)*-5flC?Ixq%|JtDQisIs$P- zN#5KQ?5}pTtSmOP<>ST>xg^CZjd%UJ#20~Ep>k%}J#Xwx2MNtESD$XTY@CqZAKKr0 z02Hc<1TJq+1zoXAXC(V>Ci>25mA)4pN%s9Jy8e~E-v`T?+NFc4?}0vDZ%cJRBUtbX zl!%xZt>$TtXSJY$BiIIW1z1~t4ol6yQe@<~zVWW$nyk(h97yLD?GPa* z?akI-mLt`Zaz{Z4mpOHFvwkR-HZDLAovFpHa?R7(`%-wz;Y3%|d71c1&dmp@O3i`y zY_(&t@7->Wr936G3X&z;f@Ms6aEP3OqqN#x90fW)>{21qTO_S6tu^#_Jx|dY44pza zf8r^z;ildI5`0t&bJ>8tdISE*c=A-i<*MKt)*kf~w4YdFL*=6?9%c2+h1?QPQb|%v zxx6C$2a67N)Xh24*y9E5Y)6>o)%=_yUp$q6EgTp`wlmw6S8u6ZY#LU9Jdj_)f5f`wt?K0JWKkb=qjU_mvbxRy1tOtHp2S;Gvnzu98Ljl~%+Ni|2<+Hc;7k_Q=!J|2G-9`ac1W!Zr^WO<5T; zW5r5=%-CE~g6(MJz6N&+?KLyi8;-muyOt4J8JtX_u}c$GT^E z3Ag!VUajO+EiZ}m%DYeUzO%gKpUcKa4m|}UQ zYUxtD#~4{=nBpQi8ptXOEmYv94zMQUTOOcF(B1H}q+r><9@}mXr(MxYrR`vD$bCMh z*otIO?@c-R;SX<>(7_H-{RA)?N=hi`sx6uLW*%d{oTAG==;S)#Gn`A&x3|5#v_mh- z6zmmV;zD0|S~ax)3LF;rjU%$prgE+XQ0J24MV*HpQgV$J2eQ-6<)cu8@D<4p+XWr6 z7UU58mU$T&akTNs4f1ZEr?}#2L15mMp_S^cD7?rs6>Gy=Ey{{pa6CR*H$L&e-z@bS z$B6(|9-j7G6-F>x&B49`b;VjG?bO$$fZsfk@3oad8$okab9bxTND+qf)hfNPnI*6w z7rFM+laWo62My=y3?0xchi+^Z<><;yzQ|zcFz5Z0&^8QCYdoG#yLT9yMJ-^c3*994 z`$(#k-|g||d*i=V@!vDzzukRQx!UvMAgr6k;&(S{54nI-t0`cFL*2So(*i~abx+o6 z#PeLJ+pE>Qpb}HGnm?<=by`gwpN6`*TnL2~>b?<=nB70nYJQ>K!#_HmM6{hkWd?fq zEiO68rwWf6f09Jr0X1K|@d92G!S3D6`FYw#k!?)pqZBlHM4zWS`b!=>+QwoT>FLoh zPd;P#hyP$faP+@^znV(SN~}40*DFPIG3fASzJt=7hfDUE3f1E@BiXjM<{hnOIStS@ z)8^AW!=F-heTtdaIiBLv0%vKf`$O`sFn_Knmt6phZ{-$Sr_AGyEq)X9UaFw>lw4mh zSF61nMwWi`l~S-Q%T>DK(n47zt2jz#DkD@9zG$Jm?FA%rtp+90Wi>b=$(aR|fy?SV za+E-#)?Ht4Tb$^I9>-@LbTO;G-F%=-NE;wr)So)!bWO3+A=TS`k&1R*H5|Q;UE1oc zlXq2Khqdlj63AamRT1L|>Pg}6Fn9V!Rt26-8Mo-q)m+}9JvfAK)d%jzrCZkBMgf+I z;z5PF@6>7<$yg^BMalg&zoG8Afty0zFa#E}`_~2IujInq{DHO>K0*qE70{LQc>QJB zW-tsE-K|H;@~c7(*G8`0B@(ikGNeDWDs_e6rNq_o!kO<`Wo5?Y$;Dwd4N}WV4$MQa z7`>4j^JOZ~dB4m`3tyHPS9Dv$z$EAA~WD+I>M z9p>cy)Pa+C5Cr3y0wUPZWmBweACgb+I9to@@aZ7R~1?(^A`X5Cwx7o0S?ggAg5Ps=@0NS zpi8(J?+P2+lo!m3V;}S-IQIv571k-QG;14{j*?5mLeVOoB^=LEGlS}gZ768z=(6<+ za!WDt7h<{%M5WdU1%hgQ4})ccIfKvmMh30+=)$uF*1#|uRvDc*tOvPY#K*Oq->Ldb z@)A((CF2DHpjTw>L)^^>dZ>p#ehYNW6Ra;bMX1OXk%6lX<`vRc8QInfVEaMnaSB|}hBl^!Za#>CIUv`f?{ z=_((${!&+nSatTxi<2)u)1puDa_uZ2p*7B5iI}-oaIO6ql1D+Z_G3UE1+hka@7OuF zk`vMM?S~tAAm!3(MEzQh%sbQsskx!^+Y%_(ycu>_d?=%0V-0v;o=@x&8y%`nD-0yt zR1OKTniT_L9;2U0`&k=hFe8h7?J7@n19aoKH0gfy1N+-$L^7Vi`U5>V%A2k6Uu?aV6~jxjrL64 zNTn|1BUEjb@i*0)ER&F7jprfFx|B|M!qe&m(7EzwhWzn)jf2t+Nl&*1%Hm;N-$7)Y zYMXvjbqmd>D7@N>H&r&};{`NKHg0|&ZB1igQ}g;9bt~Acg+xtm{Y=hfRZgBFlloP0<$GiO;Y6<7>*Bc$ z>#O?4%YM5j_fL_jcdPG*_T>E{ktbr@_}BL(@;+ry?L6(iA3*>l@@0Y(`QIUbeN|Sx zwZ>j=ihF(W$6opQz4C<#pQy+IZ<~x-7aeGzwkN2q+MN=ZDqqj!YjkU2=L9bFReq${l%mL&E}tp|mcV>v z#`U@&<8eO~N+EcaIAJ1y8aAU;6kJ24J}Q;^zQs)v7h1(U!d^I+SbV>liqjn+wlCYI zr(7G+$h7tMdt98EmzSYp#VNje60ri`8m6lIBk7cA3hV0|^~n-GE#!paycD$@J#>q3 zOb&9p)LT=feX%LeC=aKJ*QPNaR=dv*4uFgMVd?6#CH7FP*)SpSVqVI{;0rtIGJLUC zZS@#=v)!ELQ+&EXUoF5};Y<(3UBa^%gybtrp1#4Sq>{cZQ(zAW`8DP!!=%-`0~DfC zPAsgxK?2z|TSrv>7V`b@Bwc0U@nRt2(qnzpM2y*l#%-)Q)>!SH5ulEe-?WNzmlG-B^R+OO;r2PH~8*NXE^S zj~}}GfY})SV@mtN6aG{x%NyRHEJp{9O2oXxr$`Ri#q2pDO*~LgFAE`BDYP&Q8})C5 z&wXV63|}Smv=7h7^RMN4j_<~u^I#QkHkZ66OAZaWhCp$71m8Q!dX>Iuyw+Q()uTEZ zp78NR0A|V?JmKN{Nm~xKtc(KN&5m2E)R4b%9Ww%@vD^vEg(iE~ZdR)i%*!Nmk;*5C zH0EHWMh1^2Qy&N~x)`Ht`7QG8#B`A!d(amrN+VgLB|krwdnu={Pv|_6a&I$#i=Pe& zfyuM3YEYlcXE23S?AAMkZOWkG4~xNO+rvZIZeDe|NW4Fj%SY~G)dE_J#S5MyJlUI^ zuHKO_D`moGgYrs6?-EXIJRV@hN-gP(7X8_JLs35Eql^!{#*{oQl_#&=5U z5a-XTP`LRZ``9+_rq~P>rT8{p{G0t3JPHMZt4>&YUGN5-CahjjmsPD1zQ<`zs$tfZKdg-f&K5%J&8CGDV;|Tc`SF;>*+F!0O za5ZaxVT9K;(BxUkyejQN=bv;(%KX8SdYaVT{XX$&7qs!`{6?u=>86*4CKUQ;5p!9I z4eh+)fE$CK3?{PZMG^e?0_|D4SizSTYV4->dk8NE3%m zM{747p+&I@K7rse&V)msSC$2C|C82i){V#z?jKR4H7-S5ti^D+t#GWze_fH^zT_q5Vi9_(!F>w9M=8+*R zE`S$53u9-W@d1c{VCA^9^LLuRLLy>^H<@37!bfLly+~|RmooI;PIXKmv3dDC*@@FS zWh>oR%6o=xVW=~e-3=i33D*yujpAs7i~~_76+iTFd@9g~Tt_}vug=807UGlz##yJ{ z_yw2Y)mzQ$;m}aoAWz*b=vyrr(Bd6v$3D06%va8UMx%uk+qDF*b6UIusL$WY6-A&C z*>euDuZh3K6G){Pt)hHh7C~Wyz|oC{SSMuqVAbWvhDl>cJy^&HH6&hopl>{4dZryQ z9h7rQOzgQhD$MH@3p+HS!pmw3_K)ZrCFGVP)R<4$5JIK@6aq2Mr&dxSHQs2z3Lu8F za})b;3^o_uZX{C(sf6Jm;nN3cqUu%AAfqDcm&FQ)@CU0CW(_3ZH=$xgYyGvWsES99 z2x1XlSPJDY-K=>tc$tW3a;ukgs0r}5CoUUJmS223j!nGrw#TPtt?VqT=xB3l@SUU0 z@E24GT$d$FSWRF1NRY6wtv?D{{Mde zuk79b8D&VXj_1ZtP-Y11%{E(v^o5)$#EU>`lEr(37{#OmwiyFhu7>kvb4DUXz< znia=SCM8#)?xnsy#d4E_(v1Nq8V@u!H%3Qz4BoW!#2a-5qxuGK_}X-=5Es2s<<0Dn zBhOXk4S!D@QJ0FZDqrM|f<~l8bu#9Lb81UsJ)SGJK4HJ0CI0t!*)A!RY>MsB1)ayH zJ%qav(a6j|(V1{F{zGukKQ{j`74)~k-xrLT8P>Fo{tWns;cL>NXYl=H&ZszR3q*Z#&;%)E>%DF+W2&EA9gjNv!w)yxTot z2PF3VJ5TWe_zGFyWakStXy(!1UOoT^DxW0@AAoXa8Dd6~&6vL-Ny|Rl(ziy&3h}`( zv);}(f7nyB*)0S4jeY=a8@rhEnG5AEx>q?-Ghb?>JSKHQ=w{>8&(%7)AO$XiHHZhI zUrx>^LncraGA1i;e`1Em)`B?UBpw~YKWeu5Hu3~}RIEu1$%XFhzd_#5Cy+Q2z1+2= zaVRP77?}`p$LPZ?Bg$JYSE#ep8fZS5{M<~T3#?Z70CBl;A`YVY7g#8YzCyo*bdRu`=7A&E2`?b5M#eiDeaTXL7~~7PV$Upp>#FJI&S% z&Jz3p>7jcEV^AyZFxa=n%I7x%)Vr?~4>1GfZi#9?ml3&locqzqn0X_$+C+wV4N0M7 z4ErcOoEQ+;bk)?yz|0iGAE~K`nu6z4{kGbpesL-GlPI%Kuv53qPdqH$iu*Lxv7)D7HJV)%*@>2K1MN z%#PdhfdYoDe1W_UDJ>PjRQ5mC={o<7Ao~(mz#-89Dt+U9j4fkU77_@Xbyvtj&tXh zTqZox`@O*_lg^pyP26&x&-wlXio=i@X`{Y+MdzCn8w>)wUC%eBBvY5&wKi_^*4imcP|&tfa`$s>gDMO6eb-(Th6ha+XxRzIF2p$|pq z9cwx282~tUc#6+a;B2+#|JUGL{WWlMdcg4)A=q@c1h0k?PlB?e%F$+n(juTVCP8^n zfl}q(61=bq%m3OAR^r!29MibbW-XMZJuOl3u0FIuAK4OXOO*X8mH&N03rK);J2?7` zn+e3h(I5Rl7(2ozkTs!#;+BH1WFdgbSP5fd=CuyB=`f2Nlx)!qj1^SC^;GQKdv2!y zhL=IEC3?w1S8#-wmToa;u>Y$IqUz6YpH94EQLxWc8Ufn*swH4>BW- zneFaRkV;1Gjd3kz8FFzsVfAqz@oAnD6s_45Y{cG6HQ!UEqC$GHj7pW|y7V(o_Qk0> zb-wVzd{F^XzGCySLmm?o{?C+Dc^aZ)&#TfoaY)F<4wf33+LCv9JXE4*eRW+AQb3UX! z;zxM9>7c4u?w50f(}Kodo47!~buMT6v_%y{2jU!!7_5kOq?20B^^_)KfMTXYUv1^X zt`6VOn6GQUFSdgaEV1Ay^JJ#{E4m=_3GH5G!7&~zl0gV*>-H;#J3b6xzO!~c1D5^KGuE<+vP)JgA)R zoA>j~#kV$-YoBC3BG3$oXCCAdDVZxJ^IP#uF-tb*L*L@OCOr1cOJP1Lq1c2euVXI~ zo>0UO>PWd4JLgS8mh zuf$(F%_~5wLgk%Z$uH{s=Cq9@!p`5Q64ZP@Xh;gAQb3fdpRsyrC@ft#rN*kG)bdBH2H?L;`PodAndpX5=htXmy^$I}(Jk z3-J2(P2dn=d4^d!_BZ?n`WsERH;i|*#otQ)+mb)haK6hgr_brFHEO`6vO*~w zt|?ea+G5sTP;cZ{a(t1Rf~VzIP`dP?Xv0JvNf0jqrX1P%_(#Ek;(KF6TpYhztzDx>uv)Upe`WEXN)h@ zYD}6K*SxrI>9`i{CnAcho;VJ-^Y+)z^EG4diG%EMu&(VIEEgXv>r1)%jB(9NK9R33 zjDNL6wP~087oVWfhZm);eTgcy4H-Z0ssz3~_(RE;#{akP=$W%e|!8x5Yq z&5sgg&C%4@ou)^!((nP{*mPUN9O*`+#x?435PNyS+_gU|DElej>W=oF@P0<)?YlB= zZ^-ZzHi=q`UfAGh^0=FpWq2dkryWBF$2n&{AEBYQuOpq#1k+S}Hq%s9sx z&Tb=nQ9nmpEPFjEE6d%sxPM_AcXXb@*?*G1!ylJ74}FcjGPaOi)$PFGg; zOkvIv92Tdn({s#^p`PW~tmL-@S7-DqI83}3pv4~#WK(oXP%2}=VB4OGC(jUcK(k!5p{q%Pp*kCz|2^K2N#$^W)9dM?D0KbTQw2aJ0<_lzVMx z!taGN3!b-5ba2f@^TE`i3ICz;GR-$X=O}R2@MOQfaUS$e4<9IBxK`>rUA~h$hv;VF zlSE~Hi_%JJ24hOv5`Og%^9q!c;Pm)mp{7sl=>siC>h`g=X>$r*Ws1+&DgqC_>JcDV>bN_Nzt!0<*m0MAVaNkDGZ?9D*n)w z5Dfsu$aS<0UTy}!3AtPjSa^j=7{ z+_>uS@)8;IpwoOn0Et}FlW{j01{!~Umv78A^TE9WCyUcyaT+Yn$SpYuN-G)nGs$O| zD{jyTjm6oBNP>tzriscM=kHqjE@W&2zwx7!VG%6M%jd`>S>z-AH0g3f>5`1*aV3uu zn&u6KBAY<~h>m9~@j2?iaXzP zGdMjsqAb?vtxxq*?oGLQGYKL)DTCdk_>SyaD+=pR$##070E`~)kls7*dM2^$M;k9o z*UOFH%YYzZ3VYN2MidMn%);<3E?fH?wdTnZl zx{ViQbZd_;Jx~0tzNQzpiY%_ov4^$t2}Rl*N34N->OQvQHLmV;oKNl}i$C`mFUpkR z^)|?jj47C#&en9vJ?K&L-6wwWt?lCbDS^r?%#=xL~)+=E^uF< z3O|)7{D>6(nO>h&K;ga=*6!zcV0_gForsN4sa`JvC0dmuGrn`S(tLTPa+oU&>>i}H zv?_tpy423T0hBf|iPA)Xc`8b~9i?JWT6ttvK@r+rm=noC+nQbw-`LAU%nTcYzH0Wy zMvD!%nK)5b#eYfhIFw)?fl`$B6N*Wr)F^2+AMgq#T^F1C8#)uKkj{XlwVGxMCXiDC zD^EWKD_@l8!dDU0Qy8bmk+Vnz0{147^Gk?|;j z==zz)v~rq89gZIQ`!fm8Gf9+Z8Q764m6QliW6wZ z7CnZ!HX$`#(3i-<%Jj%=Se9ud4#DpXx@0@=t7K#-$g8sQ0mczTe{cWq=d zJ&tUqCWR^>8|9INJv~$LB4vr$u*f-;7gt)DDUQJq(<<)!PAnzOzazQ;y9b99SDeah zXXE`|Kw-CyHtz%f#%YXqM%bc_Q#4c*XWm*U6S14%l`Q6E3pRu1JB_J1?0gvX{!XQ( ziV*^SFfZr09cPrf1dejH1Sl79i}barInsHS9*_CvGb~F`LN<04iRP^uB6}nhWKLl{ z%S9rNZ12qn;c^hj800}6ix0kDs12`79~$qM8TYc`azvL+x z@CldkRT)fpK%b*7g-uPYp}ge6;ODW1q(1PspAq(2x2^UUbVYo9&C)8#@-hz%fuX)a z{F1eqSunFi_cw%+uaS=D%7&m>9{#opcgKZrp)Wl4bXuh~+v_k)mE!V}3v$T|eA`_5 z10~D(k@+k>ZR}nvaqZ&;)pSN(CKF*Mkk4VI5)co0`;|eLnf+(L2|L%HCe=3tTFS$t zsre-y3DxQ1d(--pD)Dr@#P2A4xhx!aV$_(UUJ9hDS_c^zRwxKR2W;KMmCEC6pgj0mqC*-h6(k+ z7&@r!T1aH=Fh4isipHzzt0AMoFx+d+1CrnKA`VGZ@ITsOpQrf47g|JifKWZo=NOQs zb?t}EkCTB1?`L_JS2pytQtochLUYNr7X&-ye7gay=0=plR%v-; z)DNURBl|{vqG}aJM%`p*-N28vm?Br$&lBbO4zpmP48dX9!!EXAbROqdj|+nGN~bZz zK}?Z!9Ae;uK<+U3^YA&E#2bNm%Hw>e6iY+JE%F1G-}qL6l}~GJ!xcb{{3MKHXU1~V za3F!$sZ62^O5l|*m;paJ^8NIP-(fxnhSWD;d%v@i6ZlEyQkD>%qwtQG>V^?vy)qaeOL0+7bMEHSd5J&hpnJLNiH zIDb#t(dOQ{z%=I23Zq;PrxkYxbbh96>~ zD%;S#KbUR&LfXRRdF*w|X~c0bavqOC+DDUt*OW=WxTEAQiH_t70yvI?G}x z*Fi4vT;}B-|M%-yEtQ?XC~IyrL$dVNU0|o%B%Noc+a;Z4r#mFgSwz>3PDy`uNTp3ln|AuJr2lTGyCvOjrv(F;uh?mq zq}ST%97#W8r}HGe(oW|~`e8dQB0ICrP8Ugfv7IiK^jteFNX49Gr+t#1Zl}cx)hxHu zb0uABrx!~45<6Wj>Ctw&PSV5d^a@Gm*l7_en(20WwxqkkZj8gzlK#L>KPTx;PIpTBK|5_qy4p@3mUO^QcT0MV9%yr=r^lk{Ob zJyp{0+Ue<%?y%D{CB4;7&z5w9ot`V{7wq&xNk46;t0n!oovxGg3Ol_*(lvJa5lJt! z(<>!?hn;>}(lhP!bCSN^POp`;PtqZ!9=TQMs;Zv7-q+{O&R*?I2{_HO)fZQ}$Z^;? zId%@7j*v>i2&RIy#JUd5IISK)hd5fKS{2jFd1QU@t-OhZ^&J>hH=2doPyJW`4 zz4W@|r4uq%_~++5D(B`ag0FqLVG|Zmm`>oaj>A0NoeM z{f{eoP~@Rj^D{;kP1Xx}!7VVBTPtP^atXahUP#Uuzbf$s^b+@MsO5fC8q1v_1?Bx9 z`~54)_n!=s_u~`qKP^|^*CgM+sooDuyx+}xg6>lBPF~2(;%oq#U>A?&ex`t>oj*%G zVdw8CB(_G*$0UK}i}R->2pIA+`5K$9A7W`0z-Wd~=E^5V_9A&>9FFDAR84itg%OA4 z4S~yIZ^#eqe0a+Gx-14sbh3*TTUn1>`#H7fvDYY)aa3$t(9c`{VXjq5o!P3j9f3pY8d1VcQ9iDK?9JeEKM4M&T2fWpNIJ>0tfJ@O;; zUj_vFLi4BjVw;0U#AkaS^za8*+sX=I^{z>&niNh?ErZ2aMSrkD-5iWcp&Th>?gE3^ z1`khjcYjv+yJ}BLu(x&z5h?n?@@H2tp8~KDHU)+VWCP_TE?7>tOo4G2DYI58i>nI1 zm)!$mxv>{d?`0Te28a0z-vp?%s>$K>L1hwJ44}SU7HbPet-xgPj@|+5II$GIIs_>@5q5@OobFm1;P6l(# z{^|qa8b_btj|4KU<<~voy&TlqmxvK9HwqQRbkv(<#WnrWRr(C4R(UFfse~uJa4|PH z$vx`HBRXjzS%0`!t~~6z^RG}>27)ioodRLoA+jFGPk#`2WIrg9Ls8Nvp6G>Yo8M#S#0a+`)|b{OTe(0C zf_-AvUkWRbz7nU+tH|)Z+8WV`3)za&Nu7haXc#ZdD-X|180DeR_pTiW)mDZN*vjx8 z46#Sa8pq5ge3pnol>5Md-1!z4%oV?q3uWJ;j;=0rJIz;-kBA1mx1*3`Mc50^6FoGhL_TEq4fItmmydn!!}D;Lb!%!M-%uF>1deUl2b4@`)<@6b+3Yx& z;L>~zQeiKoQHIuS1$Y|C1#UUp~yZ+a7ZS@c=`%&-m)Rgxd9=Jgu7^1Bf&F|O9at+sN z?_e;Zt<)(h;Z9Unt;sUUjfkFOtyP)rRqktZ=4J7B;DSC?j%x>71*A`#cP4-H7UYq0 zhNx6G9rd_u?e2$NqTP+iPQqZK9p#l~aN|JB)c%TfGXN#jy8eRxHK`A_3ai}uY4b+$H*dj+Du;dsD(4im+w7;Uu2F4T_`cz5LWK_j9pcwU zcp9SBEpE%BHT)ThGwif)(At)*0Cggk?`(ycvK5p$xX4juzH_9ee?H%8zi~)@!o)ejlGYt3|63z1Gh44mev~f} zyoiM(XMbS02n45e`no$lP%Q7V> z7v>^fvx(05eD29P!K@JeC4(=cRwIUQu}linEk__*v~4o& zZ0pyhb;YsCE`soVjOAP^OvY9#V#~lp=QKY~VDO>yu?Le^ks^DDj%#av;Dss!YYTvYOW&=0ou+ zFA~7+i&u%F{0=k71HTCy%NdkUP6Pi`gD#|Nn31{Te%Y{2y5WB{;5T|xpy*H%}>0gGn8idX~We{w013W=vk7=IC zRv?sUEbuZe>te6E`Fe4ywx)&aN#!*zi2Re`Yg|x~=TJ{o_#%sFNmIyfIEnRZZNoy1 zYOBJmoQyR22n&@xfM-52N>()2A-Q@iTrHhcVqlQ~hQy(V3RKCtZU5`#pQ3PQIjgxb zBQUf+byEG{zT=vL-z9uAyY2>GS0j4FDZziND0?X-RsCCjWn^&Qs^te`TGjI7-P!_- zTT=-_4lAK4xUp<~?4KJj=%)A}acX;6( zz5Dc<#g5^@5l{iSl9wOn!YeDyku7pvV=A4BYD;>2U<`Xn(&NV=LkKc7cIxZU)WYFQ z16Udbzl3jsCDAVnh(HqqkuZxe0CV zNA;0=(6u(&^^vWGO*$Igp2Ci@$|j?{w%w!scCQxtIaTV2QH&OUWz+7?uJ%c_9@@{F z6iM&nd&KIipy`)@#=1?9U=MHXNK}l4n5wwjX}nR`=C5pwJU?#-N)J}_9(Th$r-$I@s$`fKzQQ*ap++GQ>XAvQL>4P^zqSOuo${aKnfR4*2~Sk74dU?;e6_dqA77#^0b_-Azc1vG+U{&kqpMl!puiUJo&YI>o8u46P=03I< z+((oWwS4YNE}!)9jF;I)Cl|eiZuS<$c*ffvhx0Eal%IGqSCiJ(2ir%;h>dLZI9m0W z^MTx6+bH=OZ3d9}neyat4ls5kM{`#K!~tcYM%MT=*7(8l!hZw-ad#X<8P78J@!lZz ztneNXFxQ;$75RZ2IUMarxb$|HHU^?34cwmnU&~8__?L zxO~X3ZCpNx-~WH$^0FuXFU94D|17xt>c{`*;`0CXSPw4$73u$hxO@m;DO`U1S3S5q zOv-|+;qw3ZG zq}?B&&3{=QnYOM`CyWd!}GA?Ctu$y@zi6yjiaHE>_@ zb6nP^;I}gizn!k}{Q~LZvx82*qtP<;`W$}6lJTK4AT0?13WeY?Hi;g_Pe|$#Mq)xD zaR5+NjuB7P{)vxlcCFVq0$dNkFuRD5UiCTN!UNP?eY_~}i8Z47c*(L6q1fs3wd(ha zbjLBhZlK?>lOlHelv?ul>f?oh^QwFy0mx<15GFs=joZx-x z8Wly|I2M_-W4vp@AQiFOu9&u>yLt1quX5HoWgyl8SxOYLFGfeS+AbdLJl)t7{gqv% zodJN<-G{IQY1SXVTAfz2fW9ycMEz5V3vAahGKMck;a=FFY4@W5_cd7Xl5c+;xIo5m zh(Jq7qn)yMm44+#I$9+fX>nl+(^ zqJ6ZQ$EC-yO@aCHXOdbC;!zk8LYh|l7^#wq1%Y~hWV-Z3;2_ZJdt`_FMr@s2-lJQo z&Q2kajKk+Oj#+(@iy`oN_4^l9A9raFcm%}0^3{Sw{}=SLGiH*Z#`^(YEA8IsJi82y zpB(SHyF&oTkkJTPZ>R=C$NB|sj+Rr(kDTcH@kx4~b#u%bF6(A&Bx|*{p(zsZwJ$$8 zb#O|`vTPeDecbLPZ(FBrxRyLiqp0=}dz~0svVG*`2hm6EYVAs4yZ*8~EY=`e%^)tn zp;+GCdG+3-8|pLq8I#bVpSA-8 zw!_yL%?W$==!ILu{+-&IN&Sc)L`?FERj{(!s`Qaf;fgg?9;{9Ek(;Z$BX@Wr>8VJ= z{6>|IsbxrF_>pSTLh}USy!0jDRe9ab+5M)W560?urHmDlk~ zm$#L5v@AHNq@p?4zocSgurGbx6fIGO8gRugg(kUFp}r+IrU%nY&Ir7qub1r&dS&oe zc_Tmi0@ri}c#MCbyb>>byOt7B_=~F}f$WXtk$YVFNObDg^uf0gF^Knhv{h|J>ZHge zE~I1JI*-i93&LCBi^SoPv&xft8`qDD2Z&vfRu=j=&0F}E2W-yEWiNRPUl+N$*YO@r zEQ@eUS;K97)!MWMI)no}dtx?-U=j!P4NE6_YWD;QI9~C*ZtV0rb~U~~!t21;bqjXr zz&n(#wPZGlm%XrmRoMGH@UM{%m$jzQC)W0gYrB>YOuTcO722x{Vm7e)3F7#GO z2ds3oJXdkFJ!vl&rn7ZHjxPQLQ&V(wDyvgdf>RCeUoow+R~+H6iVg3J;flYKI-9T8 zg)3gN_V_M8|y$Hj#t9o7iGY#{wn=f^6a%6d`S5uM1a*WPopNo zUfJ~58qMQhk#KnpfEQ>t8s6ur-@7U7ZM2J7gRAtey|DXOSR-4VDb=xMVQ;J0FG%!9 z!wa)?+D60QXe@cP(af>N8i}p^l58Anl(B`~tpHHW95p}|U?huyAW%H<{-G+<`!jS6 zO8Xhj{N(6i45PyfQCs!LEA zYMtyzEn=h#De9@a-5Cvo=$T)v5hNPH24Jq{^-zy{J5iVs=|}{f182^=7zNjKq$7?` z(^A$eq3eM$wpe==pL|un{{rh|Y^%WKmPIC^;V!1G;GOYGR)3O~qDQ`Sn)!sPBXHSQ zzyI)kz84V2%V(FxKU3mc|;7_GbTaM1uN zj;??d?s`+IAxo<%`0AZw(E?-4lz{E zcMp9@sT$M4V=Hg=^Sjp*$#Q|be<}Dw3oQ@~uDf?=p*eC8Y>XcaJG2MH%yX52G>7c~mU}iW+2JJ|^*d?kMMp#lzuU+a2W_nBR zOlLWkTo`ypH$I0bhmrb4B>hr?5)m{3Tg~qpZ~G&6($`tphxC#AaN*0Yk&%xkLy)oTecmn%J&V>)tINz5wl^ekwY)4(Po6?BLP3A*j zx&6$@p2V@xrgjVBRfdBdw{*Ox_Ko00#*%%y(VjRI8jKyB36b=PAowluBf+~T?B%Ax z&4RC%arE+cj=W!Vt3u$317S0x;{Ppp{4q~W#hw7v^cGb)2ZKqqog;RB%(0N!txko; zvclcrC1QcQC)iGnobh~1BkELW;8bV^&+ZZU)v2&Ytrm%W$9d3cp9kIQJb;YaiDpJcXO~G=;wgUjyegX-UD(HG>0k97{$|j?fJBK$3{8kp&oY3 z%ciDZQf!qR1Q+wLmxI9nOF;cl<>C?6@a_wH@in6szYM|=>ukHSs;+%Q*^G0nkvN%E zN5aRrnD82}hNm4uFaHm+b85G7K%j8X>F}hz53P)NU558#eVxcwI5JqljoN+0qhu|! z&eU*F^JCt~wK4W5!aSfA3ubvr=9~!j;cr*q zZ@Td%)ZHG|(-`9CeZbTi@q$l>; z_axT7N3DHJ*1nHu+_2M@AqBc+jkoX}B8{@}i46Rq;4Ye37M4L}B-sSh>`kCHfc`hN z1Mmiv*aa=|U9ijRXi%iluH-K8I=0F#Xk@zWUEuA#3vOXlwl2EasCewujbN{TooLmv zxf)pTr>=h!QY*3kr?LKP@x%(KVXwXVn|fCNv~O7b2kq5=T&;dCi1F25(zE)75VBXl z?tbN8FMn@x`6sBKwt0DwGW%JiEY+b6JuBCms8+u>a|e)q$S#tFuabHiv_>ZtEp%W41dJq=#+^XTvg(KbZtJEH{#3IJdIIjw_GOuAFt&m13?R} zHG&^|+?}4t)K5LyHTaB=f(4={*%>64BoOg^GaDyI22b=Beu_WpMl+9&r*l#FTAsQ&pXhaIe#dTlvDC##Mn&(A5kiZF zzvIU){*jf9pYW1kmfn(9L{_wjU>oi3;{=*|YlsyE$9^+iEfyy{P+>Q!pO<9Mv@`wnh|{zsYrmW(1< z0xsMiLaU06<&;vvk9ATdn(F#8^!iUTs>SZ5*6Fwx-%2jC;BqO_CPrn-?h;jHW;+$n z5e%~O&Y!M_8uGQ({jd$~<*#3zs2+lX?er8jvQtI(wntXq+wQ!yx7~TWd8HRe~bXzqOWB1E=LivjuV!FE{@MdAh*X-eBN={LT6HN-yg)7HG83Mx1z=+3q1fz+8 zY5e-Yh;nm3Hco)0x+$>LQ^;+R*ak8{|3a6}kB5eYB3)dsC9Xwx*mX*B^W zARQ%Owbo9Q;P54b7$_n-pacyH6-%hnse@MV8x3#Oe0Y7Tn z_r9I`|J{54jhLNt_C9-`v-dvxJZr6ItwXx6P4weAMBOmk1_olRv|$D=Xi7A zvXM6hWX$h(L_A^QJV63rz6<3c;|)DCbW03gqJxn>)o(GK_JYP+nobUIeiGp<3VgP6 zM!GO&Fv4!4P4Y^tq4r*w<5vemD_rbXBY45AM}#Wq(;xiN(4c8iW1vswiw>GEopdB@ zuOOY3IT@y05W<#2?w}8a|Kii(YDH{YB74n3C|eTScR1YIfBZDiXI4hp=%!(KYud4! ztdXbuz6Wk?QK&cKI=rNG46b5{-_3e2bf(}gy5cG_T#u8$D<^@j1JDrr|}-Si1P>@ zAsC7MH~tR0R}=>!p&lLIgg4W1^<<6^JuJw3TqD!W2Ty}X#{)A)^_$YUQ;|DxW7dz4 zj+3girSvo0a|5dlQ25TXDQp0X5B&fyG&8xHyHo{+KaY|Nb%Km8^gNI|IvgJK>pb88_>O z1@#QEGIW^L@d0ym_{Z;#pdJOWxEbR~_~T%-(tn>U)u0F>>}^ITkJc2E`< zD)yzr$rlR-os0SZ6`p_d;{}0uP(ncWLvJ8d6K)5heb}&V)eK9rQ8Ld4yztn(1S#2tf^@kZs97MN1y^IA9PUaiA7c z`W_mr0(IlK3_N~Ug6E8-9CHJ&{e=!tW=WSl->Yhs`jD+w2Yz55^GF-G5H`4?%ERsU7sn-W-rC6nVmm_sT+PH2DJi^niIf&H)jOpbfM(~CK{zI*u*;r&-aNuWX_h#5Lh zth1m{=Ck_0eAk#ebb9nv9JGJQ-q5TKfmG(`tblP)apL8L{dt}*D>Ybi?0YZI-ROhI zSWAZ0MxV(fC81@EWXxwfiJV1#L|{Mo_&@EvtPSo|#wS7mMRq%s^r6&S%|>Fos8=p z_l*rjJvWdf_sA$5-|zLZ18EP%{)sQmqL2FV4^Nw;AFM;8V?6YWXY!wBS&{}%{Ct+~ znXDITCAQrD+-LHKY7JFH;A)PA=8rpb&4LQew>?ASvBArw>v?vX8>jZ1msOP?5!s(K z@9C8dwP8HQ@@2=+hQt1^r#wAsutg>vss!_P)@kDm8m&2&kAKh3nm{rl#Qxd8hpCGo z_o0K0F*}M z;wk2YJ$SQAeZ;>&o*zYQrZ_w2yEW|qkR4VBnj86#lY#%*&!wm~3TA}J;kl8(BP~8Zo?dqg z?*}oqH)8S@Qyeww-@X{*+!1eYXHos>xf4*vgM_mhEdYI*j zqU0J<0=|Fd8p!ztT2OaA=X{S<`uETO*L$Gx!?E-wR5EEXlMY@N`-n0BUx$t9eJ1T- z(iSE?$fTuAs%Fv*CVibrgPGKYNo|>w#iWluGPcvpq@7H9f=L^hbT^Y0G3h2I&0x~y zOd83gzD(-Eq*IvGhDljW`d>}P_WPOi8k2S~X&aLkG3j>)jpc_o7*ks&oyw%{Od80f z5+;>1X*!eUFli~1)-Y)!lb&GGYfSnblTwF_?OHSGL?(4*(oiOqGieHws+d&6qz9Sw z6qDXy(kD!6#moywCiP%aA(Jj((s!ADNo3MpOd7+a!A$DTq;^bd%A^nU#_PGrq~49j zZ6TA&m^6b)bC`4&lh!h66O*1`(l43xJ0_)=`q@m%Wl~Qj6*8%WNmnxIJ4{-@q?JtC z$fSe!&01z&$hUkC-uhd+e~U;QWcZ$!=&?= zdVQGGg-Pw1)S5~Eiz(mBr0q<4m`Q7xw1`PVnRFGC#xUs#<~#<^n;6~kQT>rgS28J} z6#1x>OlrlX8BEG%QsY$;MLqpd!GKFXByI|w5*&q(3KBP+5^#i%3WicTeUnLvRE>{{ z{>ImBrhoszq%3AW*fVLz3;jQM9QWJN^tl8w=_)2IV$w<`J;w>P%DlyJxwy6Ucc%`+ErD;mfoWE}L{MX1l&uzoEc_tTEczXQ3#`Cq32G4DO_{8&e z@@daHmBG_{^=;1@(L>Li0u!&6#}-~@U)y-CS#R&vQZvnK_Ike8XTt)#UJn;}`7Mj_ zIt9Yvue@~|y*A&<^?LVeu~&9tg_oqT#%tEH1}~@nzjncE{m}D?$4a&?J=M4opH|J`}Hv*@1&_Q-tAV2-iJR=_kKTW zqqqIXx!&pZ#oixyS9otssPXo4Yw$jK@NeF?AD;3y8D{WaI&jN-%E#Y%?+!GXJy2sY z``a>`*{A_|)wAC%R@A@4GeoiSoPIEfYx>F6aLMI_ueU=%Iq$mt4X(f`dz>Cx%&@FFfYbJU_IAHu;|1jf&P}0;7|MA1-qyD z3tE?k3Zj-v1zEug!3v9XfytLDfuk^2u+yzru)c1GKyg+p*uM3kVAROJ36{@2B^Wus zOW^U!Ex}iJz73cCY2oY6vGLWFPVyc1p_A`NZ@c@x`?a61<+M=WlhdWXy(S9Z zwZ~Wc`u$Didv`*vZ<}ecZ_l50_?|7-`d&#m===5Mk9|L6o$}3Lb@~4F#+Sb4fBn{X ziH`ESIKsm3^{>YGjZU8Ar{3h`_rK=4`@MPC&u`hle7}gh(S8Ykm-|($U+wp&Qk7rx zw>f^_cW?EZFWKQ2l%n;U?sCxY%ZiWvY}!xyjX%@r$KCa%pI7X+el=N?|K95?|FYv_ z{5Sbc@;8w<`A4(e{g-X@^FMWPzW<%tX#f6q<^G+XtNkymQu&vj&hhuH+v?xqxWm6y zp!Lsw^nw4Kq>ueKZ9D0IB)`+YG5$;cbz{Eu{~>`2$knp~zIcC3fT{JQfGrMA0Y|RA z8jvRT3kX~@KVa+1=zwfrdBD^Ms{&lYQ~`gg$_dEXv^5~~ad|+jg*M>3;~xY(nfY9}|-lGZm{=k+p)N z-U<>ZR=}l2&Fg?b7AvhJ;7|Qu)M{%E4dv7WgRQS^3@#JC+K38%Lg1ku--xGZBC*s+*j|)y@cfYHMfSgRexO~iXXghBbG-(S zBu72{j9Bx>ba}FJv~X?=pos~^QAG3RZI^V2b0;V@{CV5u#o}D8+D;g{Q)wHe6LeRk z9yp@ss@W5xB6%aWO9~~)6BI?{7duSklwspLeW!vQFFIx@OU(~zvR98PmxS|9Xe4<; z)`X}6UaLkT7MeR{So`+cM-_^lgAP|H_v=eb75Tc1VsW2iVz@Armt8D2*G4T6hI*A6 zB)rK=i6kYcA599Ixav`xE*442dA01tR9m!sXhL?s?q1eDIgs+ zKa^K(D-Y-IEt^}w>*FNm@XZ{Q3xZCTWk_85Dl!&`PjHllf_)WAiSP81tOep}2%@B- z%<+F@)y1N5CV>@TUl)6x@9Eb5; z3!Y^2f~QpKDed->c4Y=g^+}hdnO8HUJ!_J>KT7ENXXZj_QcrY3+-&J$0}jdT)~CJk zoxgM(DIArV(3P1PpPA5Oh>ltl(N&UmIWz5QNmBgVNpam?QJJVJ?P^9++}larP0~2S zhD#`1l5~A>($&XF@!gr-hU_;o65i zCZXHl)s>M%YK~608j}?FQ9@i(=K1KPs~HJby%QFf;@Ay~OEcp$65g1NcBOH4YZiBJ zS=N+xeSE@VY#KI5OEa%`Wq$E~X8aX$kx``^u4|I6f0UUJyZpLg%caZ>Z-|k%{ZQ-r!%???iF-JklQI%; z`Elc4kB@mTt~)zv{Cmsd(&E2QNLal2sv-N%qwJ*bGvA1fxsEI9E~&4ZarUbp3KEWN zc>_}x;6G4hkyObHF}0~k8Ompki((5|PT6dUjpZL>r+!$}__PI1%PDpK6qa`?RMN^*ooBb%XXEEUY> zDI+E34%%o*vXjKI9`uG%&})Tv1#Np;e4;&XL1hIA`lYpf)%uDUZN zU)N-i)r~PW-oA*()5l1X-INO?=2hDEAQ7sH67gc%MfbSXnxJ{w>Q0%+skBJEQmf^J ziQH=Jlo7lpjyR>Ex>GK4YO+%tsMD7F^4v-_a#!7nEAsPteT>2xjmrw0wAW<$N18ZF zD<^%dEEkQ-_q&}m$m(_4iBT!~CQfPrZ|{=SuLOF#)I6QRAU|K%bWL6#@HVbo+lbR` zKt=(-4_)G#)rd|)^wF`=vq_ayJ$ zS6e^uLtawu?%L-1m6QH1CwmU1V!F|L(t4V{NhNz`oNaQ$ONHfd9m9JgU zSD}32tAO9eQT*(eDYa&*J^s@xpDA?{?Fd;S5l@TfLs`1D81q;o(Q*=_CFIvs?Y=#D zT=2BEyb(?%^sjJZ5iu{Ra}izmH-6FW41H15Hgj`o-|$Iq#)^Dr*pHe?9tuU1D9ZT+ zN6jX4rdZ;lOScyCs;Y5{x@wK2)m|Mb5xJ4G)0J2YEwpOXR;7^$c@FAGF-u!*gUPOu z__CZdY_Ww?HOb9DIbH@^?4qr<6W*)bQ!KX7k*nirJA+tS+>9wY+__@ywj!~puDVnb zR#&1Cvz+u2u?w%nAa>D}MBQq!pn|E zEy$fg&UB=%I$A7t(8h>)PFfqW*sY{PlA_aMpH_=nv?P~TB0;4kk)(o7Y~on44kzTI z(@G@HXp$60yV!?0?+bj!a^Kw{yzhDI%qy#c9X=gyixD-YOv9;-CYv_Bs#b9}Vh8RH zN;R5N?V)mVRL`xzo}WgI4 zw2gK$9)%T-ta3tU&%_Xl4bn14tr3bHYHXExf@)2AxL~tJ-p*^&C<=nitK@}2z1(0i zudPgZhHvhmh~)Qi6N{j%Vv$*LkWH@|CoCwAqv*10#Mlr(uuHQ-q~k&sN!>2YiU1zz z8XF-ckLn0%X42V*;g^y7&+tW3Y$gD_ERL4Odne#&yI7xuCw~tx#iM9x697nNRAw4B z0YI)AoGwHG+9Y((is%O3DV27Yq+xS0Km`)P3>CH2^eckQj+mE2taW_kVo=K8e#^{GAO z*u2|($hEe9#{T*P1GO`Hnvt8@Tp;_tkDFad;Y0V4`$O}}fupaUZGNz$ zet%D`YtK=av(2v#G{1VT`Ky6lwVyTLZEk+6x&A><^MjEeru}fVzqz^oOw-H*hYtME z^kBxP2L{wYQwjQ{Hwb*nOqjhHaAH|k+O4&Zw+n4J*UofQ9gLwxrZ1vY`nx}}RBVKe)U#~YS$jL0dwt8@df z%(5$)*Eumgc58sx6s4KV4sUov@LmF^w#m)vgZfDc*S+71=ae38cnAada}Nd#u{$eh zA15mk5Ec(VmV-8r&zhi&^ysa`ifCD-i6PiFT-aNtjueJz)iFYzTed`IsckHkr1G@} zIZLa>^I5AgNWvPlrSkoptRkRm9D%th5r=ID&MY>@JxJ_SQYseL zp{kME#u!PSTS-hxs+$2-IbhKg*J(>rQtP@VqH%?l7>{WQ)-sI&=qKaiqSN*o;H5f^ zM&4SX!SX&KFn zvTbA|flPpx^qkaGw>D%rK?D%F0Zy!}Yb}@6HfU@Ws46Dqbb~<_mC{gJDo4gO`5Cu1 zS*mjtsft{AiW`v0DAG8PNv9k~7~}`4G37+I9h+S+-(4lCKB>suqgV3*oqwf@TzScqFipG#Fw{4b5Rz``!HJK z%3p2}uXJjgCtl&!SQ|BXStDp?k!Vy zj4c>Gjz&Y!zyl2lcswsLW{>vDL|kx@Bz2sEjd5zj>;}A605)TY^dy6Cm`E~YN^6o) zcccaxUVWcOA){Q07r)+^=|ia|UvWMpI2IZ?coC)!T8`qJpc;$1pwC_c$W@_Sz(-%U z3-*$Xz6z27yhSn?&}BYZO)|2qg(L&lPBL)qFS!U7s00PTB{W_VPR5mzUp6d!8TZi{ z{||oA22FVQE=8`j9$RjLWb*BV(pDavNr_~5WJVPvSi@sDa-JzsYmZEPxCvbMs8-TYr zvmvPHOJ(_W+ls|0b$UZes)M#umdb~)F@vY?l!f7TlLJ0ok)>c?JO#(v&Y!bxy+ZTs>OQkd&3#LHs*J{M&mW^rE0mg*fCfh%AX%Z5AF&x z*L@X@6&~yoc~N>&i^NQDuf%kr!-$5r+0p&>tz6kfucp|nvnc#78_KP5rhzNWR6*&K z=rZ{;egePq4}2JmKW4kgfAq!RF^Gf4Z2zX@^h4@`r^!NF29O8N3TYWD4UC4Cjs9E= z9?O>E4+86N|DY{2w9s>~t+63!DA4n{w#I!EJ?6K!^m`4z_rS09Kp=%jJ$c+`1KH$J z+yzw24WCjhl!b}O6Di84xH=i4Q*wEq38m5|@4_?mw|%%j)f}}fbuKqM=&DLG@f=l| zOkEh3Go{7TLs%eEoV5qD>!WOCl_l-k+>p>4<|Pg1fw(;;v7igHqN z###3W6eA@|l9uMxq?Fg*Yd&NZe91PVD>Lb8=|)tTTw8npj0ar~g?h}&YM|3{J?kAP zg`}6%(_~UxODbxziX@fvG^J7X1IHp}(&;Y#=*Xy;gz>x3kGzlTt=>;=uGKZqOuXtD(d9Jk(3#AH zt0NNQN|L&;GVj6(L@)jH9&37tVk3P9FojTZwp`3R!HLS_*Vrn;d02FZ5iCDVvvJV! zpc=%Ib3e_nwHQKO7f?PQtbKe0TNz=?+_7la+OI?hE~w!4_dAP!oM!iYwINQp*@ zr@hEGH=-M8(HNZb%&$S{!W8)*Z@N$|w~v`nF2~v?#1yw%&d(Y-D$atsZ3ZO-zqd>& z!FW|i%TnsH0hKE?5{cMJYmf}sE3Apy4jNiWDv%H~#TeX@4w=|V-4Vodg2Gk=u}tP% zg&9M%WRfs9eX-cm2}d{+)np0}CyZlpW!e%Nq!u9;<-|I@jnJh^i>i1fP^7s*V<&RT zmWWe$dMMl=4MUE_vCdA=tGPf~2NhjO3>0qk89-f#(~uAaBMNJw_Y>fb;#l*TKVr|OWFl&U6h#bd`xfS(W@H5gT*i4LC@#$peOJk`5PRE z-;y#IZ3qvJ4QY889_UG1?NKj)=QrVF*b!rYOB;j7{UNemcS0$j5ID!Xfoc&cis3mxCnuCTtwarm&BgC_` zSghk}B7q07Y3a1B7|+aTsQGwm;6W|XkiCEhRovkYuv~_VPjM7PS(pgD4Xn5xL;)w_ zO&|)mY7MP+lZa`k#M9Eq36E}U5(7Lor)#0)>8rrP_;Ng`h$G#)qP*M@cyQgW6}7d~ zLPMRA~ZW4TvZ*%IwmD4zaMY7u~D14ALMkEfNB>!W}DC%dhrx)h%S=vT}d`l3N*CHLP(pD4E?_wysQzLOD(B>KJ zvr-+vE`a84iaN4R&rzKB0>)1TQ6aS+W13OeU|6DjAb_5Q!jgZmzfX?XJukEoA*Q6(hccQk{kpF#35V;Hgm*w_p(zenk5UHBXV`EG7*!0R7S9CgSO7a7k}QlkaF_1{&&=gbk@? zMLNh)u!_*-ije^$u!!C?PK3ewQjsBJ4y%TORfjTkLqx|onbt8bN_JRNzWUA>pWQ{v zOkpdgOdxisTBx9795B#EP^6#cIUi>a8|)rR?kvce*4X>5vM_78V1-L- zZ^o*rUA>~WTzX*0$JIo)iFiA~ z%)^zlD9S-?D+zVTX1;P9Hgn{#gjZ~`bkSAs&ht3q`r$c`v*c^w;D_zL_uWsh=UUY@ z+Jr^uyJBI5>8nV!?vN!z`_IgMy8l#=+gTG5i-P8nnsXd#D$>vJ_EnnF-HA--At?XT z%Ha7KPybFT{pV|fMfhtBKie6;a2z-|3GoIPq|=s-UvvF&<`<7MZ^1GfSDN(PpYhUh zB`RVMpf7~jeE5Bp+aiU7m&rwgEsN}1S3Ay6cRXF}D%$25_M!jz%l;AnAiA2%(IJa7 zLasN4T-8K$XGDOs7pDg|F72uz?Tym3FCK4r<}Y(HeTkv)Aq_384$Z3$ExhGZ>}XQu zu%DtPklEy%x5uaOR%o%KsI*$N>rUM6pv;DBHGn@JNeiy$;?wLiVp9t2Dgewfg`3k8KKwaV&b5lER}WHQ&d z@E_>Vgi9ly9RLtW96yz~&R2ShG|^%D=m>pu*f{AzV2EG-ctrrX3^F@a+>?!2juz_5 zO}8hUus=~fAsfGZ&74|qJM68L-xi!M3%b3jBcx_3I_)X5Qwe6LcAG6tj+n@*0<-f? zU89UJJ3o`ujZzm%Lf!U6%iZeMbc*YonlM{l&g?7@oU#ut;P-P9HxuhOn4R|7(Jtnb zGb1IRg4r3guQDszcYaA$q-6fjGCMDP=y~Cx{~{x^(n4MR> zpo3$WopBk`>ub`kfK3T|&wL znL&Z`1U~^a)67nAMwgXk_7M8&hNv|gZe}DUT-opiXL-W-!V5-bXKd2dCz&_Lmx9~y zg)-rd#c5YLF;~4eUw^!1*`p1&Vl#U<%j0J^H!tA4x6J3QFML32$jFS3ef_%ky|#si zw|ucrSNp+^`qY2bxc<<5py&9iAC9KK3r=3G>!iQC^c?@=Ky&*2qYJ-Z(mg&V&Tey8 zY4$Rl(ADf^y3d+D{?`0Q`w!}7eEQYMEnh6&T$?uO?EaqP?mskrgX8Q!ZkPq3;YGqk ztmEm2u4ipR&K?Q|;xlq$B4$NIJPePzOt5!UCe*PBVVA?B9(rEx^gj>%UxxIuXHt}B z1iIkznh*?57tnHMLV{hy<&qFWoki~gbH@M=I-#obsOllAl3p%BZ3$-|Mn^pizWh%N z4j~3dNs|^o^pE;y@ItQu%&*H{NnO#>IB)6Y(ugPwyEN@83X~>XZHhocQCUy@xwYGMk9BiAK+A~eAXPal9Z8}J(IW_mrG|xDjf#vawM`_LXnwvg2 zQ~$xohgJ^Me|7KBTRlg=-d^Lnqn6i$!w$KA+?00q(5nSCcR#Dy|Jfm3^P#Vr>+6Z! zv74L$_&c>VuGswHkZVs9>b?Kjp|3u!ckMZpHuB^9mLGo5e5meY{NBI+v!?q!bK)0g zO0kHmhRD0nlF}3`5T#ZS+68M1v^?ex1n%h)323Z__E}r45txG?3Ty}r3m^$nE=5(g z5DJ!AL~g4I7*rNiwJF81pMN?0G8F6_JIoo3NRRjCR?HmSLrvL=vGg88rYE`^&xPxY z3o*J^n>Hl)cu1w7hjwpxg-)`oie1j4PmeAVHKl<{bZehuPt$`Rj;?n7HoNMeYsohy zZ}_-u{23vF;#6y(@TJ+AZ5m0z^FqW_io5{+*@yn%8)|4&prIAqP)O@bB`dVq9nfBDO9}n7Q{qykvB6hK zCy@ZK&kY>Z89EJESUODij2pxx60FU>lH67@|3;2*v&BAQFd)d|gkyDa)cq33PZo9W zTk={R|2f5_hO=$K`r4wPGeHlkB%!?i#*f0`6Y=Tiyc)L0=6CwJiQx|S^^dM8zy8D= z*noDMQ1Ns4CphT^qSKYZ=lB-eHT1)}Sj5wn*v;ZO)O5&iSAbb`x>{oprfje7kmc%# zYWo?t37n_gN@B^&)=19rdW$4y_;)xGv0!gSR6Bp#Wc3+=+0HB*p0+~K4pO)JT+p40 ztRm5L>Um})*}h#Nw-SOS90`J?M&kljS)}A%C0N3swc9H0RA?3m#XHp)L_TQkBY9o1 zva|ZeXhlB1&rb1ygElrSMPF)2d5dqjCO;pLUMQKa)h`gI>Ikb$zXp^x9r*6~4fS^)-f+^VN+pvilgAL z?OJc$_Q?L-{a#OElw-hy&zO1i?v#Q>`bS))n-Gk6>t@#EcRi+P%fnIy?;GCvi{9)F ztcQ)I>+>2Ocgnxk_f1>*bx@8W9aUAzt&XDc_9Gl=>NmK+#JZ6F&+|L5WTt!-)H_jg zPLHbizWra0d`_2vWoRt5l%2kSXI3S#6goR-*<$fH1+?mwiRZ}LVJ8&TVbprdH0Sud zDs`#Yq7HYb3&^kH<8S zegk-V7-uVAm&t1Isrg_J!l@!!oQw$&FXnd{J3sE78uZ;P?f9p1gg@v zN}@1jip2#)TT(zMXI9!1G2*<2YMc1fhF-h)LZ&V;37d9=YbhjU)OqNuCrTdv5fd<$O;5)rHYg~ z12TB}*wng!lcn(sbzmqSID#2|UjH~YY60{D&ww5aqvMo&8%Iq$OLTDWz_V${S%NJ& zQvteH7|4m>(Gh2fhHSWi)wSZOVo8j`D=%td?co$-e6Gq1BzUe8h8}AR9}K-J!ozZm z7V~@UF|d7HO);TrNr=v+SV9yu5|}}}! z{GA7lZLh~a7^RgcYW251OMgrMwk+y`+euTZ1@^NRYsQ~p9r5HsyA{fL4sGQ5mt_lO zVqb+E+QT7A;whs4ajr_FRX;Xhf{};TPGW?H!5O+KY?9N3kczW3asWcSr*kY^Xayc9 z2+)ivK|m!`%P=qR0=_w1S*F6s+9|IegC5J{_rsCG&1}-U(+MT9{TMRNA9>702liGf z7wWsPga+*8q+;K-kyJ|plz)B)7bPk;ZLP$*YD(cEh6{}s!E3X}MeLy|i4}695miRg zl*FJ@MqVX&ZiMm1@G5r_4x)p)T|oQl8L4npFS!UdY|w!;HR^x=7fuzI^!%3v^YG0uT)nxZ`orUwZqWU36ORfZTddY zxMN6Pn!Z4Mmj*6d!DKWl{f0masfAHR&|JY^{z6ASFf*reo_9`RgOTUlTCs;HxvOnm zYWD2`#TvF_;fXS3vG05bScmUb5{DI@7WibR@?wz4p*mU^s@-GlOCSf3Qiipd=a3Br zxl=V;;xbta@~;yqjLVaVoYcj_={x`f7hZ|2aQfuxiy{kMbunBF2*x1xZi}5jK2RkW zfp(#`fxUZMH1RxPi$g&Hkcd!N66#bENzTAl>;e?FjZ7m8T#>I)y!c_F199^ z3t2+;rdazx6AK@oo13S9{*8K4MP*deTZ62M@QLx_ISA|2NRU z;4_hWg1A$2RPagZ4HO2?3l)bih?GRf#1fSc{ZXk@bQ*|nl`7DB^0^x(7e_GqNGD7Z zsN+DBRB~MAX_a>Hh!sXoxMeSFPrW}u7(Ql`y+?TbStn(YLv^JvC*B#Z7?28Zz@LNG z+N$%&o#GS_TbwmL0Kaks*q3bN3l82CA%Ydi4FX;Hmb;Ht)*YWG_UaHpEF1f9gN+s* zF3&muwXoXJD>O38OwezyKJMzAx9NoYVLSD3FXw_yx7|;5W{ni)lxK;&o=jA~8MM~U z*oI?JXi=6KZesPkAe@1j;IOUwY|y@mY8L_P4{BNy1(i)Dp`kci(i)so=*qxFwkKB; zEzao%`;oL}2}6dytfVzdx1mLfD|Vv)dUI|r@?n3shZoj*##>K~y?msSB^v$3LT|_jja4Fhb zk#6a-&)A(@U}k(4erJDa%;cwk-`ZaoIe{PpOye>zDz;CC!G&Am_4e?j96CQ84 zj=v|F%VJ;9f|eRD9d{YwMH>~myf%*VoS@%P!ydd$3@EkAc0N7dM2FzB?RdV!b>TzL zg<}I2ft=B4*_Pn3e^PCoR1J(#~t74_}Eq;Yp zJe5~`%csy$6u9D)3t{XAQdA!N#ffHARP2;o{N}pSecQ|LZr|lnOBcZ!f+FOTSF<)x zw>EFz+QR;v;uYIV_vy-KoT<70D=JW;BOOUka7PG5M5{Yr;us>q54v|%R-||BKjk}y zq`RK&@HAfIrLh6%(8U?XMS~dtV5rjvZO>k^kFas-lDJ8u+`1$oT`&;-%7+2J=oNX81(G^L;C0|#`^Z0ig_gYSo_ZnR@#pI?c(gAVPzYykfy2o%jg|O>{k9@eF7Zw0ZHIj-nZM0O?&3BN z?j<`l;o@Ys>QWJ$Y09wXKkEwy-+68uS6c*GueCyM&C?E)!_#NMM ztnL(r!i8BO;x!dXwrKTB!os}ZMf?{3(L_m}zB(qA_V7LLX1MlBpL3=}Hc;JID%n-m5~_+S0Ge7~-vDvT`gmiEGR3XWR`Gy; za+jh#Ahdnaz3N7TDA^5F0U|?k)9NSAg?A4ccWbKv2}7ir0jyj$N@||G@cl^2eEB+L4v*Lb33>icrXgJTe$MtgKmg}$l3GXLVS>9-cu9>EdG zb&q3Hzk!`JIQ0mwW1-ul*Vn&w{LvKk3O7_W+NJGAYWuPNiu^@-vp=9JgG~M46X%^- zk+p^?iScFOwC#V7VFi3b|;s$U7(%cLai5zAV55sY%B+adD z$t!Ku5CTub#83RbI%K`@`|@?!o>dGrOG&ZhT-mk`fio|w03fGHBMv8`khr0wm{^(1 zAxCTA!>((Uh*zSjcvmk>nHjnh9Gq2aSt`6oBH`R#&4H{3ck{Oz?jVCS&eOHV#23O1 zEGo>arZWW@6QdRc7(P>CW^_unAVZP%NtaCd0F#VdIqjrxr#N4wxk5KCU)gZyGg(1^ zxe&WH`jGAiB|l)$KlicFrjE4cl5>D4P#aImMN~W@7wT zb$ts`@9Xb;9_iv$BlD|w>x)^x*Xy6x(s4rfaYFZL_f#jU2$p1W2JM13ZHc&5F)NhF zVOSbybNe`&)Iq$ZFd5JBSuh9b zH$$p~Xba0tB%A{Quf>QV0H;^@g*~W*xOMQ@+cuC~d+o!;Zib5Wqo-;ODb~J^qvOwG z35B8t`!0M!QP)P8QwN7ldQQ3vgl7}E2#p+~YsDSEG8Un}cdIiNV5EW}sAzG&(tKH-0}-AaG9q8p^%})33?X!I8d?ss!H|&&2!VzX zx1I`KM27qIzObZjytRr_g+4DJIzV8NoD;Y>R72^9XQ;2Gwz>%OJh(tGU8lsOsH)o9 zg{U7SmO6DOoW#IX2cJ0F7cT#icu+xT1OwTI_|-=X!N>uHx=IsG3WJ^DP!cV4=4C+n z4Ih7r$RVR6$dX7}F1+dmke~?5omWB&V=x%-w4gQP+35?(ji@+aC?{-V6h;I9(0n1> zRY8l4l@kg`s1;Ph$V&Z6zvG@WQ&)Q4JU)zO#RG{@i#p==?wpp(Jz<-)%M)|(cnZmbwavDK%nwyua}S&w!xnJRaoLc=3ZjZj(U=Qrk$?DuFHk#H@O zs|E=xr`5!^NR>7At+ii{T6p-Fg>Q(~8fykVCe$2?Djvy&EGH2{BMTJSQh-x%De^6ey*11+I8p6r%*Hp1MNlOzW#D&<)r2`v1yhVXH)BYS zm>SMuVO$gXe*Uv}N)B zIXn+z{MiQk^Ox+;4$fZGiT|AsdyosccGQaN2fm;%+E3 zliNDfIBc7e@fYiDmHbn@>M2_a=ZSUTDomKJ%`lQ$xa6tw3_B;3uyb-8j8bHEah}T= z=RtPP*#n=p`wkrZ6zm*+V~5z)t1CvaMc=ziSuY3$IyN9u4_Vr^#ybjwiZBvEW)oUV)Iwqo`f1?t7F(9$A}Ks^WPDv?b2An z&Wr+gWnAWEyCle@u%lm=CUp_>c2fLD8$h>shMa?wAVJ5*QOunKv2?0{aB-fya|*xo zDSSmlG%M5SJ4d&D*InK27w(+O6?uEh^7iHsRf=x9P?UCIp&-^Mm2L*=i93qyc z6R|YpxjUzYZ$B3|&mq?ch~DHH11@28$Osw#>;M2@7FmUnrNnWO1Tv`?5l*86enl#k zO1sFdg^o4a1n0xbq>c|l}y4z&>2vw zkSGuc4?#juAOnG`5V`?XF>$u&FjR=MrA3$kz{O%oJ{@O^grK;~g|U#>SQLnXRV+cM zD~Oy8h-k$`fj|a=JwO^5gBUJ!T?Ig|?38%Fj@-A!vK}6n-hwwr|P|z6= zInxl^ip1F>f-n>6%8yrvfD$;}D+pcyA=TNb&Dgl2!0RJUsx^t4l}jRXLEc5(nSc{B?Hv81NBX39I%1_v#4P@juAo#{gx^X_;I58qUZ5#|)5@(B} zjG*Ie3EC#ECq^X2dABBLr#|VnU+?x)cD%}+4m`o)!OV_O3}wc^6A}`5f|%tndEn1y zEfm4g9&iVvE8>lV?(qgRhR?*=5@N+y17Xvo3yGQ?RY-`t8d*Mu8qxspQtG%U+J&E( zog@I=qCy~16H3lOep48Y^n)GA@l`hGVh{jUP;K6 z700v9D_;!o!}f3{0e+?-z|SH&z|RUgzz>9J!eP^RxM;PJvT2C-BXj<#1Z5OH{!Es= zzKXeYFds(vfKCIKT%jZxcvKMKWALGo1>pnxg8E4Y9czP_eqJVg!1_*kkZLp<5<>%I zWn)MU3>LzpkxhLm-)tu~Q|gE`M#t3vV}eA}fUHJ(u3$3RM0k}jx|<8YNa z!&e~H!ecMLAq&=zy4F|)q3)0|B=ZF1bO^BYrYwxktvgam3L_>6CUw;@BDZet8nYm; z&D7|gXaW{0iJaDMi~`bEgh>Y}72{9$Ht|X5v!|ngC<|%1R&bJJASlStFgzU)CEWUq zGPdp2ilvS;>%!=!sc0wNtC?6+iQcy0HC}XvC7$kRD_fy<-O z{s@B;4I_-4dfJ>yqOg&wj2YStas;{KNI8pVGK?Z2lksc-4wN(A)^yDz3I|gasfDZo zLz_>7a$w)H8P7|rHcyXWq*|tCW0a7g+?Ts)(!ps+To?96;x~XRJ3&Vz!LO;k&kF@Z zCpJ{&Gbj5W-8UjIVYv@t89yJ_r4e@=2h-cqa{UksY=kUcRamjrhq?zR%l zlnN;CutMhZ4NH|5XtTHuh1*-#vay!yucUk>FyG@xcybaE%5TRFF~+&#c>ac_GvwZMH2D?atXF&s9gjq}C&QFHoVFK|E3 zQWUrgA1}!ma}=z$F>T|QQGsu%hf!Z{+N$o1+gvj5+FH}itZHJ93WQ)C1T4ZMlG}^% z5&OtW3I>ro76opL<(j0@m^9njnZ@Hbu%D<4uM}7v(d2EfV7*hlS$1H!U*o1pf1_wu zoJcgs@pDgcsw*3B@Di=$#px%@grPyTlQY5{TK8?%2x~N( z%2Nuf6jmwcM2Dk=Iy_C-!?Esc53HmttrDpg6X7OX3SPbaYzNa5&hG9rXQlxPv9~+e zjL8p@3%w$v!_BGukyhVRMO6)3*Q_>4FgskC|FN~24Z*#^M`dcWYSr;k3;%Z0Vzy7v z-hG`xSner`OM7`7GJ%uFtdo~+ersYg)k7$er*A6W4U-H$fz&r9RM7!y%%yYZR%fhz zSEbG=DAJTwR95dZN`|D6i3v`Z05yE@6B{hre(S7K!G7!FI@8_5)7!__e@-BMjLMoC zO?^XAMN6nLsCQZ7ij}Jdt2PRIlT{-~T|@G}8!h;t;{Rjg9|I`;?q4!wT>ag@;`j=oeR&hGGN?X~mQ}T17JRm?|x3yw_mac26%b4w1oq07UK>xPfHFhiSj&qr0 zNk6A?s`3)QM3WD=dTTv@DDu;>)h~GZ`@S)5UQR= zetK9*;tE~#gs1;n68Q<9`@b6b>C4#CnsvKKNT;F5PjJ;AS9*u>^slvyfO{FpH6-#A zO445FwFAc=BA65+Kfyo$CUI4-fv5Sv8QK-y=;^uOHJ z(;x0po)O#n(Z}x~^un~o|1|b{ME(7ByLoxFwatj>H7f*K>$T+2fivETakkQNlUDY4 zCUoi3ChbG$;6rJ{XqT)s6Y7SAH5E9*`#|9;iKksG?UjO%rS1r5PzE)EnxlZwp#j!* zzd_Vs!U==%oT=wMbB&sW7v+=Z!?{~fS8`Y3|3MPZ*@A++L$Mr&(~jm&QBc^>^6PeJ z!-x@G%tP2;qjY(jjQ6 zoig*uSzv+dh=+?#3z|_?7UDC(J4TW^8R6XFN3Vfh?y>$47M#uu+ijg48;fv4;Omc zDhq83D8vZY1i_#DB0l)E^h@0D!Mnvi{6c^yvT3P>U6|*D*P^&MkzBG5=3kI+t8iFo z6~t$F@*_q(i3^2FiEfe9S4DzN=^%At&f1Vu!%l>M5{tCeXcun5Ekx$b5sz%RTrlG= zEn~8+#?tX<$!kCxPpqC_f8sGkbfWqZ=bd|HSyyJ=8Z+z6qWhXR ztsTtx8B=_rq2*@yW7f{%y(Z<(rsdO(CS4e8 z*Qutxqneh-WdEilbeGxM-K-Tui!~bBz0Y)a%3xd5@>F~CR4ZzKQzOj5q2=ai2+c9u zq^%UwUHhJCYelVU-+$z~{uAf>dmaD3?g31@7if`YCmTSKT7_u)(7kPSjKE4AaXA?1 zngrkf&3yrZ;h9K+rsN$)W^*rjB8sK!NJO!W7`Apw%UF{d3kuqp7o$+Z?vS-Rv^Z(q z6xjcQ#{fO-W)a7BHJ*>jLfe1~o(_3pOBXup(ZV2|!FWZZ5Wg~$1Y%Hu?hEF7+OSm#2>#FmEV=3idF&3~ znHU|X-ZE{;T8e%Z0@!m@o3pk|vYBt8)m(I+hPB%TYd0_rm^@gfv261uV8u?=6=N0W zNy&o)?70^mj)psg5{?+cwm^*uPcnp~hJB@&7!Ck&h~Z$m7Qrp)U`9}^L%R<*9T>hy z5Ng`Z$N{e-!IOblKhV=ZaX7N1maeh~FPUJ&Mn};@|4YDw(Qcye{1F!ly-xro9XK?2 z5gni+N_zSbq7xzR=fI&PrZ2M*L==5{pAH%Y^ykn+!WGTvIhbbb=^J#&C+j7M0Cm-X z_e@Mj2$^xu#RP%|brTza3{)q!MC?$l5r$$~(*WKg2{tfzg1KN)6D2sU3IFeY(KajE zqV<34YdXdL__)c^>BpZn;t((dQNE&;A=g{Ll$Tn!T__f&Ld1_UWhXK1 zaTKXAmeRpC<7YSx0Zh-Lszrsix#FQ$}hf_1D89|{MU`7ukuf!pK z&+^m;j7bWdIUyvVmscX#J5VbLj`VUcL=iq4%iUzS8O!o0+f;4^e~qcLf`!Y*xw<=N znf-Ykbj)KM#!!yaoI7UDtUODN&sg2Pk&UU!wKIt-Z z-i0ACfCSkM8HaZ~Fm<67f9dexD8@kgKWO3UA%PwKXb80Ycn;3X|Z-@rsD3s0tm)Yado1KtI&=2&&6y zbAGP2U*8Y)&~wpMb4)3BPF@Y9eE8fZp%BZ4#|(4Fz1LlDxU?}VIZC1yz0#+bj1#2g-l&}_sKU_xYQMDQi=cQDGw z5CjL#Kt3kYUR-I~Bo($0RSP=Wmw2V%og9`>T+idRYCH;{R90{16Md;j1VPuuf|iyc zUi@F|y$e)RXWlh_K;$OUsEC206D$Zpa14SqRQmzmAb^EHkc*58Vgcw1i`9(`_AS2)_=i5 zJhwdOl5>)0KYRc7mYv3MbA(?32mx7DJ}E!(@v;%`^G5bQBhVDa^~T6DZ9%=C6Ozh+ zf(xihtX$1xb`X#;@NCc2bO6r)gD`FYTBZUdSo)F}$)pTE?o=Qqg>5Z2kz7uPMtGsj zF8wwb7C8HE-D~fQzckVi@0*X={;ic&Kk)v(0Sf!tPrCYM67(|vQ0Zq;U8>4 zmu(Vdcpz5L>`EvNWL(Ki{Fon`V3$zI!{r$;ru;&WJ1|U0xC-~S3V90@qOG<0#XUSM z1`Z*!7_ec#U5 z_XTqwO9GmYVO4mf2Q{fE@22q*x&sg&A(O=7?h!%RhZUFP-$Jm6aeTtLK%?Zz0MJUa zWYtRp{8#~8O8gO%{bB`K3;9%F;2tAAg~%U6w1X2v(1>wB1q6fE)Ie=L{5UX#55x=n zy0#X15tsrp79(?cElv3mTd~arh!-dwvsG{|g1;9JnXxgp^9M2}(QF}J!DHl0pfRA^ zBtT6qUqS=T2tUIyN5s2e1rRj(g#m7}s|@FCncG`QnzBz2^e|(cD%O z(?%|E<%a);4($W9OZfRXYDAOt$Zhz;9c8s&Xtiil+1fNFLd)ayo>7aTUjl@UpEOQi zAm9-^%?ku~+3N=NV_1mOHqE8JX!H3BWY2DM zFG9Dj{7$qhq|xJ(Pg}Sy@;W1qIVJegv7uA4$}GP~ZffOi9I>{xphJ>X-)$Z2WN(P! zN9HMMxKPi=S0BIHk9YKz^r+^B#m(xc!Per#+iR@nzOu&%xf>|hi+eEly(tUE?Y%oE zx9^J|Z*CGGimh)`rSZ~?Z%-7i>_tCtTF4}gX>VpCIu!iR@gL_ZG7g?l+J2T7d+x`O zi5kL*B17Pt3+hLqNv<9hse*ef`CLmDoWK4+`PnJ?U72Tc+n1$eZl(xPc(<&7K> zbZsXLA`gw}S@1D zVV>CyWbp>h>kX}#nb#$LP=cJuH?DSAy);xkv%t&HS%oi8ywNJ92pM+aAOT4Ysmyv0-~oxC7+6%4fH%+ z6vpsP1m%-pjeKaTta5`lBgLduT|yKu3M-PUQCo+~s=jh`fKi4OBnzg3AK^ZA1H4*t zY8Q!9msFwbVmo@AF{uBsM%RxrtLsr14BI-`TnvpN(VBJSzzaPDop;oJIf0Hr#T5%$ z5y9dD7Z4T~gvyL<(QgM^l_%*Z%R>t9AjghQDZR{_;#y3eW7ctt&XKuiz`{=riwI&x_)>(%2_`XWGzQU#Q|)qJ2nD%X-a@Mg?w&q~L6J5*2yyyJ8j zU*MIzq(v@=b58`ytRddPDPIL>EKoy44?TD9L1TkS!mJdba~*W%MF2t36wxGN-NZsGQls5y@Gn)AdNxO z>1v#SG)TvWGs6U76Wt1iNOUW3-Y^2BP1tty*NIKx4=sF}8-i_c+WdAv zZGd5-!5k8{P}d%Nv93LScMvYo1fEL|`n;LB_k#C5x7%&6tzTgKr9lW2w%GwYE?@?X z*fd0UoY>#cS}ffWYY*c8fmsVqxce3-oVRkg48Vjd$5=uO&@e)6eC#W&r&r)}L~_^h zWJu)p9dPEs&8d#oNcwLQ+RXKyEK4@Psj+)En9^Fq&L|M-dU^>4F+~7@-caB;lNwagXe6+lGkbv!6eL%+U!IyWchT z@1c8XV#HQ)&sXX93CVU;cNN2}hVH5p-J$VqE|0HKG>)wbwU$%hLdfpO%*#pl$i@(_ zElaO%d_=`mG<%}u+U5sd#-q5T*K9b!q#V2Q4%b6&e{PvDbAbpbTc3;OxJ(Sq7=YjR zXJ0W}qIOj%UTqH8{q@3M8N6Bc+U(cn&!~u==CEZ-Rhi}VFU+fN8vdGNHIsmwGtIp3 zmY$qqRW3~K{B4FH+Dvw4m$#wV$bMsvtxBjalvE1j{t+mgG#2|zR&|IoYzm+eElamd z=%}yP!A%42X#&SI{ZUpNB4|XTISWgn$AT73=G)jG>^%b z@~)mgSO1hY`KGqNq2*tH#rRin%p>(rBl$WR6ooUAuah#8uk+FpsHgQ$oB?+{A`u33 zPIpA*SFOt|_E}FqX;W_f#@FgUUPW(s=T)cZoR!6{`_xI+uny7X>$D0eU#E)lbq=J2 zSQ}5~^L2_TU#CcZXnT6De6hg0xK)^fe4WYAdQ<1tslN#R zU?-8UBRx=(E_Zc6zK+b{x%oPC-}=EVNbLqeVQ@+mQuum)n9JwuoDV@jO6(PwAvMfB z=Qb}mL~#z-Bt&t=U79K9w0%MMumUsj zk7L7oGQxXy-=ch-sHHtf-`RepP#M*oc;lnFZz-tdb8b;f(Q;^1Pq+I;HRbDsV+rzg zdK5_0!CGXtgu^DaP;sS8xpbovvp2ADPe9M#5+gs|j_j!GuSfMfRD?fFRcuT|zRv9; z<&{t8DgKrkT$phqC2IMnsn@Mm_gZEm^=ElO;&SBcJW@tUuQsi-**9SNC#TO&AOvN` zy<c!3o|_ z$KLoz87W*BCCugXgl^z!2-ihU%8YzuwQu0>C!Ee4JAAcHa_yLl*=I9tS`&KT5AP|c zITSPIPZxT&?@Q?QM(9c1x>*}(oTd=l z$D%glN174O<1_J%k6v$ z6ZJ^g)K`IP>C$Xct6bl+Esv+t+w(O3&^0!2V zQi;H`8--EVCvIH+C>0kc3ddX+8#!rpuYGS*^@ITaGSRbB5Y>yOCoQ_Dj_pz?5eIbT zqr~t}q4Z3p<3r}p?5M5=M13m5KT5q`5EZpiiJMl@07g-{a${ondr`gJIGR*NXzKNc zsbww)k0BOk#c`@!P`UDP?nDuiC!?Dw%wqXSfqbc@6R-h9& zBuZf%cM|Y7D-clUQjiYs5Y`(4dWOKH;VX3bZRo}r%HT2LkOqcrNA)Dbn*W*E!K320 z<8_|Dq=8?ww}0!#AS;Jos^PQxT=`TRu6&BW<0#$j1PW1Z>T$PZK8#OQ?> z$?aq_L>GiSJZZ22101kcae@0P8C*p8?Z!Q-fuqHIF)XHn16&H#^6aW^VN3vYuo2tp zTdpF*rO&)Q0QukzG-s?iS86njX~jJ*p=!5ufd|CL9bQ0jhKM*!hM}MZ3{(iz zIbo26>_aGzVlu*VPcy$%TlEEIAqswzA9X-h5dw>7_<#*5;C{2k#*hgkSA*HRQY~B< zd!D}h*4SZT%m?feq~ZRJEz8VvPRonQTNWcs4_Q#Ijxk@`TCy{A!5ww*k_C$=$7XGo zEV>(l`&#rb6x;I9Y7~iW=QzUTe~3o}15}=dq_oX_MKpD9qv^IWT0==dEB;3$60r%4 zv2h}V5&&|&u&FfdmN!v~ca)+AzT|TT9&;vmHt{o=1ImYiD7;!!`jj{D6Tb@X=kOXg z1!DKPNE>+7bHM_);V_Y%&rMy0)d-%WZw}r)aKz7I#Lr?RFZF+xmwG&U`xkdaw)XaS zz7m`e?A!zQ_WIx08tlmbN@6%MeUIy2v!t)QZwu1N$#xi?TU@mhaeW6;)Yknrgy&$} z6@AvR;4<(Wc$3A|`_$3SE*sVI?Nu%KY~acy2$X4LB4)rR7kDk$x0aq;X@)m=|6Nm*$oK44#Vup6mLnf3RX6!*kTJ z4=*G<2a1KqbLhG&3W4VmFH!_5y0VGAkD?+iHwGyZf#-T(SM)rLy7DkJyjvOb6wk%- zcrNOZKYF|9*8z3)q9^<=uo2<8i|G7n^HQULt1c=tZWP1<&xH#&Mm@@i>?ydD5_KK$ z?)6ZtMNsK2goy4MhUb~Dg~f(Te|Iaa@cN^I zSTq$zd8vptUH*9Y9pt6Hr;M^%cfG&8>AqR({qiSm7rPQ;cBNhqU%mX@+*?AAKRvk3 z@=~Xp?ROsYr|$+@{`llrT@K4j9YcAkwFAd~{Kv7w&in5D{Y3nk6Nj%h0MD&+{u2tz z5(e5N$e?UczQ6oE(=UHaQATZA9o70!nR0vaoZq$KtsO#HGWPZNc3bzZ3g7DpYliH~ zyG?u7G}V;HRaV9AiHj(Ho9fQ$#Kkqvam8^FdsY`0@84Cqrnn}dxbhGR3C~oc&-TRZ+Tu#*&*~2L*4+EHsXV;03RQ^lfB^i)H3v8CiT~}MH5$SK@fuCF zM&lfbwJLNbkO^YHn(2{y_7_vjeOoKhxHDvaZH4{2Gz2%c?m^BeT8_V}i7TcERF{t{oz4JB zAA?|Wokp`3Ef3H^u03Rfv3?w_eU^n}7o*D_pRQKCz-Z`i_G(fZ8|Gj4YK-0|sLei<`(BGS;_cpyV;M)5zbpdX{V0WNL z7S{R@a4{9=F;YSBn6MijjE2OOZUI;D6mnW+ZLd640BGFk_u!8 zvW~fSj-j4(0(w}_7Mf}$nf<%=#$T$kW* zL_!ZVHO(mATZJV}bv1ZXAYuKi?%n_XO@{kE~!A%C{n*l0GpD?D=*HH`^af=OZ z#XAs(%Hv!R zJYor}OiZ1T;13u-;=G9t9?ji!o5Q6|8CD02TUsB{J=o-~fGT~l)2SIeOCCbAFtt2D zQA!}+^4MA+J3@P82MKsb{G6H|CCE}88C{1zyelRxBhHR_T*4f*OdW_}7N)isIv@cy zD$S;_RNkTT%JusFSg*FAS!2EZrRR4=FNvQuF*r{u*qt)oD&FhLZ(NbanI^(0&A&9z z&732Y_2NLcITYwN1Ya?1L>MeBEsg%;Jn@fBz7&sPtC#x+rlE52!OQ#wML&br&}HF& zM)2AQUSk@o;W-c^{M(5C;7iFjtQ^k2jo`Hryf%W@M)2AQUi(ktHG56~VYfh!Af2uc zt)1dUo#@KLHShNfM@S?YLzyAulp~}>+9FIDFUy8ZL1KjBGGb*yBFV3sX?&vB;ig#gm{8{(@Wyv#;ADGbL-hVBr-JR{Zg~5rE z%XQl{Ty(^h=0k5e~A{t1ILf}myGzA{J-m8!s&6x zZB!jD2l9MPT#B+CPuks;dl`xEcFf#T`e?i~y`Ydk8=&LFkERaf*oRXZhLAubl zb_+YCPLnHIq>HQeL3~nMDV!y9pND$BQeFZ6k)2U5D?TlARZP9q}b_oJ2p~e8rCg zcXPeX*`00y7WOEWdCMXSvZyYm>qZe)&&{aShssIZ`FyvShwc4$7Oxbna zQlX&1Y2=10Z_Em~VyWor4p7uX2c^6YIo3y{>|#wRdPoMQ=xT5ef;LbQ8_q_-d!Ul) zRt8u^^#li8nF#U-!n#;Rp>jDCSzv7-yL*@liBlAq7a_IW)1_2wR4ymUo-!(I8at{e z1&#_v2@Oz`C8DXN+GAE+`I{2dQq+WnJ=F3-ML`r^3-X8^Gp!9)DxuDbDT1zQ362?S zR~AHFN5mbJbdR>5bxZ6`iHdq1Qo+Qi*E7R=QkRD)Ko4DEOw;v8waOd9MT#yZsG#M_ z*yTr+%RvS8|5wBIwNHqRne~rFDa+>+b~T7USvTg(Lj#XbeDD0(gX!}w9#KN=2s&)} zM~RVE>!KF3M#CQmEPV(zYy0i))VHmoKB|E{>QLPwvrq58`XxsA>#jCzXm7{`&r|zE z77KRiy~N(7tD_v+n-Xn4`()PdR{Ef*3*W|`X(nXkhd5y5ucae@O>Dd)8vTeN`D-!A zU$fWduQ|19^Vck7abn6}vu_BLp=$kU{#uwUPNK_SGkG?DE%|Bwns7SO)O7i46cVnB zK(mg_c0tmaE&>htYvNYRn2u-i*QzOR9I46L{53K1*S@9vwZ+sF%U?qTnzf%VMWC${ zH?SOPiv(ZFUqj^gH4kITUo)#Xc{#ehQJ24V$iCt#N~f^%u@xu7eNTt59xviY0!p~=}|1haiF`Baq9@%g&~%3l*AW~~|dYm)vzSq|Gda^#W| ztGlPL{Ivw%DylcBZTU@bLVbg9^AeZtWe5{(u}P1w?n6`JhLVJu&wH+Ifq&==b#{0# z4e@mD1RDdRY|`1~kW2DX_PmyEq5I;j^n-4xF!5s*h@5UVD-9*;C`Xy@S zoX<2Q4zz8+Mo*5_+AMCUdD1lVA1&+cUgVsCKyrZ`Vms9CidAYk`klj^GxlP@cIqLR zRm8v@Az~X%F{6dyDzInC20czb!JL!7GJB28*__uaLY6f%Q(S42Zszf&IvFg2eFfx; zCF#)Z6~M_8#c17#_+wXZHIWJ})(K}txS~18t4FFJ3VhDZ!#$6{?`z4Jwb_hfo}Kc8 z2;owhYw9BsI;4+9{t30+)}RA~T-wE(9QWH{MS>7I8dCrsb~>NcICe-8`bM+KOUOAC z6hRry5^d1OW^E}un^mA`6SV{$Y%TKMwB3HjF)(<*qku9UAVLib?@Keppd8gJ+?K0J z&XQR^(mv1tF^ z>YeBp-8C@IosC$ftaicH%#524O2><)R_dpnG{{)S9XNc{=d+_}Ge#}zY>qPWMmgk` zFdI)jlR0y4WjcKIK=o=#X>iE5BDBjvcXjhcsx2EP_*y`G!eF=%tSPiVKj9MuFK%fH z0*-Jm5#sP9E!ygu6Mxp%WfU)94IbglUd|^7kH1|1C3=QW7{MbT>u{UHS7`)~jNlRX zi@^(_m+vW5j^L61r}0QT&Nxwi6Q`9P#%r|Q( z^iruuW4whKHt6t(?@#ea#2c~-9Uf_OtcdVCIJqJuLGwI3Vm1_yz#KW6@Ce4m7#?vL zjz^&6egPf{7=lMo0P<5jqA2_c9;uHV#3PW>MDl7b9*+PQFg${;{xf(4RU5yk@o-$}wo&nvMk&DX-ssb^fi_GuuUy@ z0z-hhAdVx{g@d^DF!hE|LGm}t%&x-SD<7p+d_Sf@(U5^7=r2l)3j5vdyZ<=mnxc%v zYirw&)y(~DLrUhG!#jM&+@IkyuPT}E@0DeN&J6m5dGeD&bcB#=LXjOAkaSQo^fY_u z5FN{q<>6PR>h>1bX2>JfVsJKMo4e{lgd;^pZ>y@Xj!bZ0gjx>jGdsXlj#jiwopz_I zJ>Y7tj&K$?he;jm({l+<?aXDgbBW&v&E1L5uQ8_HqUy2@m?qDo6 znv%;C(04>rvF30RYlcgK1V@FY%qgNo7%an4MNb!Zg&~|7P5DW>11Wu4=qF>yr1nm? z*BY1d@q~UXV`{4Ft>=sRop)KrRDVu8M>4c*JMDaXBWebg)ZQtMIMmpDIU%v}Z^g-- zRe)apjdWCvqr(9w(mQd2FgeQsCX390{Dt3nc0HO(sC~$gNtmAu0niD#?hlJ24q`<@ zJQOm?_a%LokqnLWY3w5cP4#uhp#LEN1zu_i~>GgHJn7kD`OK*B#6cv%n-;9t?~)ff}AY_0#CaM$% zo7!gBCTH8~moT~=Hlh^0|CDY;BO@rNg8AI$pFf&n)i*B4+NqVMGPcfCTV>2ExEe8FyYrg& zxAXc*1&?=IpYz0R&Ah*Kf5a6<(b?k4qUbj9ew*ZWNvjAn+THSC-XP2$?-P(?Lbj-?r+cLOg**X zo?uqirZEMt8Eo3VYeCiqe9|uD1o-R}rrXSKx9u+}Un2jyWZ#9L_>yF`hYSo-LRs*>(2Nit^)l5M3rxlMYf zB>jSKRY~#%sd$H+W|KO6zbOepUeazAI{iaykT&RZ=BzYv0$G7i>@=Q)uoOKLiu<>)QycmQ*dg~f~H%aqLgRd zjn@e@Eyr2_pGoVk&;DKSql~xNQJsewKnTi@2q5)#6Kq34KbBl6NQAw@m4`%Rod=3b zQG|z5MN#-eWso8@l3-iZl}CxFN(XZVvk8J!lc+eU7qv>=%3F_hP!7fo50!84Qbs*q z*z>nk;KP{u*yWEiZd5&K`AZH)ufKim*zf;x`yVYk z5_-u9BKg{}8s|U#IO}(@VZW`6>#ZF4d($^f$9_G~gwmi-fMR>Vxn*`0WZbs=-R;Y% zx8^Jw+|kO*sW;yH-OBg&^fYV-&}&;eu;^Fs|KW%BrtRN7X-RtG(f@94#{;wB9cE_r zzCw^>E*WhrH^Vn6!J=_70t~aSYWIbSv!%?}CECopuSgAeSEfcfkxRySB2z47an;~u z;$6B0GQbEFX1G*#$NN`zS;M>z2n)bNPAf2Ce;~zN4(^9so5B6uDN&nwI89cmWll(W zjy9`087j}NFAs@HsJ#R32jPl-4BjP5?jRCMN;@y%caD%smr&fGXiDlxG!leA?NVPf z<#E>$P5HYtTgtXpqbYG!Gto%RVe@@aAs+1lqzD?RxiHeGtUgbcgTn>%`m{Tq(MW9P zIrR_0{a}TklRI9K=>8B)leE5&pqFLLx%xZZppo`>#|PBjxf(K}qauVMw;d6zZLqx&+h6&R^=RU}9HqO~aIEthVanD%+ig%B$} zDvr#5OAC{2eyd#C6m(#)Jtvz{jdR20bCm~q1{!XaXHKFs$r;8<5x zkH^*&)PVllPIZ`#E&+_WE5feGB*3NKRn8KmTr1E86|@={@tawxSRiH7$0;3U;t+4W**cj9Ndg>3I~sP4|gfdH8JH_0ZY0=fPeD=7~!t&-V?#x z=n`NEmru!O%M!kCBwScel+rwyN>)Rymi&M=?x;uaJFvPr47D&uw>Il>*I;HKFqz$P zI6ozHj`cFF_g|W47SU70I4xkj73&ZCP@XSiq4Id&NEErqUHN79>OefAq*TK)nao%_C<7|Gf#<5iZV^b%_a3_;&huze=v}+r_IdTX&E_YA|!^M0?t#k zO8*0W$CrtMWEsK63 z95f_2$e>`>DPvz>0v9+~f`cmw4z_BY)4k;{frI>u@K;;kBG%zCPU0_W9>ilS?8N3f zSCfHcnd7D+wGT}-&)iz1-U>s|A-?{Dc+AlxcVC}xe24UHp+jy`sWfiMoc$uB?4X-c zlM{cN7PGGMNM*vh4zc|p9>YV&L$PR9Qjul*p-s{$+x;a;rcMV+x0t$~5~cgQep3!} zj&Ba^%k}uy@kpol7?&d#Wd3BfSo67I)ca5A6KFY~;xR)jhR4u+7VupXni_`37Vog| zt>qz^-CI962TgE4KWkxdNC1TU7&KbCF}7!;vS(vzcu_{=(bVvx8IhMWP!_yWn5q4J zoO2am6Negd__fECm`)BFiQ3%-8=T?y|g~%j-syKh2Z{_Ovnz)Y})*Ng| zgfA~5H`pe)$qd+gfe;Z?oj&us8Y5Ld|LeKtloRI(Y}>lQrgekeLb+XQlCu%J!l$To z#Z&IwoaDAR*{wBsE`ArMEI6(9Kl@kzS9EUzU^sp}B{t0)Y)+rIdrR(eG0A;t^1Pnp zfF4{5x*{+C`GDbfoQUo2)rIkC#*e>ouu~F5PFuXRrv$*d-qXnk6sy}w9Zw%qv)7~3ZzbWbXLV63Y*n0KjghrDn zO#SawCEuSlp=H>w_78vic;bCqd0E)9dy6PF*D%_`w$gUzl$76_?<|#^5|>Zep1Vj^ zh2b_Uhl-Rf?94@|jHjVM?X8R{xbtOc@8a_OY^OHIKeoG`ai%|qzU=TAIQ*qxzL^Af zv9mkw;_dZ)dy;FUJ_!~0cA3t9n(_}ok3P+ax~#kbTce)s%O_<%dt(hgIUEgBvS)GxkNt=6 z7_78k!<(!UWGCf$ubUT!0du?2Wf<)RpRr#s%S<|UYD%7$!@Q&U(l5<^yeW5_xWGSs zyZ!6AqOm6`m-*hAV~mfzr*xYT_~~@%f)0tvZZ!=2D!_+{T?&P>#P*frV<7*#;Cs3p zUCiv=AQZOJusb)zpaI{9(LCKI?-2Kq{O^v9T*k})j3=wwB!)0F7FXB=cZgeURP9~> zZ=GI_=pr3|M*e4aZl{}{g}vW|h370{dtkYylmDHWKo)(ymhdivI4~gKuOTF~o2URh z!;n6iCxj>*5kTlxik66i7a&AsvM=}C{wR$ls|51^isHv%r z+W+et8S}1{4w-U4fn@<={(T1 zUPDCQJzCpTJEPhEO;t@zU>P93OSIXi`Suv$v9`MV15Lj^qO=8a1l@L< zSh~dJ@9qI*R+sq3pQ@jbSn9%K>A81o8u79}u6q^BT7I1VzgEu4t$4c_N2;m*SaWco zZrya~0=)qmiR*hkDtr>)XfD9*UI?+sv9Aq|eJ$_Uz_Aa^9aikFs~(dYbLx@FxrE-9 z4Np97KUD7f#LT4i_qaFo=-!ynMsx&ocrdi>w+MzIxF|(Ha4LkySn#)3N&2Ams-~R-Ci%lGUeWGlY+sMD6lC&B zjqNLdYh55eB-{7|7mT>G$JQ`lYqK7U2?E>`wTSS!V~9fb^iCo0tzarj+Ly?n6~?tC zJ2EFLn87=W5xnFC{U=2TKMVJu6U70oFpD;mWQtNkT%E?L{ACVRAK;2sD{(7SG`GXO z{>Wud=qtNj{p@iotgb#;6anwRdpMwbOh#;WFk(GA$TMHs2VYJLuz7k~2U*zGSKYL97^Nkrj?*HuMKE z22VRCPp1G(esU63=x2=!Wueut8uJNUi^lUA)@!waTt)oskUslhQrAnDMg9cia-M%O zHRAq{(a^{M0Wvs*Ut$bVYB*VyDZX2-BG5KpCUs=)b7I^+c%l(z1*Nat$sP&Mq{5A$ zJgx{Md!$3h16_L&)F?@1JQhq^>=MzvC4-iAP z2`&gkh|a0U^~Wa!;-%fYBgSwy*TF%+=kSKig7QC}IDeD9*U%^$c(bdG`@xpTNg^0| zuu9$xxR>xY@XHWr(5GDnEhT?z0X{Mh2V+}xpf|g<;JQa(m4GRm8b(gy3aG{t%tXsi z!K$qmj$*A2gkry1U~0mLc+(~@@Y90T3f!X43Ez`(Y4By=a5;WJ+xqz;ui?$~l6=}`T~b_^_tjJcTt z+gTrY>RAX+VMi(hF;{x{c&B8Ufx*|~T}{nQTUE&y;zl8TThl{|qqLz}JT^buE`W;Z$u3e4PnU)~;Nw_ug3{N&dL7?9Ea7#s6Y z1waCnD_b~%U(W)ujo{Z2{7T;+Blr~`3M2RxT8C3K@^kz@hhOKv+thx6vJ5$&~+O5-)Ry*)+F>6Vis8S-Y(5_Y&W2p-g^vd zrvtifgNL2Q`AL)0XH7FSnso>3oc~cdec;%4PjY&}pM)@uk!%W6VG~a_g^XidirO?~ zDhQU_yAqerL8%%z#*CE(vA23se|7!QIEA7IHFq0HLON;V+gDPTiw9=k>Q3$W{)zfl z)~^9w;XS`@!n*5A3vWCYpP4mx-bHm{Fk?fnf2xf9--%Ig=V-ni&^Z4HxoAf3B&W~r zzY0kz@tDi&V`GS3+_>^|ed5ZasgtjC7aaS`*H2o`*C*a;OkE!LWOo0%nJSOiVd!YE zXf0c8To4UIEwNG{*YN7h7;_oQdjzuhiC`OB?SLLl?2n*mtqO+BOd5(zGV9=Y$wpK} z@(8uwA`$>Di|%2$YhSra9svzwAx2sFqBV$45k~9O!iv^xDCn#T9bKjX%>np|OsH+J zOc+Z|fg-esiLYt^(ZY5T!L}Bzj zs$9bf5IIG4R`t&*TH6c#SPU|Tywh{!IbLhb&gSiQ%9T3UR-o@+s z)gM4$4|LEZ2gO?{Og<|`95HylWgPcC-0d%auzl*s6LJhDGIM)WeF|{#T7>gWB`rlU z9kvX_vXj7}%diZGt_7_8iRBW(*CB1CKmDZ7r#=Y}Z2Qq?|4Ax0z<8SR-8rBH5nkS^w|Z1(~%H1|e9Aj63Q>q-#> zz2F+vUJmvZa>8%zUScsunPgQ;%K0JyTfGym@eImNR)rA8y&OG23Iv=V2w8ia5JhUw z$5>1^st3DK6U(SsNekM8e>{c^3Q?%Zrt0x20xWMGvwbwT{`EPWr`_c_U&=0o-&(Vt z35D~(S&%~rtOo&B*#HB(g=p-C-C)S;!~4a|1rf`KWk8)cmEF2!Nbb`uvrW-%hfM~T z!B~WU1%T;rPeOJ<;6TsXqd$(?DM)eoDIj2zGTIvfUB@y4!~}FPI3UMu{G7~4d(P94 zOY_|B{?IaEl{zU;cE;XYCKcCyBop5e9kHGTnNd#sX~^a!TN_p8;_~vsPH9D65c0L{ zRmNU%@N9Xb1wBD1bA?%XyF5!dQ?pgvaXs%X7F=N1io3!Y`ua&GR-+9wVopfE`PWgi zr$Nn*JNuNI-Fn(Y#!xDwXFc;l&n}qtl%I`G+VZm$?Fhad!MFTK#|S?=f^RtyK2ApP z?f(UQyXp&y;WXcO$$O^PnszV4s;^7Ed@H)T)B6Ooa-{bQRQbNLd0`!1C-Z(3*|u85 z$l|8E#9k79;n{y}!ySRaQ+%7L#kb|)XQ_iJT|9)JZ5SWJ@NFCMv#@9R@AI>jWY6*p zKl?w#x5N3_g+JkEp{9*uRwraMz7$n^I)0YNx66?YH5}hw*YdMEdlukZ%TN?NKILa& z&%*dwDph2Kg3!G7PRfM2J;S$cJicvM_haIX*JTXfHW9u}0A&3MzIDC_eA_e>-`@K> z=+!0{u%m>2E2lp>_WhH~b>F|bpXkuuW3^y(2abJm1jS!~qKJ%3y$` z4@?W1;^ni{jRkaUE+YBtZZNAPpCzyvD$9nhHWCG9Jh|yDu4ZD`E<$a*b~i_>-K|pO z_%lBX;Jf3$3mo z;c&B-)^#LWw;C6M?VQR#+0MftpCzO#t`Cc;nb#T`^A=;J>Y+hKf^S&NC%|gYlh4AB z#kLhm2f*&q7tdYU)%jGpUM-wxQc+bc|mP3-}gd! zC8My)nbcAZI}p2agrD1})dX!XF!Oym_|)M9uPzFtMG#|*ENVo7oGMKbSi`-4iEL4Y zIyB-;xf;3b<5WvzKH`1yi0M_a`QY3O^tt2aHu&ePVoVxX(=6n71ML~wR@eYIV7R0m zXpi_!R1k^*HQ-37H7MkhtjLfgknjd|{?!C4aBDHlE3Uv%@|B;%SW^!1<)91Wp?vjr zs$OV{dQuu$L4~e72h^{xFWt4kPN4}r=B)>NySBb>86#&1RjzIsU8#gxR=3P*LNN$QAsU@{WSPUZ>6VSkVp@*mc@kso> zqg6Zq>u&mShm@16SDmT|Y5#gb=WFhlqU|r2O}ut<^a=v4oGU;p($`zVUc+M%5;0?< z+*G#pbEJ+NmE9>8XQ-13{aW#M1Rb(Z@v$%%C}9@(k+I1J59tL z_f)kT=#LIuAsWS*3&xjoX(#mOx2_*2$n!hpIMdN)LWl4Eu^7ylI%~nyXo-*i0mJO< zZ@3j3KCt~2=jt~5!i*WEXShiz8+txKF{VmnX%y(GZ@%Q{t*x)my=CZd*P_6K?|~bT zMU2mESj4R9o8vL}O;7Iyi+p7MO9FX%)0iU5@-1FOZ=&ZW5>fw+RXSptO=|JobUaqf z4rN4t3#sXd{&qxvJEFgZ0b`D&wIqFsw+Sz>7D0)JpT!$2T6fr--eKogXBTk6`RosF zZ~f?Ye!{{aw}9Y@QRgQrFIvV1&yKq2j;?HM7eapETkc zPnG80_Q^MRs$4I1%>DD6+}C{b?ZWe?Z7O_wYjM@CJ>OLAHGM|8z9xHrQTG0B=6 zkgQT)5~(UIqQ`F*6hoyot?^TVQ-<;0WeGWg*IG6RTw~4sGYPgxm@u3zim3s4 zG)Pr-6IB&DgsRFRhY^@NYInYkiq?omip&93l?f^UXRUYh$B}V*MqKkNRBby z%odT`DMysUwTPgPWCQJTC#H|2KChhVBYiQNt*;>TUbq3LIEwKR^qGKG7Of>s$;Qiw`x3EZa~k|2Kq4Q-7fRnVM_Q0df2ch zBsCmfJ6`TvRdG4`9!4#&4BQ#`AJmP}vO~4#ee%m{D^U;03`A2{o~YzXG-2RN;8A2=qLJ*-QZ7toICj-O- zO=MpX3iPrQgqpYlT)KTl2+9{LF)ToYT7qOF9t65^57zF4g$>=1+d-&BWRvwKw7C$C z0;%A`gWcPxa1_%f)l}h_?b1M$Vn2UDl4}SL9;|O!2G)yh(qEiB){rZj3qs9)IH7ip z<9G*t2EDwE>5*h`mA)s4Rby`Z1k7~aHnd_WwFWQ#r>}tT3@!`X#MoXv9{fJN{bjuH zQ`Z#kDQ^frsZp)^Q@e9}1{a6Cg6bOCEL*{>h4?AJN(L7P0VeHICnO!BM8$TxeXzCI zkxq^(hOrLD5OnRKfHLr@lMcsq@_b!^W%PclrBgn5&D3fdFQta-6K6{&^#Ps00(KTZ z^9KYscl_=cqvLl?UUjp#G=h1wJ(mZ1A7bK|C0^4e7vSTmXiFdsX+Xp;anB(V5+7s8 z*>=6_SP??{;O>a+koc3V7{s?rH^y_2wjPn#*j=1}uO@9F?4f#KV?Ux&Yw90<1@$_8 z(vd@}Ipi9cdKj_!{ye0>#p6!ed=}^z)dwx8HEZnOv$+G>iG-ZSzH6w9eRLrLd;E&r zl)j>G3>d@ECig$D4@>x-tZDA!4@SJuGEHrMr?&fQ@;REi|M{oZ322YsWDIv|`+ClE z+06Vrk28laWWD;u;Pl*pSk)SoSpr#$LVcv8o%$o zcOpf?s>~A=hM-Tk#DZ*)=mAbb1Cb;(ttiHBu{>pE)adcj^ zv+b-!(m40ZK-=vbDSuHQH`>sZ zyUE#lnR1TKGgHha>FG79a`e+rNN$y+TqVBQb-vwH%k-0~_|gMK=A7ju;SYME`7y73 z_h^4tDjN) zF0^MGq;WS#aiVa&se5uP07le*{mD@TDVs zDRq+Y?K`3e7U4sIzC%aqS^vX&;JXY@=kF_w5FA_DCUtaw^c%@)i<4h%t|;=#O?t2^ z8nr?7`#U5RSv!_RPTw*0#Gq@U;%Kxa3Ir?t{gyaM0>eN6Nvh$-uYUK3y|t_odK$h@$^z5oD9!pJIW zs=EAAG&<)nYUF7;(w(B>5zaEGlrpj{=XD)h11 z>+6LCH)tP_x*c+F6;iR`bMZ7Zl0bSx@HF4MCb^nG#_%)-O2*Usf_^LvQl5*a$u1u< zO1uXcQ(+x-Fls!IghWzSAopju4=_Rw#)qjRt6~8up_N0+^#omj$;9XtqRWoFFJE8@ zroKdX8dr}x{=}^JTcoF*$^%F?v9F8W$LUZ17b9 ze21$C$VOVtTpnY$(uzS5C%RkDt2+D%p7tRCEdZV-umcFe&x#3817I*b4FLT-JdKTU z<$$MwpNHXTx~?z8)5i%<8`{R`aK?-9G@{#hJdJS=9#7}XhvR8^0jYpAA%RPB*Z~kgCiL_1w3c4P(?u7Z$J3aiH=>gMu&HPM^l4YL z)0>k6Z8UB7ay*U0W_X$|FvHX7gs1Bno(8aSY0%+mmyP3@KotW#_~e4Zo#AOY!_&#% z;pC~VGGY)<7ta^dCL|Na%c#t?p5bXsRW}m9T8o5|`{Wn|Ba4#FxD3A-Pdfom>(DWe zr&F}==n$#uP&`eD6t5tWG=05mnPg0jr|}qFQx)`FYBw2AHx?Y2*(?uk`PXXEF^{LU z)tStymw$y8Pt$M@V{OrZb_%nkb=9q4cp5wB*TVC5a0TJ%!4*RdiLmiY@boS8U39I- z+vys94bQ{V1Nb*hJ$Dz}fiq?dslOfO>oMJC?2MscJ=e>Dgy#ta*6)^=Uy!Y>b(isA zogljF-2-Z>!iOPR&Mv4O0M;+jNF%_y3k<7}y&eG;p9ZSv2CMlTU_GJwjxgr1wErrB z^~$E^FzzU$Za?JL$aW<;&S|UWGrqLcs#xo zvAwZxN=m0!|CAINzo|xQ}<(ek7OdoZ$8QOM%-8R(u$`K7CRe%bz?2)SrbblAJ3*xa4<@Au?%vZNJ)f zOUaQEztd)3OE5gU>Xf4cTo7DU7Dui|e1ng3434GbNMIpQDC?(Q?-qD+k8_=1Y~lIA z2WH$HPoF$}&UB2~?UR9f@s%=fudotOXH zAuTLgMRbLGAxalfREtk&TGpD?!+CRg2oK$HxIYPO!7}>M;(1%fkE4QE7!x91v`c_vN3WwL$p`BT z3uCrbrR2-{?N<4F`-n60WkwajOT2yD3%ljw$;tR^^od-b^bW+TIp)45&5!Z5WSemM3A0r~<^d$a6LXU&K1^Ntk-mYX9bBZ@#(% zvutDj^5A^EgtId@>=*g`Vc!SBg;{Z@%8jn?`_gWWS(0hh;(hyez#l*z(&8)L&7V0C zy%xjqW?}M?{PmIi^_P2+4b5MNf32tY8JCAwXQjFAyu5jh`rS*LKN#RTBjM8ew)j$)Wa`*AmO9x>rH76*=f^? z`B_f1X-es?sW*2`)z1G@|K<1V?TORhvqt;Dn6|n&%~6w9rO`H8x@($9Gj)Z=>7Uw( z_Ql$L#SPh4l?J4LR=Rt^NF3Pqdacm~6=uwrO7kx{X~C&YjU;W9@m7+iUb-ZW^8rJom$@L}i@F zlsjJP2y@0gMrUwDs@S+*!?3eCJZelCbKr$1 z%nFqAp%@3&r2zQPt zlL??Hxr`rTp{Xjqwin?#V%+GC7@5JR>~jlz(I-1D>?_)7X;EsCd?Be)q`DOUz#_y< zZdSY{N4lml`GTaSJoAFAzvPld@>+5Il$@ZB$6w*IABI)NGxZFRHhN5;A8p3#y1iFU zbe`#$ZusFQB;$;;9Y9 zI)nmG(9V1pisrSGtYQ2a!LK9um8iE7{K~pCAq$tLEWCbX;T81=e*H!GmGkgJmc#Tk z^_I}|HG)-w%*$e*EesnL7l( z?jih&r{ksg6)-bMh1>z)SGTt;%HoQrWeXObn-%ch-u_+F{DUn5CICae7{9*7^bJ#tq@|tQGJp z;aT8U76M1#PI8)3SgTy(sMXXd;xxi^D?osYB@!n zERj`d@hjDb0>6?{+7~;fI9$ax*R{QL@nfwHXf$oOggxwv z{uB6BWLL3eiOhbGFa75rVI1O89j=ATjW3 zzugga^f?mR#JM!=LHH%O|81WGzxqPju-R$yKKNHj9)9HqaSKXGKHs0`o$JzadGk4F ziy{x!KKf0JthP%S1EI4p=3s3%G|rNS(1hF<;nx#Fh)-xxhsJn7_-pa26_#mXB~@Vn zGXk|@@CTe4P0^4KiRDdDVnNmAY)Ve$bsp6L5B=*mg(j>Mqy5V=zoN$KrXpsL|TAfrZKf?qi+qsi*RSJU#6E=7E3 zqq2w`vtzzlM9%J{950!8RUYtbLB4mZ5Lz$4vUH2h=NbzxpS$&W`g+HM5QIeasHgLteUV}E$GK-O&JFnM z2!3_*RfqW1hXmAz_)S#2^>gr5;f}6l04}UO<%fDo*VguZ_3Fx^B#Y#@oZ#H}z#ZOg z;bWb=O(k1DSF}qUB&{8izVbUI5|!{s@f-UslJf`g>xbZ9SL@|hu;Dhmf8}v$eVg#B z?UxgN1qHhaM8ZG+lM77QPrrOqv?GUN(7oE0S8SScb1Q!TC0JRzF9#h~zOyOq?d-Jv zt=fIzjIg7B(Z2rqD>Kr<|G%$5+E4N8{0+_!)Y`Px5`MKgU5C%cI_Gm34nI>j7s2%Z z+>a+(OM8ZY^^&-aJyjR0_ff2#+t|`L?k$7&rg*yRrQy(cgP_48L42gF2(<9S;iPN9 zYXHD2$k$FcfY&SnuXE4+=s%%SoUJj1oC+Awf@FA?OU1QwD9lKY7?t#WVTF~O_JB`) zF6{~gH59gDOGXoF4ifDOK9!KutxbE^0QD9FS~1?2NLFQ(NV}+J3@Arr3W8SsfRVcd zxp)du85M2_YM7v^tEU1YFC?<*0kMHptTS6ry07qtL=GMb0J8Xmfc+AupHsRs$7$Q) z^Qtkg@PSOAJC6%1ErQ!-PO~i+Shv`zEWGWZ5S3Mlh;Rj9h13$g_;_)w0G;9jQ|M+3 zLO3}6lG|@aAWQB<>;^oTVQn-BT|>YgJ%z5+L4OKe0dWbsvi=0{4eQN=dL_nIeE}Vf z2^<%4lSs{dr}_+D^J0odxgKYh8xsz8d(Ye1#jE0q39%MePV)u7y~iQD@-*RC;#r?U z*`A4*r!>YoXBrs5g<+R%Da_?6#Tw1Qwi&Cg@W{0xkuH9nS;$gc#ljB`YBX!F;#PfN zU<6yKr&dMw9D+GL1zYmurcX)O=jz3GFwl8nj#g>A!T;Zc5l3?~6mz({Zw{-!#+!3o zm?1>fLc&CZ)i|K&z)3}KjjZ|(nF64;;LL86*o$F27W_>KG`HJo_gi>4!8R@O{^#Y; zZo9O6wb@jB36{d2KMD=Tto7#m(uVPVhk)cZ|GvJNkldpwk$&}e!Z>bq`Y3L}mazw4 zE3w!+?$UoXMfv6|P*(D2|7F8r$LLuuNXm#7hyCdPAmAC)6 zEjF(Hk!S3a^K8pYy|W@6dB+*N;6tzXEL7P9)$Qkn<)=H$!&H_O%ijle`+cW2wrQezJ*apkO1XuJlGml!T4BQ=a zwtPMF)TQ(>-dV-zzV45$Rd0K}XUXrw&dVn+-O%flP_@VlM_?#DYN0ygb--HXBsKn( ziuK&_QC6 z#NHvlk%h5VY`3_Ef(vo0s|>Sdj&HB_~V6P5CK@+D)CsPPA-8$2TiV#FYpu_>8AQwKh8Ed02$8B=eyeDhU_ zfR;Voj)zAE`1s7+zVe#b_(K00(V}tD)~?@pJ-R#7#5%pi``hz(*FaWaY+tZJE_2W& zlzM8B7K2+E7A)kK4>6TFRUO!yqYXtxGOEYDLw_`X!%T8gFn@aWNqKOhdp9cTrTxX} zM?y)z!9J7artJEOaP7U3@0%AynXA!RVm>c;SibLDKiCXSMLqu)n{(qR6*XwQ%SG4! zkG(g6t118g$KP2}38@eoZWI+!2}Rx0t!{PG=2lb~T5j4@TF6+sh#@f~O=3)zqAY{4 z&rlfI31gYv48}5>G5hNOe4TS{-LAyvJM;T||Bvs(sdL}woY#9h@8xyg&-d%~e!YiY z36n?UsIHgfMD3r=@9aDKlV4_k@@q~^r0$Np!mHD~4S18V#VdU(F+F8nY@&HhR4B_Z z_v71}VmEZSt} zU_V%8QsROyU2Hj~#)$B^6D&0igzB5{j+e|lP@rS8o0zGBA$$G$`K39HwzJyU1(_gj}OnwE}lQQ<6n#k2|e`bjDPVS18Db4t=&nD@gEOyrGa;c{_)wO7RF)$IHald3}_whU?{mE4s@tgp_PpuRK1F{0Ey9IJmd z2V|9pLMI%suN@*kU_ZV~H3Y5A9pKDb2A23dWw;ioV65~Ovc%Z3Tahp~6Io(|8J2(ze>(1Y0LJyC&LrS!@)r6^2DnTtzG*!nzs( ziK+(3K6vDggs$)^uh$n;0tS}>3G-^j0AJwM0=^YgUz@|XyN!Ww!O}&1OM+PqzFnok zw*${=@a;Z505!t59e{6Fsd#*gyZ;E^ntJuKSydcRt&49XM0{)CJidi3CyO{^=SmXI zwp&F@fY+{s%$66;HpRE3Zu}4MZU2H2YYo0lcmm%xsu}~|qGAPnD@-4V(*mke$j~9r z9+dhK32If{_iZn$wuid*_^}wV?3)Wo_tzipdm6sAm|ut?Ig~enrJ$|Z9KKyn#@wJ4 z>nW)7R%H|lW2**~OGxYAkX$|;-&T}n27B2NzU>F&!vh3->(uok*3inJKK>7JCkFy#IyqI`|PXUD~V2#8B7REwkx?Y&t%^|7=?Dy|9t*yyH-Ue z8%uwcj2qx|HTvoJmW-Ow_|_Whs!`*Bo$KRCUeDuJUMw%*R%O6R;TfQ)2H%-ePuL~f^r4sE>iOnbiw9;IN1v~V?P#aJ zeIW)*7JIrn8}LZiCMVFYzr%@AOxo#qNu-cpK^DL9>R&D%x z(#%l8BA?@48M&c`CY{3w?s^Sk;gRDvO&IU_y569BU+idY)dpss26il0x3OHCaoj9D z_gIJEdOQ0Z3C}S*LL-+gAI~~>zH}}oJ~1^TJ9m~ke^KFb8Z=`p$z}nS+Iaf-xMW#$ z@6prprCz-yR(<+fgGFO$Bo2w1wP_=amgru*Bnl2uzxD;bMe}%pZ(rcs7x?y>R)_!p zgm0IdggL;@py3kh*vrXV%j1ldUsvq%x1UV-c7es-mwUWgJlbStm33T!?3}}eEOn0--#~L=KgPdY8l=4Rb{BanZ#JinyiyY9Y<+s#?Ogys>h^x08jXpXzfw+->|J6Vm_bnox&k5OG`fJLI>&a!us7 z86>~OI!#DuE5Z$cEwjTRq2+aLX$#jAP8exQ2AkUhdP74 z;|4lhjZSf_v-o7(l8Sw0OPr*?eyAJ>dq#{+=S93t_q2tKSJ>N^Fz_arP>2O_T^iFiTfTXy#(ov4D$h8ZhvB zOimC6CNzv!<}t8MzA01`1Q{=HJ1;x{yT+Q5;FvHlCD{@NUcLeP_YU%Tgn=za`F6<) zjV{=dX{TvRe7E*8`8cy)=R^ z$oB->s-j&Uf4hoO7{RJ6jXh(x83y{HQa-=qh{k-2@vTGnX_W85usTnnn1%S7$oF6^>Fh4c^Or2oYb1M@oE@$xhlUODhzOTo4Ud2} z$b{)ru1=eBwPecmG5p1tDVTE97SiIHe|3ql3yMbG)^rz?0tn!4`!9pAErH(!1@g9g zRqJ$iLAjY*a5s0^#o?#-ju)lct!Ne*ho{*FvVi^ zMnXxl+F;1?7`|B4h}L4gfw!?x-SDtz{cTBEec2D^-8z=tDX%hLbLHsb@HPDpR+X+H zPO>)jLibykKeaov`b7Eade~1_7?)KDS2Il4wA)^F8PB@kUE8s)dkp*~T`p@^^+6=U zM%9;nx#gfat`--s>A&}2xDX#7Y1W0Rm)Bl6>h?K8EdFp!%0a^kxcV)A?YHL*=~<(w z+K_KPo|q(xd9i=ci~WQCi~9#1-*fwN=EbGu{`P)*uN95HV|~K1M?v|#FgQC_aYW_X_j`n4L>8WvY8Adn(P2cT5+5SkKgfWs@6I}&)U!U@%6gOr(8A`; z`5)NXAJ7r$03NP=L?U0|_MiP?QULPdMxi$n3NhEizYuNhBllV}k6JVNKTAajZK;zM z-Uta@G!xUp8zG^8DXo7azc1qWKV1T7c6zjxQCBZ$0=H7T>aka?WknK2y^A_Nija7q znIx(!Nv^L5f(I%M&qpA*bl709+@({Qe$af)x^s}Q1c5w{ZsSjcN{G1|imyJ%7iuVh>0vhvW_Cu+yAlbBQQCt*bH(iTJXswFcfUkW? z#Xnzwpp&4U+7`NgNHD|lY%8ehdKL|A4@+3*Tf-8TxgL3bQUUvBs5x1`y6sw0k+k8| z3bI?d0+z6#dX0stft@$pol$8Bi%M7WlL|Iex58)yrJ`#{%bL}G?pktZ#)f+YEvwH= z9e9>EX$9Hys#}RAf~BkKYI`IEJ6VVWvSy8`tm;F9pyN&Jasbe~t-C9l%G%MM*SR9u z>h-pW6yk5-OHW=8OITA3)nh>WuUZKL*z2n%sDVgH6T1~~J!xWhFQ*`oR5QSMl2q#p zONueSdb5`H1Tz?MddqHuo=bM^H?OG z3=X&tp>?BqEHdN+j9-yWKo0u{-LuRFo+9}qw4H_0E=Ub_G!5rfy}LlTN7aQnkIE!| zqU7%4%IaiH#n6+g>W1>*no-BFh9X*dae#|1RNg{1n}K2iXtGjo+urMa3OnyUK^qL|W5>0FK>OzpTJ$a4 z;edVa&OgEw6FY% zhxhyp2MMvUw3a6TggXG8*&-_PhhHdU(-m&3NW{%w;RpAC@&W+@>*xU*0yZ?*Ta4Wl zgb0eF5txq(KS)R!(BN+r;uB*Q#N*i7Nr;d3a-vKAHaZ0bjQ#fb_%JV$g6IW*N!yVS z7VQerw_sH}9(swGP*aFA1tnfKm?=;e*k*N9ZmaU5nSxaXm?@Ya?hG}Nb21|<6=n*y zud*0XSGut@*?xVTF&MUtvAN3)+ZdJCdg?PviM78TThMl4$Ig8`3tP3m^~GgO{JU+`kTVK6UD-A+?opO$ld+U%&(1>+9PjykY_*9u+`W3f>D z|5e;RRcpSWxXfj_g@IMztYh(cDdVPS)zgBJxzGUh4cz>D0zB;AVoh`IRKr>$eXls@jYu?|v!F0Q8w7TN#vgXRl#(i%NfFGMRXPnRIi za4jk8KTq>T3@=LHDJ6g=t~+0F%Mqva5TivUW}93vzq8cd9hR ze8IYQ7w2p2tRoG{3=r1Avp*5;LT#WS;fGkWY6Om#u0Q9e9C-5Q0v?l<_j{k=L@E4<_jtp_i-VE-T?68 zd;zVpe%5>e)Y`G=T5G;w!t1vpHS-0B1~twXV#L`ic31 zj=)R}^95v%4D$sS+@5c~pg%yrX1*Y)toiu@5;#R*zJOnPP;Dg47eqW|zTl8JUjPHz z&z>*P$13+`=L;~$pf&-Rrfsu^6~>5HQ;nXoy_W7SJ>qU#Vz7Tiy+IQbW0=K-1+6`! z@^!`TnmGknm?HIe?9_#=`p6WQK?SJ?2s-e9&;@q;zQBYIKe133J-$6{WV{4332RcV zFv~;xbHxn_*o$X0r!X+!AfD|yVUe;_Zo6h2zkApAp>}t&M(w&9jfsVR8w-nQM=#8u z^ugNgI`c4GmE}9u!EVw_bt~`-4z9##9w8qu?hXl$&T}ByXC_z-p5LPY{*~`}2z|cwz7Q z{37KUgdhTv6K5RAm=_Q{){AQhG!Y;Og?YS>IRFwAoAP)c;RNLYT#$-9H0z-rK>m0w zdP8A`Ku|3Z34$7dNI*jHErh^@*3<#Nfjb$prkMGu4gAs-Zjlgv1p+06TY(@XRIHhq z0Q-f7do}B8@9$X+b-`lHJS4*FPXII26;NdOXneWO@b$nh6ceNeGvG-29I? zA29#}T3&tq#eBqz`G^Q_xW9H+vF_9lxxJXed`7Q}D}7en{oegaM76|vMlZ!9_oCY~ zFi5v5C;}|N8rO9R1%Y8$11#Q_^)KUZ*J0%=#_QGh55<49FXpUxTlwHn>IeI*KEjv9 zIwUNpETPQhyvyPZ$zBmQ=Z8dSZmYZ^Ji@XkRNg-ncqQlHj)C4K9+z-i)o_cv`LEkt zjj%~&Nv86!1<3(gw-F1fUJ=5suKX%f6}8Y|X2WgKgs6oBp}SEZc%@|VhObTK*HvXZ z+F!pK7`AWmh5=^cZI_6vB~_IUVG&VZLhUuGYedAp)zzt*TYb&PQN5*lUr>Z}?!|3W04U(GFJR7UaUZB+2bl$ty`=2hx9H%D;v-hl&}$_Abo}0Pmmr$t_tV`V_Tw7mLlfGfe^|z z0a?6Q7qZm$(6|;9sT;Ab_@)>rw6MR>BBv9jqhYto#w9>zXaf!CBZjXhM!^LN`wIyQ=c9_KAVv?3SVh}I5riBB zU_>HpG~5R>AW8+|2_O3-8Z@bnYpNY0f@U`lVov&2@y1>-gJVt>lyo)^vSG`OpscqM zqjiO%g4B(%ZMYJ0OQ;)HRBUmoQfN=(fbH_@v_uuMNM&_+K=Sqz z78T)DSb)343Bzz~scI2dto#KSW7jp?ifm_~qV4D1?qZp2U37cqnFz==vWZxC2F7=U z1}x%C1k;+YVlQsol2Wl{Tt{RbXsjLf_k|pLz6r&Lq5d1#a2kN2-t8pJ5PM<6X$U6Q zV`J(s*J2bc=p4w0^|vsz=M70hX~W_;_N{i)e>aHZaqnCYExB=D;^P4y4b{t^` z>r?^uCva;>8`2IKv=B>UfvuD)#9g|t6*yI5lW^?AJ*LoUJq)A;*zJogTuSgOWqX&n z)Pek7?c0&p6xh^?+lEpY5Ah^WR-MJInGpC!#^Igb9G7fYIlet}oB<0=0XwHIT(#-# zW0!97;_U`hg!V!WNx{ouMO0KQXywajpB^t;YIXb-kPQ|Xm-5SxK`^iq9SVg%UQ8iXg9r_;!6UULNg-@D^@)V*MLFZc zi=tiePKdIB_@CVB)qc{gqgra#WOFXqP;gubyqbBztpa@r?W@?|4($tO**&P7-^ee1 zg|8?(yPqt)vFmfO@~d47gGU%t?0G+>6V}>CCs+N_%Xy0}c1FTp*r8al0W)l)Y~H>c zopSi@r=#rc>OOqsJGcEs%0P#%Y?A5cOnqR|@dpO|<#BTX3|p~SbRKVG(jcIhYHkJs z>Oa_2jOmTpIpFO*$r}$;t$g?1{M!E6?hP531^H?^u6%4JoaR3_De&`U$)Vd11D^+NvrLjL_iU;YK&WdB9H z>An3+%Y3IIWyb(x-=tHv?d;%*udD}%D4hM{k{85ohyxt#>bs0cAgjW zom=(=yG07a*8>cz$c*CC@MeK7-gN(W@Mgazc(aV)C-7$c{}^uqeufF~6Q8Xo@aE(O z_<1$Is-OX265jl}@s{xBfCjwzRf~A@Yh@F>IiOj*c|N=WZ|)$xIaIZ}CA@jdpKv*k zH|2yk`xRjQFV^tJhsO<5u>$~CasbItyQ1r%Qc_+3xz zDtN8TVkN)m5<^=61_=g$Jl+hjYZ-64oWJ68QP|JcOnyn+&z3Jr$TjcrCatj!4C|Z$ z+NI*BfM!&d&g7}-Yf@zS_r(UP*m-$1mFX}ToT0N&Ak?D z0^XRv98#-ct48n^j8iYHRt7*!bz|+2isEarg?rs5rvPt8res~X#^cQ|*M>RQMW*Zk zZi&Zw-nCD|o5lj(3>F5=n@M@Pt~3mIlQx<;NqFjFJPthWImJDU6WxsMA1sJl-6&V?ij7H={Ehc>7IQ z4W#UozZ|NxCrXP=tq5;A)NLv*ln zgNrp{HyZ>Cuvr!E1xU(+Jjl;@1zs4wqTPPNl?uX}xIzR?03J`k%moPpu}>HJ4PFMt z58&Sr!mi>u@n(R4HC6E(8!spcZ-x!1sJI5axj8%l zlN$eBym@YK-S`3XEsBc?Z=RDa-leLO+$q0mVGph9G2>2|dz~4bYzMsA4|sD#rTHd{ zaVa+0%cIX9-1h=+f(x8*TwGeb7_&|^bte8atk1SJT(eRWLSj>GyBW{F&dpUM&z*h--2O!k+FJuEO+ zF2Z{6OhnaWeYW2UbHy%UiMDmfqk*Ge;LR8M))!u^&&G(0zMs6g1RAYiM}=T7!zPBa z{id3qgxUHP)}wY?2VEX`{t;Q(zQm7v!@5kk)FtOiR~2lCUm2>p5}~>}P4&S()wun$ zqxOjl6huqn*K@R1D$tUIK5ok}TyN93QlZ>-*%z+M`YOm0em~x_LDlMY_p3JOST-n6 zEZAIHuz3-gzPDXmlC-$2`rwAtGo-EctpA3U3S>q+lU6Fon^-pZZ{p2eUyjc=Ey@fH zIID;Xu)DjZ>m9pz^OZN|pE6e(M+0vL*y%g%$M?v%$TIE$@Mcu~;p}C0iKh)#KZ!Rl zyKM0LabVD`#k%s%A9Eq!e15zcGDNN|--O8qE%|1@tJx7G-~51=Zzc@5Q; zZ$fKSkZ)G=^3AWkrfKAxJl;IM3Pb9+(5-+s!yw<(#+%x=B;QeIdX(Qfz0QshXH!%SKCDMNd zZ^n?|r2%h}e6tDO920$Z6EEL<2Hy1N<(q;LC?0R#l@Q*9U`-jYDi(@)wiUee33!t< z_K+sQR1B?QJ8Bumy}(B;$Tx-8cA))dVKX{B0`g6vAXWiy^1@$xLB6TMo3w^jz?)bQ z`Y++l;yB<x$TtaZrttDjEYsX5;!R%>Zx$-cpz-HWXHnq-u~zIhC%h|< zH;XR|c$1fJj!C)5%Qtt`Jsoc*Z-s33nlwiJLUU?s-a{10#yPvBuClu8@d zvI4&f(oY@-ntB;hLVPepk6?TViUqc*_=G^k=0~_~0dIO?{>vMA6kHlk1c2?D2u?d_9Wvle)5VM9aJgqS*~0bfW0~_ ztnOImUr_j?A;uZ6Bg0@edoDw=a+&10eV9GTJqwHqDabgeYy zoCoGELaTCaBpVOAJ|2nQ`#3sf*R`^gok(<62Ccxx{2gf@-{>)}(CvCDZ?G(WsZ(89 z)(+lixAbI>xa|k8^`Zv#S=`cH*T!c#Fv;*^dTi=Zf3F7vj|cQkbJz23qf9(y&m{V6 zl7V_|ZZ=9`9&KUQxSEs8dJ$=hGC zczb@Z-R(_v*OZ2ac)RYq5o}qlwj!xt@CF7N?lHb$%N=R=%^g-f4WBHn&Zk zjf{;>=4V|_YRydYPZ_UR6lrW~Ry}t^>Yn;*6~BIBve| zwy>p~G7pKeoi`EE>_kkRj0jE#UQk0f-&W z##?;Y{MYfi!%1a!rg8vc;9~(UC-S$iRNe!&j##~+S~=nRg0EiL0NvrR2pH1IgjJlc z@PV!myp*$e!&Xyy1oVH6u3q)Ig4+lDZFT#IE)ikVpgZgwbiD$L4?pMD265wMj^*o8GqaWNcvjcPrc`US0V+hjn z%DQAbsZR^?Sa|0_UC>HwkqCJ#Z}iw+!P`+5U?1UQ0rgfx9@`+MO)SIqL4x$wC8)tD z)06mE8wrYo0E{%Aq5m6WMDo}I8RW4BUbN?@!ruY%SPTkz{ogUsXMm5DDNmEfLiR|L z>2ly>0A0ezg>HU=k>rig|Fy`vFdFz6SeWoJpfLer$Pc0aOCwwi(P<(c<8;i%Lzcaz zmMlQ|t~hV#JI{#rsoT_wxmun?Ig=%8n+9F!vl?4gE6FGpFOL;gr2-#U-WTT$!mo<5 z>u2I)b%XvdhNu8OrqEctNtmsL33e50 z=M!vH2Do9=d9BQ@J8#Bl=qhJ@9z|YQj9pc+qwHEUQe|AS%dLN$ogGH-S;2L{olbR- z$L@eK?0Ft6Iy_zf7pkQswFtDUAkjsoh>v-F#&d3)QSSeSJQn(y&|((wF&SfOz{d^{ zj0pJn60IVnH(OH8<70?evmLSpe7vz3_!!F1doA9;+ZMq<6JC#($71Q|-FTA6#un0! znZOKPd6nn!DRw{*Q!cn|o|)=|Z7G3!-y8?)%ukocLgBncd@NLXZ0IGc3)1Xys zd&C2AAs7jMMUcxAH24_VAYpI|`1mq-rgx)tuMWyaJ72zbf)y~}w`hpP8wvj_SECy6 zzorPpVtI~Ry&G+N@?hFjIl23o9#d}_TJ%}YD~u;Wwbuy^#vHGpOh17q{i|IoT&PMnn3 z&9GN8yqv>1Ya7&y<~8mMNA5mi=$I6oUrJdzjN=t9x3OCUMCd{gWgzmeC^{b z;syE3o$7j|TsX+o9~-n|@3rk~SoOB?fTah%Z)4oqf4$XKY<|nsRxCeu_y17AIqJOI z$+ZJ+Z-TwFfwU<~fzz~85*T2Oc8)ih|9=4^aBY8+NW1_N<^4%PrAi4G_EMGKS4+PPR4ae96*xVVyp2(#)SI z>=ga9K(BuW{l+usH?`>clzxLbH3d=FP5KejZ;pPC=xu2wv?mo`!j5BKwCd{}H=kxh ze2B(2VNb`F=v$sa-}VgpPD&ru_q6n%Mc;#Ytd{l>SGRAOUi%C>YQIB^7Vy;;Ez?=| ze@0h7D}0ZZ<5%}+c^A89(OJ)Dgzwp_<%RYmjh^0rv2;b#znbm;JiUef>-miSttPs_ zKbq~|TKuJ1I?rDwJ-vS)p!~N$uYCqxn?E$yKehQob9A0R++>=G&OT*LmzGfKY^P>; z-eNy5eg+>XeFhy%-dc>m964#Rqi=c^xn(-|P-IJdpw_5mI%|)=hb`^)*tKQ4x~p-E z;h#lk-C7R+EV}wx;VoK@|5#tT5pJmJZ zY8Z7IIvhKgsHyKPG+^wLJF#!_54C>wb!nvUshTud<3Aq$DO{~cuf|xS?1$TKT0!~C zjNU@{PFVdqe7}m*rSBKR6Ma^|)p(8n`-qR?KcGb)`|^gRx^%Uj5PvAbuRNfDWv!-1 z{Sbk^$egkAZcFAhr80ItZ>_MU3!WZefyGGCw1wmTJ*DT z4QhygnHYbh_jV|3}b|d|_ zBUhtz>5f|TE(hCo)TM`N(XDpn{H#mQ(4wE;SFv7~zFdp``1L-Ub?G}r`T?vgHFR2W zUAO)+3WfYn2mMmsszP1*y|TvlyIt;5pd0^qt@h*Q=zd+(o?b_LqVlyB+Ygoh_@W?h zO?aw*qE8X)kMid+>FXd(ei!1N+DDoeeYNYBTe@_|HA4QZkzVn~8E@<6KV1w@^otjQ zZ)p5~0y!R>b&dZOxTo|7iseIehqYND+H@+PjAKIlZIR!^^esc1#?Dx@SpGye8msQD@&ADs zf3Em`MBlfueLD@E(u08rmV2Qwev_}VX6Vw{MS-4!@V*bimg%N{TkJnXe_Ux`sqycR zd&)oiSO}kw@_W~8`xE?S`F(-@4(j{;cWz$OjX(5PfqotI@EMk4b?J`nI;*K1KSKOn ze}DOeF5RSyKo14~GTeS|j4pkWwLq@}{j(eP`*i7!E&}~+q;L7=TW59Y4K|QPKv2(OQUyJwqZ0$oVgKm1*itUf+(-v%< zsqr6#dr0e3I0`6IfX`IRDF zdT5&Pe!qf#e`0D<)7+s?iTNY?oWwzIY5Z5>p3)DUErcIv0*rq35YG~{<4`XZ=yO4T zrB@UMX>ypX6XZ`ZAPN170Equ$m?|1;rd%p^2D9v%|tUC=&T#eMfg{!PvZbRW>A zHEvUyhGuM{*#3zBITst8*YLMr(Lbqu+KS~*^pR}`aT@wBV*ic&K!~6CUmxY8n;L%j zDd;@^(4u=Le|SchUMkXw-xL>h&)4v`X}Et0=^xOdj~wM^piQUvZ-{i_UsHz~J<{b* zziQFVI`p}rOSc#KD}|r8PqJS_*YHP+4~6$5{`KvxLAe_K5*FW za?dYhy7XKv`qdvtchjYpigeK57^mDc7J%3mft4l8xzh9L8B<0Cz8anki;xDBl z|08X{Ll*ZzewcoM4uToWwtK;hFCvDU;dfplqcw7{Sf`zUagkv(k(s_ z%AffE;LWe5YQ6`9aW6so;bQ)XzsBrzd8Erst4JsQdS;b!s4oAr_*5uAqQAQBO1>`LRf{h9YiOx1JyN6-|MS_jet?GmY4~TZ z7X8*we#3R?r6Qg9<7U6Bb{hVef_rK|#bWy)`rw%1KWOM0{#h%AC;qbT@Q5H?{&rJ~ z{<_ieGrDy4nehG;e);6${kn9C7JZJsg_kbfQ;U9K#?5?P{x(UA?kn3AsG)24t6Ga5 z^7DkVy7Y39PW;b%{dbPK{H<1tzVu4x?Yi`vBAxhCK(8Oa)a6g?W+VUFcsndjmoCww zzvF*rwl3XMi+)r#i_@h~66wVM?2L}Tr^`RoTJ+k7@qxPZaxMCWsA^YTdaV|{|HckG zb?G;?=&@d@Gj!?fbK(7ozg)FC`l>E}vDKn`^~imsOApneCsr)2)TQTY(Fc5|m!eBA z*P=%Z>RqBsKPA$Mzr|k)Ez#v~1H|za(Z74=Se}L+jC&ei4jMEb|5=%F;}fQ&$4`t) zk5|P_Ovs9zmYx}#lr<u*Ol|d^HAQUV?s^6kkcWo<7p*1Ke-Ne|L2(Xs@PxhW>59 zyL@8!;q#*imxRY;PF7`0BGQtwd6MRNLQ+~xs$@!1ZhZRmG)azz%)(-(WTdJjX)#k& z5}SDJ;1m=ZMgid}$PLb!606FTq$fz?5@XWRRH<3?l(De%w8@ews;sP-$tt?{PE60t z0nIlxCT+4RlgZ-})9E>8A!QJm;vFP#fA{eYmIcw%P|-y?{JkchnzHok>*PrO{NVVC z*S@%x4R$@xZZHR;d;4}e^(}h z>j&2lt}k3)xN@96xb}hT4c8m4*KqPboXOz&!3B4Q|KZFRt{kTiu6^Ko!}W&iHH`cZ zV=}mYaQ)!=!u5qK$LWJ>AGqFdz2SOcwnWxv>kZe- zh5WlP8C*ZOesF!^`ofjt^ue_cTyMDEaJ`0*{~=5U*AK2ATwl1paOF6CaP0%v8?HB8 zFPLkS^>t=4xPEZ`;QGS#g)7JDgKHnS-f+F)dO4AQCnkf7`a|83e<$V(SB?|)#(dzS z&X_k`FI1SUuOpMe^@HmN*B7oYTscl3T>HTFhU*O%hdX0`qb)J-#fuDN9kZj6sz2^O z_Qv%HR(@TcZaN>&YLB7s3_pJ^@G$xrN=iNAqfVziP4wrvZmqU|7xyC(2U>vIz1e;` zB`H2h?CO~@X_EAuZ0Z1f6V>zrjt@I5(^!qXA1%FUM8h9{vr2W8m__w=04e2~INp~E49!ZTBdJ~(Se zR<>%&5a+@1nMu=BnOTEX*>Qs>PZ<<1^!O*~jkM`WY4J(OcTjjDIEZjGrYH31=F2%f zUc*rZ|KO=Q49qt$94!|W?jMX38Xd$S&g!y`=CLi29etkkH|ZI_b=gp^| zp_(jaK;(nUm~55A8=Q`~TDZ&)A=TbvWn<(N2OUEEp>jWw>qjP~O%^EZBzU#94uFYSMjdIUn%!xfgye&n)vBjcq%;ciBQVI z6(M{Zr6-zu$rxE+1X2tNQOXg2LwL=-CJw}}xn%O-aAlO3kSr`xGDfZp(?lI4_fg0s zVM=e%vs6ur8es5oNkRiqCv zY|!+WTuNk6OqSqI8Ir@_XJ|$djE%z!%a!tAZ#g2s;jWV*cbyk=*C~i`^h$w>uy7%` z&_6@PJV}(Qn0Sm{G=mDn&$kC<%=E@*=xaEdZC_bKrZnMCVMBs+`BRv;vT^)EbTO?l zJnwi~ywj(}h>VBN4?JtaIriI~vn=6a=gJRQHH*EFIz;E*b5s50cDF8fe*GaUKmGES zP(OLFk{WWjQszAhE{);n@D2$ILY=cHxeTor-`PN~2+F8T8IHnwO1`o+xk6o{6$gX; z`N;8xiqM88?Hv*trBwL&BMK&q2=@;`>5VrV{VazHhc(rpHWcQZHj;rfJIWvCcs}tqo4n6MzVx>5w1m(%Zq8Av1#B z2sx^1q)@7EQY19Y1jtkHTDME&W^B4 z>`V3+>!vqEZ?s;PUa8(uy>Im-t;Vz}YW03A%hsu_kGHmNvkVq&=eIS{->N^RovFc1 zgX4yWjq2M!HV*7~s8e9)c4pt2>vs$9{&CNWUi+-N*qpKbY~VPjQNs?7+%5C*pA#~5 z?BGckl47$T=i#OBjmW|hHs%Au`lTeWW8T6412#+@98xO26~&s}`@!=H~4jQ{q2=l1*G zUW2~mX1}z&pHlG>Sgo38ty5G}XebzynwlOLlMRk4Nr(ZBNJ^U)lbRGS$;!rv z15YwlQ*%^V*^;#MY)KM9G8*#1dt7>EW=;mK;4@PdGer!}Fk)0?5~NdQW~O88rHK!q zm7;672OQKIJ>pxD6Bh^6#^%hLK4q+(nPD3gLicX1SSwAzKW3W0zx9~jWA-=utCi@s zCYPzXAKDDXH<`iROJf{xiN=GX!8f}aW0iCJr+l;z-*eZEO9mY}5&ZRg-+lY-x8FZ} z_^{`h6k88$#J+j>;rn*uUpr>@;i$x+$1+1coB7@0&*yiNE_v(Mg6%y6SG=D7TS@n| zuN|F#q}{+TA}5&L95b7OEf?W zGv@h-IkNx<>BDT9BREGeYiJ6Mg{QfS4jm=uT%BzDyku@l4U|99;-kZZ{bVDCIP{nF zFsJs7V_Mqe31dP>`N~EP9cjgV zT!iq{uJ23TOpNrFFP=ARYKm%Nq%zRg(+x3O_2{Hmx}qR|W=?ui?D#RE0p1?Nod#H& z>up$5ylg?q=i+Jb(7IjO6&2$Bw2`9$DRcIIP*6{A!XI)<6r1vFU?M`cMW{NH6X)%zq-Zz*V=re>%J35T(=rDqFS?Ix; zpY!Al|MupRdirt8`UY?hy99AYk3zV``<2{JstE4SKgV*jW<_(}x5slGTqbgVrNnR# zm&9=f#VRf#e==t|A&HyQD}_6MDwUf!K8;)bK|1$|=TvS_Q6@L{Vix!HFWKBu<7wRe z4%4}Ve@^ErKFH-%6*IUElV0J>jAwH5w#?+V44cIT@1MmD959iej?w~MhtbZwd&px-DC;8XQd@gijD{! z<--kk9?;he{bUuq&(6(Cjz=`X3Yq&*hnLV%-Yi?W^woK@v(pewWY{QQZur24o^tBF z+IRN9y`y^Lo2yrxuD5U-TR8Lw9`BNVCJZMTx(eQ2#&A zz5<)qJ;;afHxs@(>2<>R1>PeakT{^?BqPeW$3Ws!`()VboY>Q zoXpGHNABzAXKQX{=Qz~O!_!Odrx=C3-;@z!qsEPYc~Y!ua#BiaT1IBh^cgc}%~9KS z>p#TZTM-gAcHGM`@d-&O=~>fe%$hTI{;Nxtttc*8z2?o0l~vnz?0Va_hr>wUkg+ev zC#7Xhdu6tI{-UKtC9B^k-?(M_?tKRj*B(E0{_?dCKDl}8rCu(+5wTOI%~`l~cns%%vNjKKSYHPBz}-r!FX|*mLy! zja%RR{C8hVCs}Y*TuNr{ocu*gSFBq7X2sT>dyvM-^H*+s{P~@G-~IGQ_uj)tjZ4Z= z7ZjDP-?C%R!6T>YuYY>ytA{^5?$FQY<($Q9wjMfl_4BWPF|rRzS@6c&r#|}nF9V0L z>=oNieDcV|S{9Y2UjF9xgYRAZ;EM;3emCy#7dLbHrhRqSZh!xm!JzPIt9G5a^;-v35_Sp2fRAN<~S#FRBBzG>@` zwdvBILTkDy9_4f#Jh*%JmN%1}x@ex_u74-7WWojZN{-FJ6ZP8n*^v|SS) zVQSy6^SGf#r{8V2E025i5C6jn!Fe24RdP70}pFq^}z+x`3DJtJmw@t$3e z3>rC$t2P;YQZ{v$h>se>YnwyufxkL1?>WKiS!Q8;(atz(U6&}goI zqFIg6n?c+=c@{P8FDbYic`w!cc}va}PwrEbbwkEQ4eMX?%MK4N;Hv>Oo{4VUu?3Db zzhJC}vj*23p4EWH!A}kRatKp{upHv3L0lZ-tU=ry(x^dN9MY^o+8pvwgS>FaQw{RQ zA&)i4s}y;zLEfc!hZ?+#6z^1nca!2BYw)g8ymJlSU5YZOL0L#qCN(GpdN+DUdRKa9dUq-VDhnzT zDjO;zDk~~8DmyAeDoZL;DqAXJDr+ipDtoE}stc+UsvD{!sw=89synJfs!OU4^WV)}erq&6w$k8i8gX2tyTZJFA% z_MMj`Mys)Kx_}3*gkk(K|DijKRhoXo+7p{p4Sl15!)Zni-;$Q?UUzK#IwZq z%Zcro=WTdLp4So26Wc$}3yCL+{e$O~#52YI!}C(&sbc@)c`fl=vH$VBn0T_-KY3nF zJX`F)JTE7nF7|Iu?C(79r*Wjn4~S0uf&5b&pzzcNC_ZWf6u%U0fYPHjKOrAcX19w;xAC(0Y;k@8A;ro7WT(7Vt((Yw(*(!0_-)4Nj{P+3r! zP}xu!QCU%$QQ1)$Qdv@&QrS`&Q(04)Q`u7;P+d@+P~A`+QC(4;QQc7;Qe9G=Qr%J= zqrdZY&X^}tvs#RqL)mgx51cuPm9v|`;2CTuG|<{GAC}MFW9BTJ6|?u5HE{VRcAL2X zh3;WLV$AK&7GcS+1!nn5*$trgM7D+915(Xp2e5|Lm<6&zb`HpXJX^~?W&>F&+s3{I z!k@+7Wq$(o%Gg|X6tjq<*$T`HT4AnmJ^P$Fv8ikq`yR6da<+h-z<54_tzuU(yQpFn z><$~sa@bz>6XvTFY%x2H*~cihntg!rc@nE)_aPjb!49(DFpm|)mSQ~r5}Saz$4@Xb zIR!J2-!Kn0n;pg+WGl>3&SS@zDMtQ9>@wybV%Y}v1?Dd^*>3g-a}>U8A*%xhAHz!6 zHK2(ER*BimVVKX{$9~4_MF1;cXMoV7SsD9~*|TI!)INZa>J@f~{f?Q9V7821fbQkX zY#sX)7(R{dVBcb2tT~t<`x`SM-fTWQjycpYwvt@|UWsEH*)2ANWwE!}511kGW3RH4 zm|q>sUT4=?e>RzIW_K~WI-TujzhEAA6kEd10_%)pYuHC@0A^aZ0=EiBAva(zGEEAV>N_v00J-kkvEcXQ5&>{HfRZL_&)(1HXSQ6cC(8x z?{Kq&;4<)zqrj$J|H$LM`7w{9cGc(eJZ=TB?8@VL9JM#e+B~i*KaZyj@t7pf6wBM)y(2{%$dbe zJ9qqPCU;`nOz!WPnH;tM?k8U1{>*%Zo7d|Vj{1dv+6->B=?rexo?MRlOQ-LrbBC8q z=S-}pbJUNP2TkKHe44|(HYJCn{?$7_oBO1FHpi{V;;7#}F3#kF%rd#q*QRpRALG;+ zT-HzNoNHn_NBy+MH;pUWJ%#ITIfbMCJN8}**Kt$|_sZ5}j{5a-RTAf3lgMrFn#fUq z$5)UjisIsXMe%&5U&dJO!KyLbs)G?c|2g)180TXV#vK`=KFFi2kQp(zMmHtLN z4|ZSQj$1TJpUeNT4bO|;@@mC>dY5rWx;>T>Pwrp-oAmO{pQWt#k5b~z1;yV=Pn`Wq zdV<}T5|92V?v~WA=%zI9$R|?b)v+cwq@lyEO4~$VmJ-j-Uvo~XJa}4ad$mqVyxXMR zQK|P!N2KeW-jNay|1*5A^!K>kQtzp6Nr{&qT397Dc&$?U-l~mK;_3P8-jFUTFO&9M z|GJcT`!{c_kPa+cCjFy$iIjN!*@X+F=Vs57{_*7;De?N0eVNkSvQ%m6tOP0X{CRHC z(tGCN(%f%@q{RD!*T|&T(nd-bdk&S-H{i!lZKd0`_K{wiW+|m_!Da&!Y1u_X#NS#< z--Io$-+Gw7`?<#hkEp|a&W1kK7 zczCRcXQipCf?)Ns{YVmpCvklcZe zazl}iU}l!)scv@D@D-l?#E-;6pqGpBP#BujRf|4LjRg7`k$u&R_v-e-^H7m*B_t$> z`MTf<{VSXYa8~2ofU^wea-4-Y*WxU}S%h<$cwY>+0H?+e-IwAddd8DyX?Ms0D7`?O z{U}|IEllB<`5=yE9G1fTm{cQQ@XwRY^-{~!o@yyhPxbiV@gd`bqeHUovTQSL^Lym? zSkZaC@lK;%?JeGREEx9cu>7G5T^9_`AD-`#={qSPa#ZBlfGDqV-ti+-opWtpv56TF z>>L&xK00#Ln1Hc<(TWKH69T5#W?JX;$?5Z2=M|tbfE{mtnWv!?L&p zuUL6pK$PD&#kk<8F`?tVCU_={oa~Prz@lBI;rqvyG8NFjrtN)han?_xBk4*C$Gb$oHY@Ao5Vyyr8QL+9> zBT|NCxnvH{aGg6O-?qf6@TJ(kLH71DCV8a}NVm-yI8%~qJ>4qLYGI!xT~>B0HDA}g ztVd;+?Is60955>Bu%uJh-CSmXGCXX&aLX|V%DXbMUS4AFZJpzky!QV)7RSC#-=SQgG2}#`Izhd!Qp>c z{U)}Jn;Zr>O%8*0`uc5gv=I-8z?vMbo^e2I_K%Jxnfc$iQB$J)5A`s<`|(|kt^|T7 zjVT+Bb{!2ZdzyA}<%T&~_qBJ(m_BDlYD%oiKg3rS9u_^}=G|}a|M|zGpKg41?b3V4 z&zxWW`nuJHOXe-u@>b>gJ#Qa6e6sfRg^xbIdin9M-~W8;_BRjq?>u;9>$ZvwuPvIp zaAoluW&I^~gGRa!b?$A^xohh-9gN0?M!h^LQ0|3E?S!oC*{>{K_NsbS(VDfp_SGEN zUcGVCZ-4*t@Xi-seSNg<;;BzQyz)NOlP2Y4&YU%R%*4o`0B@h}y}FsSZPnh`s^4H+ zj}b#$f)$>A%82pfrcKSwOP&%RCv|fi-p6L(0DV1!PCZ^SH``HFzIpfFci$;lQTk@V z(){_Keo%k?*okvzzx@2(cfbGj;}4-ZvC#fVRAmkh%g%{UN|&UjPfpLCk--ZgQAl1f zY4L+&GP9u}(uAZ)P0fKslNXIrS;{1_yc(M%ElaUP{LJj!jWa1Si8LG^L^vo$S&^u}JJW~Y$D&}n`3r|T$MSLI$6a}*a zh1a=5CI@Ge0^Rh?B#2ju;+;MvBOPiBn(+Mlgk;7gLRgy_L-e%xoH(fci5_J9s}2_P z(-*s2Ci9wdP*UzIA!!n>3Dp|=mz`Jjgr zlaLAp-wci3Z90_oB(|~83M4Y}!`~-lrl)1ogOF_04ayQazDaS=>lxylJH%O%k(3Kf zUP=Fk=lvzNp}~HV^t99&c0w463`eNKJ3Im!Cf*V9Fn_r`TzJaZm=J8@95zv-X2Qbc z@=@V3FF~mao@Ak+fePJ883u@GW@>N1*YhrLjke6IJF+3_%J~2!d z6dI^`#Ga&UKSBFY_)H8__{cT+;&oHBo&?H$!?kXiBG^YBD#s6WV**3Hp&u0~_d#Ij zR(T<}ye<#L3&5@$!p;f`)j&<x(R_X-rg~R2@>3!h$l^G(`k;AbRXK{w8p8%DZ%L} zp5$L6|B>LDPEVY~;wil5dJ?XQr_q^)lm7&?5$N=+8y?Uz$umy!+YTqi{WrcS8XXII zj_4Xr$}>HqI4O^qWO# zba#sGa?wo`-B8i>6kSKrm58o^=svU(;=dufwW3=tx{E|NS9B+duBYe@nxe{%iHD-{ zL@*ri9%`Z!CkDyGWj?ZS*+g%DnId>1dO&zY*u=5QkYGRjD#GOxy=8%cRNgK5M-TTA zy$316f@I;|{w?}f1VcFz{g~qRf*KnsZ?+V_A~;;G43-5>lq;2_e?~`3{)6PuvW%LD z*h2)4q!qBGa1p_Qir`UNo}ZBp)EJ4GY2~Wrd;$?d)l=eqspuw(uB+%8i0%zr zF@4cpB)XGC*HLtt=$`5?=0kK7Mb}ky4McY^GLjjq>EFWWa-xsiJH!X$NugTAuUJGd z#%f`5Vq)m-Gzz765X!lwaKd=gTj@Qq;bZn(;i&EU<4Z`Z2c9RLz>qMERHK5u$$Rtp z61uJUJ~FQmW%zUW!$=mY+_d)KsqqSnA2dubA~-A}G!&83z_{7+Y3g76;yic!e4}kP z-f($fV6(Y+N({kenqeXO;H&9$pR^K6h5|qKNzM(^Kj|e;e@`|^rMa@(ro^; z(|h`-^y%$aJA8A4$>&K|tJMS528Uz(OFj3Q`E98_q5s#k)SePw3-8=)`h3@Kp&qn8 z)6Iqt@$+jsp48=kP1_U|e6#WJ?TY7*&C|hcmEQgneKEiixM%}=Yu-N}U(=Ckv*~KZ z+tfE>|HcGSR*1EcmMx-Ez^*5M6)Km5A;=C-M6wx*4MDD!NQ`>m3Du z<)WJ_x}lD$B1Wm1);%jWC- zTt>a+CkC2Er-@t_8U5Urqj?5TYC(B z`Tt|@I{>39zP)ERZBq#$q!7wdLQmL)^m3Ds0tkVSgdzm8Np@2pWyx+Jp@tq%Ab>(> z5>T3oMo~ef1PDz;q6S1kjI=+BU?>WT=y%S{+-)R^zVH3t_ul(1-28UhnVB;)XXebE zd+yM|f#DgW0^c953jEDm8@QxwPT;~TivwqTxiWBpYC~Z1vTcF=Gu{gHzOgUxqVLJT zPh!pm#`s&^zR+;JuNq4sWYZ97TGs#&%n zzZAHHSl{&u$#m@=GU^*e$ocURAuHDp3c35r$dLYvvO)@zibFoPnG-T;;^L6GV^)Ur zzOX*T_P4Dexkqb4!UyaN={4&_NcDoVAz!Mmgxu(RH{`qfBs5`^ZKzYMOX!F?uh4g| zc!$n@O%b}Kdqn6_<)F}%?2)1K;<7?>ZHq%Cm&-%D4Okqy(Pw4o^j+&ivrcUdUAv+t z)X{!lXm;$0Q2T*rL;bs63B7ggPH2ZSB+Sa!Hca8+61H=-S6JKK-eG&DD#B*`7#?QV zeNfo(9wWo9OR~aB4^IvY-&Y>?o#*1PW73sj7iO;yJGE|W*!l4_VLyKUVc2fjiLeUU z*|1HGm&0r}-3d$ENy6)`Y{MtqY8~Dx&ntZXT<`G5v5N4Vz2V^*HwT6%ewP|P{$OVK zhUt^TXRj^~|KLtV_%C0q2p^cdK0IdP*6<#^Yr-#Y_%Ph%ljGs;A2o!_U%DI~IOb0H zws|CC``5CFs>7`#=7xJkNRquHQk@kM8FRuTPSgyHxb|vl#Elu55e)&8BhF~bBUYcR zhzQ%YBBHk2`iP^UTO$_y{AR>8^@kC2R~?Ud|G9>Ucg9_gC~JKu;?Z~#x%gdK zPgv9@T=*z_ppfXBDg-~w5aw^!2+O_81#MY{aC!6!;o`}4!Y}7v5ek;SDR@2nKzOm^ zaiM>!2EqM{Z-vPDO~Nr35>>30MXegpI;zj^c2S?yc8hweq+itA7sH~|l7Uejno^=3 zy_*sBNT~sdg3nOd)kLhyQ7$=KGE{PRHOC|w^RKjLD5gW))8UY1Vfb9zFT2M&UYugt zX40gi?r$e9Y-g1;u;boavhJ;#PIftWZb`q4Q$zZw);k1#zVNi4UG=hv{riW9XfCuK zdi+@ZppK2J;&(nyj(L4o+jOs*hH-~iuNhVH+^FOeL7o$5_c>p<&2fEJYv-{!uF)OJ zULJpO=CtXXG^evC=o;VaS~dE$%Nv$0-Mk{SQu$&;ZI9=k`}+Fw9?!D;`Yw(-FCe)-afy&vcSKghvr`W@1ttI9z107mqWdR zjz6+~aHNa;oljnjEcvKsdDz`e8z23g@ZsJ^cea)NasOxG+t{0bTw8Z~-wmJonLkX` zEDWeE7^v_ZVj20ysH35;Sx!bJ0HE~*w)wO7gRfbdE8^`u*U0~htzC7 z_}eb!hu+V1eQ)LJ%WwDVvujCJQ2w$Q=YI2kcD%jl-uRts+ zJB>-Cj?ai7YQ%5;k z4*%Bq=#Y@0g$c|13>>gzI!TMnJ~ZZP^xTmt<6}p>6yCwRSNDsZo5-fV13OIUIUvz9 z=%=Lf{(Yyck6J%zYO{1KCt#0j{xWC@@h4rgEyDm)b;54e= zo%e^_{z+M|>){ug{NFy4_qnW&{QmkrubnsTt#f~T@53HnNVZ-7{CxS=OGO)1UrjvS zweIWs%e9t2Z$7>Irt;*hrNaJ`m4CeN{NBEIw!b#BX3L|nH`-o*^y8q8ovxg^;;)ml7O?hm;F!vd^f%&TxmKoiAj;g;K zvcC0%QDfUK(s+6(3eL9=jNBxhE1zIJ&bovB4_+5rjo7v-`1*&*{i8Ov7Anf?!s z=@xc+l>ExgwmzvpH}op&zVqlO;kk$0JM{UuntXp^YtpWBE{XY{oto6|n;BDXUpRDX z^OY&*l>d6Osq6P1w=UoAuzzdQtJSLe+J!xSsat>jvF+o%iw`uGEzLO=R$hPM(fqT| z?OT_*dge%<;mutz5l{qA z6LX8E$_q-ea`9m$Jav>$g~ycIyc~Q<6-*LoA&p9oY2@(kY7vbAHiE!tkUX;_8y=Pc zDIY&yg&e{Fz!j&?&M3*($s^?oaC64-{NXj%l6>}FtxB!YXufjhY;(=Wty5^wop~rF~RxPAQGhgDX@-%*2 zN)mK`YW%CY{4hjQRFp5K!E)hwf?{|9yQo-RkTFRuFVVX^?mG_6g<4yXX zY5=yXNxEV+93X(sp#vj7zVdN?iUMt4KZOFoBxxXc_!{Szq0`~$GfoCiqnk}-lAkUY z3Y=S%uab}R38KYpv6R#5z&;Iq|DEwuUs>|{(H_BrzWr5Dg{McseGq;hxc@ldAlz`i zdwX!R`~!PqS@`a}5fkf=GPzeB<3QJkz#7~GKLd9F+=|4E(!7F_0vJxl1JzH?$0>|d zWA^$P$rWndOy1Qm&@8Q@g|sXw+6n@zXpk=8AExX757YVo!*qWCFdd30W1c=GUqb&@ zGLX}ppCSJ+UGP6l7xWL){k`sDsNdh~E{1e}ue%u1{k`sDNcZ=;iy__L>n_d7YuepJ z*~#QBc0d^AaK*uiDKM>uhBd&DMhOVQKc8>L2ck_y*vCY>jfTWV^OqXt2i^z%_6&rR zF;X|4fB*S>W}pV=o47m^?as-yB^nJ>T&=hk2e?`i*Xu~lB)>*JP>Y;_Iu;mk* zJms3A{4z~$QDIqMxgRX43W^Gg`pW&`7npr3hQoDW?#)CrqM#fMwn(&)V@?j7c7xR$ zOvNzuOo3ck4c7KPe5~rn?M^BEli|VxCrT}*QA|vg- z5X#0!MZEKxv*7y19-+JBS2))k9Zl0wyOwgT1{S_gv1;_=-GSS~gsSQnscgw;w$9Wy zxnVt&&2wZc=)biZ5}61EH_-d%{ZZi?z$wcAY<OXx5?vDm!5DSyYmfi{~b3TQ*xWXjP_d!Mvc)k238)J3Er3F3tkB zz-e66@wlut)pYX;L3wGeezYU;`a#dZ-rqv?^z0;Hpb`#QLsqC=_tX>@p*1J9s+Xu~ zL-VM>?o`hbuybJ+<||KxBiHgws`Z+&`iY{*dxGgI%%sPV6pJEwXwlUFkXR7Yw>Vr`FA{agzY+>Dw0xW>7FeX;jM$<)1F_{F{G{As zl{HG=V)?l6Ygt$kGWEdhgW=!c6SrtVkOo%_OsYa=CX>6u*ALvu86YRb98oIjiZr}9VwGS>z{&SAIY=t~ zz7y!b)DkYFD2Bq*Jtr+3g~!QdyI8aBqXd0A-PO)Za+XJo=DeK5wYQb9;8%H{yvF+!fD zfO4M&!d?zG4%PTdgPgrgQ3$UHKz0PIae{zkwl}fewHZ_8xLGIuF42JBA0}&VXoRrd%IlSs0nHmf0t+bi_kYuRIYkY; zP#1vVW>|OQo(}8GhR%b%`6-ssdJc~UTgoty@GXvfy4^>Yi~aq9jDctX5-o(cVdypx z-A9BTu7(#;)bbu+Ca?hBDCr?r!>(!;?wawaIP2$u{0FOqV2lvoS;2V(^ui)|hX+<2 z*o?7BBjqJ%(_L)ygoIRBXwWigp~C|;|G=QW@<2a-&?6N70iZ)D0z&%A0~DdChZxF; zfrh+si38mnT2m~h78WA->P`=cM7Kg&ad9wU=P!oWilDq&+QGDW1$p@y#h4tHMuo8Q zkQZqBV^kQ*u*(Ju6&)M>D1G|lP(3RBjJ!)UKnP``stA~d_8PIT!TgW>(_nU(aWnHG4b$f4WwWmU;2N>Z0kBV9 z3kZ5fc|4Yvj#F0X6pX4aMqk5KTgdjkDu-Ls{jbVI8;VU%{Cfa{nLiQT@yuV|ieddA z7VbNi07NcY~#Cnr}1w zfhm^C%3@LH2c8W7tNK=^u=>{~F{~fPP^@nw=g)t2eU-dia6%~>>eUav>ktD^x8ZIN zI@Nr*pNHEL?j-PwhFb@}%i(?q_iy+c{7%FSO^}0`WoBU+dqr{)ER=^PkU?htaq2>C zo~{h`NwTwH>JgV;Bv}oTB@@Oe-$`L^YP%UH9*C$l1R{Mkyl%$)F*_1RRej727owsY zXIUD|$}=c|B8?AI@=(Y#9~?z47Gd6?g} z@Yfvvx#zy9BR}nk+P1zftm}oc$aQPi3h-Tw_yNjm;bTGrB2p5@03)z2j6yQ(C}8R3 z{p1;-8Tx2IM(72g57)Vkuq3J`6Gq(tt{< zD}*ICicTExm_nPIp`lBdW>c{8VZ0)EnV9a`H&2`D*vLsA?IbnG+#JjU(`A)qK4W*QP`2pz9yzTWx*Z;tGzTkp5*gt9kYoCZ~4T12i0c_$A)rUdfp*Hd{ zF<$t-SyiFS0l4*Xu57(<0B)hGa3%P!6yW*KL5xe~F0VAYpOjDH7a^kQdK=?3cZu>! z8N=k9CW)aapBqKFETWlwjvmY6|GVT>w1j<6rg`}c?=GfkvrE%pX+y_aT1HBCX`EKW zBsB0F_szmPEjSegdnu9250^yh>0NDB&f^QG2JsFIZ2E=86TfFu$-iq;%`xpACpurW zgkpX*JU(ql`dTZh85t_EjdFE5O<2Evq@X|>mX-$J@dX4YL4W4MVlp>|7~Gh^tUq85 z>4j=>CWm!9waz@UI6txnk^9KGn_9~UAF#__%IIZ+h!s zq2C({FnoCkr5FtRj6zs%oB8Jzh^P<1_<32A zsXw5pe{mM`FU~UYFDcHa{(vU_IqE|3HE(9w>}*BM*RWx zewlpTit#gx!)Q3ZatdcZXdL*CO`#UnF+TCQf``d243^O)g_A@J>3FIHR7xNA-H9;R zhhbY6$W+jgV4+Bh1JAd`hr~c2AKuh=v~xsz7cnI|c$l9zjV=np<_l!~m1IdoWZn5vqot{RxAZ zK%LDe@umH|OMSf+{_GF+2bw*-RlUsR2{RYZCF9`OXNj0GO$2|qo9-=(eu&)a?V!QW z3>lg@YSOY}iT+iow zn!g18;%&umTrc2_^F7{pMjh{zXJV$xL*A5jZlxHvS@rtj@0`N=hDR=ws!KI_#qf+U zWq3mB=$PdAG}xfU2M+l$D74ZN%i=SNwIKg-7i)?-7ItwmL0NcR|AhE;!_ z9`ZMKxdeJRn zF7t27;`FATi*VobX$XAUY9JKPynOrwjsEj>q-h;XN9Hm#s}GBxt}eh+R9y{4mSs z({(kar&w)Tuga~QKO89?IN1h!RVE9B=IgI5%GSYNgwc|PrcdGCazjNLUpLLS`ZeaZ zprtZ=-vs+MS}rK(-#fvFwT#*DwVWxi*PBTrw7?gL!c3FsIZMj}-#-~mEtVJx^jG;d zUtc|aJ?ERH-wfv&JzOsqYctXcG$kPD^@U_rqJQJS4q+nLR8)f2rk28)3yVCygw z>;YzhD-Y~4>fmn?Sf+@je{~S65c~#{IH1s6deeAukXj4zkya*9)&Uj6CQ5VZQwZ2M z0sD)|kOzD*hl~PuGL&jC*cKed%idhNSY9TK(p>mZu>Cj~C?o(K@oFyKkiVcKrbQeI zwaTI#(Zb&ps9gr!YRDfk1Gt$AwaoyIX~B{s5;MkwV!@3XUeJ&aLQx4cP)j@y33weY+3;QmP2x{yD z{0D$|a(i@B7i#{M+<6Fhzz9%9NT;~98`;eW;x7H+6Jy1`-;RLCG_L1!^>&)GD_ zYSfWWS|5~vIn$BPj{Ry<^y)r+K5xBy5~&@YA^YQkncMukTp;hvJ`$UuHU5qgmI1Gt zFWEex_=;gP$MW;ct>IW><`(_`3ZprFF0Yh18`1~X8-0}U9n3M#g^R8y~&r+!}3=$vK_i)zKn=Puu z^s#YqF`R%g|EMx;lsq;rbvP^z=_S9%_$2DPn!C&`>bpuFUVe-DC;h}w(ZtYve;^h1 z?Ba$FmE*$?*uN_Vdt+eWs}L6R?Bqip?g!?>3J`37!6$ABtPu0%S$MJvb^~Klk_O8& za8q8Mlsr5(J|zWA4W!0^c^l9}O7c~OJ>bb5`{ENm7J@Yp91ehI1aM{u2m*mT{dafa zL{u(l6mqb^17CM4rjJIzd>Oau1>=F0Q`;|oOg!CeqoH zXXxP+z%(pr5j+IR!3^Qa1UzHx4Bzp^Cof`wGN!<{sBoQ&QPibscsLDD@CvZ8Xg2sH zi#_y#r&{#0Rr-k)QBz7e4vQ zi$gFS_2CtLk`Ao?#E*CZDGbk4+d{1$1`^`npSFNSqWIb0YQFI)#wo=m|< zU(8<){;1uCnf}2%2<}{9M#keD@+rvEvLo~_T3p)K@7j!nWs!BGSFXtO{Y*7#r|as# z;oB1~EqyP@{kr)&*?c__LV&+HGzL$6WegT~Pq<;if9EulU{~-E?MZQJevW?s~uduNVA>zEyhor`+upZ~ylC z3wIOz=EZG4xa;Ef!^+F5{ku+d{8#m$S1x&^g{FP({#W__Rez~i)9Cd=?&9bL3)l6| z?>_eEFz>Wi+JEzSSh+ms(}W#Kjkt$^SK)|4sq5Y$G4oC@C@A`IP#4j^nR-pl&}L}F zU4L&_|H#4mJ0jXuq}vIAu#Y4ceq

56p7eU?tn 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

O?;XhRBb$Vm2iTatXjjwJ52Cm}l=NdGEF(x<|S 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 H$9Z3SS7T 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 aaaa = major version number. bb = minor version number. cc = development version number. -*/ - -#define FMOD_VERSION 0x00044412 - -/* - Compiler specific settings. -*/ - -#if defined(__CYGWIN32__) - #define F_CDECL __cdecl - #define F_STDCALL __stdcall - #define F_DECLSPEC __declspec - #define F_DLLEXPORT ( dllexport ) -#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) - #define F_CDECL _cdecl - #define F_STDCALL _stdcall - #define F_DECLSPEC __declspec - #define F_DLLEXPORT ( dllexport ) -#elif defined(__MACH__) || defined(__ANDROID__) || defined(__linux__) || defined(__QNX__) - #define F_CDECL - #define F_STDCALL - #define F_DECLSPEC - #define F_DLLEXPORT __attribute__ ((visibility("default"))) -#else - #define F_CDECL - #define F_STDCALL - #define F_DECLSPEC - #define F_DLLEXPORT -#endif - -#ifdef DLL_EXPORTS - #if defined(__MACH__) || defined(__ANDROID__) || defined(__linux__) || defined(__QNX__) - #define F_API __attribute__ ((visibility("default"))) - #else - #define F_API __declspec(dllexport) F_STDCALL - #endif -#else - #define F_API F_STDCALL -#endif - -#define F_CALLBACK F_STDCALL - -/* - FMOD types. -*/ - -typedef int FMOD_BOOL; -typedef struct FMOD_SYSTEM FMOD_SYSTEM; -typedef struct FMOD_SOUND FMOD_SOUND; -typedef struct FMOD_CHANNEL FMOD_CHANNEL; -typedef struct FMOD_CHANNELGROUP FMOD_CHANNELGROUP; -typedef struct FMOD_SOUNDGROUP FMOD_SOUNDGROUP; -typedef struct FMOD_REVERB FMOD_REVERB; -typedef struct FMOD_DSP FMOD_DSP; -typedef struct FMOD_DSPCONNECTION FMOD_DSPCONNECTION; -typedef struct FMOD_POLYGON FMOD_POLYGON; -typedef struct FMOD_GEOMETRY FMOD_GEOMETRY; -typedef struct FMOD_SYNCPOINT FMOD_SYNCPOINT; -typedef unsigned int FMOD_MODE; -typedef unsigned int FMOD_TIMEUNIT; -typedef unsigned int FMOD_INITFLAGS; -typedef unsigned int FMOD_CAPS; -typedef unsigned int FMOD_DEBUGLEVEL; -typedef unsigned int FMOD_MEMORY_TYPE; - -/* -[ENUM] -[ - [DESCRIPTION] - error codes. Returned from every function. - - [REMARKS] - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] -] -*/ -typedef enum -{ - FMOD_OK, /* No errors. */ - FMOD_ERR_ALREADYLOCKED, /* Tried to call lock a second time before unlock was called. */ - FMOD_ERR_BADCOMMAND, /* Tried to call a function on a data type that does not allow this type of functionality (ie calling Sound::lock on a streaming sound). */ - FMOD_ERR_CDDA_DRIVERS, /* Neither NTSCSI nor ASPI could be initialised. */ - FMOD_ERR_CDDA_INIT, /* An error occurred while initialising the CDDA subsystem. */ - FMOD_ERR_CDDA_INVALID_DEVICE, /* Couldn't find the specified device. */ - FMOD_ERR_CDDA_NOAUDIO, /* No audio tracks on the specified disc. */ - FMOD_ERR_CDDA_NODEVICES, /* No CD/DVD devices were found. */ - FMOD_ERR_CDDA_NODISC, /* No disc present in the specified drive. */ - FMOD_ERR_CDDA_READ, /* A CDDA read error occurred. */ - FMOD_ERR_CHANNEL_ALLOC, /* Error trying to allocate a channel. */ - FMOD_ERR_CHANNEL_STOLEN, /* The specified channel has been reused to play another sound. */ - FMOD_ERR_COM, /* A Win32 COM related error occured. COM failed to initialize or a QueryInterface failed meaning a Windows codec or driver was not installed properly. */ - FMOD_ERR_DMA, /* DMA Failure. See debug output for more information. */ - FMOD_ERR_DSP_CONNECTION, /* DSP connection error. Connection possibly caused a cyclic dependancy. Or tried to connect a tree too many units deep (more than 128). */ - FMOD_ERR_DSP_FORMAT, /* DSP Format error. A DSP unit may have attempted to connect to this network with the wrong format. */ - FMOD_ERR_DSP_NOTFOUND, /* DSP connection error. Couldn't find the DSP unit specified. */ - FMOD_ERR_DSP_RUNNING, /* DSP error. Cannot perform this operation while the network is in the middle of running. This will most likely happen if a connection or disconnection is attempted in a DSP callback. */ - FMOD_ERR_DSP_TOOMANYCONNECTIONS,/* DSP connection error. The unit being connected to or disconnected should only have 1 input or output. */ - FMOD_ERR_FILE_BAD, /* Error loading file. */ - FMOD_ERR_FILE_COULDNOTSEEK, /* Couldn't perform seek operation. This is a limitation of the medium (ie netstreams) or the file format. */ - FMOD_ERR_FILE_DISKEJECTED, /* Media was ejected while reading. */ - FMOD_ERR_FILE_EOF, /* End of file unexpectedly reached while trying to read essential data (truncated data?). */ - FMOD_ERR_FILE_NOTFOUND, /* File not found. */ - FMOD_ERR_FILE_UNWANTED, /* Unwanted file access occured. */ - FMOD_ERR_FORMAT, /* Unsupported file or audio format. */ - FMOD_ERR_HTTP, /* A HTTP error occurred. This is a catch-all for HTTP errors not listed elsewhere. */ - FMOD_ERR_HTTP_ACCESS, /* The specified resource requires authentication or is forbidden. */ - FMOD_ERR_HTTP_PROXY_AUTH, /* Proxy authentication is required to access the specified resource. */ - FMOD_ERR_HTTP_SERVER_ERROR, /* A HTTP server error occurred. */ - FMOD_ERR_HTTP_TIMEOUT, /* The HTTP request timed out. */ - FMOD_ERR_INITIALIZATION, /* FMOD was not initialized correctly to support this function. */ - FMOD_ERR_INITIALIZED, /* Cannot call this command after System::init. */ - FMOD_ERR_INTERNAL, /* An error occured that wasn't supposed to. Contact support. */ - FMOD_ERR_INVALID_ADDRESS, /* On Xbox 360, this memory address passed to FMOD must be physical, (ie allocated with XPhysicalAlloc.) */ - FMOD_ERR_INVALID_FLOAT, /* Value passed in was a NaN, Inf or denormalized float. */ - FMOD_ERR_INVALID_HANDLE, /* An invalid object handle was used. */ - FMOD_ERR_INVALID_PARAM, /* An invalid parameter was passed to this function. */ - FMOD_ERR_INVALID_POSITION, /* An invalid seek position was passed to this function. */ - FMOD_ERR_INVALID_SPEAKER, /* An invalid speaker was passed to this function based on the current speaker mode. */ - FMOD_ERR_INVALID_SYNCPOINT, /* The syncpoint did not come from this sound handle. */ - FMOD_ERR_INVALID_VECTOR, /* The vectors passed in are not unit length, or perpendicular. */ - FMOD_ERR_MAXAUDIBLE, /* Reached maximum audible playback count for this sound's soundgroup. */ - FMOD_ERR_MEMORY, /* Not enough memory or resources. */ - FMOD_ERR_MEMORY_CANTPOINT, /* Can't use FMOD_OPENMEMORY_POINT on non PCM source data, or non mp3/xma/adpcm data if FMOD_CREATECOMPRESSEDSAMPLE was used. */ - FMOD_ERR_MEMORY_SRAM, /* Not enough memory or resources on console sound ram. */ - FMOD_ERR_NEEDS2D, /* Tried to call a command on a 3d sound when the command was meant for 2d sound. */ - FMOD_ERR_NEEDS3D, /* Tried to call a command on a 2d sound when the command was meant for 3d sound. */ - FMOD_ERR_NEEDSHARDWARE, /* Tried to use a feature that requires hardware support. (ie trying to play a GCADPCM compressed sound in software on Wii). */ - FMOD_ERR_NEEDSSOFTWARE, /* Tried to use a feature that requires the software engine. Software engine has either been turned off, or command was executed on a hardware channel which does not support this feature. */ - FMOD_ERR_NET_CONNECT, /* Couldn't connect to the specified host. */ - FMOD_ERR_NET_SOCKET_ERROR, /* A socket error occurred. This is a catch-all for socket-related errors not listed elsewhere. */ - FMOD_ERR_NET_URL, /* The specified URL couldn't be resolved. */ - FMOD_ERR_NET_WOULD_BLOCK, /* Operation on a non-blocking socket could not complete immediately. */ - FMOD_ERR_NOTREADY, /* Operation could not be performed because specified sound/DSP connection is not ready. */ - FMOD_ERR_OUTPUT_ALLOCATED, /* Error initializing output device, but more specifically, the output device is already in use and cannot be reused. */ - FMOD_ERR_OUTPUT_CREATEBUFFER, /* Error creating hardware sound buffer. */ - FMOD_ERR_OUTPUT_DRIVERCALL, /* A call to a standard soundcard driver failed, which could possibly mean a bug in the driver or resources were missing or exhausted. */ - FMOD_ERR_OUTPUT_ENUMERATION, /* Error enumerating the available driver list. List may be inconsistent due to a recent device addition or removal. */ - FMOD_ERR_OUTPUT_FORMAT, /* Soundcard does not support the minimum features needed for this soundsystem (16bit stereo output). */ - FMOD_ERR_OUTPUT_INIT, /* Error initializing output device. */ - FMOD_ERR_OUTPUT_NOHARDWARE, /* FMOD_HARDWARE was specified but the sound card does not have the resources necessary to play it. */ - FMOD_ERR_OUTPUT_NOSOFTWARE, /* Attempted to create a software sound but no software channels were specified in System::init. */ - FMOD_ERR_PAN, /* Panning only works with mono or stereo sound sources. */ - FMOD_ERR_PLUGIN, /* An unspecified error has been returned from a 3rd party plugin. */ - FMOD_ERR_PLUGIN_INSTANCES, /* The number of allowed instances of a plugin has been exceeded. */ - FMOD_ERR_PLUGIN_MISSING, /* A requested output, dsp unit type or codec was not available. */ - FMOD_ERR_PLUGIN_RESOURCE, /* A resource that the plugin requires cannot be found. (ie the DLS file for MIDI playback or other DLLs that it needs to load) */ - FMOD_ERR_PRELOADED, /* The specified sound is still in use by the event system, call EventSystem::unloadFSB before trying to release it. */ - FMOD_ERR_PROGRAMMERSOUND, /* The specified sound is still in use by the event system, wait for the event which is using it finish with it. */ - FMOD_ERR_RECORD, /* An error occured trying to initialize the recording device. */ - FMOD_ERR_REVERB_INSTANCE, /* Specified instance in FMOD_REVERB_PROPERTIES couldn't be set. Most likely because it is an invalid instance number or the reverb doesnt exist. */ - FMOD_ERR_SUBSOUND_ALLOCATED, /* This subsound is already being used by another sound, you cannot have more than one parent to a sound. Null out the other parent's entry first. */ - FMOD_ERR_SUBSOUND_CANTMOVE, /* Shared subsounds cannot be replaced or moved from their parent stream, such as when the parent stream is an FSB file. */ - FMOD_ERR_SUBSOUND_MODE, /* The subsound's mode bits do not match with the parent sound's mode bits. See documentation for function that it was called with. */ - FMOD_ERR_SUBSOUNDS, /* The error occured because the sound referenced contains subsounds when it shouldn't have, or it doesn't contain subsounds when it should have. The operation may also not be able to be performed on a parent sound, or a parent sound was played without setting up a sentence first. */ - FMOD_ERR_TAGNOTFOUND, /* The specified tag could not be found or there are no tags. */ - FMOD_ERR_TOOMANYCHANNELS, /* The sound created exceeds the allowable input channel count. This can be increased using the maxinputchannels parameter in System::setSoftwareFormat. */ - FMOD_ERR_UNIMPLEMENTED, /* Something in FMOD hasn't been implemented when it should be! contact support! */ - FMOD_ERR_UNINITIALIZED, /* This command failed because System::init or System::setDriver was not called. */ - FMOD_ERR_UNSUPPORTED, /* A command issued was not supported by this object. Possibly a plugin without certain callbacks specified. */ - FMOD_ERR_UPDATE, /* An error caused by System::update occured. */ - FMOD_ERR_VERSION, /* The version number of this file format is not supported. */ - - FMOD_ERR_EVENT_FAILED, /* An Event failed to be retrieved, most likely due to 'just fail' being specified as the max playbacks behavior. */ - FMOD_ERR_EVENT_INFOONLY, /* Can't execute this command on an EVENT_INFOONLY event. */ - FMOD_ERR_EVENT_INTERNAL, /* An error occured that wasn't supposed to. See debug log for reason. */ - FMOD_ERR_EVENT_MAXSTREAMS, /* Event failed because 'Max streams' was hit when FMOD_EVENT_INIT_FAIL_ON_MAXSTREAMS was specified. */ - FMOD_ERR_EVENT_MISMATCH, /* FSB mismatches the FEV it was compiled with, the stream/sample mode it was meant to be created with was different, or the FEV was built for a different platform. */ - FMOD_ERR_EVENT_NAMECONFLICT, /* A category with the same name already exists. */ - FMOD_ERR_EVENT_NOTFOUND, /* The requested event, event group, event category or event property could not be found. */ - FMOD_ERR_EVENT_NEEDSSIMPLE, /* Tried to call a function on a complex event that's only supported by simple events. */ - FMOD_ERR_EVENT_GUIDCONFLICT, /* An event with the same GUID already exists. */ - FMOD_ERR_EVENT_ALREADY_LOADED, /* The specified project or bank has already been loaded. Having multiple copies of the same project loaded simultaneously is forbidden. */ - - FMOD_ERR_MUSIC_UNINITIALIZED, /* Music system is not initialized probably because no music data is loaded. */ - FMOD_ERR_MUSIC_NOTFOUND, /* The requested music entity could not be found. */ - FMOD_ERR_MUSIC_NOCALLBACK, /* The music callback is required, but it has not been set. */ - - FMOD_RESULT_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ -} FMOD_RESULT; - - -/* -[STRUCTURE] -[ - [DESCRIPTION] - Structure describing a point in 3D space. - - [REMARKS] - FMOD uses a left handed co-ordinate system by default. - To use a right handed co-ordinate system specify FMOD_INIT_3D_RIGHTHANDED from FMOD_INITFLAGS in System::init. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::set3DListenerAttributes - System::get3DListenerAttributes - Channel::set3DAttributes - Channel::get3DAttributes - Channel::set3DCustomRolloff - Channel::get3DCustomRolloff - Sound::set3DCustomRolloff - Sound::get3DCustomRolloff - Geometry::addPolygon - Geometry::setPolygonVertex - Geometry::getPolygonVertex - Geometry::setRotation - Geometry::getRotation - Geometry::setPosition - Geometry::getPosition - Geometry::setScale - Geometry::getScale - FMOD_INITFLAGS -] -*/ -typedef struct -{ - float x; /* X co-ordinate in 3D space. */ - float y; /* Y co-ordinate in 3D space. */ - float z; /* Z co-ordinate in 3D space. */ -} FMOD_VECTOR; - -/* -[STRUCTURE] -[ - [DESCRIPTION] - Structure describing a globally unique identifier. - - [REMARKS] - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::getDriverInfo -] -*/ -typedef struct -{ - unsigned int Data1; /* Specifies the first 8 hexadecimal digits of the GUID */ - unsigned short Data2; /* Specifies the first group of 4 hexadecimal digits. */ - unsigned short Data3; /* Specifies the second group of 4 hexadecimal digits. */ - unsigned char Data4[8]; /* Array of 8 bytes. The first 2 bytes contain the third group of 4 hexadecimal digits. The remaining 6 bytes contain the final 12 hexadecimal digits. */ -} FMOD_GUID; - -/* -[STRUCTURE] -[ - [DESCRIPTION] - Structure that is passed into FMOD_FILE_ASYNCREADCALLBACK. Use the information in this structure to perform - - [REMARKS] - Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value. - Members marked with [w] mean the variable can be written to. The user can set the value. - - Instructions: write to 'buffer', and 'bytesread' BEFORE setting 'result'. - As soon as result is set, FMOD will asynchronously continue internally using the data provided in this structure. - - Set 'result' to the result expected from a normal file read callback. - If the read was successful, set it to FMOD_OK. - If it read some data but hit the end of the file, set it to FMOD_ERR_FILE_EOF. - If a bad error occurred, return FMOD_ERR_FILE_BAD - If a disk was ejected, return FMOD_ERR_FILE_DISKEJECTED. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - FMOD_FILE_ASYNCREADCALLBACK - FMOD_FILE_ASYNCCANCELCALLBACK -] -*/ -typedef struct -{ - void *handle; /* [r] The file handle that was filled out in the open callback. */ - unsigned int offset; /* [r] Seek position, make sure you read from this file offset. */ - unsigned int sizebytes; /* [r] how many bytes requested for read. */ - int priority; /* [r] 0 = low importance. 100 = extremely important (ie 'must read now or stuttering may occur') */ - - void *buffer; /* [w] Buffer to read file data into. */ - unsigned int bytesread; /* [w] Fill this in before setting result code to tell FMOD how many bytes were read. */ - FMOD_RESULT result; /* [r/w] Result code, FMOD_OK tells the system it is ready to consume the data. Set this last! Default value = FMOD_ERR_NOTREADY. */ - - void *userdata; /* [r] User data pointer. */ -} FMOD_ASYNCREADINFO; - - -/* -[ENUM] -[ - [DESCRIPTION] - These output types are used with System::setOutput / System::getOutput, to choose which output method to use. - - [REMARKS] - To pass information to the driver when initializing fmod use the extradriverdata parameter in System::init for the following reasons. - - FMOD_OUTPUTTYPE_WAVWRITER - extradriverdata is a pointer to a char * filename that the wav writer will output to. - - FMOD_OUTPUTTYPE_WAVWRITER_NRT - extradriverdata is a pointer to a char * filename that the wav writer will output to. - - FMOD_OUTPUTTYPE_DSOUND - extradriverdata is a pointer to a HWND so that FMOD can set the focus on the audio for a particular window. - - FMOD_OUTPUTTYPE_PS3 - extradriverdata is a pointer to a FMOD_PS3_EXTRADRIVERDATA struct. This can be found in fmodps3.h. - - FMOD_OUTPUTTYPE_GC - extradriverdata is a pointer to a FMOD_GC_INFO struct. This can be found in fmodgc.h. - - FMOD_OUTPUTTYPE_WII - extradriverdata is a pointer to a FMOD_WII_INFO struct. This can be found in fmodwii.h. - - FMOD_OUTPUTTYPE_ALSA - extradriverdata is a pointer to a FMOD_LINUX_EXTRADRIVERDATA struct. This can be found in fmodlinux.h. - - Currently these are the only FMOD drivers that take extra information. Other unknown plugins may have different requirements. - - Note! If FMOD_OUTPUTTYPE_WAVWRITER_NRT or FMOD_OUTPUTTYPE_NOSOUND_NRT are used, and if the System::update function is being called - very quickly (ie for a non realtime decode) it may be being called too quickly for the FMOD streamer thread to respond to. - The result will be a skipping/stuttering output in the captured audio. - - To remedy this, disable the FMOD Ex streamer thread, and use FMOD_INIT_STREAM_FROM_UPDATE to avoid skipping in the output stream, - as it will lock the mixer and the streamer together in the same thread. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::setOutput - System::getOutput - System::setSoftwareFormat - System::getSoftwareFormat - System::init - System::update - FMOD_INITFLAGS -] -*/ -typedef enum -{ - FMOD_OUTPUTTYPE_AUTODETECT, /* Picks the best output mode for the platform. This is the default. */ - - FMOD_OUTPUTTYPE_UNKNOWN, /* All - 3rd party plugin, unknown. This is for use with System::getOutput only. */ - FMOD_OUTPUTTYPE_NOSOUND, /* All - All calls in this mode succeed but make no sound. */ - FMOD_OUTPUTTYPE_WAVWRITER, /* All - Writes output to fmodoutput.wav by default. Use the 'extradriverdata' parameter in System::init, by simply passing the filename as a string, to set the wav filename. */ - FMOD_OUTPUTTYPE_NOSOUND_NRT, /* All - Non-realtime version of FMOD_OUTPUTTYPE_NOSOUND. User can drive mixer with System::update at whatever rate they want. */ - FMOD_OUTPUTTYPE_WAVWRITER_NRT, /* All - Non-realtime version of FMOD_OUTPUTTYPE_WAVWRITER. User can drive mixer with System::update at whatever rate they want. */ - - FMOD_OUTPUTTYPE_DSOUND, /* Win32/Win64 - DirectSound output. (Default on Windows XP and below) */ - FMOD_OUTPUTTYPE_WINMM, /* Win32/Win64 - Windows Multimedia output. */ - FMOD_OUTPUTTYPE_WASAPI, /* Win32 - Windows Audio Session API. (Default on Windows Vista and above) */ - FMOD_OUTPUTTYPE_ASIO, /* Win32 - Low latency ASIO 2.0 driver. */ - FMOD_OUTPUTTYPE_OSS, /* Linux/Linux64 - Open Sound System output. (Default on Linux, third preference) */ - FMOD_OUTPUTTYPE_ALSA, /* Linux/Linux64 - Advanced Linux Sound Architecture output. (Default on Linux, second preference if available) */ - FMOD_OUTPUTTYPE_ESD, /* Linux/Linux64 - Enlightment Sound Daemon output. */ - FMOD_OUTPUTTYPE_PULSEAUDIO, /* Linux/Linux64 - PulseAudio output. (Default on Linux, first preference if available) */ - FMOD_OUTPUTTYPE_COREAUDIO, /* Mac - Macintosh CoreAudio output. (Default on Mac) */ - FMOD_OUTPUTTYPE_XBOX360, /* Xbox 360 - Native Xbox360 output. (Default on Xbox 360) */ - FMOD_OUTPUTTYPE_PSP, /* PSP - Native PSP output. (Default on PSP) */ - FMOD_OUTPUTTYPE_PS3, /* PS3 - Native PS3 output. (Default on PS3) */ - FMOD_OUTPUTTYPE_NGP, /* NGP - Native NGP output. (Default on NGP) */ - FMOD_OUTPUTTYPE_WII, /* Wii - Native Wii output. (Default on Wii) */ - FMOD_OUTPUTTYPE_3DS, /* 3DS - Native 3DS output (Default on 3DS) */ - FMOD_OUTPUTTYPE_AUDIOTRACK, /* Android - Java Audio Track output. (Default on Android 2.2 and below) */ - FMOD_OUTPUTTYPE_OPENSL, /* Android - OpenSL ES output. (Default on Android 2.3 and above) */ - FMOD_OUTPUTTYPE_NACL, /* Native Client - Native Client output. (Default on Native Client) */ - FMOD_OUTPUTTYPE_WIIU, /* Wii U - Native Wii U output. (Default on Wii U) */ - FMOD_OUTPUTTYPE_ASOUND, /* BlackBerry - Native BlackBerry asound output. (Default on BlackBerry) */ - - FMOD_OUTPUTTYPE_MAX, /* Maximum number of output types supported. */ - FMOD_OUTPUTTYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ -} FMOD_OUTPUTTYPE; - - -/* -[DEFINE] -[ - [NAME] - FMOD_CAPS - - [DESCRIPTION] - Bit fields to use with System::getDriverCaps to determine the capabilities of a card / output device. - - [REMARKS] - It is important to check FMOD_CAPS_HARDWARE_EMULATED on windows machines, to then adjust System::setDSPBufferSize to (1024, 10) to compensate for the higher latency. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::getDriverCaps - System::setDSPBufferSize -] -*/ -#define FMOD_CAPS_NONE 0x00000000 /* Device has no special capabilities. */ -#define FMOD_CAPS_HARDWARE 0x00000001 /* Device supports hardware mixing. */ -#define FMOD_CAPS_HARDWARE_EMULATED 0x00000002 /* User has device set to 'Hardware acceleration = off' in control panel, and now extra 200ms latency is incurred. */ -#define FMOD_CAPS_OUTPUT_MULTICHANNEL 0x00000004 /* Device can do multichannel output, ie greater than 2 channels. */ -#define FMOD_CAPS_OUTPUT_FORMAT_PCM8 0x00000008 /* Device can output to 8bit integer PCM. */ -#define FMOD_CAPS_OUTPUT_FORMAT_PCM16 0x00000010 /* Device can output to 16bit integer PCM. */ -#define FMOD_CAPS_OUTPUT_FORMAT_PCM24 0x00000020 /* Device can output to 24bit integer PCM. */ -#define FMOD_CAPS_OUTPUT_FORMAT_PCM32 0x00000040 /* Device can output to 32bit integer PCM. */ -#define FMOD_CAPS_OUTPUT_FORMAT_PCMFLOAT 0x00000080 /* Device can output to 32bit floating point PCM. */ -#define FMOD_CAPS_REVERB_LIMITED 0x00002000 /* Device supports some form of limited hardware reverb, maybe parameterless and only selectable by environment. */ -#define FMOD_CAPS_LOOPBACK 0x00004000 /* Device is a loopback recording device */ -/* [DEFINE_END] */ - -/* -[DEFINE] -[ - [NAME] - FMOD_DEBUGLEVEL - - [DESCRIPTION] - Bit fields to use with FMOD::Debug_SetLevel / FMOD::Debug_GetLevel to control the level of tty debug output with logging versions of FMOD (fmodL). - - [REMARKS] - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - Debug_SetLevel - Debug_GetLevel -] -*/ -#define FMOD_DEBUG_LEVEL_NONE 0x00000000 -#define FMOD_DEBUG_LEVEL_LOG 0x00000001 /* Will display generic logging messages. */ -#define FMOD_DEBUG_LEVEL_ERROR 0x00000002 /* Will display errors. */ -#define FMOD_DEBUG_LEVEL_WARNING 0x00000004 /* Will display warnings that are not fatal. */ -#define FMOD_DEBUG_LEVEL_HINT 0x00000008 /* Will hint to you if there is something possibly better you could be doing. */ -#define FMOD_DEBUG_LEVEL_ALL 0x000000FF -#define FMOD_DEBUG_TYPE_MEMORY 0x00000100 /* Show FMOD memory related logging messages. */ -#define FMOD_DEBUG_TYPE_THREAD 0x00000200 /* Show FMOD thread related logging messages. */ -#define FMOD_DEBUG_TYPE_FILE 0x00000400 /* Show FMOD file system related logging messages. */ -#define FMOD_DEBUG_TYPE_NET 0x00000800 /* Show FMOD network related logging messages. */ -#define FMOD_DEBUG_TYPE_EVENT 0x00001000 /* Show FMOD Event related logging messages. */ -#define FMOD_DEBUG_TYPE_ALL 0x0000FFFF -#define FMOD_DEBUG_DISPLAY_TIMESTAMPS 0x01000000 /* Display the timestamp of the log entry in milliseconds. */ -#define FMOD_DEBUG_DISPLAY_LINENUMBERS 0x02000000 /* Display the FMOD Ex source code line numbers, for debugging purposes. */ -#define FMOD_DEBUG_DISPLAY_COMPRESS 0x04000000 /* If a message is repeated more than 5 times it will stop displaying it and instead display the number of times the message was logged. */ -#define FMOD_DEBUG_DISPLAY_THREAD 0x08000000 /* Display the thread ID of the calling function that caused this log entry to appear. */ -#define FMOD_DEBUG_DISPLAY_ALL 0x0F000000 -#define FMOD_DEBUG_ALL 0xFFFFFFFF -/* [DEFINE_END] */ - - -/* -[DEFINE] -[ - [NAME] - FMOD_MEMORY_TYPE - - [DESCRIPTION] - Bit fields for memory allocation type being passed into FMOD memory callbacks. - - [REMARKS] - Remember this is a bitfield. You may get more than 1 bit set (ie physical + persistent) so do not simply switch on the types! You must check each bit individually or clear out the bits that you do not want within the callback. - Bits can be excluded if you want during Memory_Initialize so that you never get them. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - FMOD_MEMORY_ALLOCCALLBACK - FMOD_MEMORY_REALLOCCALLBACK - FMOD_MEMORY_FREECALLBACK - Memory_Initialize - -] -*/ -#define FMOD_MEMORY_NORMAL 0x00000000 /* Standard memory. */ -#define FMOD_MEMORY_STREAM_FILE 0x00000001 /* Stream file buffer, size controllable with System::setStreamBufferSize. */ -#define FMOD_MEMORY_STREAM_DECODE 0x00000002 /* Stream decode buffer, size controllable with FMOD_CREATESOUNDEXINFO::decodebuffersize. */ -#define FMOD_MEMORY_SAMPLEDATA 0x00000004 /* Sample data buffer. Raw audio data, usually PCM/MPEG/ADPCM/XMA data. */ -#define FMOD_MEMORY_DSP_OUTPUTBUFFER 0x00000008 /* DSP memory block allocated when more than 1 output exists on a DSP node. */ -#define FMOD_MEMORY_XBOX360_PHYSICAL 0x00100000 /* Requires XPhysicalAlloc / XPhysicalFree. */ -#define FMOD_MEMORY_PERSISTENT 0x00200000 /* Persistent memory. Memory will be freed when System::release is called. */ -#define FMOD_MEMORY_SECONDARY 0x00400000 /* Secondary memory. Allocation should be in secondary memory. For example RSX on the PS3. */ -#define FMOD_MEMORY_ALL 0xFFFFFFFF -/* [DEFINE_END] */ - - -/* -[ENUM] -[ - [DESCRIPTION] - These are speaker types defined for use with the System::setSpeakerMode or System::getSpeakerMode command. - - [REMARKS] - These are important notes on speaker modes in regards to sounds created with FMOD_SOFTWARE. - Note below the phrase 'sound channels' is used. These are the subchannels inside a sound, they are not related and - have nothing to do with the FMOD class "Channel". - For example a mono sound has 1 sound channel, a stereo sound has 2 sound channels, and an AC3 or 6 channel wav file have 6 "sound channels". - - FMOD_SPEAKERMODE_RAW - --------------------- - This mode is for output devices that are not specifically mono/stereo/quad/surround/5.1 or 7.1, but are multichannel. - Use System::setSoftwareFormat to specify the number of speakers you want to address, otherwise it will default to 2 (stereo). - Sound channels map to speakers sequentially, so a mono sound maps to output speaker 0, stereo sound maps to output speaker 0 & 1. - The user assumes knowledge of the speaker order. FMOD_SPEAKER enumerations may not apply, so raw channel indices should be used. - Multichannel sounds map input channels to output channels 1:1. - Channel::setPan and Channel::setSpeakerMix do not work. - Speaker levels must be manually set with Channel::setSpeakerLevels. - - FMOD_SPEAKERMODE_MONO - --------------------- - This mode is for a 1 speaker arrangement. - Panning does not work in this speaker mode. - Mono, stereo and multichannel sounds have each sound channel played on the one speaker unity. - Mix behavior for multichannel sounds can be set with Channel::setSpeakerLevels. - Channel::setSpeakerMix does not work. - - FMOD_SPEAKERMODE_STEREO - ----------------------- - This mode is for 2 speaker arrangements that have a left and right speaker. - - Mono sounds default to an even distribution between left and right. They can be panned with Channel::setPan. - - Stereo sounds default to the middle, or full left in the left speaker and full right in the right speaker. - - They can be cross faded with Channel::setPan. - - Multichannel sounds have each sound channel played on each speaker at unity. - - Mix behavior for multichannel sounds can be set with Channel::setSpeakerLevels. - - Channel::setSpeakerMix works but only front left and right parameters are used, the rest are ignored. - - FMOD_SPEAKERMODE_QUAD - ------------------------ - This mode is for 4 speaker arrangements that have a front left, front right, rear left and a rear right speaker. - - Mono sounds default to an even distribution between front left and front right. They can be panned with Channel::setPan. - - Stereo sounds default to the left sound channel played on the front left, and the right sound channel played on the front right. - - They can be cross faded with Channel::setPan. - - Multichannel sounds default to all of their sound channels being played on each speaker in order of input. - - Mix behavior for multichannel sounds can be set with Channel::setSpeakerLevels. - - Channel::setSpeakerMix works but side left, side right, center and lfe are ignored. - - FMOD_SPEAKERMODE_SURROUND - ------------------------ - This mode is for 5 speaker arrangements that have a left/right/center/rear left/rear right. - - Mono sounds default to the center speaker. They can be panned with Channel::setPan. - - Stereo sounds default to the left sound channel played on the front left, and the right sound channel played on the front right. - - They can be cross faded with Channel::setPan. - - Multichannel sounds default to all of their sound channels being played on each speaker in order of input. - - Mix behavior for multichannel sounds can be set with Channel::setSpeakerLevels. - - Channel::setSpeakerMix works but side left / side right are ignored. - - FMOD_SPEAKERMODE_5POINT1 - ------------------------ - This mode is for 5.1 speaker arrangements that have a left/right/center/rear left/rear right and a subwoofer speaker. - - Mono sounds default to the center speaker. They can be panned with Channel::setPan. - - Stereo sounds default to the left sound channel played on the front left, and the right sound channel played on the front right. - - They can be cross faded with Channel::setPan. - - Multichannel sounds default to all of their sound channels being played on each speaker in order of input. - - Mix behavior for multichannel sounds can be set with Channel::setSpeakerLevels. - - Channel::setSpeakerMix works but side left / side right are ignored. - - FMOD_SPEAKERMODE_7POINT1 - ------------------------ - This mode is for 7.1 speaker arrangements that have a left/right/center/rear left/rear right/side left/side right - and a subwoofer speaker. - - Mono sounds default to the center speaker. They can be panned with Channel::setPan. - - Stereo sounds default to the left sound channel played on the front left, and the right sound channel played on the front right. - - They can be cross faded with Channel::setPan. - - Multichannel sounds default to all of their sound channels being played on each speaker in order of input. - - Mix behavior for multichannel sounds can be set with Channel::setSpeakerLevels. - - Channel::setSpeakerMix works and every parameter is used to set the balance of a sound in any speaker. - - FMOD_SPEAKERMODE_SRS5_1_MATRIX - ------------------------------------------------------ - This mode is for mono, stereo, 5.1 and 6.1 speaker arrangements, as it is backwards and forwards compatible with - stereo, but to get a surround effect a SRS 5.1, Prologic or Prologic 2 hardware decoder / amplifier is needed or - a compatible SRS equipped device (e.g., laptop, TV, etc.) or accessory (e.g., headphone). - Pan behavior is the same as FMOD_SPEAKERMODE_5POINT1. - - If this function is called the numoutputchannels setting in System::setSoftwareFormat is overwritten. - - Output rate must be 44100, 48000 or 96000 for this to work otherwise FMOD_ERR_OUTPUT_INIT will be returned. - - FMOD_SPEAKERMODE_DOLBY5_1_MATRIX - ------------------------------------------------------ - This mode is for 5.1 speaker arrangements using a stereo signal, to get a surround effect a Dolby Pro Logic II - hardware decoder / amplifier is needed. - Pan behavior is the same as FMOD_SPEAKERMODE_5POINT1. - - If this function is called the numoutputchannels setting in System::setSoftwareFormat is overwritten. - - Output rate must be 32000, 44100 or 48000 for this to work otherwise FMOD_ERR_OUTPUT_INIT will be returned. - - FMOD_SPEAKERMODE_MYEARS - ------------------------------------------------------ - This mode is for headphones. This will attempt to load a MyEars profile (see myears.net.au) and use it to generate - surround sound on headphones using a personalized HRTF algorithm, for realistic 3d sound. - Pan behavior is the same as FMOD_SPEAKERMODE_7POINT1. - MyEars speaker mode will automatically be set if the speakermode is FMOD_SPEAKERMODE_STEREO and the MyEars profile exists. - If this mode is set explicitly, FMOD_INIT_DISABLE_MYEARS_AUTODETECT has no effect. - If this mode is set explicitly and the MyEars profile does not exist, FMOD_ERR_OUTPUT_DRIVERCALL will be returned. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::setSpeakerMode - System::getSpeakerMode - System::getDriverCaps - System::setSoftwareFormat - Channel::setSpeakerLevels -] -*/ -typedef enum -{ - FMOD_SPEAKERMODE_RAW, /* There is no specific speakermode. Sound channels are mapped in order of input to output. Use System::setSoftwareFormat to specify speaker count. See remarks for more information. */ - FMOD_SPEAKERMODE_MONO, /* The speakers are monaural. */ - FMOD_SPEAKERMODE_STEREO, /* The speakers are stereo (DEFAULT). */ - FMOD_SPEAKERMODE_QUAD, /* 4 speaker setup. This includes front left, front right, rear left, rear right. */ - FMOD_SPEAKERMODE_SURROUND, /* 5 speaker setup. This includes front left, front right, center, rear left, rear right. */ - FMOD_SPEAKERMODE_5POINT1, /* 5.1 speaker setup. This includes front left, front right, center, rear left, rear right and a subwoofer. */ - FMOD_SPEAKERMODE_7POINT1, /* 7.1 speaker setup. This includes front left, front right, center, rear left, rear right, side left, side right and a subwoofer. */ - - FMOD_SPEAKERMODE_SRS5_1_MATRIX, /* Stereo compatible output, embedded with surround information. SRS 5.1/Prologic/Prologic2 decoders will split the signal into a 5.1 speaker set-up or SRS virtual surround will decode into a 2-speaker/headphone setup. See remarks about limitations.*/ - FMOD_SPEAKERMODE_DOLBY5_1_MATRIX, /* Stereo compatible output, embedded with surround information. Dolby Pro Logic II decoders will split the signal into a 5.1 speaker set-up. */ - FMOD_SPEAKERMODE_MYEARS, /* Stereo output, but data is encoded using personalized HRTF algorithms. See myears.net.au */ - - FMOD_SPEAKERMODE_MAX, /* Maximum number of speaker modes supported. */ - FMOD_SPEAKERMODE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ -} FMOD_SPEAKERMODE; - - -/* -[ENUM] -[ - [DESCRIPTION] - These are speaker types defined for use with the Channel::setSpeakerLevels command. - It can also be used for speaker placement in the System::set3DSpeakerPosition command. - - [REMARKS] - If you are using FMOD_SPEAKERMODE_RAW and speaker assignments are meaningless, just cast a raw integer value to this type. - For example (FMOD_SPEAKER)7 would use the 7th speaker (also the same as FMOD_SPEAKER_SIDE_RIGHT). - Values higher than this can be used if an output system has more than 8 speaker types / output channels. 15 is the current maximum. - - NOTE: On Playstation 3 in 7.1, the extra 2 speakers are not side left/side right, they are 'surround back left'/'surround back right' which - locate the speakers behind the listener instead of to the sides like on PC. FMOD_SPEAKER_SBL/FMOD_SPEAKER_SBR are provided to make it - clearer what speaker is being addressed on that platform. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - FMOD_SPEAKERMODE - Channel::setSpeakerLevels - Channel::getSpeakerLevels - System::set3DSpeakerPosition - System::get3DSpeakerPosition -] -*/ -typedef enum -{ - FMOD_SPEAKER_FRONT_LEFT, - FMOD_SPEAKER_FRONT_RIGHT, - FMOD_SPEAKER_FRONT_CENTER, - FMOD_SPEAKER_LOW_FREQUENCY, - FMOD_SPEAKER_BACK_LEFT, - FMOD_SPEAKER_BACK_RIGHT, - FMOD_SPEAKER_SIDE_LEFT, - FMOD_SPEAKER_SIDE_RIGHT, - - FMOD_SPEAKER_MAX, /* Maximum number of speaker types supported. */ - FMOD_SPEAKER_MONO = FMOD_SPEAKER_FRONT_LEFT, /* For use with FMOD_SPEAKERMODE_MONO and Channel::SetSpeakerLevels. Mapped to same value as FMOD_SPEAKER_FRONT_LEFT. */ - FMOD_SPEAKER_NULL = 65535, /* A non speaker. Use this with ASIO mapping to ignore a speaker. */ - FMOD_SPEAKER_SBL = FMOD_SPEAKER_SIDE_LEFT, /* For use with FMOD_SPEAKERMODE_7POINT1 on PS3 where the extra speakers are surround back inside of side speakers. */ - FMOD_SPEAKER_SBR = FMOD_SPEAKER_SIDE_RIGHT, /* For use with FMOD_SPEAKERMODE_7POINT1 on PS3 where the extra speakers are surround back inside of side speakers. */ - FMOD_SPEAKER_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ -} FMOD_SPEAKER; - - -/* -[ENUM] -[ - [DESCRIPTION] - These are plugin types defined for use with the System::getNumPlugins, - System::getPluginInfo and System::unloadPlugin functions. - - [REMARKS] - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::getNumPlugins - System::getPluginInfo - System::unloadPlugin -] -*/ -typedef enum -{ - FMOD_PLUGINTYPE_OUTPUT, /* The plugin type is an output module. FMOD mixed audio will play through one of these devices */ - FMOD_PLUGINTYPE_CODEC, /* The plugin type is a file format codec. FMOD will use these codecs to load file formats for playback. */ - FMOD_PLUGINTYPE_DSP, /* The plugin type is a DSP unit. FMOD will use these plugins as part of its DSP network to apply effects to output or generate sound in realtime. */ - - FMOD_PLUGINTYPE_MAX, /* Maximum number of plugin types supported. */ - FMOD_PLUGINTYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ -} FMOD_PLUGINTYPE; - - -/* -[DEFINE] -[ - [NAME] - FMOD_INITFLAGS - - [DESCRIPTION] - Initialization flags. Use them with System::init in the flags parameter to change various behavior. - - [REMARKS] - Use System::setAdvancedSettings to adjust settings for some of the features that are enabled by these flags. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::init - System::update - System::setAdvancedSettings - Channel::set3DOcclusion -] -*/ -#define FMOD_INIT_NORMAL 0x00000000 /* All platforms - Initialize normally */ -#define FMOD_INIT_STREAM_FROM_UPDATE 0x00000001 /* All platforms - No stream thread is created internally. Streams are driven from System::update. Mainly used with non-realtime outputs. */ -#define FMOD_INIT_3D_RIGHTHANDED 0x00000002 /* All platforms - FMOD will treat +X as right, +Y as up and +Z as backwards (towards you). */ -#define FMOD_INIT_SOFTWARE_DISABLE 0x00000004 /* All platforms - Disable software mixer to save memory. Anything created with FMOD_SOFTWARE will fail and DSP will not work. */ -#define FMOD_INIT_OCCLUSION_LOWPASS 0x00000008 /* All platforms - All FMOD_SOFTWARE (and FMOD_HARDWARE on 3DS and NGP) with FMOD_3D based voices will add a software lowpass filter effect into the DSP chain which is automatically used when Channel::set3DOcclusion is used or the geometry API. */ -#define FMOD_INIT_HRTF_LOWPASS 0x00000010 /* All platforms - All FMOD_SOFTWARE (and FMOD_HARDWARE on 3DS and NGP) with FMOD_3D based voices will add a software lowpass filter effect into the DSP chain which causes sounds to sound duller when the sound goes behind the listener. Use System::setAdvancedSettings to adjust cutoff frequency. */ -#define FMOD_INIT_DISTANCE_FILTERING 0x00000200 /* All platforms - All FMOD_SOFTWARE with FMOD_3D based voices will add a software lowpass and highpass filter effect into the DSP chain which will act as a distance-automated bandpass filter. Use System::setAdvancedSettings to adjust the center frequency. */ -#define FMOD_INIT_REVERB_PREALLOCBUFFERS 0x00000040 /* All platforms - FMOD Software reverb will preallocate enough buffers for reverb per channel, rather than allocating them and freeing them at runtime. */ -#define FMOD_INIT_ENABLE_PROFILE 0x00000020 /* All platforms - Enable TCP/IP based host which allows FMOD Designer or FMOD Profiler to connect to it, and view memory, CPU and the DSP network graph in real-time. */ -#define FMOD_INIT_VOL0_BECOMES_VIRTUAL 0x00000080 /* All platforms - Any sounds that are 0 volume will go virtual and not be processed except for having their positions updated virtually. Use System::setAdvancedSettings to adjust what volume besides zero to switch to virtual at. */ -#define FMOD_INIT_WASAPI_EXCLUSIVE 0x00000100 /* Win32 Vista only - for WASAPI output - Enable exclusive access to hardware, lower latency at the expense of excluding other applications from accessing the audio hardware. */ -#define FMOD_INIT_PS3_PREFERDTS 0x00800000 /* PS3 only - Prefer DTS over Dolby Digital if both are supported. Note: 8 and 6 channel LPCM is always preferred over both DTS and Dolby Digital. */ -#define FMOD_INIT_PS3_FORCE2CHLPCM 0x01000000 /* PS3 only - Force PS3 system output mode to 2 channel LPCM. */ -#define FMOD_INIT_DISABLEDOLBY 0x00100000 /* Wii / 3DS - Disable Dolby Pro Logic surround. Speakermode will be set to STEREO even if user has selected surround in the system settings. */ -#define FMOD_INIT_SYSTEM_MUSICMUTENOTPAUSE 0x00200000 /* Xbox 360 / PS3 - The "music" channelgroup which by default pauses when custom 360 dashboard / PS3 BGM music is played, can be changed to mute (therefore continues playing) instead of pausing, by using this flag. */ -#define FMOD_INIT_SYNCMIXERWITHUPDATE 0x00400000 /* Win32/Wii/PS3/Xbox/Xbox 360 - FMOD Mixer thread is woken up to do a mix when System::update is called rather than waking periodically on its own timer. */ -#define FMOD_INIT_GEOMETRY_USECLOSEST 0x04000000 /* All platforms - With the geometry engine, only process the closest polygon rather than accumulating all polygons the sound to listener line intersects. */ -#define FMOD_INIT_DISABLE_MYEARS_AUTODETECT 0x08000000 /* Win32 - Disables automatic setting of FMOD_SPEAKERMODE_STEREO to FMOD_SPEAKERMODE_MYEARS if the MyEars profile exists on the PC. MyEars is HRTF 7.1 downmixing through headphones. */ -#define FMOD_INIT_PS3_DISABLEDTS 0x10000000 /* PS3 only - Disable DTS output mode selection */ -#define FMOD_INIT_PS3_DISABLEDOLBYDIGITAL 0x20000000 /* PS3 only - Disable Dolby Digital output mode selection */ -/* [DEFINE_END] */ - - -/* -[ENUM] -[ - [DESCRIPTION] - These definitions describe the type of song being played. - - [REMARKS] - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - Sound::getFormat -] -*/ -typedef enum -{ - FMOD_SOUND_TYPE_UNKNOWN, /* 3rd party / unknown plugin format. */ - FMOD_SOUND_TYPE_AIFF, /* AIFF. */ - FMOD_SOUND_TYPE_ASF, /* Microsoft Advanced Systems Format (ie WMA/ASF/WMV). */ - FMOD_SOUND_TYPE_AT3, /* Sony ATRAC 3 format */ - FMOD_SOUND_TYPE_CDDA, /* Digital CD audio. */ - FMOD_SOUND_TYPE_DLS, /* Sound font / downloadable sound bank. */ - FMOD_SOUND_TYPE_FLAC, /* FLAC lossless codec. */ - FMOD_SOUND_TYPE_FSB, /* FMOD Sample Bank. */ - FMOD_SOUND_TYPE_GCADPCM, /* Nintendo GameCube/Wii ADPCM */ - FMOD_SOUND_TYPE_IT, /* Impulse Tracker. */ - FMOD_SOUND_TYPE_MIDI, /* MIDI. extracodecdata is a pointer to an FMOD_MIDI_EXTRACODECDATA structure. */ - FMOD_SOUND_TYPE_MOD, /* Protracker / Fasttracker MOD. */ - FMOD_SOUND_TYPE_MPEG, /* MP2/MP3 MPEG. */ - FMOD_SOUND_TYPE_OGGVORBIS, /* Ogg vorbis. */ - FMOD_SOUND_TYPE_PLAYLIST, /* Information only from ASX/PLS/M3U/WAX playlists */ - FMOD_SOUND_TYPE_RAW, /* Raw PCM data. */ - FMOD_SOUND_TYPE_S3M, /* ScreamTracker 3. */ - FMOD_SOUND_TYPE_SF2, /* Sound font 2 format. */ - FMOD_SOUND_TYPE_USER, /* User created sound. */ - FMOD_SOUND_TYPE_WAV, /* Microsoft WAV. */ - FMOD_SOUND_TYPE_XM, /* FastTracker 2 XM. */ - FMOD_SOUND_TYPE_XMA, /* Xbox360 XMA */ - FMOD_SOUND_TYPE_VAG, /* PlayStation Portable ADPCM VAG format. */ - FMOD_SOUND_TYPE_AUDIOQUEUE, /* iPhone hardware decoder, supports AAC, ALAC and MP3. extracodecdata is a pointer to an FMOD_AUDIOQUEUE_EXTRACODECDATA structure. */ - FMOD_SOUND_TYPE_XWMA, /* Xbox360 XWMA */ - FMOD_SOUND_TYPE_BCWAV, /* 3DS BCWAV container format for DSP ADPCM and PCM */ - FMOD_SOUND_TYPE_AT9, /* NGP ATRAC 9 format */ - FMOD_SOUND_TYPE_VORBIS, /* Raw vorbis */ - FMOD_SOUND_TYPE_MEDIA_FOUNDATION,/* Microsoft Media Foundation wrappers, supports ASF/WMA */ - - FMOD_SOUND_TYPE_MAX, /* Maximum number of sound types supported. */ - FMOD_SOUND_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ -} FMOD_SOUND_TYPE; - - -/* -[ENUM] -[ - [DESCRIPTION] - These definitions describe the native format of the hardware or software buffer that will be used. - - [REMARKS] - This is the format the native hardware or software buffer will be or is created in. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::createSound - Sound::getFormat -] -*/ -typedef enum -{ - FMOD_SOUND_FORMAT_NONE, /* Unitialized / unknown. */ - FMOD_SOUND_FORMAT_PCM8, /* 8bit integer PCM data. */ - FMOD_SOUND_FORMAT_PCM16, /* 16bit integer PCM data. */ - FMOD_SOUND_FORMAT_PCM24, /* 24bit integer PCM data. */ - FMOD_SOUND_FORMAT_PCM32, /* 32bit integer PCM data. */ - FMOD_SOUND_FORMAT_PCMFLOAT, /* 32bit floating point PCM data. */ - FMOD_SOUND_FORMAT_GCADPCM, /* Compressed Nintendo 3DS/Wii DSP data. */ - FMOD_SOUND_FORMAT_IMAADPCM, /* Compressed IMA ADPCM data. */ - FMOD_SOUND_FORMAT_VAG, /* Compressed PlayStation Portable ADPCM data. */ - FMOD_SOUND_FORMAT_HEVAG, /* Compressed PSVita ADPCM data. */ - FMOD_SOUND_FORMAT_XMA, /* Compressed Xbox360 XMA data. */ - FMOD_SOUND_FORMAT_MPEG, /* Compressed MPEG layer 2 or 3 data. */ - FMOD_SOUND_FORMAT_CELT, /* Compressed CELT data. */ - FMOD_SOUND_FORMAT_AT9, /* Compressed PSVita ATRAC9 data. */ - FMOD_SOUND_FORMAT_XWMA, /* Compressed Xbox360 xWMA data. */ - FMOD_SOUND_FORMAT_VORBIS, /* Compressed Vorbis data. */ - - FMOD_SOUND_FORMAT_MAX, /* Maximum number of sound formats supported. */ - FMOD_SOUND_FORMAT_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ -} FMOD_SOUND_FORMAT; - - -/* -[DEFINE] -[ - [NAME] - FMOD_MODE - - [DESCRIPTION] - Sound description bitfields, bitwise OR them together for loading and describing sounds. - - [REMARKS] - By default a sound will open as a static sound that is decompressed fully into memory to PCM. (ie equivalent of FMOD_CREATESAMPLE) - To have a sound stream instead, use FMOD_CREATESTREAM, or use the wrapper function System::createStream. - Some opening modes (ie FMOD_OPENUSER, FMOD_OPENMEMORY, FMOD_OPENMEMORY_POINT, FMOD_OPENRAW) will need extra information. - This can be provided using the FMOD_CREATESOUNDEXINFO structure. - - Specifying FMOD_OPENMEMORY_POINT will POINT to your memory rather allocating its own sound buffers and duplicating it internally. - This means you cannot free the memory while FMOD is using it, until after Sound::release is called. - With FMOD_OPENMEMORY_POINT, for PCM formats, only WAV, FSB, and RAW are supported. For compressed formats, only those formats supported by FMOD_CREATECOMPRESSEDSAMPLE are supported. - With FMOD_OPENMEMORY_POINT and FMOD_OPENRAW or PCM, if using them together, note that you must pad the data on each side by 16 bytes. This is so fmod can modify the ends of the data for looping/interpolation/mixing purposes. If a wav file, you will need to insert silence, and then reset loop points to stop the playback from playing that silence. - With FMOD_OPENMEMORY_POINT, For Wii/PSP FMOD_HARDWARE supports this flag for the GCADPCM/VAG formats. On other platforms FMOD_SOFTWARE must be used. - - Xbox 360 memory On Xbox 360 Specifying FMOD_OPENMEMORY_POINT to a virtual memory address will cause FMOD_ERR_INVALID_ADDRESS - to be returned. Use physical memory only for this functionality. - - FMOD_LOWMEM is used on a sound if you want to minimize the memory overhead, by having FMOD not allocate memory for certain - features that are not likely to be used in a game environment. These are : - 1. Sound::getName functionality is removed. 256 bytes per sound is saved. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::createSound - System::createStream - Sound::setMode - Sound::getMode - Channel::setMode - Channel::getMode - Sound::set3DCustomRolloff - Channel::set3DCustomRolloff - Sound::getOpenState -] -*/ -#define FMOD_DEFAULT 0x00000000 /* Default for all modes listed below. FMOD_LOOP_OFF, FMOD_2D, FMOD_HARDWARE */ -#define FMOD_LOOP_OFF 0x00000001 /* For non looping sounds. (DEFAULT). Overrides FMOD_LOOP_NORMAL / FMOD_LOOP_BIDI. */ -#define FMOD_LOOP_NORMAL 0x00000002 /* For forward looping sounds. */ -#define FMOD_LOOP_BIDI 0x00000004 /* For bidirectional looping sounds. (only works on software mixed static sounds). */ -#define FMOD_2D 0x00000008 /* Ignores any 3d processing. (DEFAULT). */ -#define FMOD_3D 0x00000010 /* Makes the sound positionable in 3D. Overrides FMOD_2D. */ -#define FMOD_HARDWARE 0x00000020 /* Attempts to make sounds use hardware acceleration. (DEFAULT). Note on platforms that don't support FMOD_HARDWARE (only 3DS, PS Vita, PSP, Wii and Wii U support FMOD_HARDWARE), this will be internally treated as FMOD_SOFTWARE. */ -#define FMOD_SOFTWARE 0x00000040 /* Makes the sound be mixed by the FMOD CPU based software mixer. Overrides FMOD_HARDWARE. Use this for FFT, DSP, compressed sample support, 2D multi-speaker support and other software related features. */ -#define FMOD_CREATESTREAM 0x00000080 /* Decompress at runtime, streaming from the source provided (ie from disk). Overrides FMOD_CREATESAMPLE and FMOD_CREATECOMPRESSEDSAMPLE. Note a stream can only be played once at a time due to a stream only having 1 stream buffer and file handle. Open multiple streams to have them play concurrently. */ -#define FMOD_CREATESAMPLE 0x00000100 /* Decompress at loadtime, decompressing or decoding whole file into memory as the target sample format (ie PCM). Fastest for FMOD_SOFTWARE based playback and most flexible. */ -#define FMOD_CREATECOMPRESSEDSAMPLE 0x00000200 /* Load MP2, MP3, IMAADPCM or XMA into memory and leave it compressed. During playback the FMOD software mixer will decode it in realtime as a 'compressed sample'. Can only be used in combination with FMOD_SOFTWARE. Overrides FMOD_CREATESAMPLE. If the sound data is not ADPCM, MPEG or XMA it will behave as if it was created with FMOD_CREATESAMPLE and decode the sound into PCM. */ -#define FMOD_OPENUSER 0x00000400 /* Opens a user created static sample or stream. Use FMOD_CREATESOUNDEXINFO to specify format and/or read callbacks. If a user created 'sample' is created with no read callback, the sample will be empty. Use Sound::lock and Sound::unlock to place sound data into the sound if this is the case. */ -#define FMOD_OPENMEMORY 0x00000800 /* "name_or_data" will be interpreted as a pointer to memory instead of filename for creating sounds. Use FMOD_CREATESOUNDEXINFO to specify length. If used with FMOD_CREATESAMPLE or FMOD_CREATECOMPRESSEDSAMPLE, FMOD duplicates the memory into its own buffers. Your own buffer can be freed after open. If used with FMOD_CREATESTREAM, FMOD will stream out of the buffer whose pointer you passed in. In this case, your own buffer should not be freed until you have finished with and released the stream.*/ -#define FMOD_OPENMEMORY_POINT 0x10000000 /* "name_or_data" will be interpreted as a pointer to memory instead of filename for creating sounds. Use FMOD_CREATESOUNDEXINFO to specify length. This differs to FMOD_OPENMEMORY in that it uses the memory as is, without duplicating the memory into its own buffers. For Wii/PSP FMOD_HARDWARE supports this flag for the GCADPCM/VAG formats. On other platforms FMOD_SOFTWARE must be used, as sound hardware on the other platforms (ie PC) cannot access main ram. Cannot be freed after open, only after Sound::release. Will not work if the data is compressed and FMOD_CREATECOMPRESSEDSAMPLE is not used. */ -#define FMOD_OPENRAW 0x00001000 /* Will ignore file format and treat as raw pcm. Use FMOD_CREATESOUNDEXINFO to specify format. Requires at least defaultfrequency, numchannels and format to be specified before it will open. Must be little endian data. */ -#define FMOD_OPENONLY 0x00002000 /* Just open the file, dont prebuffer or read. Good for fast opens for info, or when sound::readData is to be used. */ -#define FMOD_ACCURATETIME 0x00004000 /* For System::createSound - for accurate Sound::getLength/Channel::setPosition on VBR MP3, and MOD/S3M/XM/IT/MIDI files. Scans file first, so takes longer to open. FMOD_OPENONLY does not affect this. */ -#define FMOD_MPEGSEARCH 0x00008000 /* For corrupted / bad MP3 files. This will search all the way through the file until it hits a valid MPEG header. Normally only searches for 4k. */ -#define FMOD_NONBLOCKING 0x00010000 /* For opening sounds and getting streamed subsounds (seeking) asyncronously. Use Sound::getOpenState to poll the state of the sound as it opens or retrieves the subsound in the background. */ -#define FMOD_UNIQUE 0x00020000 /* Unique sound, can only be played one at a time */ -#define FMOD_3D_HEADRELATIVE 0x00040000 /* Make the sound's position, velocity and orientation relative to the listener. */ -#define FMOD_3D_WORLDRELATIVE 0x00080000 /* Make the sound's position, velocity and orientation absolute (relative to the world). (DEFAULT) */ -#define FMOD_3D_INVERSEROLLOFF 0x00100000 /* This sound will follow the inverse rolloff model where mindistance = full volume, maxdistance = where sound stops attenuating, and rolloff is fixed according to the global rolloff factor. (DEFAULT) */ -#define FMOD_3D_LINEARROLLOFF 0x00200000 /* This sound will follow a linear rolloff model where mindistance = full volume, maxdistance = silence. Rolloffscale is ignored. */ -#define FMOD_3D_LINEARSQUAREROLLOFF 0x00400000 /* This sound will follow a linear-square rolloff model where mindistance = full volume, maxdistance = silence. Rolloffscale is ignored. */ -#define FMOD_3D_CUSTOMROLLOFF 0x04000000 /* This sound will follow a rolloff model defined by Sound::set3DCustomRolloff / Channel::set3DCustomRolloff. */ -#define FMOD_3D_IGNOREGEOMETRY 0x40000000 /* Is not affect by geometry occlusion. If not specified in Sound::setMode, or Channel::setMode, the flag is cleared and it is affected by geometry again. */ -#define FMOD_UNICODE 0x01000000 /* Filename is double-byte unicode. */ -#define FMOD_IGNORETAGS 0x02000000 /* Skips id3v2/asf/etc tag checks when opening a sound, to reduce seek/read overhead when opening files (helps with CD performance). */ -#define FMOD_LOWMEM 0x08000000 /* Removes some features from samples to give a lower memory overhead, like Sound::getName. See remarks. */ -#define FMOD_LOADSECONDARYRAM 0x20000000 /* Load sound into the secondary RAM of supported platform. On PS3, sounds will be loaded into RSX/VRAM. */ -#define FMOD_VIRTUAL_PLAYFROMSTART 0x80000000 /* For sounds that start virtual (due to being quiet or low importance), instead of swapping back to audible, and playing at the correct offset according to time, this flag makes the sound play from the start. */ - -/* [DEFINE_END] */ - - -/* -[ENUM] -[ - [DESCRIPTION] - These values describe what state a sound is in after FMOD_NONBLOCKING has been used to open it. - - [REMARKS] - With streams, if you are using FMOD_NONBLOCKING, note that if the user calls Sound::getSubSound, a stream will go into FMOD_OPENSTATE_SEEKING state and sound related commands will return FMOD_ERR_NOTREADY. - With streams, if you are using FMOD_NONBLOCKING, note that if the user calls Channel::getPosition, a stream will go into FMOD_OPENSTATE_SETPOSITION state and sound related commands will return FMOD_ERR_NOTREADY. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - Sound::getOpenState - FMOD_MODE -] -*/ -typedef enum -{ - FMOD_OPENSTATE_READY = 0, /* Opened and ready to play. */ - FMOD_OPENSTATE_LOADING, /* Initial load in progress. */ - FMOD_OPENSTATE_ERROR, /* Failed to open - file not found, out of memory etc. See return value of Sound::getOpenState for what happened. */ - FMOD_OPENSTATE_CONNECTING, /* Connecting to remote host (internet sounds only). */ - FMOD_OPENSTATE_BUFFERING, /* Buffering data. */ - FMOD_OPENSTATE_SEEKING, /* Seeking to subsound and re-flushing stream buffer. */ - FMOD_OPENSTATE_PLAYING, /* Ready and playing, but not possible to release at this time without stalling the main thread. */ - FMOD_OPENSTATE_SETPOSITION, /* Seeking within a stream to a different position. */ - - FMOD_OPENSTATE_MAX, /* Maximum number of open state types. */ - FMOD_OPENSTATE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ -} FMOD_OPENSTATE; - - -/* -[ENUM] -[ - [DESCRIPTION] - These flags are used with SoundGroup::setMaxAudibleBehavior to determine what happens when more sounds - are played than are specified with SoundGroup::setMaxAudible. - - [REMARKS] - When using FMOD_SOUNDGROUP_BEHAVIOR_MUTE, SoundGroup::setMuteFadeSpeed can be used to stop a sudden transition. - Instead, the time specified will be used to cross fade between the sounds that go silent and the ones that become audible. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - SoundGroup::setMaxAudibleBehavior - SoundGroup::getMaxAudibleBehavior - SoundGroup::setMaxAudible - SoundGroup::getMaxAudible - SoundGroup::setMuteFadeSpeed - SoundGroup::getMuteFadeSpeed -] -*/ -typedef enum -{ - FMOD_SOUNDGROUP_BEHAVIOR_FAIL, /* Any sound played that puts the sound count over the SoundGroup::setMaxAudible setting, will simply fail during System::playSound. */ - FMOD_SOUNDGROUP_BEHAVIOR_MUTE, /* Any sound played that puts the sound count over the SoundGroup::setMaxAudible setting, will be silent, then if another sound in the group stops the sound that was silent before becomes audible again. */ - FMOD_SOUNDGROUP_BEHAVIOR_STEALLOWEST, /* Any sound played that puts the sound count over the SoundGroup::setMaxAudible setting, will steal the quietest / least important sound playing in the group. */ - - FMOD_SOUNDGROUP_BEHAVIOR_MAX, /* Maximum number of open state types. */ - FMOD_SOUNDGROUP_BEHAVIOR_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ -} FMOD_SOUNDGROUP_BEHAVIOR; - - -/* -[ENUM] -[ - [DESCRIPTION] - These callback types are used with Channel::setCallback. - - [REMARKS] - Each callback has commanddata parameters passed as int unique to the type of callback. - See reference to FMOD_CHANNEL_CALLBACK to determine what they might mean for each type of callback. - - Note! Currently the user must call System::update for these callbacks to trigger! - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - Channel::setCallback - FMOD_CHANNEL_CALLBACK - System::update -] -*/ -typedef enum -{ - FMOD_CHANNEL_CALLBACKTYPE_END, /* Called when a sound ends. */ - FMOD_CHANNEL_CALLBACKTYPE_VIRTUALVOICE, /* Called when a voice is swapped out or swapped in. */ - FMOD_CHANNEL_CALLBACKTYPE_SYNCPOINT, /* Called when a syncpoint is encountered. Can be from wav file markers. */ - FMOD_CHANNEL_CALLBACKTYPE_OCCLUSION, /* Called when the channel has its geometry occlusion value calculated. Can be used to clamp or change the value. */ - - FMOD_CHANNEL_CALLBACKTYPE_MAX, /* Maximum number of callback types supported. */ - FMOD_CHANNEL_CALLBACKTYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ -} FMOD_CHANNEL_CALLBACKTYPE; - - -/* -[ENUM] -[ - [DESCRIPTION] - These callback types are used with System::setCallback. - - [REMARKS] - Each callback has commanddata parameters passed as void* unique to the type of callback. - See reference to FMOD_SYSTEM_CALLBACK to determine what they might mean for each type of callback. - - Note! Using FMOD_SYSTEM_CALLBACKTYPE_DEVICELISTCHANGED (on Mac only) requires the application to be running an event loop which will allow external changes to device list to be detected by FMOD. - - Note! The 'system' object pointer will be null for FMOD_SYSTEM_CALLBACKTYPE_THREADCREATED and FMOD_SYSTEM_CALLBACKTYPE_MEMORYALLOCATIONFAILED callbacks. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::setCallback - FMOD_SYSTEM_CALLBACK - System::update - DSP::addInput -] -*/ -typedef enum -{ - FMOD_SYSTEM_CALLBACKTYPE_DEVICELISTCHANGED, /* Called from System::update when the enumerated list of devices has changed. */ - FMOD_SYSTEM_CALLBACKTYPE_DEVICELOST, /* Called from System::update when an output device has been lost due to control panel parameter changes and FMOD cannot automatically recover. */ - FMOD_SYSTEM_CALLBACKTYPE_MEMORYALLOCATIONFAILED, /* Called directly when a memory allocation fails somewhere in FMOD. (NOTE - 'system' will be NULL in this callback type.)*/ - FMOD_SYSTEM_CALLBACKTYPE_THREADCREATED, /* Called directly when a thread is created. (NOTE - 'system' will be NULL in this callback type.) */ - FMOD_SYSTEM_CALLBACKTYPE_BADDSPCONNECTION, /* Called when a bad connection was made with DSP::addInput. Usually called from mixer thread because that is where the connections are made. */ - FMOD_SYSTEM_CALLBACKTYPE_BADDSPLEVEL, /* Called when too many effects were added exceeding the maximum tree depth of 128. This is most likely caused by accidentally adding too many DSP effects. Usually called from mixer thread because that is where the connections are made. */ - - FMOD_SYSTEM_CALLBACKTYPE_MAX, /* Maximum number of callback types supported. */ - FMOD_SYSTEM_CALLBACKTYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ -} FMOD_SYSTEM_CALLBACKTYPE; - - -/* - FMOD Callbacks -*/ -typedef FMOD_RESULT (F_CALLBACK *FMOD_SYSTEM_CALLBACK) (FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACKTYPE type, void *commanddata1, void *commanddata2); - -typedef FMOD_RESULT (F_CALLBACK *FMOD_CHANNEL_CALLBACK) (FMOD_CHANNEL *channel, FMOD_CHANNEL_CALLBACKTYPE type, void *commanddata1, void *commanddata2); - -typedef FMOD_RESULT (F_CALLBACK *FMOD_SOUND_NONBLOCKCALLBACK)(FMOD_SOUND *sound, FMOD_RESULT result); -typedef FMOD_RESULT (F_CALLBACK *FMOD_SOUND_PCMREADCALLBACK)(FMOD_SOUND *sound, void *data, unsigned int datalen); -typedef FMOD_RESULT (F_CALLBACK *FMOD_SOUND_PCMSETPOSCALLBACK)(FMOD_SOUND *sound, int subsound, unsigned int position, FMOD_TIMEUNIT postype); - -typedef FMOD_RESULT (F_CALLBACK *FMOD_FILE_OPENCALLBACK) (const char *name, int unicode, unsigned int *filesize, void **handle, void **userdata); -typedef FMOD_RESULT (F_CALLBACK *FMOD_FILE_CLOSECALLBACK) (void *handle, void *userdata); -typedef FMOD_RESULT (F_CALLBACK *FMOD_FILE_READCALLBACK) (void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread, void *userdata); -typedef FMOD_RESULT (F_CALLBACK *FMOD_FILE_SEEKCALLBACK) (void *handle, unsigned int pos, void *userdata); -typedef FMOD_RESULT (F_CALLBACK *FMOD_FILE_ASYNCREADCALLBACK)(FMOD_ASYNCREADINFO *info, void *userdata); -typedef FMOD_RESULT (F_CALLBACK *FMOD_FILE_ASYNCCANCELCALLBACK)(void *handle, void *userdata); - -typedef void * (F_CALLBACK *FMOD_MEMORY_ALLOCCALLBACK) (unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr); -typedef void * (F_CALLBACK *FMOD_MEMORY_REALLOCCALLBACK)(void *ptr, unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr); -typedef void (F_CALLBACK *FMOD_MEMORY_FREECALLBACK) (void *ptr, FMOD_MEMORY_TYPE type, const char *sourcestr); - -typedef float (F_CALLBACK *FMOD_3D_ROLLOFFCALLBACK) (FMOD_CHANNEL *channel, float distance); - - -/* -[ENUM] -[ - [DESCRIPTION] - List of windowing methods used in spectrum analysis to reduce leakage / transient signals intefering with the analysis. - This is a problem with analysis of continuous signals that only have a small portion of the signal sample (the fft window size). - Windowing the signal with a curve or triangle tapers the sides of the fft window to help alleviate this problem. - - [REMARKS] - Cyclic signals such as a sine wave that repeat their cycle in a multiple of the window size do not need windowing. - I.e. If the sine wave repeats every 1024, 512, 256 etc samples and the FMOD fft window is 1024, then the signal would not need windowing. - Not windowing is the same as FMOD_DSP_FFT_WINDOW_RECT, which is the default. - If the cycle of the signal (ie the sine wave) is not a multiple of the window size, it will cause frequency abnormalities, so a different windowing method is needed. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::getSpectrum - Channel::getSpectrum -] -*/ -typedef enum -{ - FMOD_DSP_FFT_WINDOW_RECT, /* w[n] = 1.0 */ - FMOD_DSP_FFT_WINDOW_TRIANGLE, /* w[n] = TRI(2n/N) */ - FMOD_DSP_FFT_WINDOW_HAMMING, /* w[n] = 0.54 - (0.46 * COS(n/N) ) */ - FMOD_DSP_FFT_WINDOW_HANNING, /* w[n] = 0.5 * (1.0 - COS(n/N) ) */ - FMOD_DSP_FFT_WINDOW_BLACKMAN, /* w[n] = 0.42 - (0.5 * COS(n/N) ) + (0.08 * COS(2.0 * n/N) ) */ - FMOD_DSP_FFT_WINDOW_BLACKMANHARRIS, /* w[n] = 0.35875 - (0.48829 * COS(1.0 * n/N)) + (0.14128 * COS(2.0 * n/N)) - (0.01168 * COS(3.0 * n/N)) */ - - FMOD_DSP_FFT_WINDOW_MAX, /* Maximum number of FFT window types supported. */ - FMOD_DSP_FFT_WINDOW_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ -} FMOD_DSP_FFT_WINDOW; - - -/* -[ENUM] -[ - [DESCRIPTION] - List of interpolation types that the FMOD Ex software mixer supports. - - [REMARKS] - The default resampler type is FMOD_DSP_RESAMPLER_LINEAR. - Use System::setSoftwareFormat to tell FMOD the resampling quality you require for FMOD_SOFTWARE based sounds. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::setSoftwareFormat - System::getSoftwareFormat -] -*/ -typedef enum -{ - FMOD_DSP_RESAMPLER_NOINTERP, /* No interpolation. High frequency aliasing hiss will be audible depending on the sample rate of the sound. */ - FMOD_DSP_RESAMPLER_LINEAR, /* Linear interpolation (default method). Fast and good quality, causes very slight lowpass effect on low frequency sounds. */ - FMOD_DSP_RESAMPLER_CUBIC, /* Cubic interpolation. Slower than linear interpolation but better quality. */ - FMOD_DSP_RESAMPLER_SPLINE, /* 5 point spline interpolation. Slowest resampling method but best quality. */ - - FMOD_DSP_RESAMPLER_MAX, /* Maximum number of resample methods supported. */ - FMOD_DSP_RESAMPLER_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ -} FMOD_DSP_RESAMPLER; - - -/* -[ENUM] -[ - [DESCRIPTION] - List of tag types that could be stored within a sound. These include id3 tags, metadata from netstreams and vorbis/asf data. - - [REMARKS] - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - Sound::getTag -] -*/ -typedef enum -{ - FMOD_TAGTYPE_UNKNOWN = 0, - FMOD_TAGTYPE_ID3V1, - FMOD_TAGTYPE_ID3V2, - FMOD_TAGTYPE_VORBISCOMMENT, - FMOD_TAGTYPE_SHOUTCAST, - FMOD_TAGTYPE_ICECAST, - FMOD_TAGTYPE_ASF, - FMOD_TAGTYPE_MIDI, - FMOD_TAGTYPE_PLAYLIST, - FMOD_TAGTYPE_FMOD, - FMOD_TAGTYPE_USER, - - FMOD_TAGTYPE_MAX, /* Maximum number of tag types supported. */ - FMOD_TAGTYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ -} FMOD_TAGTYPE; - - -/* -[ENUM] -[ - [DESCRIPTION] - List of data types that can be returned by Sound::getTag - - [REMARKS] - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - Sound::getTag -] -*/ -typedef enum -{ - FMOD_TAGDATATYPE_BINARY = 0, - FMOD_TAGDATATYPE_INT, - FMOD_TAGDATATYPE_FLOAT, - FMOD_TAGDATATYPE_STRING, - FMOD_TAGDATATYPE_STRING_UTF16, - FMOD_TAGDATATYPE_STRING_UTF16BE, - FMOD_TAGDATATYPE_STRING_UTF8, - FMOD_TAGDATATYPE_CDTOC, - - FMOD_TAGDATATYPE_MAX, /* Maximum number of tag datatypes supported. */ - FMOD_TAGDATATYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ -} FMOD_TAGDATATYPE; - - -/* -[ENUM] -[ - [DESCRIPTION] - Types of delay that can be used with Channel::setDelay / Channel::getDelay. - - [REMARKS] - If you haven't called Channel::setDelay yet, if you call Channel::getDelay with FMOD_DELAYTYPE_DSPCLOCK_START it will return the - equivalent global DSP clock value to determine when a channel started, so that you can use it for other channels to sync against. - - Use System::getDSPClock to also get the current dspclock time, a base for future calls to Channel::setDelay. - - Use FMOD_64BIT_ADD or FMOD_64BIT_SUB to add a hi/lo combination together and cope with wraparound. - - If FMOD_DELAYTYPE_END_MS is specified, the value is not treated as a 64 bit number, just the delayhi value is used and it is treated as milliseconds. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - Channel::setDelay - Channel::getDelay - System::getDSPClock -] -*/ -typedef enum -{ - FMOD_DELAYTYPE_END_MS, /* Delay at the end of the sound in milliseconds. Use delayhi only. Channel::isPlaying will remain true until this delay has passed even though the sound itself has stopped playing.*/ - FMOD_DELAYTYPE_DSPCLOCK_START, /* Time the sound started if Channel::getDelay is used, or if Channel::setDelay is used, the sound will delay playing until this exact tick. */ - FMOD_DELAYTYPE_DSPCLOCK_END, /* Time the sound should end. If this is non-zero, the channel will go silent at this exact tick. */ - FMOD_DELAYTYPE_DSPCLOCK_PAUSE, /* Time the sound should pause. If this is non-zero, the channel will pause at this exact tick. */ - - FMOD_DELAYTYPE_MAX, /* Maximum number of tag datatypes supported. */ - FMOD_DELAYTYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ -} FMOD_DELAYTYPE; - - -#define FMOD_64BIT_ADD(_hi1, _lo1, _hi2, _lo2) _hi1 += ((_hi2) + ((((_lo1) + (_lo2)) < (_lo1)) ? 1 : 0)); (_lo1) += (_lo2); -#define FMOD_64BIT_SUB(_hi1, _lo1, _hi2, _lo2) _hi1 -= ((_hi2) + ((((_lo1) - (_lo2)) > (_lo1)) ? 1 : 0)); (_lo1) -= (_lo2); - - -/* -[STRUCTURE] -[ - [DESCRIPTION] - Structure describing a piece of tag data. - - [REMARKS] - Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value. - Members marked with [w] mean the variable can be written to. The user can set the value. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - Sound::getTag - FMOD_TAGTYPE - FMOD_TAGDATATYPE -] -*/ -typedef struct FMOD_TAG -{ - FMOD_TAGTYPE type; /* [r] The type of this tag. */ - FMOD_TAGDATATYPE datatype; /* [r] The type of data that this tag contains */ - char *name; /* [r] The name of this tag i.e. "TITLE", "ARTIST" etc. */ - void *data; /* [r] Pointer to the tag data - its format is determined by the datatype member */ - unsigned int datalen; /* [r] Length of the data contained in this tag */ - FMOD_BOOL updated; /* [r] True if this tag has been updated since last being accessed with Sound::getTag */ -} FMOD_TAG; - - -/* -[STRUCTURE] -[ - [DESCRIPTION] - Structure describing a CD/DVD table of contents - - [REMARKS] - Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value. - Members marked with [w] mean the variable can be written to. The user can set the value. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - Sound::getTag -] -*/ -typedef struct FMOD_CDTOC -{ - int numtracks; /* [r] The number of tracks on the CD */ - int min[100]; /* [r] The start offset of each track in minutes */ - int sec[100]; /* [r] The start offset of each track in seconds */ - int frame[100]; /* [r] The start offset of each track in frames */ -} FMOD_CDTOC; - - -/* -[DEFINE] -[ - [NAME] - FMOD_TIMEUNIT - - [DESCRIPTION] - List of time types that can be returned by Sound::getLength and used with Channel::setPosition or Channel::getPosition. - - [REMARKS] - FMOD_TIMEUNIT_SENTENCE_MS, FMOD_TIMEUNIT_SENTENCE_PCM, FMOD_TIMEUNIT_SENTENCE_PCMBYTES, FMOD_TIMEUNIT_SENTENCE and FMOD_TIMEUNIT_SENTENCE_SUBSOUND are only supported by Channel functions. - Do not combine flags except FMOD_TIMEUNIT_BUFFERED. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - Sound::getLength - Channel::setPosition - Channel::getPosition -] -*/ -#define FMOD_TIMEUNIT_MS 0x00000001 /* Milliseconds. */ -#define FMOD_TIMEUNIT_PCM 0x00000002 /* PCM samples, related to milliseconds * samplerate / 1000. */ -#define FMOD_TIMEUNIT_PCMBYTES 0x00000004 /* Bytes, related to PCM samples * channels * datawidth (ie 16bit = 2 bytes). */ -#define FMOD_TIMEUNIT_RAWBYTES 0x00000008 /* Raw file bytes of (compressed) sound data (does not include headers). Only used by Sound::getLength and Channel::getPosition. */ -#define FMOD_TIMEUNIT_PCMFRACTION 0x00000010 /* Fractions of 1 PCM sample. Unsigned int range 0 to 0xFFFFFFFF. Used for sub-sample granularity for DSP purposes. */ -#define FMOD_TIMEUNIT_MODORDER 0x00000100 /* MOD/S3M/XM/IT. Order in a sequenced module format. Use Sound::getFormat to determine the PCM format being decoded to. */ -#define FMOD_TIMEUNIT_MODROW 0x00000200 /* MOD/S3M/XM/IT. Current row in a sequenced module format. Sound::getLength will return the number of rows in the currently playing or seeked to pattern. */ -#define FMOD_TIMEUNIT_MODPATTERN 0x00000400 /* MOD/S3M/XM/IT. Current pattern in a sequenced module format. Sound::getLength will return the number of patterns in the song and Channel::getPosition will return the currently playing pattern. */ -#define FMOD_TIMEUNIT_SENTENCE_MS 0x00010000 /* Currently playing subsound in a sentence time in milliseconds. */ -#define FMOD_TIMEUNIT_SENTENCE_PCM 0x00020000 /* Currently playing subsound in a sentence time in PCM Samples, related to milliseconds * samplerate / 1000. */ -#define FMOD_TIMEUNIT_SENTENCE_PCMBYTES 0x00040000 /* Currently playing subsound in a sentence time in bytes, related to PCM samples * channels * datawidth (ie 16bit = 2 bytes). */ -#define FMOD_TIMEUNIT_SENTENCE 0x00080000 /* Currently playing sentence index according to the channel. */ -#define FMOD_TIMEUNIT_SENTENCE_SUBSOUND 0x00100000 /* Currently playing subsound index in a sentence. */ -#define FMOD_TIMEUNIT_BUFFERED 0x10000000 /* Time value as seen by buffered stream. This is always ahead of audible time, and is only used for processing. */ -/* [DEFINE_END] */ - - -/* -[ENUM] -[ - [DESCRIPTION] - When creating a multichannel sound, FMOD will pan them to their default speaker locations, for example a 6 channel sound will default to one channel per 5.1 output speaker. - Another example is a stereo sound. It will default to left = front left, right = front right. - - This is for sounds that are not 'default'. For example you might have a sound that is 6 channels but actually made up of 3 stereo pairs, that should all be located in front left, front right only. - - [REMARKS] - For full flexibility of speaker assignments, use Channel::setSpeakerLevels. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - FMOD_CREATESOUNDEXINFO - Channel::setSpeakerLevels -] -*/ -typedef enum -{ - FMOD_SPEAKERMAPTYPE_DEFAULT, /* This is the default, and just means FMOD decides which speakers it puts the source channels. */ - FMOD_SPEAKERMAPTYPE_ALLMONO, /* This means the sound is made up of all mono sounds. All voices will be panned to the front center by default in this case. */ - FMOD_SPEAKERMAPTYPE_ALLSTEREO, /* This means the sound is made up of all stereo sounds. All voices will be panned to front left and front right alternating every second channel. */ - FMOD_SPEAKERMAPTYPE_51_PROTOOLS /* Map a 5.1 sound to use protools L C R Ls Rs LFE mapping. Will return an error if not a 6 channel sound. */ -} FMOD_SPEAKERMAPTYPE; - - -/* -[STRUCTURE] -[ - [DESCRIPTION] - Use this structure with System::createSound when more control is needed over loading. - The possible reasons to use this with System::createSound are: - - Loading a file from memory. - - Loading a file from within another larger (possibly wad/pak) file, by giving the loader an offset and length. - - To create a user created / non file based sound. - - To specify a starting subsound to seek to within a multi-sample sounds (ie FSB/DLS/SF2) when created as a stream. - - To specify which subsounds to load for multi-sample sounds (ie FSB/DLS/SF2) so that memory is saved and only a subset is actually loaded/read from disk. - - To specify 'piggyback' read and seek callbacks for capture of sound data as fmod reads and decodes it. Useful for ripping decoded PCM data from sounds as they are loaded / played. - - To specify a MIDI DLS/SF2 sample set file to load when opening a MIDI file. - See below on what members to fill for each of the above types of sound you want to create. - - [REMARKS] - This structure is optional! Specify 0 or NULL in System::createSound if you don't need it! - - Loading a file from memory. - - Create the sound using the FMOD_OPENMEMORY flag. - - Mandatory. Specify 'length' for the size of the memory block in bytes. - - Other flags are optional. - - - Loading a file from within another larger (possibly wad/pak) file, by giving the loader an offset and length. - - Mandatory. Specify 'fileoffset' and 'length'. - - Other flags are optional. - - - To create a user created / non file based sound. - - Create the sound using the FMOD_OPENUSER flag. - - Mandatory. Specify 'defaultfrequency, 'numchannels' and 'format'. - - Other flags are optional. - - - To specify a starting subsound to seek to and flush with, within a multi-sample stream (ie FSB/DLS/SF2). - - - Mandatory. Specify 'initialsubsound'. - - - To specify which subsounds to load for multi-sample sounds (ie FSB/DLS/SF2) so that memory is saved and only a subset is actually loaded/read from disk. - - - Mandatory. Specify 'inclusionlist' and 'inclusionlistnum'. - - - To specify 'piggyback' read and seek callbacks for capture of sound data as fmod reads and decodes it. Useful for ripping decoded PCM data from sounds as they are loaded / played. - - - Mandatory. Specify 'pcmreadcallback' and 'pcmseekcallback'. - - - To specify a MIDI DLS/SF2 sample set file to load when opening a MIDI file. - - - Mandatory. Specify 'dlsname'. - - - Setting the 'decodebuffersize' is for cpu intensive codecs that may be causing stuttering, not file intensive codecs (ie those from CD or netstreams) which are normally - altered with System::setStreamBufferSize. As an example of cpu intensive codecs, an mp3 file will take more cpu to decode than a PCM wav file. - If you have a stuttering effect, then it is using more cpu than the decode buffer playback rate can keep up with. Increasing the decode buffersize will most likely solve this problem. - - - FSB codec. If inclusionlist and numsubsounds are used together, this will trigger a special mode where subsounds are shuffled down to save memory. (useful for large FSB - files where you only want to load 1 sound). There will be no gaps, ie no null subsounds. As an example, if there are 10,000 subsounds and there is an inclusionlist with only 1 entry, - and numsubsounds = 1, then subsound 0 will be that entry, and there will only be the memory allocated for 1 subsound. Previously there would still be 10,000 subsound pointers and other - associated codec entries allocated along with it multiplied by 10,000. - - Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value. - Members marked with [w] mean the variable can be written to. The user can set the value. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::createSound - System::setStreamBufferSize - FMOD_MODE - FMOD_SOUND_FORMAT - FMOD_SOUND_TYPE - FMOD_SPEAKERMAPTYPE -] -*/ -typedef struct FMOD_CREATESOUNDEXINFO -{ - int cbsize; /* [w] Size of this structure. This is used so the structure can be expanded in the future and still work on older versions of FMOD Ex. */ - unsigned int length; /* [w] Optional. Specify 0 to ignore. Size in bytes of file to load, or sound to create (in this case only if FMOD_OPENUSER is used). Required if loading from memory. If 0 is specified, then it will use the size of the file (unless loading from memory then an error will be returned). */ - unsigned int fileoffset; /* [w] Optional. Specify 0 to ignore. Offset from start of the file to start loading from. This is useful for loading files from inside big data files. */ - int numchannels; /* [w] Optional. Specify 0 to ignore. Number of channels in a sound mandatory if FMOD_OPENUSER or FMOD_OPENRAW is used. */ - int defaultfrequency; /* [w] Optional. Specify 0 to ignore. Default frequency of sound in a sound mandatory if FMOD_OPENUSER or FMOD_OPENRAW is used. Other formats use the frequency determined by the file format. */ - FMOD_SOUND_FORMAT format; /* [w] Optional. Specify 0 or FMOD_SOUND_FORMAT_NONE to ignore. Format of the sound mandatory if FMOD_OPENUSER or FMOD_OPENRAW is used. Other formats use the format determined by the file format. */ - unsigned int decodebuffersize; /* [w] Optional. Specify 0 to ignore. For streams. This determines the size of the double buffer (in PCM samples) that a stream uses. Use this for user created streams if you want to determine the size of the callback buffer passed to you. Specify 0 to use FMOD's default size which is currently equivalent to 400ms of the sound format created/loaded. */ - int initialsubsound; /* [w] Optional. Specify 0 to ignore. In a multi-sample file format such as .FSB/.DLS/.SF2, specify the initial subsound to seek to, only if FMOD_CREATESTREAM is used. */ - int numsubsounds; /* [w] Optional. Specify 0 to ignore or have no subsounds. In a sound created with FMOD_OPENUSER, specify the number of subsounds that are accessable with Sound::getSubSound. If not created with FMOD_OPENUSER, this will limit the number of subsounds loaded within a multi-subsound file. If using FSB, then if FMOD_CREATESOUNDEXINFO::inclusionlist is used, this will shuffle subsounds down so that there are not any gaps. It will mean that the indices of the sounds will be different. */ - int *inclusionlist; /* [w] Optional. Specify 0 to ignore. In a multi-sample format such as .FSB/.DLS/.SF2 it may be desirable to specify only a subset of sounds to be loaded out of the whole file. This is an array of subsound indices to load into memory when created. */ - int inclusionlistnum; /* [w] Optional. Specify 0 to ignore. This is the number of integers contained within the inclusionlist array. */ - FMOD_SOUND_PCMREADCALLBACK pcmreadcallback; /* [w] Optional. Specify 0 to ignore. Callback to 'piggyback' on FMOD's read functions and accept or even write PCM data while FMOD is opening the sound. Used for user sounds created with FMOD_OPENUSER or for capturing decoded data as FMOD reads it. */ - FMOD_SOUND_PCMSETPOSCALLBACK pcmsetposcallback; /* [w] Optional. Specify 0 to ignore. Callback for when the user calls a seeking function such as Channel::setTime or Channel::setPosition within a multi-sample sound, and for when it is opened.*/ - FMOD_SOUND_NONBLOCKCALLBACK nonblockcallback; /* [w] Optional. Specify 0 to ignore. Callback for successful completion, or error while loading a sound that used the FMOD_NONBLOCKING flag.*/ - const char *dlsname; /* [w] Optional. Specify 0 to ignore. Filename for a DLS or SF2 sample set when loading a MIDI file. If not specified, on Windows it will attempt to open /windows/system32/drivers/gm.dls or /windows/system32/drivers/etc/gm.dls, on Mac it will attempt to load /System/Library/Components/CoreAudio.component/Contents/Resources/gs_instruments.dls, otherwise the MIDI will fail to open. Current DLS support is for level 1 of the specification. */ - const char *encryptionkey; /* [w] Optional. Specify 0 to ignore. Key for encrypted FSB file. Without this key an encrypted FSB file will not load. */ - int maxpolyphony; /* [w] Optional. Specify 0 to ignore. For sequenced formats with dynamic channel allocation such as .MID and .IT, this specifies the maximum voice count allowed while playing. .IT defaults to 64. .MID defaults to 32. */ - void *userdata; /* [w] Optional. Specify 0 to ignore. This is user data to be attached to the sound during creation. Access via Sound::getUserData. Note: This is not passed to FMOD_FILE_OPENCALLBACK, that is a different userdata that is file specific. */ - FMOD_SOUND_TYPE suggestedsoundtype; /* [w] Optional. Specify 0 or FMOD_SOUND_TYPE_UNKNOWN to ignore. Instead of scanning all codec types, use this to speed up loading by making it jump straight to this codec. */ - FMOD_FILE_OPENCALLBACK useropen; /* [w] Optional. Specify 0 to ignore. Callback for opening this file. */ - FMOD_FILE_CLOSECALLBACK userclose; /* [w] Optional. Specify 0 to ignore. Callback for closing this file. */ - FMOD_FILE_READCALLBACK userread; /* [w] Optional. Specify 0 to ignore. Callback for reading from this file. */ - FMOD_FILE_SEEKCALLBACK userseek; /* [w] Optional. Specify 0 to ignore. Callback for seeking within this file. */ - FMOD_FILE_ASYNCREADCALLBACK userasyncread; /* [w] Optional. Specify 0 to ignore. Callback for seeking within this file. */ - FMOD_FILE_ASYNCCANCELCALLBACK userasynccancel; /* [w] Optional. Specify 0 to ignore. Callback for seeking within this file. */ - FMOD_SPEAKERMAPTYPE speakermap; /* [w] Optional. Specify 0 to ignore. Use this to differ the way fmod maps multichannel sounds to speakers. See FMOD_SPEAKERMAPTYPE for more. */ - FMOD_SOUNDGROUP *initialsoundgroup; /* [w] Optional. Specify 0 to ignore. Specify a sound group if required, to put sound in as it is created. */ - unsigned int initialseekposition;/* [w] Optional. Specify 0 to ignore. For streams. Specify an initial position to seek the stream to. */ - FMOD_TIMEUNIT initialseekpostype; /* [w] Optional. Specify 0 to ignore. For streams. Specify the time unit for the position set in initialseekposition. */ - int ignoresetfilesystem;/* [w] Optional. Specify 0 to ignore. Set to 1 to use fmod's built in file system. Ignores setFileSystem callbacks and also FMOD_CREATESOUNEXINFO file callbacks. Useful for specific cases where you don't want to use your own file system but want to use fmod's file system (ie net streaming). */ - int cddaforceaspi; /* [w] Optional. Specify 0 to ignore. For CDDA sounds only - if non-zero use ASPI instead of NTSCSI to access the specified CD/DVD device. */ - unsigned int audioqueuepolicy; /* [w] Optional. Specify 0 or FMOD_AUDIOQUEUE_CODECPOLICY_DEFAULT to ignore. Policy used to determine whether hardware or software is used for decoding, see FMOD_AUDIOQUEUE_CODECPOLICY for options (iOS >= 3.0 required, otherwise only hardware is available) */ - unsigned int minmidigranularity; /* [w] Optional. Specify 0 to ignore. Allows you to set a minimum desired MIDI mixer granularity. Values smaller than 512 give greater than default accuracy at the cost of more CPU and vice versa. Specify 0 for default (512 samples). */ - int nonblockthreadid; /* [w] Optional. Specify 0 to ignore. Specifies a thread index to execute non blocking load on. Allows for up to 5 threads to be used for loading at once. This is to avoid one load blocking another. Maximum value = 4. */ -} FMOD_CREATESOUNDEXINFO; - - -/* -[STRUCTURE] -[ - [DESCRIPTION] - Structure defining a reverb environment. - - [REMARKS] - Note the default reverb properties are the same as the FMOD_PRESET_GENERIC preset. - Note that integer values that typically range from -10,000 to 1000 are represented in - decibels, and are of a logarithmic scale, not linear, wheras float values are always linear. - - The numerical values listed below are the maximum, minimum and default values for each variable respectively. - - SUPPORTED next to each parameter means the platform the parameter can be set on. Some platforms support all parameters and some don't. - WII means Nintendo Wii hardware reverb (must use FMOD_HARDWARE). - PSP means Playstation Portable hardware reverb (must use FMOD_HARDWARE). - SFX means FMOD SFX software reverb. This works on any platform that uses FMOD_SOFTWARE for loading sounds. - --- means unsupported/deprecated. Will either be removed or supported by SFX in the future. - - Nintendo Wii Notes: - This structure supports only limited parameters, and maps them to the Wii hardware reverb as follows. - DecayTime = 'time' - ReverbDelay = 'predelay' - ModulationDepth = 'damping' - Reflections = 'coloration' - EnvDiffusion = 'crosstalk' - Room = 'mix' - - Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value. - Members marked with [w] mean the variable can be written to. The user can set the value. - Members marked with [r/w] are either read or write depending on if you are using System::setReverbProperties (w) or System::getReverbProperties (r). - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::setReverbProperties - System::getReverbProperties - FMOD_REVERB_PRESETS - FMOD_REVERB_FLAGS -] -*/ -typedef struct FMOD_REVERB_PROPERTIES -{ /* MIN MAX DEFAULT DESCRIPTION */ - int Instance; /* [w] 0 3 0 Environment Instance. (SUPPORTED:SFX(4 instances) and Wii (3 instances)) */ - int Environment; /* [r/w] -1 25 -1 Sets all listener properties. -1 = OFF. (SUPPORTED:SFX(-1 only)/PSP) */ - float EnvDiffusion; /* [r/w] 0.0 1.0 1.0 Environment diffusion (SUPPORTED:WII) */ - int Room; /* [r/w] -10000 0 -1000 Room effect level (at mid frequencies) (SUPPORTED:SFX/WII/PSP) */ - int RoomHF; /* [r/w] -10000 0 -100 Relative room effect level at high frequencies (SUPPORTED:SFX) */ - int RoomLF; /* [r/w] -10000 0 0 Relative room effect level at low frequencies (SUPPORTED:SFX) */ - float DecayTime; /* [r/w] 0.1 20.0 1.49 Reverberation decay time at mid frequencies (SUPPORTED:SFX/WII) */ - float DecayHFRatio; /* [r/w] 0.1 2.0 0.83 High-frequency to mid-frequency decay time ratio (SUPPORTED:SFX) */ - float DecayLFRatio; /* [r/w] 0.1 2.0 1.0 Low-frequency to mid-frequency decay time ratio (SUPPORTED:---) */ - int Reflections; /* [r/w] -10000 1000 -2602 Early reflections level relative to room effect (SUPPORTED:SFX/WII) */ - float ReflectionsDelay; /* [r/w] 0.0 0.3 0.007 Initial reflection delay time (SUPPORTED:SFX) */ - int Reverb; /* [r/w] -10000 2000 200 Late reverberation level relative to room effect (SUPPORTED:SFX) */ - float ReverbDelay; /* [r/w] 0.0 0.1 0.011 Late reverberation delay time relative to initial reflection (SUPPORTED:SFX/WII) */ - float ModulationTime; /* [r/w] 0.04 4.0 0.25 Modulation time (SUPPORTED:---) */ - float ModulationDepth; /* [r/w] 0.0 1.0 0.0 Modulation depth (SUPPORTED:WII) */ - float HFReference; /* [r/w] 20.0 20000.0 5000.0 Reference high frequency (hz) (SUPPORTED:SFX) */ - float LFReference; /* [r/w] 20.0 1000.0 250.0 Reference low frequency (hz) (SUPPORTED:SFX) */ - float Diffusion; /* [r/w] 0.0 100.0 100.0 Value that controls the echo density in the late reverberation decay. (SUPPORTED:SFX) */ - float Density; /* [r/w] 0.0 100.0 100.0 Value that controls the modal density in the late reverberation decay (SUPPORTED:SFX) */ - unsigned int Flags; /* [r/w] FMOD_REVERB_FLAGS - modifies the behavior of above properties (SUPPORTED:WII) */ -} FMOD_REVERB_PROPERTIES; - - -/* -[DEFINE] -[ - [NAME] - FMOD_REVERB_FLAGS - - [DESCRIPTION] - Values for the Flags member of the FMOD_REVERB_PROPERTIES structure. - - [REMARKS] - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - FMOD_REVERB_PROPERTIES -] -*/ -#define FMOD_REVERB_FLAGS_HIGHQUALITYREVERB 0x00000400 /* Wii. Use high quality reverb */ -#define FMOD_REVERB_FLAGS_HIGHQUALITYDPL2REVERB 0x00000800 /* Wii. Use high quality DPL2 reverb */ -#define FMOD_REVERB_FLAGS_HARDWAREONLY 0x00001000 /* Don't create an SFX reverb for FMOD_SOFTWARE channels, hardware reverb only */ -#define FMOD_REVERB_FLAGS_DEFAULT 0x00000000 -/* [DEFINE_END] */ - - -/* -[DEFINE] -[ - [NAME] - FMOD_REVERB_PRESETS - - [DESCRIPTION] - A set of predefined environment PARAMETERS. - These are used to initialize an FMOD_REVERB_PROPERTIES structure statically. - i.e. - FMOD_REVERB_PROPERTIES prop = FMOD_PRESET_GENERIC; - - [REMARKS] - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::setReverbProperties -] -*/ -/* Inst Env Diffus Room RoomHF RmLF DecTm DecHF DecLF Refl RefDel Revb RevDel ModTm ModDp HFRef LFRef Diffus Densty FLAGS */ -#define FMOD_PRESET_OFF { 0, -1, 1.00f, -10000, -10000, 0, 1.00f, 1.00f, 1.0f, -2602, 0.007f, 200, 0.011f, 0.25f, 0.000f, 5000.0f, 250.0f, 0.0f, 0.0f, 0x33f } -#define FMOD_PRESET_GENERIC { 0, 0, 1.00f, -1000, -100, 0, 1.49f, 0.83f, 1.0f, -2602, 0.007f, 200, 0.011f, 0.25f, 0.000f, 5000.0f, 250.0f, 100.0f, 100.0f, 0x3f } -#define FMOD_PRESET_PADDEDCELL { 0, 1, 1.00f, -1000, -6000, 0, 0.17f, 0.10f, 1.0f, -1204, 0.001f, 207, 0.002f, 0.25f, 0.000f, 5000.0f, 250.0f, 100.0f, 100.0f, 0x3f } -#define FMOD_PRESET_ROOM { 0, 2, 1.00f, -1000, -454, 0, 0.40f, 0.83f, 1.0f, -1646, 0.002f, 53, 0.003f, 0.25f, 0.000f, 5000.0f, 250.0f, 100.0f, 100.0f, 0x3f } -#define FMOD_PRESET_BATHROOM { 0, 3, 1.00f, -1000, -1200, 0, 1.49f, 0.54f, 1.0f, -370, 0.007f, 1030, 0.011f, 0.25f, 0.000f, 5000.0f, 250.0f, 100.0f, 60.0f, 0x3f } -#define FMOD_PRESET_LIVINGROOM { 0, 4, 1.00f, -1000, -6000, 0, 0.50f, 0.10f, 1.0f, -1376, 0.003f, -1104, 0.004f, 0.25f, 0.000f, 5000.0f, 250.0f, 100.0f, 100.0f, 0x3f } -#define FMOD_PRESET_STONEROOM { 0, 5, 1.00f, -1000, -300, 0, 2.31f, 0.64f, 1.0f, -711, 0.012f, 83, 0.017f, 0.25f, 0.000f, 5000.0f, 250.0f, 100.0f, 100.0f, 0x3f } -#define FMOD_PRESET_AUDITORIUM { 0, 6, 1.00f, -1000, -476, 0, 4.32f, 0.59f, 1.0f, -789, 0.020f, -289, 0.030f, 0.25f, 0.000f, 5000.0f, 250.0f, 100.0f, 100.0f, 0x3f } -#define FMOD_PRESET_CONCERTHALL { 0, 7, 1.00f, -1000, -500, 0, 3.92f, 0.70f, 1.0f, -1230, 0.020f, -2, 0.029f, 0.25f, 0.000f, 5000.0f, 250.0f, 100.0f, 100.0f, 0x3f } -#define FMOD_PRESET_CAVE { 0, 8, 1.00f, -1000, 0, 0, 2.91f, 1.30f, 1.0f, -602, 0.015f, -302, 0.022f, 0.25f, 0.000f, 5000.0f, 250.0f, 100.0f, 100.0f, 0x1f } -#define FMOD_PRESET_ARENA { 0, 9, 1.00f, -1000, -698, 0, 7.24f, 0.33f, 1.0f, -1166, 0.020f, 16, 0.030f, 0.25f, 0.000f, 5000.0f, 250.0f, 100.0f, 100.0f, 0x3f } -#define FMOD_PRESET_HANGAR { 0, 10, 1.00f, -1000, -1000, 0, 10.05f, 0.23f, 1.0f, -602, 0.020f, 198, 0.030f, 0.25f, 0.000f, 5000.0f, 250.0f, 100.0f, 100.0f, 0x3f } -#define FMOD_PRESET_CARPETTEDHALLWAY { 0, 11, 1.00f, -1000, -4000, 0, 0.30f, 0.10f, 1.0f, -1831, 0.002f, -1630, 0.030f, 0.25f, 0.000f, 5000.0f, 250.0f, 100.0f, 100.0f, 0x3f } -#define FMOD_PRESET_HALLWAY { 0, 12, 1.00f, -1000, -300, 0, 1.49f, 0.59f, 1.0f, -1219, 0.007f, 441, 0.011f, 0.25f, 0.000f, 5000.0f, 250.0f, 100.0f, 100.0f, 0x3f } -#define FMOD_PRESET_STONECORRIDOR { 0, 13, 1.00f, -1000, -237, 0, 2.70f, 0.79f, 1.0f, -1214, 0.013f, 395, 0.020f, 0.25f, 0.000f, 5000.0f, 250.0f, 100.0f, 100.0f, 0x3f } -#define FMOD_PRESET_ALLEY { 0, 14, 0.30f, -1000, -270, 0, 1.49f, 0.86f, 1.0f, -1204, 0.007f, -4, 0.011f, 0.25f, 0.000f, 5000.0f, 250.0f, 100.0f, 100.0f, 0x3f } -#define FMOD_PRESET_FOREST { 0, 15, 0.30f, -1000, -3300, 0, 1.49f, 0.54f, 1.0f, -2560, 0.162f, -229, 0.088f, 0.25f, 0.000f, 5000.0f, 250.0f, 79.0f, 100.0f, 0x3f } -#define FMOD_PRESET_CITY { 0, 16, 0.50f, -1000, -800, 0, 1.49f, 0.67f, 1.0f, -2273, 0.007f, -1691, 0.011f, 0.25f, 0.000f, 5000.0f, 250.0f, 50.0f, 100.0f, 0x3f } -#define FMOD_PRESET_MOUNTAINS { 0, 17, 0.27f, -1000, -2500, 0, 1.49f, 0.21f, 1.0f, -2780, 0.300f, -1434, 0.100f, 0.25f, 0.000f, 5000.0f, 250.0f, 27.0f, 100.0f, 0x1f } -#define FMOD_PRESET_QUARRY { 0, 18, 1.00f, -1000, -1000, 0, 1.49f, 0.83f, 1.0f, -10000, 0.061f, 500, 0.025f, 0.25f, 0.000f, 5000.0f, 250.0f, 100.0f, 100.0f, 0x3f } -#define FMOD_PRESET_PLAIN { 0, 19, 0.21f, -1000, -2000, 0, 1.49f, 0.50f, 1.0f, -2466, 0.179f, -1926, 0.100f, 0.25f, 0.000f, 5000.0f, 250.0f, 21.0f, 100.0f, 0x3f } -#define FMOD_PRESET_PARKINGLOT { 0, 20, 1.00f, -1000, 0, 0, 1.65f, 1.50f, 1.0f, -1363, 0.008f, -1153, 0.012f, 0.25f, 0.000f, 5000.0f, 250.0f, 100.0f, 100.0f, 0x1f } -#define FMOD_PRESET_SEWERPIPE { 0, 21, 0.80f, -1000, -1000, 0, 2.81f, 0.14f, 1.0f, 429, 0.014f, 1023, 0.021f, 0.25f, 0.000f, 5000.0f, 250.0f, 80.0f, 60.0f, 0x3f } -#define FMOD_PRESET_UNDERWATER { 0, 22, 1.00f, -1000, -4000, 0, 1.49f, 0.10f, 1.0f, -449, 0.007f, 1700, 0.011f, 1.18f, 0.348f, 5000.0f, 250.0f, 100.0f, 100.0f, 0x3f } - -/* PlayStation Portable Only presets */ -#define FMOD_PRESET_PSP_ROOM { 0, 1, 0, 0, 0, 0, 0.0f, 0.0f, 0.0f, 0, 0.000f, 0, 0.000f, 0.00f, 0.000f, 0000.0f, 0.0f, 0.0f, 0.0f, 0x31f } -#define FMOD_PRESET_PSP_STUDIO_A { 0, 2, 0, 0, 0, 0, 0.0f, 0.0f, 0.0f, 0, 0.000f, 0, 0.000f, 0.00f, 0.000f, 0000.0f, 0.0f, 0.0f, 0.0f, 0x31f } -#define FMOD_PRESET_PSP_STUDIO_B { 0, 3, 0, 0, 0, 0, 0.0f, 0.0f, 0.0f, 0, 0.000f, 0, 0.000f, 0.00f, 0.000f, 0000.0f, 0.0f, 0.0f, 0.0f, 0x31f } -#define FMOD_PRESET_PSP_STUDIO_C { 0, 4, 0, 0, 0, 0, 0.0f, 0.0f, 0.0f, 0, 0.000f, 0, 0.000f, 0.00f, 0.000f, 0000.0f, 0.0f, 0.0f, 0.0f, 0x31f } -#define FMOD_PRESET_PSP_HALL { 0, 5, 0, 0, 0, 0, 0.0f, 0.0f, 0.0f, 0, 0.000f, 0, 0.000f, 0.00f, 0.000f, 0000.0f, 0.0f, 0.0f, 0.0f, 0x31f } -#define FMOD_PRESET_PSP_SPACE { 0, 6, 0, 0, 0, 0, 0.0f, 0.0f, 0.0f, 0, 0.000f, 0, 0.000f, 0.00f, 0.000f, 0000.0f, 0.0f, 0.0f, 0.0f, 0x31f } -#define FMOD_PRESET_PSP_ECHO { 0, 7, 0, 0, 0, 0, 0.0f, 0.0f, 0.0f, 0, 0.000f, 0, 0.000f, 0.00f, 0.000f, 0000.0f, 0.0f, 0.0f, 0.0f, 0x31f } -#define FMOD_PRESET_PSP_DELAY { 0, 8, 0, 0, 0, 0, 0.0f, 0.0f, 0.0f, 0, 0.000f, 0, 0.000f, 0.00f, 0.000f, 0000.0f, 0.0f, 0.0f, 0.0f, 0x31f } -#define FMOD_PRESET_PSP_PIPE { 0, 9, 0, 0, 0, 0, 0.0f, 0.0f, 0.0f, 0, 0.000f, 0, 0.000f, 0.00f, 0.000f, 0000.0f, 0.0f, 0.0f, 0.0f, 0x31f } -/* [DEFINE_END] */ - - -/* -[STRUCTURE] -[ - [DESCRIPTION] - Structure defining the properties for a reverb source, related to a FMOD channel. - - Note the default reverb properties are the same as the FMOD_PRESET_GENERIC preset. - Note that integer values that typically range from -10,000 to 1000 are represented in - decibels, and are of a logarithmic scale, not linear, wheras float values are typically linear. - PORTABILITY: Each member has the platform it supports in braces ie (win32/wii). - - The numerical values listed below are the maximum, minimum and default values for each variable respectively. - - [REMARKS] - SUPPORTED next to each parameter means the platform the parameter can be set on. Some platforms support all parameters and some don't. - WII means Nintendo Wii hardware reverb (must use FMOD_HARDWARE). - PSP means Playstation Portable hardware reverb (must use FMOD_HARDWARE). - SFX means FMOD SFX software reverb. This works on any platform that uses FMOD_SOFTWARE for loading sounds. - --- means unsupported/deprecated. Will either be removed or supported by SFX in the future. - - - 'ConnectionPoint' Parameter. This parameter is for the FMOD software reverb only (known as SFX in the list above). - By default the dsp network connection for a channel and its reverb is between the 'SFX Reverb' unit, and the channel's wavetable/resampler/dspcodec/oscillator unit (the unit below the channel DSP head). NULL can be used for this parameter to make it use this default behaviour. - This parameter allows the user to connect the SFX reverb to somewhere else internally, for example the channel DSP head, or a related channelgroup. The event system uses this so that it can have the output of an event going to the reverb, instead of just the output of the event's channels (thereby ignoring event effects/submixes etc). - Do not use if you are unaware of DSP network connection issues. Leave it at the default of NULL instead. - - Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value. - Members marked with [w] mean the variable can be written to. The user can set the value. - Members marked with [r/w] are either read or write depending on if you are using Channel::setReverbProperties (w) or Channel::getReverbProperties (r). - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - Channel::setReverbProperties - Channel::getReverbProperties - FMOD_REVERB_CHANNELFLAGS -] -*/ -typedef struct FMOD_REVERB_CHANNELPROPERTIES -{ /* MIN MAX DEFAULT DESCRIPTION */ - int Direct; /* [r/w] -10000 1000 0 Direct path level (SUPPORTED:SFX) */ - int Room; /* [r/w] -10000 1000 0 Room effect level (SUPPORTED:SFX) */ - unsigned int Flags; /* [r/w] FMOD_REVERB_CHANNELFLAGS - modifies the behavior of properties (SUPPORTED:SFX) */ - FMOD_DSP *ConnectionPoint; /* [r/w] See remarks. DSP network location to connect reverb for this channel. (SUPPORTED:SFX).*/ -} FMOD_REVERB_CHANNELPROPERTIES; - - -/* -[DEFINE] -[ - [NAME] - FMOD_REVERB_CHANNELFLAGS - - [DESCRIPTION] - Values for the Flags member of the FMOD_REVERB_CHANNELPROPERTIES structure. - - [REMARKS] - For SFX Reverb, there is support for multiple reverb environments. - Use FMOD_REVERB_CHANNELFLAGS_ENVIRONMENT0 to FMOD_REVERB_CHANNELFLAGS_ENVIRONMENT3 in the flags member - of FMOD_REVERB_CHANNELPROPERTIES to specify which environment instance(s) to target. - - If you do not specify any instance the first reverb instance will be used. - - If you specify more than one instance with getReverbProperties, the first instance will be used. - - If you specify more than one instance with setReverbProperties, it will set more than 1 instance at once. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - FMOD_REVERB_CHANNELPROPERTIES -] -*/ -#define FMOD_REVERB_CHANNELFLAGS_INSTANCE0 0x00000010 /* SFX/Wii. Specify channel to target reverb instance 0. Default target. */ -#define FMOD_REVERB_CHANNELFLAGS_INSTANCE1 0x00000020 /* SFX/Wii. Specify channel to target reverb instance 1. */ -#define FMOD_REVERB_CHANNELFLAGS_INSTANCE2 0x00000040 /* SFX/Wii. Specify channel to target reverb instance 2. */ -#define FMOD_REVERB_CHANNELFLAGS_INSTANCE3 0x00000080 /* SFX. Specify channel to target reverb instance 3. */ - -#define FMOD_REVERB_CHANNELFLAGS_DEFAULT FMOD_REVERB_CHANNELFLAGS_INSTANCE0 -/* [DEFINE_END] */ - - -/* -[STRUCTURE] -[ - [DESCRIPTION] - Settings for advanced features like configuring memory and cpu usage for the FMOD_CREATECOMPRESSEDSAMPLE feature. - - [REMARKS] - maxMPEGcodecs / maxADPCMcodecs / maxXMAcodecs will determine the maximum cpu usage of playing realtime samples. Use this to lower potential excess cpu usage and also control memory usage. - - maxPCMcodecs is for use with PS3 only. It will determine the maximum number of PCM voices that can be played at once. This includes streams of any format and all sounds created - *without* the FMOD_CREATECOMPRESSEDSAMPLE flag. - - Memory will be allocated for codecs 'up front' (during System::init) if these values are specified as non zero. If any are zero, it allocates memory for the codec whenever a file of the type in question is loaded. So if maxMPEGcodecs is 0 for example, it will allocate memory for the mpeg codecs the first time an mp3 is loaded or an mp3 based .FSB file is loaded. - - Due to inefficient encoding techniques on certain .wav based ADPCM files, FMOD can can need an extra 29720 bytes per codec. This means for lowest memory consumption. Use FSB as it uses an optimal/small ADPCM block size. - - Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value. - Members marked with [w] mean the variable can be written to. The user can set the value. - Members marked with [r/w] are either read or write depending on if you are using System::setAdvancedSettings (w) or System::getAdvancedSettings (r). - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::setAdvancedSettings - System::getAdvancedSettings - System::init - FMOD_MODE -] -*/ -typedef struct FMOD_ADVANCEDSETTINGS -{ - int cbsize; /* [w] Size of this structure. Use sizeof(FMOD_ADVANCEDSETTINGS) NOTE: This must be set before calling System::getAdvancedSettings! */ - int maxMPEGcodecs; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_CREATECOMPRESSEDSAMPLE only. Mpeg codecs consume 21,684 bytes per instance and this number will determine how many mpeg channels can be played simultaneously. Default = 32. */ - int maxADPCMcodecs; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_CREATECOMPRESSEDSAMPLE only. ADPCM codecs consume 2,136 bytes per instance and this number will determine how many ADPCM channels can be played simultaneously. Default = 32. */ - int maxXMAcodecs; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_CREATECOMPRESSEDSAMPLE only. XMA codecs consume 14,836 bytes per instance and this number will determine how many XMA channels can be played simultaneously. Default = 32. */ - int maxCELTcodecs; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_CREATECOMPRESSEDSAMPLE only. CELT codecs consume 11,500 bytes per instance and this number will determine how many CELT channels can be played simultaneously. Default = 32. */ - int maxVORBIScodecs; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_CREATECOMPRESSEDSAMPLE only. Vorbis codecs consume 12,000 bytes per instance and this number will determine how many Vorbis channels can be played simultaneously. Default = 32. */ - int maxPCMcodecs; /* [r/w] Optional. Specify 0 to ignore. For use with PS3 only. PCM codecs consume 12,672 bytes per instance and this number will determine how many streams and PCM voices can be played simultaneously. Default = 16. */ - int ASIONumChannels; /* [r/w] Optional. Specify 0 to ignore. Number of channels available on the ASIO device. */ - char **ASIOChannelList; /* [r/w] Optional. Specify 0 to ignore. Pointer to an array of strings (number of entries defined by ASIONumChannels) with ASIO channel names. */ - FMOD_SPEAKER *ASIOSpeakerList; /* [r/w] Optional. Specify 0 to ignore. Pointer to a list of speakers that the ASIO channels map to. This can be called after System::init to remap ASIO output. */ - int max3DReverbDSPs; /* [r/w] Optional. Specify 0 to ignore. The max number of 3d reverb DSP's in the system. (NOTE: CURRENTLY DISABLED / UNUSED) */ - float HRTFMinAngle; /* [r/w] Optional. For use with FMOD_INIT_HRTF_LOWPASS. The angle range (0-360) of a 3D sound in relation to the listener, at which the HRTF function begins to have an effect. 0 = in front of the listener. 180 = from 90 degrees to the left of the listener to 90 degrees to the right. 360 = behind the listener. Default = 180.0. */ - float HRTFMaxAngle; /* [r/w] Optional. For use with FMOD_INIT_HRTF_LOWPASS. The angle range (0-360) of a 3D sound in relation to the listener, at which the HRTF function has maximum effect. 0 = front of the listener. 180 = from 90 degrees to the left of the listener to 90 degrees to the right. 360 = behind the listener. Default = 360.0. */ - float HRTFFreq; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_INIT_HRTF_LOWPASS. The cutoff frequency of the HRTF's lowpass filter function when at maximum effect. (i.e. at HRTFMaxAngle). Default = 4000.0. */ - float vol0virtualvol; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_INIT_VOL0_BECOMES_VIRTUAL. If this flag is used, and the volume is 0.0, then the sound will become virtual. Use this value to raise the threshold to a different point where a sound goes virtual. */ - int eventqueuesize; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD Event system only. Specifies the number of slots available for simultaneous non blocking loads, across all threads. Default = 32. */ - unsigned int defaultDecodeBufferSize; /* [r/w] Optional. Specify 0 to ignore. For streams. This determines the default size of the double buffer (in milliseconds) that a stream uses. Default = 400ms */ - char *debugLogFilename; /* [r/w] Optional. Specify 0 to ignore. Gives fmod's logging system a path/filename. Normally the log is placed in the same directory as the executable and called fmod.log. When using System::getAdvancedSettings, provide at least 256 bytes of memory to copy into. */ - unsigned short profileport; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_INIT_ENABLE_PROFILE. Specify the port to listen on for connections by the profiler application. */ - unsigned int geometryMaxFadeTime; /* [r/w] Optional. Specify 0 to ignore. The maximum time in miliseconds it takes for a channel to fade to the new level when its occlusion changes. */ - unsigned int maxSpectrumWaveDataBuffers; /* [r/w] Optional. Specify 0 to ignore. Tells System::init to allocate a pool of wavedata/spectrum buffers to prevent memory fragmentation, any additional buffers will be allocated normally. */ - unsigned int musicSystemCacheDelay; /* [r/w] Optional. Specify 0 to ignore. The delay the music system should allow for loading a sample from disk (in milliseconds). Default = 400 ms. */ - float distanceFilterCenterFreq; /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_INIT_DISTANCE_FILTERING. The default center frequency in Hz for the distance filtering effect. Default = 1500.0. */ - unsigned int stackSizeStream; /* [r/w] Optional. Specify 0 to ignore. Specify the stack size for the FMOD Stream thread in bytes. Useful for custom codecs that use excess stack. Default 49,152 (48kb) */ - unsigned int stackSizeNonBlocking; /* [r/w] Optional. Specify 0 to ignore. Specify the stack size for the FMOD_NONBLOCKING loading thread. Useful for custom codecs that use excess stack. Default 65,536 (64kb) */ - unsigned int stackSizeMixer; /* [r/w] Optional. Specify 0 to ignore. Specify the stack size for the FMOD mixer thread. Useful for custom dsps that use excess stack. Default 49,152 (48kb) */ -} FMOD_ADVANCEDSETTINGS; - - -/* -[ENUM] -[ - [DESCRIPTION] - Special channel index values for FMOD functions. - - [REMARKS] - To get 'all' of the channels, use System::getMasterChannelGroup. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::playSound - System::playDSP - System::getChannel - System::getMasterChannelGroup -] -*/ -typedef enum -{ - FMOD_CHANNEL_FREE = -1, /* For a channel index, FMOD chooses a free voice using the priority system. */ - FMOD_CHANNEL_REUSE = -2 /* For a channel index, re-use the channel handle that was passed in. */ -} FMOD_CHANNELINDEX; - -#include "fmod_codec.h" -#include "fmod_dsp.h" -#include "fmod_memoryinfo.h" - -/* ========================================================================================== */ -/* FUNCTION PROTOTYPES */ -/* ========================================================================================== */ - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* - FMOD global system functions (optional). -*/ - -FMOD_RESULT F_API FMOD_Memory_Initialize (void *poolmem, int poollen, FMOD_MEMORY_ALLOCCALLBACK useralloc, FMOD_MEMORY_REALLOCCALLBACK userrealloc, FMOD_MEMORY_FREECALLBACK userfree, FMOD_MEMORY_TYPE memtypeflags); -FMOD_RESULT F_API FMOD_Memory_GetStats (int *currentalloced, int *maxalloced, FMOD_BOOL blocking); -FMOD_RESULT F_API FMOD_Debug_SetLevel (FMOD_DEBUGLEVEL level); -FMOD_RESULT F_API FMOD_Debug_GetLevel (FMOD_DEBUGLEVEL *level); -FMOD_RESULT F_API FMOD_File_SetDiskBusy (int busy); -FMOD_RESULT F_API FMOD_File_GetDiskBusy (int *busy); - -/* - FMOD System factory functions. Use this to create an FMOD System Instance. below you will see FMOD_System_Init/Close to get started. -*/ - -FMOD_RESULT F_API FMOD_System_Create (FMOD_SYSTEM **system); -FMOD_RESULT F_API FMOD_System_Release (FMOD_SYSTEM *system); - - -/* - 'System' API -*/ - -/* - Pre-init functions. -*/ - -FMOD_RESULT F_API FMOD_System_SetOutput (FMOD_SYSTEM *system, FMOD_OUTPUTTYPE output); -FMOD_RESULT F_API FMOD_System_GetOutput (FMOD_SYSTEM *system, FMOD_OUTPUTTYPE *output); -FMOD_RESULT F_API FMOD_System_GetNumDrivers (FMOD_SYSTEM *system, int *numdrivers); -FMOD_RESULT F_API FMOD_System_GetDriverInfo (FMOD_SYSTEM *system, int id, char *name, int namelen, FMOD_GUID *guid); -FMOD_RESULT F_API FMOD_System_GetDriverInfoW (FMOD_SYSTEM *system, int id, short *name, int namelen, FMOD_GUID *guid); -FMOD_RESULT F_API FMOD_System_GetDriverCaps (FMOD_SYSTEM *system, int id, FMOD_CAPS *caps, int *controlpaneloutputrate, FMOD_SPEAKERMODE *controlpanelspeakermode); -FMOD_RESULT F_API FMOD_System_SetDriver (FMOD_SYSTEM *system, int driver); -FMOD_RESULT F_API FMOD_System_GetDriver (FMOD_SYSTEM *system, int *driver); -FMOD_RESULT F_API FMOD_System_SetHardwareChannels (FMOD_SYSTEM *system, int numhardwarechannels); -FMOD_RESULT F_API FMOD_System_SetSoftwareChannels (FMOD_SYSTEM *system, int numsoftwarechannels); -FMOD_RESULT F_API FMOD_System_GetSoftwareChannels (FMOD_SYSTEM *system, int *numsoftwarechannels); -FMOD_RESULT F_API FMOD_System_SetSoftwareFormat (FMOD_SYSTEM *system, int samplerate, FMOD_SOUND_FORMAT format, int numoutputchannels, int maxinputchannels, FMOD_DSP_RESAMPLER resamplemethod); -FMOD_RESULT F_API FMOD_System_GetSoftwareFormat (FMOD_SYSTEM *system, int *samplerate, FMOD_SOUND_FORMAT *format, int *numoutputchannels, int *maxinputchannels, FMOD_DSP_RESAMPLER *resamplemethod, int *bits); -FMOD_RESULT F_API FMOD_System_SetDSPBufferSize (FMOD_SYSTEM *system, unsigned int bufferlength, int numbuffers); -FMOD_RESULT F_API FMOD_System_GetDSPBufferSize (FMOD_SYSTEM *system, unsigned int *bufferlength, int *numbuffers); -FMOD_RESULT F_API FMOD_System_SetFileSystem (FMOD_SYSTEM *system, FMOD_FILE_OPENCALLBACK useropen, FMOD_FILE_CLOSECALLBACK userclose, FMOD_FILE_READCALLBACK userread, FMOD_FILE_SEEKCALLBACK userseek, FMOD_FILE_ASYNCREADCALLBACK userasyncread, FMOD_FILE_ASYNCCANCELCALLBACK userasynccancel, int blockalign); -FMOD_RESULT F_API FMOD_System_AttachFileSystem (FMOD_SYSTEM *system, FMOD_FILE_OPENCALLBACK useropen, FMOD_FILE_CLOSECALLBACK userclose, FMOD_FILE_READCALLBACK userread, FMOD_FILE_SEEKCALLBACK userseek); -FMOD_RESULT F_API FMOD_System_SetAdvancedSettings (FMOD_SYSTEM *system, FMOD_ADVANCEDSETTINGS *settings); -FMOD_RESULT F_API FMOD_System_GetAdvancedSettings (FMOD_SYSTEM *system, FMOD_ADVANCEDSETTINGS *settings); -FMOD_RESULT F_API FMOD_System_SetSpeakerMode (FMOD_SYSTEM *system, FMOD_SPEAKERMODE speakermode); -FMOD_RESULT F_API FMOD_System_GetSpeakerMode (FMOD_SYSTEM *system, FMOD_SPEAKERMODE *speakermode); -FMOD_RESULT F_API FMOD_System_SetCallback (FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACK callback); - -/* - Plug-in support -*/ - -FMOD_RESULT F_API FMOD_System_SetPluginPath (FMOD_SYSTEM *system, const char *path); -FMOD_RESULT F_API FMOD_System_LoadPlugin (FMOD_SYSTEM *system, const char *filename, unsigned int *handle, unsigned int priority); -FMOD_RESULT F_API FMOD_System_UnloadPlugin (FMOD_SYSTEM *system, unsigned int handle); -FMOD_RESULT F_API FMOD_System_GetNumPlugins (FMOD_SYSTEM *system, FMOD_PLUGINTYPE plugintype, int *numplugins); -FMOD_RESULT F_API FMOD_System_GetPluginHandle (FMOD_SYSTEM *system, FMOD_PLUGINTYPE plugintype, int index, unsigned int *handle); -FMOD_RESULT F_API FMOD_System_GetPluginInfo (FMOD_SYSTEM *system, unsigned int handle, FMOD_PLUGINTYPE *plugintype, char *name, int namelen, unsigned int *version); -FMOD_RESULT F_API FMOD_System_SetOutputByPlugin (FMOD_SYSTEM *system, unsigned int handle); -FMOD_RESULT F_API FMOD_System_GetOutputByPlugin (FMOD_SYSTEM *system, unsigned int *handle); -FMOD_RESULT F_API FMOD_System_CreateDSPByPlugin (FMOD_SYSTEM *system, unsigned int handle, FMOD_DSP **dsp); -FMOD_RESULT F_API FMOD_System_RegisterCodec (FMOD_SYSTEM *system, FMOD_CODEC_DESCRIPTION *description, unsigned int *handle, unsigned int priority); -FMOD_RESULT F_API FMOD_System_RegisterDSP (FMOD_SYSTEM *system, FMOD_DSP_DESCRIPTION *description, unsigned int *handle); - -/* - Init/Close -*/ - -FMOD_RESULT F_API FMOD_System_Init (FMOD_SYSTEM *system, int maxchannels, FMOD_INITFLAGS flags, void *extradriverdata); -FMOD_RESULT F_API FMOD_System_Close (FMOD_SYSTEM *system); - -/* - General post-init system functions -*/ - -FMOD_RESULT F_API FMOD_System_Update (FMOD_SYSTEM *system); - -FMOD_RESULT F_API FMOD_System_Set3DSettings (FMOD_SYSTEM *system, float dopplerscale, float distancefactor, float rolloffscale); -FMOD_RESULT F_API FMOD_System_Get3DSettings (FMOD_SYSTEM *system, float *dopplerscale, float *distancefactor, float *rolloffscale); -FMOD_RESULT F_API FMOD_System_Set3DNumListeners (FMOD_SYSTEM *system, int numlisteners); -FMOD_RESULT F_API FMOD_System_Get3DNumListeners (FMOD_SYSTEM *system, int *numlisteners); -FMOD_RESULT F_API FMOD_System_Set3DListenerAttributes(FMOD_SYSTEM *system, int listener, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *forward, const FMOD_VECTOR *up); -FMOD_RESULT F_API FMOD_System_Get3DListenerAttributes(FMOD_SYSTEM *system, int listener, FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *forward, FMOD_VECTOR *up); -FMOD_RESULT F_API FMOD_System_Set3DRolloffCallback (FMOD_SYSTEM *system, FMOD_3D_ROLLOFFCALLBACK callback); -FMOD_RESULT F_API FMOD_System_Set3DSpeakerPosition (FMOD_SYSTEM *system, FMOD_SPEAKER speaker, float x, float y, FMOD_BOOL active); -FMOD_RESULT F_API FMOD_System_Get3DSpeakerPosition (FMOD_SYSTEM *system, FMOD_SPEAKER speaker, float *x, float *y, FMOD_BOOL *active); - -FMOD_RESULT F_API FMOD_System_SetStreamBufferSize (FMOD_SYSTEM *system, unsigned int filebuffersize, FMOD_TIMEUNIT filebuffersizetype); -FMOD_RESULT F_API FMOD_System_GetStreamBufferSize (FMOD_SYSTEM *system, unsigned int *filebuffersize, FMOD_TIMEUNIT *filebuffersizetype); - -/* - System information functions. -*/ - -FMOD_RESULT F_API FMOD_System_GetVersion (FMOD_SYSTEM *system, unsigned int *version); -FMOD_RESULT F_API FMOD_System_GetOutputHandle (FMOD_SYSTEM *system, void **handle); -FMOD_RESULT F_API FMOD_System_GetChannelsPlaying (FMOD_SYSTEM *system, int *channels); -FMOD_RESULT F_API FMOD_System_GetHardwareChannels (FMOD_SYSTEM *system, int *numhardwarechannels); -FMOD_RESULT F_API FMOD_System_GetCPUUsage (FMOD_SYSTEM *system, float *dsp, float *stream, float *geometry, float *update, float *total); -FMOD_RESULT F_API FMOD_System_GetSoundRAM (FMOD_SYSTEM *system, int *currentalloced, int *maxalloced, int *total); -FMOD_RESULT F_API FMOD_System_GetNumCDROMDrives (FMOD_SYSTEM *system, int *numdrives); -FMOD_RESULT F_API FMOD_System_GetCDROMDriveName (FMOD_SYSTEM *system, int drive, char *drivename, int drivenamelen, char *scsiname, int scsinamelen, char *devicename, int devicenamelen); -FMOD_RESULT F_API FMOD_System_GetSpectrum (FMOD_SYSTEM *system, float *spectrumarray, int numvalues, int channeloffset, FMOD_DSP_FFT_WINDOW windowtype); -FMOD_RESULT F_API FMOD_System_GetWaveData (FMOD_SYSTEM *system, float *wavearray, int numvalues, int channeloffset); - -/* - Sound/DSP/Channel/FX creation and retrieval. -*/ - -FMOD_RESULT F_API FMOD_System_CreateSound (FMOD_SYSTEM *system, const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, FMOD_SOUND **sound); -FMOD_RESULT F_API FMOD_System_CreateStream (FMOD_SYSTEM *system, const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, FMOD_SOUND **sound); -FMOD_RESULT F_API FMOD_System_CreateDSP (FMOD_SYSTEM *system, FMOD_DSP_DESCRIPTION *description, FMOD_DSP **dsp); -FMOD_RESULT F_API FMOD_System_CreateDSPByType (FMOD_SYSTEM *system, FMOD_DSP_TYPE type, FMOD_DSP **dsp); -FMOD_RESULT F_API FMOD_System_CreateChannelGroup (FMOD_SYSTEM *system, const char *name, FMOD_CHANNELGROUP **channelgroup); -FMOD_RESULT F_API FMOD_System_CreateSoundGroup (FMOD_SYSTEM *system, const char *name, FMOD_SOUNDGROUP **soundgroup); -FMOD_RESULT F_API FMOD_System_CreateReverb (FMOD_SYSTEM *system, FMOD_REVERB **reverb); - -FMOD_RESULT F_API FMOD_System_PlaySound (FMOD_SYSTEM *system, FMOD_CHANNELINDEX channelid, FMOD_SOUND *sound, FMOD_BOOL paused, FMOD_CHANNEL **channel); -FMOD_RESULT F_API FMOD_System_PlayDSP (FMOD_SYSTEM *system, FMOD_CHANNELINDEX channelid, FMOD_DSP *dsp, FMOD_BOOL paused, FMOD_CHANNEL **channel); -FMOD_RESULT F_API FMOD_System_GetChannel (FMOD_SYSTEM *system, int channelid, FMOD_CHANNEL **channel); -FMOD_RESULT F_API FMOD_System_GetMasterChannelGroup (FMOD_SYSTEM *system, FMOD_CHANNELGROUP **channelgroup); -FMOD_RESULT F_API FMOD_System_GetMasterSoundGroup (FMOD_SYSTEM *system, FMOD_SOUNDGROUP **soundgroup); - -/* - Reverb API -*/ - -FMOD_RESULT F_API FMOD_System_SetReverbProperties (FMOD_SYSTEM *system, const FMOD_REVERB_PROPERTIES *prop); -FMOD_RESULT F_API FMOD_System_GetReverbProperties (FMOD_SYSTEM *system, FMOD_REVERB_PROPERTIES *prop); -FMOD_RESULT F_API FMOD_System_SetReverbAmbientProperties(FMOD_SYSTEM *system, FMOD_REVERB_PROPERTIES *prop); -FMOD_RESULT F_API FMOD_System_GetReverbAmbientProperties(FMOD_SYSTEM *system, FMOD_REVERB_PROPERTIES *prop); - -/* - System level DSP access. -*/ - -FMOD_RESULT F_API FMOD_System_GetDSPHead (FMOD_SYSTEM *system, FMOD_DSP **dsp); -FMOD_RESULT F_API FMOD_System_AddDSP (FMOD_SYSTEM *system, FMOD_DSP *dsp, FMOD_DSPCONNECTION **connection); -FMOD_RESULT F_API FMOD_System_LockDSP (FMOD_SYSTEM *system); -FMOD_RESULT F_API FMOD_System_UnlockDSP (FMOD_SYSTEM *system); -FMOD_RESULT F_API FMOD_System_GetDSPClock (FMOD_SYSTEM *system, unsigned int *hi, unsigned int *lo); - -/* - Recording API. -*/ - -FMOD_RESULT F_API FMOD_System_GetRecordNumDrivers (FMOD_SYSTEM *system, int *numdrivers); -FMOD_RESULT F_API FMOD_System_GetRecordDriverInfo (FMOD_SYSTEM *system, int id, char *name, int namelen, FMOD_GUID *guid); -FMOD_RESULT F_API FMOD_System_GetRecordDriverInfoW (FMOD_SYSTEM *system, int id, short *name, int namelen, FMOD_GUID *guid); -FMOD_RESULT F_API FMOD_System_GetRecordDriverCaps (FMOD_SYSTEM *system, int id, FMOD_CAPS *caps, int *minfrequency, int *maxfrequency); -FMOD_RESULT F_API FMOD_System_GetRecordPosition (FMOD_SYSTEM *system, int id, unsigned int *position); - -FMOD_RESULT F_API FMOD_System_RecordStart (FMOD_SYSTEM *system, int id, FMOD_SOUND *sound, FMOD_BOOL loop); -FMOD_RESULT F_API FMOD_System_RecordStop (FMOD_SYSTEM *system, int id); -FMOD_RESULT F_API FMOD_System_IsRecording (FMOD_SYSTEM *system, int id, FMOD_BOOL *recording); - -/* - Geometry API. -*/ - -FMOD_RESULT F_API FMOD_System_CreateGeometry (FMOD_SYSTEM *system, int maxpolygons, int maxvertices, FMOD_GEOMETRY **geometry); -FMOD_RESULT F_API FMOD_System_SetGeometrySettings (FMOD_SYSTEM *system, float maxworldsize); -FMOD_RESULT F_API FMOD_System_GetGeometrySettings (FMOD_SYSTEM *system, float *maxworldsize); -FMOD_RESULT F_API FMOD_System_LoadGeometry (FMOD_SYSTEM *system, const void *data, int datasize, FMOD_GEOMETRY **geometry); -FMOD_RESULT F_API FMOD_System_GetGeometryOcclusion (FMOD_SYSTEM *system, const FMOD_VECTOR *listener, const FMOD_VECTOR *source, float *direct, float *reverb); - -/* - Network functions. -*/ - -FMOD_RESULT F_API FMOD_System_SetNetworkProxy (FMOD_SYSTEM *system, const char *proxy); -FMOD_RESULT F_API FMOD_System_GetNetworkProxy (FMOD_SYSTEM *system, char *proxy, int proxylen); -FMOD_RESULT F_API FMOD_System_SetNetworkTimeout (FMOD_SYSTEM *system, int timeout); -FMOD_RESULT F_API FMOD_System_GetNetworkTimeout (FMOD_SYSTEM *system, int *timeout); - -/* - Userdata set/get. -*/ - -FMOD_RESULT F_API FMOD_System_SetUserData (FMOD_SYSTEM *system, void *userdata); -FMOD_RESULT F_API FMOD_System_GetUserData (FMOD_SYSTEM *system, void **userdata); - -FMOD_RESULT F_API FMOD_System_GetMemoryInfo (FMOD_SYSTEM *system, unsigned int memorybits, unsigned int event_memorybits, unsigned int *memoryused, FMOD_MEMORY_USAGE_DETAILS *memoryused_details); - -/* - 'Sound' API -*/ - -FMOD_RESULT F_API FMOD_Sound_Release (FMOD_SOUND *sound); -FMOD_RESULT F_API FMOD_Sound_GetSystemObject (FMOD_SOUND *sound, FMOD_SYSTEM **system); - -/* - Standard sound manipulation functions. -*/ - -FMOD_RESULT F_API FMOD_Sound_Lock (FMOD_SOUND *sound, unsigned int offset, unsigned int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2); -FMOD_RESULT F_API FMOD_Sound_Unlock (FMOD_SOUND *sound, void *ptr1, void *ptr2, unsigned int len1, unsigned int len2); -FMOD_RESULT F_API FMOD_Sound_SetDefaults (FMOD_SOUND *sound, float frequency, float volume, float pan, int priority); -FMOD_RESULT F_API FMOD_Sound_GetDefaults (FMOD_SOUND *sound, float *frequency, float *volume, float *pan, int *priority); -FMOD_RESULT F_API FMOD_Sound_SetVariations (FMOD_SOUND *sound, float frequencyvar, float volumevar, float panvar); -FMOD_RESULT F_API FMOD_Sound_GetVariations (FMOD_SOUND *sound, float *frequencyvar, float *volumevar, float *panvar); -FMOD_RESULT F_API FMOD_Sound_Set3DMinMaxDistance (FMOD_SOUND *sound, float min, float max); -FMOD_RESULT F_API FMOD_Sound_Get3DMinMaxDistance (FMOD_SOUND *sound, float *min, float *max); -FMOD_RESULT F_API FMOD_Sound_Set3DConeSettings (FMOD_SOUND *sound, float insideconeangle, float outsideconeangle, float outsidevolume); -FMOD_RESULT F_API FMOD_Sound_Get3DConeSettings (FMOD_SOUND *sound, float *insideconeangle, float *outsideconeangle, float *outsidevolume); -FMOD_RESULT F_API FMOD_Sound_Set3DCustomRolloff (FMOD_SOUND *sound, FMOD_VECTOR *points, int numpoints); -FMOD_RESULT F_API FMOD_Sound_Get3DCustomRolloff (FMOD_SOUND *sound, FMOD_VECTOR **points, int *numpoints); -FMOD_RESULT F_API FMOD_Sound_SetSubSound (FMOD_SOUND *sound, int index, FMOD_SOUND *subsound); -FMOD_RESULT F_API FMOD_Sound_GetSubSound (FMOD_SOUND *sound, int index, FMOD_SOUND **subsound); -FMOD_RESULT F_API FMOD_Sound_SetSubSoundSentence (FMOD_SOUND *sound, int *subsoundlist, int numsubsounds); -FMOD_RESULT F_API FMOD_Sound_GetName (FMOD_SOUND *sound, char *name, int namelen); -FMOD_RESULT F_API FMOD_Sound_GetLength (FMOD_SOUND *sound, unsigned int *length, FMOD_TIMEUNIT lengthtype); -FMOD_RESULT F_API FMOD_Sound_GetFormat (FMOD_SOUND *sound, FMOD_SOUND_TYPE *type, FMOD_SOUND_FORMAT *format, int *channels, int *bits); -FMOD_RESULT F_API FMOD_Sound_GetNumSubSounds (FMOD_SOUND *sound, int *numsubsounds); -FMOD_RESULT F_API FMOD_Sound_GetNumTags (FMOD_SOUND *sound, int *numtags, int *numtagsupdated); -FMOD_RESULT F_API FMOD_Sound_GetTag (FMOD_SOUND *sound, const char *name, int index, FMOD_TAG *tag); -FMOD_RESULT F_API FMOD_Sound_GetOpenState (FMOD_SOUND *sound, FMOD_OPENSTATE *openstate, unsigned int *percentbuffered, FMOD_BOOL *starving, FMOD_BOOL *diskbusy); -FMOD_RESULT F_API FMOD_Sound_ReadData (FMOD_SOUND *sound, void *buffer, unsigned int lenbytes, unsigned int *read); -FMOD_RESULT F_API FMOD_Sound_SeekData (FMOD_SOUND *sound, unsigned int pcm); - -FMOD_RESULT F_API FMOD_Sound_SetSoundGroup (FMOD_SOUND *sound, FMOD_SOUNDGROUP *soundgroup); -FMOD_RESULT F_API FMOD_Sound_GetSoundGroup (FMOD_SOUND *sound, FMOD_SOUNDGROUP **soundgroup); - -/* - Synchronization point API. These points can come from markers embedded in wav files, and can also generate channel callbacks. -*/ - -FMOD_RESULT F_API FMOD_Sound_GetNumSyncPoints (FMOD_SOUND *sound, int *numsyncpoints); -FMOD_RESULT F_API FMOD_Sound_GetSyncPoint (FMOD_SOUND *sound, int index, FMOD_SYNCPOINT **point); -FMOD_RESULT F_API FMOD_Sound_GetSyncPointInfo (FMOD_SOUND *sound, FMOD_SYNCPOINT *point, char *name, int namelen, unsigned int *offset, FMOD_TIMEUNIT offsettype); -FMOD_RESULT F_API FMOD_Sound_AddSyncPoint (FMOD_SOUND *sound, unsigned int offset, FMOD_TIMEUNIT offsettype, const char *name, FMOD_SYNCPOINT **point); -FMOD_RESULT F_API FMOD_Sound_DeleteSyncPoint (FMOD_SOUND *sound, FMOD_SYNCPOINT *point); - -/* - Functions also in Channel class but here they are the 'default' to save having to change it in Channel all the time. -*/ - -FMOD_RESULT F_API FMOD_Sound_SetMode (FMOD_SOUND *sound, FMOD_MODE mode); -FMOD_RESULT F_API FMOD_Sound_GetMode (FMOD_SOUND *sound, FMOD_MODE *mode); -FMOD_RESULT F_API FMOD_Sound_SetLoopCount (FMOD_SOUND *sound, int loopcount); -FMOD_RESULT F_API FMOD_Sound_GetLoopCount (FMOD_SOUND *sound, int *loopcount); -FMOD_RESULT F_API FMOD_Sound_SetLoopPoints (FMOD_SOUND *sound, unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype); -FMOD_RESULT F_API FMOD_Sound_GetLoopPoints (FMOD_SOUND *sound, unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype); - -/* - For MOD/S3M/XM/IT/MID sequenced formats only. -*/ - -FMOD_RESULT F_API FMOD_Sound_GetMusicNumChannels (FMOD_SOUND *sound, int *numchannels); -FMOD_RESULT F_API FMOD_Sound_SetMusicChannelVolume (FMOD_SOUND *sound, int channel, float volume); -FMOD_RESULT F_API FMOD_Sound_GetMusicChannelVolume (FMOD_SOUND *sound, int channel, float *volume); -FMOD_RESULT F_API FMOD_Sound_SetMusicSpeed (FMOD_SOUND *sound, float speed); -FMOD_RESULT F_API FMOD_Sound_GetMusicSpeed (FMOD_SOUND *sound, float *speed); - -/* - Userdata set/get. -*/ - -FMOD_RESULT F_API FMOD_Sound_SetUserData (FMOD_SOUND *sound, void *userdata); -FMOD_RESULT F_API FMOD_Sound_GetUserData (FMOD_SOUND *sound, void **userdata); - -FMOD_RESULT F_API FMOD_Sound_GetMemoryInfo (FMOD_SOUND *sound, unsigned int memorybits, unsigned int event_memorybits, unsigned int *memoryused, FMOD_MEMORY_USAGE_DETAILS *memoryused_details); - -/* - 'Channel' API -*/ - -FMOD_RESULT F_API FMOD_Channel_GetSystemObject (FMOD_CHANNEL *channel, FMOD_SYSTEM **system); - -FMOD_RESULT F_API FMOD_Channel_Stop (FMOD_CHANNEL *channel); -FMOD_RESULT F_API FMOD_Channel_SetPaused (FMOD_CHANNEL *channel, FMOD_BOOL paused); -FMOD_RESULT F_API FMOD_Channel_GetPaused (FMOD_CHANNEL *channel, FMOD_BOOL *paused); -FMOD_RESULT F_API FMOD_Channel_SetVolume (FMOD_CHANNEL *channel, float volume); -FMOD_RESULT F_API FMOD_Channel_GetVolume (FMOD_CHANNEL *channel, float *volume); -FMOD_RESULT F_API FMOD_Channel_SetFrequency (FMOD_CHANNEL *channel, float frequency); -FMOD_RESULT F_API FMOD_Channel_GetFrequency (FMOD_CHANNEL *channel, float *frequency); -FMOD_RESULT F_API FMOD_Channel_SetPan (FMOD_CHANNEL *channel, float pan); -FMOD_RESULT F_API FMOD_Channel_GetPan (FMOD_CHANNEL *channel, float *pan); -FMOD_RESULT F_API FMOD_Channel_SetDelay (FMOD_CHANNEL *channel, FMOD_DELAYTYPE delaytype, unsigned int delayhi, unsigned int delaylo); -FMOD_RESULT F_API FMOD_Channel_GetDelay (FMOD_CHANNEL *channel, FMOD_DELAYTYPE delaytype, unsigned int *delayhi, unsigned int *delaylo); -FMOD_RESULT F_API FMOD_Channel_SetSpeakerMix (FMOD_CHANNEL *channel, float frontleft, float frontright, float center, float lfe, float backleft, float backright, float sideleft, float sideright); -FMOD_RESULT F_API FMOD_Channel_GetSpeakerMix (FMOD_CHANNEL *channel, float *frontleft, float *frontright, float *center, float *lfe, float *backleft, float *backright, float *sideleft, float *sideright); -FMOD_RESULT F_API FMOD_Channel_SetSpeakerLevels (FMOD_CHANNEL *channel, FMOD_SPEAKER speaker, float *levels, int numlevels); -FMOD_RESULT F_API FMOD_Channel_GetSpeakerLevels (FMOD_CHANNEL *channel, FMOD_SPEAKER speaker, float *levels, int numlevels); -FMOD_RESULT F_API FMOD_Channel_SetInputChannelMix (FMOD_CHANNEL *channel, float *levels, int numlevels); -FMOD_RESULT F_API FMOD_Channel_GetInputChannelMix (FMOD_CHANNEL *channel, float *levels, int numlevels); -FMOD_RESULT F_API FMOD_Channel_SetMute (FMOD_CHANNEL *channel, FMOD_BOOL mute); -FMOD_RESULT F_API FMOD_Channel_GetMute (FMOD_CHANNEL *channel, FMOD_BOOL *mute); -FMOD_RESULT F_API FMOD_Channel_SetPriority (FMOD_CHANNEL *channel, int priority); -FMOD_RESULT F_API FMOD_Channel_GetPriority (FMOD_CHANNEL *channel, int *priority); -FMOD_RESULT F_API FMOD_Channel_SetPosition (FMOD_CHANNEL *channel, unsigned int position, FMOD_TIMEUNIT postype); -FMOD_RESULT F_API FMOD_Channel_GetPosition (FMOD_CHANNEL *channel, unsigned int *position, FMOD_TIMEUNIT postype); -FMOD_RESULT F_API FMOD_Channel_SetReverbProperties (FMOD_CHANNEL *channel, const FMOD_REVERB_CHANNELPROPERTIES *prop); -FMOD_RESULT F_API FMOD_Channel_GetReverbProperties (FMOD_CHANNEL *channel, FMOD_REVERB_CHANNELPROPERTIES *prop); -FMOD_RESULT F_API FMOD_Channel_SetLowPassGain (FMOD_CHANNEL *channel, float gain); -FMOD_RESULT F_API FMOD_Channel_GetLowPassGain (FMOD_CHANNEL *channel, float *gain); - -FMOD_RESULT F_API FMOD_Channel_SetChannelGroup (FMOD_CHANNEL *channel, FMOD_CHANNELGROUP *channelgroup); -FMOD_RESULT F_API FMOD_Channel_GetChannelGroup (FMOD_CHANNEL *channel, FMOD_CHANNELGROUP **channelgroup); -FMOD_RESULT F_API FMOD_Channel_SetCallback (FMOD_CHANNEL *channel, FMOD_CHANNEL_CALLBACK callback); - -/* - 3D functionality. -*/ - -FMOD_RESULT F_API FMOD_Channel_Set3DAttributes (FMOD_CHANNEL *channel, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel); -FMOD_RESULT F_API FMOD_Channel_Get3DAttributes (FMOD_CHANNEL *channel, FMOD_VECTOR *pos, FMOD_VECTOR *vel); -FMOD_RESULT F_API FMOD_Channel_Set3DMinMaxDistance (FMOD_CHANNEL *channel, float mindistance, float maxdistance); -FMOD_RESULT F_API FMOD_Channel_Get3DMinMaxDistance (FMOD_CHANNEL *channel, float *mindistance, float *maxdistance); -FMOD_RESULT F_API FMOD_Channel_Set3DConeSettings (FMOD_CHANNEL *channel, float insideconeangle, float outsideconeangle, float outsidevolume); -FMOD_RESULT F_API FMOD_Channel_Get3DConeSettings (FMOD_CHANNEL *channel, float *insideconeangle, float *outsideconeangle, float *outsidevolume); -FMOD_RESULT F_API FMOD_Channel_Set3DConeOrientation (FMOD_CHANNEL *channel, FMOD_VECTOR *orientation); -FMOD_RESULT F_API FMOD_Channel_Get3DConeOrientation (FMOD_CHANNEL *channel, FMOD_VECTOR *orientation); -FMOD_RESULT F_API FMOD_Channel_Set3DCustomRolloff (FMOD_CHANNEL *channel, FMOD_VECTOR *points, int numpoints); -FMOD_RESULT F_API FMOD_Channel_Get3DCustomRolloff (FMOD_CHANNEL *channel, FMOD_VECTOR **points, int *numpoints); -FMOD_RESULT F_API FMOD_Channel_Set3DOcclusion (FMOD_CHANNEL *channel, float directocclusion, float reverbocclusion); -FMOD_RESULT F_API FMOD_Channel_Get3DOcclusion (FMOD_CHANNEL *channel, float *directocclusion, float *reverbocclusion); -FMOD_RESULT F_API FMOD_Channel_Set3DSpread (FMOD_CHANNEL *channel, float angle); -FMOD_RESULT F_API FMOD_Channel_Get3DSpread (FMOD_CHANNEL *channel, float *angle); -FMOD_RESULT F_API FMOD_Channel_Set3DPanLevel (FMOD_CHANNEL *channel, float level); -FMOD_RESULT F_API FMOD_Channel_Get3DPanLevel (FMOD_CHANNEL *channel, float *level); -FMOD_RESULT F_API FMOD_Channel_Set3DDopplerLevel (FMOD_CHANNEL *channel, float level); -FMOD_RESULT F_API FMOD_Channel_Get3DDopplerLevel (FMOD_CHANNEL *channel, float *level); -FMOD_RESULT F_API FMOD_Channel_Set3DDistanceFilter (FMOD_CHANNEL *channel, FMOD_BOOL custom, float customLevel, float centerFreq); -FMOD_RESULT F_API FMOD_Channel_Get3DDistanceFilter (FMOD_CHANNEL *channel, FMOD_BOOL *custom, float *customLevel, float *centerFreq); - -/* - DSP functionality only for channels playing sounds created with FMOD_SOFTWARE. -*/ - -FMOD_RESULT F_API FMOD_Channel_GetDSPHead (FMOD_CHANNEL *channel, FMOD_DSP **dsp); -FMOD_RESULT F_API FMOD_Channel_AddDSP (FMOD_CHANNEL *channel, FMOD_DSP *dsp, FMOD_DSPCONNECTION **connection); - -/* - Information only functions. -*/ - -FMOD_RESULT F_API FMOD_Channel_IsPlaying (FMOD_CHANNEL *channel, FMOD_BOOL *isplaying); -FMOD_RESULT F_API FMOD_Channel_IsVirtual (FMOD_CHANNEL *channel, FMOD_BOOL *isvirtual); -FMOD_RESULT F_API FMOD_Channel_GetAudibility (FMOD_CHANNEL *channel, float *audibility); -FMOD_RESULT F_API FMOD_Channel_GetCurrentSound (FMOD_CHANNEL *channel, FMOD_SOUND **sound); -FMOD_RESULT F_API FMOD_Channel_GetSpectrum (FMOD_CHANNEL *channel, float *spectrumarray, int numvalues, int channeloffset, FMOD_DSP_FFT_WINDOW windowtype); -FMOD_RESULT F_API FMOD_Channel_GetWaveData (FMOD_CHANNEL *channel, float *wavearray, int numvalues, int channeloffset); -FMOD_RESULT F_API FMOD_Channel_GetIndex (FMOD_CHANNEL *channel, int *index); - -/* - Functions also found in Sound class but here they can be set per channel. -*/ - -FMOD_RESULT F_API FMOD_Channel_SetMode (FMOD_CHANNEL *channel, FMOD_MODE mode); -FMOD_RESULT F_API FMOD_Channel_GetMode (FMOD_CHANNEL *channel, FMOD_MODE *mode); -FMOD_RESULT F_API FMOD_Channel_SetLoopCount (FMOD_CHANNEL *channel, int loopcount); -FMOD_RESULT F_API FMOD_Channel_GetLoopCount (FMOD_CHANNEL *channel, int *loopcount); -FMOD_RESULT F_API FMOD_Channel_SetLoopPoints (FMOD_CHANNEL *channel, unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype); -FMOD_RESULT F_API FMOD_Channel_GetLoopPoints (FMOD_CHANNEL *channel, unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype); - -/* - Userdata set/get. -*/ - -FMOD_RESULT F_API FMOD_Channel_SetUserData (FMOD_CHANNEL *channel, void *userdata); -FMOD_RESULT F_API FMOD_Channel_GetUserData (FMOD_CHANNEL *channel, void **userdata); - -FMOD_RESULT F_API FMOD_Channel_GetMemoryInfo (FMOD_CHANNEL *channel, unsigned int memorybits, unsigned int event_memorybits, unsigned int *memoryused, FMOD_MEMORY_USAGE_DETAILS *memoryused_details); - -/* - 'ChannelGroup' API -*/ - -FMOD_RESULT F_API FMOD_ChannelGroup_Release (FMOD_CHANNELGROUP *channelgroup); -FMOD_RESULT F_API FMOD_ChannelGroup_GetSystemObject (FMOD_CHANNELGROUP *channelgroup, FMOD_SYSTEM **system); - -/* - Channelgroup scale values. (changes attributes relative to the channels, doesn't overwrite them) -*/ - -FMOD_RESULT F_API FMOD_ChannelGroup_SetVolume (FMOD_CHANNELGROUP *channelgroup, float volume); -FMOD_RESULT F_API FMOD_ChannelGroup_GetVolume (FMOD_CHANNELGROUP *channelgroup, float *volume); -FMOD_RESULT F_API FMOD_ChannelGroup_SetPitch (FMOD_CHANNELGROUP *channelgroup, float pitch); -FMOD_RESULT F_API FMOD_ChannelGroup_GetPitch (FMOD_CHANNELGROUP *channelgroup, float *pitch); -FMOD_RESULT F_API FMOD_ChannelGroup_Set3DOcclusion (FMOD_CHANNELGROUP *channelgroup, float directocclusion, float reverbocclusion); -FMOD_RESULT F_API FMOD_ChannelGroup_Get3DOcclusion (FMOD_CHANNELGROUP *channelgroup, float *directocclusion, float *reverbocclusion); -FMOD_RESULT F_API FMOD_ChannelGroup_SetPaused (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused); -FMOD_RESULT F_API FMOD_ChannelGroup_GetPaused (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *paused); -FMOD_RESULT F_API FMOD_ChannelGroup_SetMute (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL mute); -FMOD_RESULT F_API FMOD_ChannelGroup_GetMute (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *mute); - -/* - Channelgroup override values. (recursively overwrites whatever settings the channels had) -*/ - -FMOD_RESULT F_API FMOD_ChannelGroup_Stop (FMOD_CHANNELGROUP *channelgroup); -FMOD_RESULT F_API FMOD_ChannelGroup_OverrideVolume (FMOD_CHANNELGROUP *channelgroup, float volume); -FMOD_RESULT F_API FMOD_ChannelGroup_OverrideFrequency(FMOD_CHANNELGROUP *channelgroup, float frequency); -FMOD_RESULT F_API FMOD_ChannelGroup_OverridePan (FMOD_CHANNELGROUP *channelgroup, float pan); -FMOD_RESULT F_API FMOD_ChannelGroup_OverrideReverbProperties(FMOD_CHANNELGROUP *channelgroup, const FMOD_REVERB_CHANNELPROPERTIES *prop); -FMOD_RESULT F_API FMOD_ChannelGroup_Override3DAttributes(FMOD_CHANNELGROUP *channelgroup, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel); -FMOD_RESULT F_API FMOD_ChannelGroup_OverrideSpeakerMix(FMOD_CHANNELGROUP *channelgroup, float frontleft, float frontright, float center, float lfe, float backleft, float backright, float sideleft, float sideright); - -/* - Nested channel groups. -*/ - -FMOD_RESULT F_API FMOD_ChannelGroup_AddGroup (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELGROUP *group); -FMOD_RESULT F_API FMOD_ChannelGroup_GetNumGroups (FMOD_CHANNELGROUP *channelgroup, int *numgroups); -FMOD_RESULT F_API FMOD_ChannelGroup_GetGroup (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_CHANNELGROUP **group); -FMOD_RESULT F_API FMOD_ChannelGroup_GetParentGroup (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELGROUP **group); - -/* - DSP functionality only for channel groups playing sounds created with FMOD_SOFTWARE. -*/ - -FMOD_RESULT F_API FMOD_ChannelGroup_GetDSPHead (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP **dsp); -FMOD_RESULT F_API FMOD_ChannelGroup_AddDSP (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp, FMOD_DSPCONNECTION **connection); - -/* - Information only functions. -*/ - -FMOD_RESULT F_API FMOD_ChannelGroup_GetName (FMOD_CHANNELGROUP *channelgroup, char *name, int namelen); -FMOD_RESULT F_API FMOD_ChannelGroup_GetNumChannels (FMOD_CHANNELGROUP *channelgroup, int *numchannels); -FMOD_RESULT F_API FMOD_ChannelGroup_GetChannel (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_CHANNEL **channel); -FMOD_RESULT F_API FMOD_ChannelGroup_GetSpectrum (FMOD_CHANNELGROUP *channelgroup, float *spectrumarray, int numvalues, int channeloffset, FMOD_DSP_FFT_WINDOW windowtype); -FMOD_RESULT F_API FMOD_ChannelGroup_GetWaveData (FMOD_CHANNELGROUP *channelgroup, float *wavearray, int numvalues, int channeloffset); - -/* - Userdata set/get. -*/ - -FMOD_RESULT F_API FMOD_ChannelGroup_SetUserData (FMOD_CHANNELGROUP *channelgroup, void *userdata); -FMOD_RESULT F_API FMOD_ChannelGroup_GetUserData (FMOD_CHANNELGROUP *channelgroup, void **userdata); - -FMOD_RESULT F_API FMOD_ChannelGroup_GetMemoryInfo (FMOD_CHANNELGROUP *channelgroup, unsigned int memorybits, unsigned int event_memorybits, unsigned int *memoryused, FMOD_MEMORY_USAGE_DETAILS *memoryused_details); - -/* - 'SoundGroup' API -*/ - -FMOD_RESULT F_API FMOD_SoundGroup_Release (FMOD_SOUNDGROUP *soundgroup); -FMOD_RESULT F_API FMOD_SoundGroup_GetSystemObject (FMOD_SOUNDGROUP *soundgroup, FMOD_SYSTEM **system); - -/* - SoundGroup control functions. -*/ - -FMOD_RESULT F_API FMOD_SoundGroup_SetMaxAudible (FMOD_SOUNDGROUP *soundgroup, int maxaudible); -FMOD_RESULT F_API FMOD_SoundGroup_GetMaxAudible (FMOD_SOUNDGROUP *soundgroup, int *maxaudible); -FMOD_RESULT F_API FMOD_SoundGroup_SetMaxAudibleBehavior(FMOD_SOUNDGROUP *soundgroup, FMOD_SOUNDGROUP_BEHAVIOR behavior); -FMOD_RESULT F_API FMOD_SoundGroup_GetMaxAudibleBehavior(FMOD_SOUNDGROUP *soundgroup, FMOD_SOUNDGROUP_BEHAVIOR *behavior); -FMOD_RESULT F_API FMOD_SoundGroup_SetMuteFadeSpeed (FMOD_SOUNDGROUP *soundgroup, float speed); -FMOD_RESULT F_API FMOD_SoundGroup_GetMuteFadeSpeed (FMOD_SOUNDGROUP *soundgroup, float *speed); -FMOD_RESULT F_API FMOD_SoundGroup_SetVolume (FMOD_SOUNDGROUP *soundgroup, float volume); -FMOD_RESULT F_API FMOD_SoundGroup_GetVolume (FMOD_SOUNDGROUP *soundgroup, float *volume); -FMOD_RESULT F_API FMOD_SoundGroup_Stop (FMOD_SOUNDGROUP *soundgroup); - -/* - Information only functions. -*/ - -FMOD_RESULT F_API FMOD_SoundGroup_GetName (FMOD_SOUNDGROUP *soundgroup, char *name, int namelen); -FMOD_RESULT F_API FMOD_SoundGroup_GetNumSounds (FMOD_SOUNDGROUP *soundgroup, int *numsounds); -FMOD_RESULT F_API FMOD_SoundGroup_GetSound (FMOD_SOUNDGROUP *soundgroup, int index, FMOD_SOUND **sound); -FMOD_RESULT F_API FMOD_SoundGroup_GetNumPlaying (FMOD_SOUNDGROUP *soundgroup, int *numplaying); - -/* - Userdata set/get. -*/ - -FMOD_RESULT F_API FMOD_SoundGroup_SetUserData (FMOD_SOUNDGROUP *soundgroup, void *userdata); -FMOD_RESULT F_API FMOD_SoundGroup_GetUserData (FMOD_SOUNDGROUP *soundgroup, void **userdata); - -FMOD_RESULT F_API FMOD_SoundGroup_GetMemoryInfo (FMOD_SOUNDGROUP *soundgroup, unsigned int memorybits, unsigned int event_memorybits, unsigned int *memoryused, FMOD_MEMORY_USAGE_DETAILS *memoryused_details); - -/* - 'DSP' API -*/ - -FMOD_RESULT F_API FMOD_DSP_Release (FMOD_DSP *dsp); -FMOD_RESULT F_API FMOD_DSP_GetSystemObject (FMOD_DSP *dsp, FMOD_SYSTEM **system); - -/* - Connection / disconnection / input and output enumeration. -*/ - -FMOD_RESULT F_API FMOD_DSP_AddInput (FMOD_DSP *dsp, FMOD_DSP *target, FMOD_DSPCONNECTION **connection); -FMOD_RESULT F_API FMOD_DSP_DisconnectFrom (FMOD_DSP *dsp, FMOD_DSP *target); -FMOD_RESULT F_API FMOD_DSP_DisconnectAll (FMOD_DSP *dsp, FMOD_BOOL inputs, FMOD_BOOL outputs); -FMOD_RESULT F_API FMOD_DSP_Remove (FMOD_DSP *dsp); -FMOD_RESULT F_API FMOD_DSP_GetNumInputs (FMOD_DSP *dsp, int *numinputs); -FMOD_RESULT F_API FMOD_DSP_GetNumOutputs (FMOD_DSP *dsp, int *numoutputs); -FMOD_RESULT F_API FMOD_DSP_GetInput (FMOD_DSP *dsp, int index, FMOD_DSP **input, FMOD_DSPCONNECTION **inputconnection); -FMOD_RESULT F_API FMOD_DSP_GetOutput (FMOD_DSP *dsp, int index, FMOD_DSP **output, FMOD_DSPCONNECTION **outputconnection); - -/* - DSP unit control. -*/ - -FMOD_RESULT F_API FMOD_DSP_SetActive (FMOD_DSP *dsp, FMOD_BOOL active); -FMOD_RESULT F_API FMOD_DSP_GetActive (FMOD_DSP *dsp, FMOD_BOOL *active); -FMOD_RESULT F_API FMOD_DSP_SetBypass (FMOD_DSP *dsp, FMOD_BOOL bypass); -FMOD_RESULT F_API FMOD_DSP_GetBypass (FMOD_DSP *dsp, FMOD_BOOL *bypass); -FMOD_RESULT F_API FMOD_DSP_SetSpeakerActive (FMOD_DSP *dsp, FMOD_SPEAKER speaker, FMOD_BOOL active); -FMOD_RESULT F_API FMOD_DSP_GetSpeakerActive (FMOD_DSP *dsp, FMOD_SPEAKER speaker, FMOD_BOOL *active); -FMOD_RESULT F_API FMOD_DSP_Reset (FMOD_DSP *dsp); - -/* - DSP parameter control. -*/ - -FMOD_RESULT F_API FMOD_DSP_SetParameter (FMOD_DSP *dsp, int index, float value); -FMOD_RESULT F_API FMOD_DSP_GetParameter (FMOD_DSP *dsp, int index, float *value, char *valuestr, int valuestrlen); -FMOD_RESULT F_API FMOD_DSP_GetNumParameters (FMOD_DSP *dsp, int *numparams); -FMOD_RESULT F_API FMOD_DSP_GetParameterInfo (FMOD_DSP *dsp, int index, char *name, char *label, char *description, int descriptionlen, float *min, float *max); -FMOD_RESULT F_API FMOD_DSP_ShowConfigDialog (FMOD_DSP *dsp, void *hwnd, FMOD_BOOL show); - -/* - DSP attributes. -*/ - -FMOD_RESULT F_API FMOD_DSP_GetInfo (FMOD_DSP *dsp, char *name, unsigned int *version, int *channels, int *configwidth, int *configheight); -FMOD_RESULT F_API FMOD_DSP_GetType (FMOD_DSP *dsp, FMOD_DSP_TYPE *type); -FMOD_RESULT F_API FMOD_DSP_SetDefaults (FMOD_DSP *dsp, float frequency, float volume, float pan, int priority); -FMOD_RESULT F_API FMOD_DSP_GetDefaults (FMOD_DSP *dsp, float *frequency, float *volume, float *pan, int *priority); - -/* - Userdata set/get. -*/ - -FMOD_RESULT F_API FMOD_DSP_SetUserData (FMOD_DSP *dsp, void *userdata); -FMOD_RESULT F_API FMOD_DSP_GetUserData (FMOD_DSP *dsp, void **userdata); - -FMOD_RESULT F_API FMOD_DSP_GetMemoryInfo (FMOD_DSP *dsp, unsigned int memorybits, unsigned int event_memorybits, unsigned int *memoryused, FMOD_MEMORY_USAGE_DETAILS *memoryused_details); - -/* - 'DSPConnection' API -*/ - -FMOD_RESULT F_API FMOD_DSPConnection_GetInput (FMOD_DSPCONNECTION *dspconnection, FMOD_DSP **input); -FMOD_RESULT F_API FMOD_DSPConnection_GetOutput (FMOD_DSPCONNECTION *dspconnection, FMOD_DSP **output); -FMOD_RESULT F_API FMOD_DSPConnection_SetMix (FMOD_DSPCONNECTION *dspconnection, float volume); -FMOD_RESULT F_API FMOD_DSPConnection_GetMix (FMOD_DSPCONNECTION *dspconnection, float *volume); -FMOD_RESULT F_API FMOD_DSPConnection_SetLevels (FMOD_DSPCONNECTION *dspconnection, FMOD_SPEAKER speaker, float *levels, int numlevels); -FMOD_RESULT F_API FMOD_DSPConnection_GetLevels (FMOD_DSPCONNECTION *dspconnection, FMOD_SPEAKER speaker, float *levels, int numlevels); - -/* - Userdata set/get. -*/ - -FMOD_RESULT F_API FMOD_DSPConnection_SetUserData (FMOD_DSPCONNECTION *dspconnection, void *userdata); -FMOD_RESULT F_API FMOD_DSPConnection_GetUserData (FMOD_DSPCONNECTION *dspconnection, void **userdata); - -FMOD_RESULT F_API FMOD_DSPConnection_GetMemoryInfo (FMOD_DSPCONNECTION *dspconnection, unsigned int memorybits, unsigned int event_memorybits, unsigned int *memoryused, FMOD_MEMORY_USAGE_DETAILS *memoryused_details); - -/* - 'Geometry' API -*/ - -FMOD_RESULT F_API FMOD_Geometry_Release (FMOD_GEOMETRY *geometry); - -/* - Polygon manipulation. -*/ - -FMOD_RESULT F_API FMOD_Geometry_AddPolygon (FMOD_GEOMETRY *geometry, float directocclusion, float reverbocclusion, FMOD_BOOL doublesided, int numvertices, const FMOD_VECTOR *vertices, int *polygonindex); -FMOD_RESULT F_API FMOD_Geometry_GetNumPolygons (FMOD_GEOMETRY *geometry, int *numpolygons); -FMOD_RESULT F_API FMOD_Geometry_GetMaxPolygons (FMOD_GEOMETRY *geometry, int *maxpolygons, int *maxvertices); -FMOD_RESULT F_API FMOD_Geometry_GetPolygonNumVertices(FMOD_GEOMETRY *geometry, int index, int *numvertices); -FMOD_RESULT F_API FMOD_Geometry_SetPolygonVertex (FMOD_GEOMETRY *geometry, int index, int vertexindex, const FMOD_VECTOR *vertex); -FMOD_RESULT F_API FMOD_Geometry_GetPolygonVertex (FMOD_GEOMETRY *geometry, int index, int vertexindex, FMOD_VECTOR *vertex); -FMOD_RESULT F_API FMOD_Geometry_SetPolygonAttributes (FMOD_GEOMETRY *geometry, int index, float directocclusion, float reverbocclusion, FMOD_BOOL doublesided); -FMOD_RESULT F_API FMOD_Geometry_GetPolygonAttributes (FMOD_GEOMETRY *geometry, int index, float *directocclusion, float *reverbocclusion, FMOD_BOOL *doublesided); - -/* - Object manipulation. -*/ - -FMOD_RESULT F_API FMOD_Geometry_SetActive (FMOD_GEOMETRY *geometry, FMOD_BOOL active); -FMOD_RESULT F_API FMOD_Geometry_GetActive (FMOD_GEOMETRY *geometry, FMOD_BOOL *active); -FMOD_RESULT F_API FMOD_Geometry_SetRotation (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *forward, const FMOD_VECTOR *up); -FMOD_RESULT F_API FMOD_Geometry_GetRotation (FMOD_GEOMETRY *geometry, FMOD_VECTOR *forward, FMOD_VECTOR *up); -FMOD_RESULT F_API FMOD_Geometry_SetPosition (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *position); -FMOD_RESULT F_API FMOD_Geometry_GetPosition (FMOD_GEOMETRY *geometry, FMOD_VECTOR *position); -FMOD_RESULT F_API FMOD_Geometry_SetScale (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *scale); -FMOD_RESULT F_API FMOD_Geometry_GetScale (FMOD_GEOMETRY *geometry, FMOD_VECTOR *scale); -FMOD_RESULT F_API FMOD_Geometry_Save (FMOD_GEOMETRY *geometry, void *data, int *datasize); - -/* - Userdata set/get. -*/ - -FMOD_RESULT F_API FMOD_Geometry_SetUserData (FMOD_GEOMETRY *geometry, void *userdata); -FMOD_RESULT F_API FMOD_Geometry_GetUserData (FMOD_GEOMETRY *geometry, void **userdata); - -FMOD_RESULT F_API FMOD_Geometry_GetMemoryInfo (FMOD_GEOMETRY *geometry, unsigned int memorybits, unsigned int event_memorybits, unsigned int *memoryused, FMOD_MEMORY_USAGE_DETAILS *memoryused_details); - -/* - 'Reverb' API -*/ - -FMOD_RESULT F_API FMOD_Reverb_Release (FMOD_REVERB *reverb); - -/* - Reverb manipulation. -*/ - -FMOD_RESULT F_API FMOD_Reverb_Set3DAttributes (FMOD_REVERB *reverb, const FMOD_VECTOR *position, float mindistance, float maxdistance); -FMOD_RESULT F_API FMOD_Reverb_Get3DAttributes (FMOD_REVERB *reverb, FMOD_VECTOR *position, float *mindistance, float *maxdistance); -FMOD_RESULT F_API FMOD_Reverb_SetProperties (FMOD_REVERB *reverb, const FMOD_REVERB_PROPERTIES *properties); -FMOD_RESULT F_API FMOD_Reverb_GetProperties (FMOD_REVERB *reverb, FMOD_REVERB_PROPERTIES *properties); -FMOD_RESULT F_API FMOD_Reverb_SetActive (FMOD_REVERB *reverb, FMOD_BOOL active); -FMOD_RESULT F_API FMOD_Reverb_GetActive (FMOD_REVERB *reverb, FMOD_BOOL *active); - -/* - Userdata set/get. -*/ - -FMOD_RESULT F_API FMOD_Reverb_SetUserData (FMOD_REVERB *reverb, void *userdata); -FMOD_RESULT F_API FMOD_Reverb_GetUserData (FMOD_REVERB *reverb, void **userdata); - -FMOD_RESULT F_API FMOD_Reverb_GetMemoryInfo (FMOD_REVERB *reverb, unsigned int memorybits, unsigned int event_memorybits, unsigned int *memoryused, FMOD_MEMORY_USAGE_DETAILS *memoryused_details); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/libs/fmodex/inc/fmod_codec.h b/libs/fmodex/inc/fmod_codec.h deleted file mode 100644 index 2e13eb69d..000000000 --- a/libs/fmodex/inc/fmod_codec.h +++ /dev/null @@ -1,159 +0,0 @@ -/* ==================================================================================================== */ -/* FMOD Ex - codec development header file. Copyright (c), Firelight Technologies Pty, Ltd. 2004-2011. */ -/* */ -/* Use this header if you are wanting to develop your own file format plugin to use with */ -/* FMOD's codec system. With this header you can make your own fileformat plugin that FMOD */ -/* can register and use. See the documentation and examples on how to make a working plugin. */ -/* */ -/* ==================================================================================================== */ - -#ifndef _FMOD_CODEC_H -#define _FMOD_CODEC_H - -typedef struct FMOD_CODEC_STATE FMOD_CODEC_STATE; -typedef struct FMOD_CODEC_WAVEFORMAT FMOD_CODEC_WAVEFORMAT; - -/* - Codec callbacks -*/ -typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_OPENCALLBACK) (FMOD_CODEC_STATE *codec_state, FMOD_MODE usermode, FMOD_CREATESOUNDEXINFO *userexinfo); -typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_CLOSECALLBACK) (FMOD_CODEC_STATE *codec_state); -typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_READCALLBACK) (FMOD_CODEC_STATE *codec_state, void *buffer, unsigned int sizebytes, unsigned int *bytesread); -typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_GETLENGTHCALLBACK) (FMOD_CODEC_STATE *codec_state, unsigned int *length, FMOD_TIMEUNIT lengthtype); -typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_SETPOSITIONCALLBACK) (FMOD_CODEC_STATE *codec_state, int subsound, unsigned int position, FMOD_TIMEUNIT postype); -typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_GETPOSITIONCALLBACK) (FMOD_CODEC_STATE *codec_state, unsigned int *position, FMOD_TIMEUNIT postype); -typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_SOUNDCREATECALLBACK) (FMOD_CODEC_STATE *codec_state, int subsound, FMOD_SOUND *sound); -typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_METADATACALLBACK) (FMOD_CODEC_STATE *codec_state, FMOD_TAGTYPE tagtype, char *name, void *data, unsigned int datalen, FMOD_TAGDATATYPE datatype, int unique); -typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_GETWAVEFORMAT) (FMOD_CODEC_STATE *codec_state, int index, FMOD_CODEC_WAVEFORMAT *waveformat); - - -/* -[STRUCTURE] -[ - [DESCRIPTION] - When creating a codec, declare one of these and provide the relevant callbacks and name for FMOD to use when it opens and reads a file. - - [REMARKS] - Members marked with [in] mean the variable can be written to. The user can set the value. - Members marked with [out] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - FMOD_CODEC_STATE -] -*/ -typedef struct FMOD_CODEC_DESCRIPTION -{ - const char *name; /* [in] Name of the codec. */ - unsigned int version; /* [in] Plugin writer's version number. */ - int defaultasstream; /* [in] Tells FMOD to open the file as a stream when calling System::createSound, and not a static sample. Should normally be 0 (FALSE), because generally the user wants to decode the file into memory when using System::createSound. Mainly used for formats that decode for a very long time, or could use large amounts of memory when decoded. Usually sequenced formats such as mod/s3m/xm/it/midi fall into this category. It is mainly to stop users that don't know what they're doing from getting FMOD_ERR_MEMORY returned from createSound when they should have in fact called System::createStream or used FMOD_CREATESTREAM in System::createSound. */ - FMOD_TIMEUNIT timeunits; /* [in] When setposition codec is called, only these time formats will be passed to the codec. Use bitwise OR to accumulate different types. */ - FMOD_CODEC_OPENCALLBACK open; /* [in] Open callback for the codec for when FMOD tries to open a sound using this codec. */ - FMOD_CODEC_CLOSECALLBACK close; /* [in] Close callback for the codec for when FMOD tries to close a sound using this codec. */ - FMOD_CODEC_READCALLBACK read; /* [in] Read callback for the codec for when FMOD tries to read some data from the file to the destination format (specified in the open callback). */ - FMOD_CODEC_GETLENGTHCALLBACK getlength; /* [in] Callback to return the length of the song in whatever format required when Sound::getLength is called. */ - FMOD_CODEC_SETPOSITIONCALLBACK setposition; /* [in] Seek callback for the codec for when FMOD tries to seek within the file with Channel::setPosition. */ - FMOD_CODEC_GETPOSITIONCALLBACK getposition; /* [in] Tell callback for the codec for when FMOD tries to get the current position within the with Channel::getPosition. */ - FMOD_CODEC_SOUNDCREATECALLBACK soundcreate; /* [in] Sound creation callback for the codec when FMOD finishes creating the sound. (So the codec can set more parameters for the related created sound, ie loop points/mode or 3D attributes etc). */ - FMOD_CODEC_GETWAVEFORMAT getwaveformat; /* [in] Callback to tell FMOD about the waveformat of a particular subsound. This is to save memory, rather than saving 1000 FMOD_CODEC_WAVEFORMAT structures in the codec, the codec might have a more optimal way of storing this information. */ -} FMOD_CODEC_DESCRIPTION; - - -/* -[STRUCTURE] -[ - [DESCRIPTION] - Set these values marked 'in' to tell fmod what sort of sound to create. - The format, channels and frequency tell FMOD what sort of hardware buffer to create when you initialize your code. So if you wrote an MP3 codec that decoded to stereo 16bit integer PCM, you would specify FMOD_SOUND_FORMAT_PCM16, and channels would be equal to 2. - Members marked as 'out' are set by fmod. Do not modify these. Simply specify 0 for these values when declaring the structure, FMOD will fill in the values for you after creation with the correct function pointers. - - [REMARKS] - Members marked with [in] mean the variable can be written to. The user can set the value. - Members marked with [out] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value. - - An FMOD file might be from disk, memory or network, however the file may be opened by the user. - - 'numsubsounds' should be 0 if the file is a normal single sound stream or sound. Examples of this would be .WAV, .WMA, .MP3, .AIFF. - 'numsubsounds' should be 1+ if the file is a container format, and does not contain wav data itself. Examples of these types would be CDDA (multiple CD tracks), FSB (contains multiple sounds), MIDI/MOD/S3M/XM/IT (contain instruments). - The arrays of format, channel, frequency, length and blockalign should point to arrays of information based on how many subsounds are in the format. If the number of subsounds is 0 then it should point to 1 of each attribute, the same as if the number of subsounds was 1. If subsounds was 100 for example, each pointer should point to an array of 100 of each attribute. - When a sound has 1 or more subsounds, you must play the individual sounds specified by first obtaining the subsound with Sound::getSubSound. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - FMOD_SOUND_FORMAT - FMOD_FILE_READCALLBACK - FMOD_FILE_SEEKCALLBACK - FMOD_CODEC_METADATACALLBACK - Sound::getSubSound - Sound::getNumSubSounds -] -*/ -struct FMOD_CODEC_WAVEFORMAT -{ - char name[256]; /* [in] Name of sound.*/ - FMOD_SOUND_FORMAT format; /* [in] Format for (decompressed) codec output, ie FMOD_SOUND_FORMAT_PCM8, FMOD_SOUND_FORMAT_PCM16.*/ - int channels; /* [in] Number of channels used by codec, ie mono = 1, stereo = 2. */ - int frequency; /* [in] Default frequency in hz of the codec, ie 44100. */ - unsigned int lengthbytes; /* [in] Length in bytes of the source data. */ - unsigned int lengthpcm; /* [in] Length in decompressed, PCM samples of the file, ie length in seconds * frequency. Used for Sound::getLength and for memory allocation of static decompressed sample data. */ - int blockalign; /* [in] Blockalign in decompressed, PCM samples of the optimal decode chunk size for this format. The codec read callback will be called in multiples of this value. */ - int loopstart; /* [in] Loopstart in decompressed, PCM samples of file. */ - int loopend; /* [in] Loopend in decompressed, PCM samples of file. */ - FMOD_MODE mode; /* [in] Mode to determine whether the sound should by default load as looping, non looping, 2d or 3d. */ - unsigned int channelmask; /* [in] Microsoft speaker channel mask, as defined for WAVEFORMATEXTENSIBLE and is found in ksmedia.h. Leave at 0 to play in natural speaker order. */ -}; - - -/* -[STRUCTURE] -[ - [DESCRIPTION] - Codec plugin structure that is passed into each callback. - - Set these numsubsounds and waveformat members when called in FMOD_CODEC_OPENCALLBACK to tell fmod what sort of sound to create. - - The format, channels and frequency tell FMOD what sort of hardware buffer to create when you initialize your code. So if you wrote an MP3 codec that decoded to stereo 16bit integer PCM, you would specify FMOD_SOUND_FORMAT_PCM16, and channels would be equal to 2. - - [REMARKS] - Members marked with [in] mean the variable can be written to. The user can set the value. - Members marked with [out] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value. - - An FMOD file might be from disk, memory or internet, however the file may be opened by the user. - - 'numsubsounds' should be 0 if the file is a normal single sound stream or sound. Examples of this would be .WAV, .WMA, .MP3, .AIFF. - 'numsubsounds' should be 1+ if the file is a container format, and does not contain wav data itself. Examples of these types would be CDDA (multiple CD tracks), FSB (contains multiple sounds), DLS (contain instruments). - The arrays of format, channel, frequency, length and blockalign should point to arrays of information based on how many subsounds are in the format. If the number of subsounds is 0 then it should point to 1 of each attribute, the same as if the number of subsounds was 1. If subsounds was 100 for example, each pointer should point to an array of 100 of each attribute. - When a sound has 1 or more subsounds, you must play the individual sounds specified by first obtaining the subsound with Sound::getSubSound. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - FMOD_SOUND_FORMAT - FMOD_FILE_READCALLBACK - FMOD_FILE_SEEKCALLBACK - FMOD_CODEC_METADATACALLBACK - Sound::getSubSound - Sound::getNumSubSounds -] -*/ -struct FMOD_CODEC_STATE -{ - int numsubsounds; /* [in] Number of 'subsounds' in this sound. Anything other than 0 makes it a 'container' format (ie CDDA/DLS/FSB etc which contain 1 or more su bsounds). For most normal, single sound codec such as WAV/AIFF/MP3, this should be 0 as they are not a container for subsounds, they are the sound by itself. */ - FMOD_CODEC_WAVEFORMAT *waveformat; /* [in] Pointer to an array of format structures containing information about each sample. Can be 0 or NULL if FMOD_CODEC_GETWAVEFORMAT callback is preferred. The number of entries here must equal the number of subsounds defined in the subsound parameter. If numsubsounds = 0 then there should be 1 instance of this structure. */ - void *plugindata; /* [in] Plugin writer created data the codec author wants to attach to this object. */ - - void *filehandle; /* [out] This will return an internal FMOD file handle to use with the callbacks provided. */ - unsigned int filesize; /* [out] This will contain the size of the file in bytes. */ - FMOD_FILE_READCALLBACK fileread; /* [out] This will return a callable FMOD file function to use from codec. */ - FMOD_FILE_SEEKCALLBACK fileseek; /* [out] This will return a callable FMOD file function to use from codec. */ - FMOD_CODEC_METADATACALLBACK metadata; /* [out] This will return a callable FMOD metadata function to use from codec. */ -}; - -#endif - - diff --git a/libs/fmodex/inc/fmod_dsp.h b/libs/fmodex/inc/fmod_dsp.h deleted file mode 100644 index 1c5e2a62b..000000000 --- a/libs/fmodex/inc/fmod_dsp.h +++ /dev/null @@ -1,743 +0,0 @@ -/* ========================================================================================== */ -/* FMOD Ex - DSP header file. Copyright (c), Firelight Technologies Pty, Ltd. 2004-2011. */ -/* */ -/* Use this header if you are interested in delving deeper into the FMOD software mixing / */ -/* DSP engine. In this header you can find parameter structures for FMOD system reigstered */ -/* DSP effects and generators. */ -/* Also use this header if you are wanting to develop your own DSP plugin to use with FMOD's */ -/* dsp system. With this header you can make your own DSP plugin that FMOD can */ -/* register and use. See the documentation and examples on how to make a working plugin. */ -/* */ -/* ========================================================================================== */ - -#ifndef _FMOD_DSP_H -#define _FMOD_DSP_H - -typedef struct FMOD_DSP_STATE FMOD_DSP_STATE; - -/* - DSP callbacks -*/ -typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_CREATECALLBACK) (FMOD_DSP_STATE *dsp_state); -typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_RELEASECALLBACK) (FMOD_DSP_STATE *dsp_state); -typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_RESETCALLBACK) (FMOD_DSP_STATE *dsp_state); -typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_READCALLBACK) (FMOD_DSP_STATE *dsp_state, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int outchannels); -typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_SETPOSITIONCALLBACK)(FMOD_DSP_STATE *dsp_state, unsigned int pos); -typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_SETPARAMCALLBACK) (FMOD_DSP_STATE *dsp_state, int index, float value); -typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_GETPARAMCALLBACK) (FMOD_DSP_STATE *dsp_state, int index, float *value, char *valuestr); -typedef FMOD_RESULT (F_CALLBACK *FMOD_DSP_DIALOGCALLBACK) (FMOD_DSP_STATE *dsp_state, void *hwnd, int show); - -/* -[ENUM] -[ - [DESCRIPTION] - These definitions can be used for creating FMOD defined special effects or DSP units. - - [REMARKS] - To get them to be active, first create the unit, then add it somewhere into the DSP network, either at the front of the network near the soundcard unit to affect the global output (by using System::getDSPHead), or on a single channel (using Channel::getDSPHead). - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::createDSPByType -] -*/ -typedef enum -{ - FMOD_DSP_TYPE_UNKNOWN, /* This unit was created via a non FMOD plugin so has an unknown purpose. */ - FMOD_DSP_TYPE_MIXER, /* This unit does nothing but take inputs and mix them together then feed the result to the soundcard unit. */ - FMOD_DSP_TYPE_OSCILLATOR, /* This unit generates sine/square/saw/triangle or noise tones. */ - FMOD_DSP_TYPE_LOWPASS, /* This unit filters sound using a high quality, resonant lowpass filter algorithm but consumes more CPU time. */ - FMOD_DSP_TYPE_ITLOWPASS, /* This unit filters sound using a resonant lowpass filter algorithm that is used in Impulse Tracker, but with limited cutoff range (0 to 8060hz). */ - FMOD_DSP_TYPE_HIGHPASS, /* This unit filters sound using a resonant highpass filter algorithm. */ - FMOD_DSP_TYPE_ECHO, /* This unit produces an echo on the sound and fades out at the desired rate. */ - FMOD_DSP_TYPE_FLANGE, /* This unit produces a flange effect on the sound. */ - FMOD_DSP_TYPE_DISTORTION, /* This unit distorts the sound. */ - FMOD_DSP_TYPE_NORMALIZE, /* This unit normalizes or amplifies the sound to a certain level. */ - FMOD_DSP_TYPE_PARAMEQ, /* This unit attenuates or amplifies a selected frequency range. */ - FMOD_DSP_TYPE_PITCHSHIFT, /* This unit bends the pitch of a sound without changing the speed of playback. */ - FMOD_DSP_TYPE_CHORUS, /* This unit produces a chorus effect on the sound. */ - FMOD_DSP_TYPE_VSTPLUGIN, /* This unit allows the use of Steinberg VST plugins */ - FMOD_DSP_TYPE_WINAMPPLUGIN, /* This unit allows the use of Nullsoft Winamp plugins */ - FMOD_DSP_TYPE_ITECHO, /* This unit produces an echo on the sound and fades out at the desired rate as is used in Impulse Tracker. */ - FMOD_DSP_TYPE_COMPRESSOR, /* This unit implements dynamic compression (linked multichannel, wideband) */ - FMOD_DSP_TYPE_SFXREVERB, /* This unit implements SFX reverb */ - FMOD_DSP_TYPE_LOWPASS_SIMPLE, /* This unit filters sound using a simple lowpass with no resonance, but has flexible cutoff and is fast. */ - FMOD_DSP_TYPE_DELAY, /* This unit produces different delays on individual channels of the sound. */ - FMOD_DSP_TYPE_TREMOLO, /* This unit produces a tremolo / chopper effect on the sound. */ - FMOD_DSP_TYPE_LADSPAPLUGIN, /* This unit allows the use of LADSPA standard plugins. */ - FMOD_DSP_TYPE_HIGHPASS_SIMPLE, /* This unit filters sound using a simple highpass with no resonance, but has flexible cutoff and is fast. */ - FMOD_DSP_TYPE_HARDWARE = 1000, /* Offset that platform specific FMOD_HARDWARE DSPs will start at. */ - FMOD_DSP_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ -} FMOD_DSP_TYPE; - - -/* -[STRUCTURE] -[ - [DESCRIPTION] - Structure to define a parameter for a DSP unit. - - [REMARKS] - Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value. - Members marked with [w] mean the variable can be written to. The user can set the value. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::createDSP - DSP::setParameter -] -*/ -typedef struct FMOD_DSP_PARAMETERDESC -{ - float min; /* [w] Minimum value of the parameter (ie 100.0). */ - float max; /* [w] Maximum value of the parameter (ie 22050.0). */ - float defaultval; /* [w] Default value of parameter. */ - char name[16]; /* [w] Name of the parameter to be displayed (ie "Cutoff frequency"). */ - char label[16]; /* [w] Short string to be put next to value to denote the unit type (ie "hz"). */ - const char *description; /* [w] Description of the parameter to be displayed as a help item / tooltip for this parameter. */ -} FMOD_DSP_PARAMETERDESC; - - -/* -[STRUCTURE] -[ - [DESCRIPTION] - When creating a DSP unit, declare one of these and provide the relevant callbacks and name for FMOD to use when it creates and uses a DSP unit of this type. - - [REMARKS] - Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value. - Members marked with [w] mean the variable can be written to. The user can set the value. - - There are 2 different ways to change a parameter in this architecture. - One is to use DSP::setParameter / DSP::getParameter. This is platform independant and is dynamic, so new unknown plugins can have their parameters enumerated and used. - The other is to use DSP::showConfigDialog. This is platform specific and requires a GUI, and will display a dialog box to configure the plugin. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::createDSP - FMOD_DSP_STATE -] -*/ -typedef struct FMOD_DSP_DESCRIPTION -{ - char name[32]; /* [w] Name of the unit to be displayed in the network. */ - unsigned int version; /* [w] Plugin writer's version number. */ - int channels; /* [w] Number of channels. Use 0 to process whatever number of channels is currently in the network. >0 would be mostly used if the unit is a unit that only generates sound. */ - FMOD_DSP_CREATECALLBACK create; /* [w] Create callback. This is called when DSP unit is created. Can be null. */ - FMOD_DSP_RELEASECALLBACK release; /* [w] Release callback. This is called just before the unit is freed so the user can do any cleanup needed for the unit. Can be null. */ - FMOD_DSP_RESETCALLBACK reset; /* [w] Reset callback. This is called by the user to reset any history buffers that may need resetting for a filter, when it is to be used or re-used for the first time to its initial clean state. Use to avoid clicks or artifacts. */ - FMOD_DSP_READCALLBACK read; /* [w] Read callback. Processing is done here. Can be null. */ - FMOD_DSP_SETPOSITIONCALLBACK setposition; /* [w] Set position callback. This is called if the unit wants to update its position info but not process data, or reset a cursor position internally if it is reading data from a certain source. Can be null. */ - - int numparameters; /* [w] Number of parameters used in this filter. The user finds this with DSP::getNumParameters */ - FMOD_DSP_PARAMETERDESC *paramdesc; /* [w] Variable number of parameter structures. */ - FMOD_DSP_SETPARAMCALLBACK setparameter; /* [w] This is called when the user calls DSP::setParameter. Can be null. */ - FMOD_DSP_GETPARAMCALLBACK getparameter; /* [w] This is called when the user calls DSP::getParameter. Can be null. */ - FMOD_DSP_DIALOGCALLBACK config; /* [w] This is called when the user calls DSP::showConfigDialog. Can be used to display a dialog to configure the filter. Can be null. */ - int configwidth; /* [w] Width of config dialog graphic if there is one. 0 otherwise.*/ - int configheight; /* [w] Height of config dialog graphic if there is one. 0 otherwise.*/ - void *userdata; /* [w] Optional. Specify 0 to ignore. This is user data to be attached to the DSP unit during creation. Access via DSP::getUserData. */ -} FMOD_DSP_DESCRIPTION; - - -/* -[STRUCTURE] -[ - [DESCRIPTION] - DSP plugin structure that is passed into each callback. - - [REMARKS] - Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value. - Members marked with [w] mean the variable can be written to. The user can set the value. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - FMOD_DSP_DESCRIPTION -] -*/ -struct FMOD_DSP_STATE -{ - FMOD_DSP *instance; /* [r] Handle to the DSP hand the user created. Not to be modified. C++ users cast to FMOD::DSP to use. */ - void *plugindata; /* [w] Plugin writer created data the output author wants to attach to this object. */ - unsigned short speakermask; /* [w] Specifies which speakers the DSP effect is active on */ -}; - - -/* - =================================================================================================== - - FMOD built in effect parameters. - Use DSP::setParameter with these enums for the 'index' parameter. - - =================================================================================================== -*/ - -/* -[ENUM] -[ - [DESCRIPTION] - Parameter types for the FMOD_DSP_TYPE_OSCILLATOR filter. - - [REMARKS] - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - DSP::setParameter - DSP::getParameter - FMOD_DSP_TYPE -] -*/ -typedef enum -{ - FMOD_DSP_OSCILLATOR_TYPE, /* Waveform type. 0 = sine. 1 = square. 2 = sawup. 3 = sawdown. 4 = triangle. 5 = noise. */ - FMOD_DSP_OSCILLATOR_RATE /* Frequency of the sinewave in hz. 1.0 to 22000.0. Default = 220.0. */ -} FMOD_DSP_OSCILLATOR; - - -/* -[ENUM] -[ - [DESCRIPTION] - Parameter types for the FMOD_DSP_TYPE_LOWPASS filter. - - [REMARKS] - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - DSP::setParameter - DSP::getParameter - FMOD_DSP_TYPE -] -*/ -typedef enum -{ - FMOD_DSP_LOWPASS_CUTOFF, /* Lowpass cutoff frequency in hz. 10.0 to 22000.0. Default = 5000.0. */ - FMOD_DSP_LOWPASS_RESONANCE /* Lowpass resonance Q value. 1.0 to 10.0. Default = 1.0. */ -} FMOD_DSP_LOWPASS; - - -/* -[ENUM] -[ - [DESCRIPTION] - Parameter types for the FMOD_DSP_TYPE_ITLOWPASS filter. - This is different to the default FMOD_DSP_TYPE_ITLOWPASS filter in that it uses a different quality algorithm and is - the filter used to produce the correct sounding playback in .IT files. - FMOD Ex's .IT playback uses this filter. - - [REMARKS] - Note! This filter actually has a limited cutoff frequency below the specified maximum, due to its limited design, - so for a more open range filter use FMOD_DSP_LOWPASS or if you don't mind not having resonance, - FMOD_DSP_LOWPASS_SIMPLE. - The effective maximum cutoff is about 8060hz. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - DSP::setParameter - DSP::getParameter - FMOD_DSP_TYPE -] -*/ -typedef enum -{ - FMOD_DSP_ITLOWPASS_CUTOFF, /* Lowpass cutoff frequency in hz. 1.0 to 22000.0. Default = 5000.0/ */ - FMOD_DSP_ITLOWPASS_RESONANCE /* Lowpass resonance Q value. 0.0 to 127.0. Default = 1.0. */ -} FMOD_DSP_ITLOWPASS; - - -/* -[ENUM] -[ - [DESCRIPTION] - Parameter types for the FMOD_DSP_TYPE_HIGHPASS filter. - - [REMARKS] - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - DSP::setParameter - DSP::getParameter - FMOD_DSP_TYPE -] -*/ -typedef enum -{ - FMOD_DSP_HIGHPASS_CUTOFF, /* Highpass cutoff frequency in hz. 1.0 to output 22000.0. Default = 5000.0. */ - FMOD_DSP_HIGHPASS_RESONANCE /* Highpass resonance Q value. 1.0 to 10.0. Default = 1.0. */ -} FMOD_DSP_HIGHPASS; - - -/* -[ENUM] -[ - [DESCRIPTION] - Parameter types for the FMOD_DSP_TYPE_ECHO filter. - - [REMARKS] - Note. Every time the delay is changed, the plugin re-allocates the echo buffer. This means the echo will dissapear at that time while it refills its new buffer. - Larger echo delays result in larger amounts of memory allocated. - - 'maxchannels' also dictates the amount of memory allocated. By default, the maxchannels value is 0. If FMOD is set to stereo, the echo unit will allocate enough memory for 2 channels. If it is 5.1, it will allocate enough memory for a 6 channel echo, etc. - If the echo effect is only ever applied to the global mix (ie it was added with System::addDSP), then 0 is the value to set as it will be enough to handle all speaker modes. - When the echo is added to a channel (ie Channel::addDSP) then the channel count that comes in could be anything from 1 to 8 possibly. It is only in this case where you might want to increase the channel count above the output's channel count. - If a channel echo is set to a lower number than the sound's channel count that is coming in, it will not echo the sound. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - DSP::setParameter - DSP::getParameter - FMOD_DSP_TYPE -] -*/ -typedef enum -{ - FMOD_DSP_ECHO_DELAY, /* Echo delay in ms. 10 to 5000. Default = 500. */ - FMOD_DSP_ECHO_DECAYRATIO, /* Echo decay per delay. 0 to 1. 1.0 = No decay, 0.0 = total decay (ie simple 1 line delay). Default = 0.5. */ - FMOD_DSP_ECHO_MAXCHANNELS, /* Maximum channels supported. 0 to 16. 0 = same as fmod's default output polyphony, 1 = mono, 2 = stereo etc. See remarks for more. Default = 0. It is suggested to leave at 0! */ - FMOD_DSP_ECHO_DRYMIX, /* Volume of original signal to pass to output. 0.0 to 1.0. Default = 1.0. */ - FMOD_DSP_ECHO_WETMIX /* Volume of echo signal to pass to output. 0.0 to 1.0. Default = 1.0. */ -} FMOD_DSP_ECHO; - - -/* -[ENUM] -[ - [DESCRIPTION] - Parameter types for the FMOD_DSP_TYPE_DELAY filter. - - [REMARKS] - Note. Every time MaxDelay is changed, the plugin re-allocates the delay buffer. This means the delay will dissapear at that time while it refills its new buffer. - A larger MaxDelay results in larger amounts of memory allocated. - Channel delays above MaxDelay will be clipped to MaxDelay and the delay buffer will not be resized. - - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - DSP::setParameter - DSP::getParameter - FMOD_DSP_TYPE -] -*/ -typedef enum -{ - FMOD_DSP_DELAY_CH0, /* Channel #0 Delay in ms. 0 to 10000. Default = 0. */ - FMOD_DSP_DELAY_CH1, /* Channel #1 Delay in ms. 0 to 10000. Default = 0. */ - FMOD_DSP_DELAY_CH2, /* Channel #2 Delay in ms. 0 to 10000. Default = 0. */ - FMOD_DSP_DELAY_CH3, /* Channel #3 Delay in ms. 0 to 10000. Default = 0. */ - FMOD_DSP_DELAY_CH4, /* Channel #4 Delay in ms. 0 to 10000. Default = 0. */ - FMOD_DSP_DELAY_CH5, /* Channel #5 Delay in ms. 0 to 10000. Default = 0. */ - FMOD_DSP_DELAY_CH6, /* Channel #6 Delay in ms. 0 to 10000. Default = 0. */ - FMOD_DSP_DELAY_CH7, /* Channel #7 Delay in ms. 0 to 10000. Default = 0. */ - FMOD_DSP_DELAY_CH8, /* Channel #8 Delay in ms. 0 to 10000. Default = 0. */ - FMOD_DSP_DELAY_CH9, /* Channel #9 Delay in ms. 0 to 10000. Default = 0. */ - FMOD_DSP_DELAY_CH10, /* Channel #10 Delay in ms. 0 to 10000. Default = 0. */ - FMOD_DSP_DELAY_CH11, /* Channel #11 Delay in ms. 0 to 10000. Default = 0. */ - FMOD_DSP_DELAY_CH12, /* Channel #12 Delay in ms. 0 to 10000. Default = 0. */ - FMOD_DSP_DELAY_CH13, /* Channel #13 Delay in ms. 0 to 10000. Default = 0. */ - FMOD_DSP_DELAY_CH14, /* Channel #14 Delay in ms. 0 to 10000. Default = 0. */ - FMOD_DSP_DELAY_CH15, /* Channel #15 Delay in ms. 0 to 10000. Default = 0. */ - FMOD_DSP_DELAY_MAXDELAY /* Maximum delay in ms. 0 to 10000. Default = 10. */ -} FMOD_DSP_DELAY; - - -/* -[ENUM] -[ - [DESCRIPTION] - Parameter types for the FMOD_DSP_TYPE_FLANGE filter. - - [REMARKS] - Flange is an effect where the signal is played twice at the same time, and one copy slides back and forth creating a whooshing or flanging effect. - As there are 2 copies of the same signal, by default each signal is given 50% mix, so that the total is not louder than the original unaffected signal. - - Flange depth is a percentage of a 10ms shift from the original signal. Anything above 10ms is not considered flange because to the ear it begins to 'echo' so 10ms is the highest value possible. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - DSP::setParameter - DSP::getParameter - FMOD_DSP_TYPE -] -*/ -typedef enum -{ - FMOD_DSP_FLANGE_DRYMIX, /* Volume of original signal to pass to output. 0.0 to 1.0. Default = 0.45. */ - FMOD_DSP_FLANGE_WETMIX, /* Volume of flange signal to pass to output. 0.0 to 1.0. Default = 0.55. */ - FMOD_DSP_FLANGE_DEPTH, /* Flange depth (percentage of 40ms delay). 0.01 to 1.0. Default = 1.0. */ - FMOD_DSP_FLANGE_RATE /* Flange speed in hz. 0.0 to 20.0. Default = 0.1. */ -} FMOD_DSP_FLANGE; - - -/* -[ENUM] -[ - [DESCRIPTION] - Parameter types for the FMOD_DSP_TYPE_TREMOLO filter. - - [REMARKS] - The tremolo effect varies the amplitude of a sound. Depending on the settings, this unit can produce a tremolo, chopper or auto-pan effect. - - The shape of the LFO (low freq. oscillator) can morphed between sine, triangle and sawtooth waves using the FMOD_DSP_TREMOLO_SHAPE and FMOD_DSP_TREMOLO_SKEW parameters. - FMOD_DSP_TREMOLO_DUTY and FMOD_DSP_TREMOLO_SQUARE are useful for a chopper-type effect where the first controls the on-time duration and second controls the flatness of the envelope. - FMOD_DSP_TREMOLO_SPREAD varies the LFO phase between channels to get an auto-pan effect. This works best with a sine shape LFO. - The LFO can be synchronized using the FMOD_DSP_TREMOLO_PHASE parameter which sets its instantaneous phase. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - DSP::setParameter - DSP::getParameter - FMOD_DSP_TYPE -] -*/ -typedef enum -{ - FMOD_DSP_TREMOLO_FREQUENCY, /* LFO frequency in Hz. 0.1 to 20. Default = 4. */ - FMOD_DSP_TREMOLO_DEPTH, /* Tremolo depth. 0 to 1. Default = 0. */ - FMOD_DSP_TREMOLO_SHAPE, /* LFO shape morph between triangle and sine. 0 to 1. Default = 0. */ - FMOD_DSP_TREMOLO_SKEW, /* Time-skewing of LFO cycle. -1 to 1. Default = 0. */ - FMOD_DSP_TREMOLO_DUTY, /* LFO on-time. 0 to 1. Default = 0.5. */ - FMOD_DSP_TREMOLO_SQUARE, /* Flatness of the LFO shape. 0 to 1. Default = 0. */ - FMOD_DSP_TREMOLO_PHASE, /* Instantaneous LFO phase. 0 to 1. Default = 0. */ - FMOD_DSP_TREMOLO_SPREAD /* Rotation / auto-pan effect. -1 to 1. Default = 0. */ -} FMOD_DSP_TREMOLO; - - -/* -[ENUM] -[ - [DESCRIPTION] - Parameter types for the FMOD_DSP_TYPE_DISTORTION filter. - - [REMARKS] - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - DSP::setParameter - DSP::getParameter - FMOD_DSP_TYPE -] -*/ -typedef enum -{ - FMOD_DSP_DISTORTION_LEVEL /* Distortion value. 0.0 to 1.0. Default = 0.5. */ -} FMOD_DSP_DISTORTION; - - -/* -[ENUM] -[ - [DESCRIPTION] - Parameter types for the FMOD_DSP_TYPE_NORMALIZE filter. - - [REMARKS] - Normalize amplifies the sound based on the maximum peaks within the signal. - For example if the maximum peaks in the signal were 50% of the bandwidth, it would scale the whole sound by 2. - The lower threshold value makes the normalizer ignores peaks below a certain point, to avoid over-amplification if a loud signal suddenly came in, and also to avoid amplifying to maximum things like background hiss. - - Because FMOD is a realtime audio processor, it doesn't have the luxury of knowing the peak for the whole sound (ie it can't see into the future), so it has to process data as it comes in. - To avoid very sudden changes in volume level based on small samples of new data, fmod fades towards the desired amplification which makes for smooth gain control. The fadetime parameter can control this. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - DSP::setParameter - DSP::getParameter - FMOD_DSP_TYPE -] -*/ -typedef enum -{ - FMOD_DSP_NORMALIZE_FADETIME, /* Time to ramp the silence to full in ms. 0.0 to 20000.0. Default = 5000.0. */ - FMOD_DSP_NORMALIZE_THRESHHOLD, /* Lower volume range threshold to ignore. 0.0 to 1.0. Default = 0.1. Raise higher to stop amplification of very quiet signals. */ - FMOD_DSP_NORMALIZE_MAXAMP /* Maximum amplification allowed. 1.0 to 100000.0. Default = 20.0. 1.0 = no amplifaction, higher values allow more boost. */ -} FMOD_DSP_NORMALIZE; - - -/* -[ENUM] -[ - [DESCRIPTION] - Parameter types for the FMOD_DSP_TYPE_PARAMEQ filter. - - [REMARKS] - Parametric EQ is a bandpass filter that attenuates or amplifies a selected frequency and its neighbouring frequencies. - - To create a multi-band EQ create multiple FMOD_DSP_TYPE_PARAMEQ units and set each unit to different frequencies, for example 1000hz, 2000hz, 4000hz, 8000hz, 16000hz with a range of 1 octave each. - - When a frequency has its gain set to 1.0, the sound will be unaffected and represents the original signal exactly. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - DSP::setParameter - DSP::getParameter - FMOD_DSP_TYPE -] -*/ -typedef enum -{ - FMOD_DSP_PARAMEQ_CENTER, /* Frequency center. 20.0 to 22000.0. Default = 8000.0. */ - FMOD_DSP_PARAMEQ_BANDWIDTH, /* Octave range around the center frequency to filter. 0.2 to 5.0. Default = 1.0. */ - FMOD_DSP_PARAMEQ_GAIN /* Frequency Gain. 0.05 to 3.0. Default = 1.0. */ -} FMOD_DSP_PARAMEQ; - - - -/* -[ENUM] -[ - [DESCRIPTION] - Parameter types for the FMOD_DSP_TYPE_PITCHSHIFT filter. - - [REMARKS] - This pitch shifting unit can be used to change the pitch of a sound without speeding it up or slowing it down. - It can also be used for time stretching or scaling, for example if the pitch was doubled, and the frequency of the sound was halved, the pitch of the sound would sound correct but it would be twice as slow. - - Warning! This filter is very computationally expensive! Similar to a vocoder, it requires several overlapping FFT and IFFT's to produce smooth output, and can require around 440mhz for 1 stereo 48khz signal using the default settings. - Reducing the signal to mono will half the cpu usage. - Reducing this will lower audio quality, but what settings to use are largely dependant on the sound being played. A noisy polyphonic signal will need higher fft size compared to a speaking voice for example. - - This pitch shifter is based on the pitch shifter code at http://www.dspdimension.com, written by Stephan M. Bernsee. - The original code is COPYRIGHT 1999-2003 Stephan M. Bernsee . - - 'maxchannels' dictates the amount of memory allocated. By default, the maxchannels value is 0. If FMOD is set to stereo, the pitch shift unit will allocate enough memory for 2 channels. If it is 5.1, it will allocate enough memory for a 6 channel pitch shift, etc. - If the pitch shift effect is only ever applied to the global mix (ie it was added with System::addDSP), then 0 is the value to set as it will be enough to handle all speaker modes. - When the pitch shift is added to a channel (ie Channel::addDSP) then the channel count that comes in could be anything from 1 to 8 possibly. It is only in this case where you might want to increase the channel count above the output's channel count. - If a channel pitch shift is set to a lower number than the sound's channel count that is coming in, it will not pitch shift the sound. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - DSP::setParameter - DSP::getParameter - FMOD_DSP_TYPE -] -*/ -typedef enum -{ - FMOD_DSP_PITCHSHIFT_PITCH, /* Pitch value. 0.5 to 2.0. Default = 1.0. 0.5 = one octave down, 2.0 = one octave up. 1.0 does not change the pitch. */ - FMOD_DSP_PITCHSHIFT_FFTSIZE, /* FFT window size. 256, 512, 1024, 2048, 4096. Default = 1024. Increase this to reduce 'smearing'. This effect is a warbling sound similar to when an mp3 is encoded at very low bitrates. */ - FMOD_DSP_PITCHSHIFT_OVERLAP, /* Removed. Do not use. FMOD now uses 4 overlaps and cannot be changed. */ - FMOD_DSP_PITCHSHIFT_MAXCHANNELS /* Maximum channels supported. 0 to 16. 0 = same as fmod's default output polyphony, 1 = mono, 2 = stereo etc. See remarks for more. Default = 0. It is suggested to leave at 0! */ -} FMOD_DSP_PITCHSHIFT; - - - -/* -[ENUM] -[ - [DESCRIPTION] - Parameter types for the FMOD_DSP_TYPE_CHORUS filter. - - [REMARKS] - Chrous is an effect where the sound is more 'spacious' due to 1 to 3 versions of the sound being played along side the original signal but with the pitch of each copy modulating on a sine wave. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - DSP::setParameter - DSP::getParameter - FMOD_DSP_TYPE -] -*/ -typedef enum -{ - FMOD_DSP_CHORUS_DRYMIX, /* Volume of original signal to pass to output. 0.0 to 1.0. Default = 0.5. */ - FMOD_DSP_CHORUS_WETMIX1, /* Volume of 1st chorus tap. 0.0 to 1.0. Default = 0.5. */ - FMOD_DSP_CHORUS_WETMIX2, /* Volume of 2nd chorus tap. This tap is 90 degrees out of phase of the first tap. 0.0 to 1.0. Default = 0.5. */ - FMOD_DSP_CHORUS_WETMIX3, /* Volume of 3rd chorus tap. This tap is 90 degrees out of phase of the second tap. 0.0 to 1.0. Default = 0.5. */ - FMOD_DSP_CHORUS_DELAY, /* Chorus delay in ms. 0.1 to 100.0. Default = 40.0 ms. */ - FMOD_DSP_CHORUS_RATE, /* Chorus modulation rate in hz. 0.0 to 20.0. Default = 0.8 hz. */ - FMOD_DSP_CHORUS_DEPTH /* Chorus modulation depth. 0.0 to 1.0. Default = 0.03. */ -} FMOD_DSP_CHORUS; - - -/* -[ENUM] -[ - [DESCRIPTION] - Parameter types for the FMOD_DSP_TYPE_ITECHO filter. - This is effectively a software based echo filter that emulates the DirectX DMO echo effect. Impulse tracker files can support this, and FMOD will produce the effect on ANY platform, not just those that support DirectX effects! - - [REMARKS] - Note. Every time the delay is changed, the plugin re-allocates the echo buffer. This means the echo will dissapear at that time while it refills its new buffer. - Larger echo delays result in larger amounts of memory allocated. - - As this is a stereo filter made mainly for IT playback, it is targeted for stereo signals. - With mono signals only the FMOD_DSP_ITECHO_LEFTDELAY is used. - For multichannel signals (>2) there will be no echo on those channels. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - DSP::SetParameter - DSP::GetParameter - FMOD_DSP_TYPE - System::addDSP -] -*/ -typedef enum -{ - FMOD_DSP_ITECHO_WETDRYMIX, /* Ratio of wet (processed) signal to dry (unprocessed) signal. Must be in the range from 0.0 through 100.0 (all wet). The default value is 50. */ - FMOD_DSP_ITECHO_FEEDBACK, /* Percentage of output fed back into input, in the range from 0.0 through 100.0. The default value is 50. */ - FMOD_DSP_ITECHO_LEFTDELAY, /* Delay for left channel, in milliseconds, in the range from 1.0 through 2000.0. The default value is 500 ms. */ - FMOD_DSP_ITECHO_RIGHTDELAY, /* Delay for right channel, in milliseconds, in the range from 1.0 through 2000.0. The default value is 500 ms. */ - FMOD_DSP_ITECHO_PANDELAY /* Value that specifies whether to swap left and right delays with each successive echo. The default value is zero, meaning no swap. Possible values are defined as 0.0 (equivalent to FALSE) and 1.0 (equivalent to TRUE). CURRENTLY NOT SUPPORTED. */ -} FMOD_DSP_ITECHO; - -/* -[ENUM] -[ - [DESCRIPTION] - Parameter types for the FMOD_DSP_TYPE_COMPRESSOR unit. - This is a simple linked multichannel software limiter that is uniform across the whole spectrum. - - [REMARKS] - The limiter is not guaranteed to catch every peak above the threshold level, - because it cannot apply gain reduction instantaneously - the time delay is - determined by the attack time. However setting the attack time too short will - distort the sound, so it is a compromise. High level peaks can be avoided by - using a short attack time - but not too short, and setting the threshold a few - decibels below the critical level. - - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - DSP::SetParameter - DSP::GetParameter - FMOD_DSP_TYPE - System::addDSP -] -*/ -typedef enum -{ - FMOD_DSP_COMPRESSOR_THRESHOLD, /* Threshold level (dB) in the range from -60 through 0. The default value is 0. */ - FMOD_DSP_COMPRESSOR_ATTACK, /* Gain reduction attack time (milliseconds), in the range from 10 through 200. The default value is 50. */ - FMOD_DSP_COMPRESSOR_RELEASE, /* Gain reduction release time (milliseconds), in the range from 20 through 1000. The default value is 50. */ - FMOD_DSP_COMPRESSOR_GAINMAKEUP /* Make-up gain (dB) applied after limiting, in the range from 0 through 30. The default value is 0. */ -} FMOD_DSP_COMPRESSOR; - -/* -[ENUM] -[ - [DESCRIPTION] - Parameter types for the FMOD_DSP_TYPE_SFXREVERB unit. - - [REMARKS] - This is a high quality I3DL2 based reverb. - On top of the I3DL2 property set, "Dry Level" is also included to allow the dry mix to be changed. - - These properties can be set with presets in FMOD_REVERB_PRESETS. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - DSP::SetParameter - DSP::GetParameter - FMOD_DSP_TYPE - System::addDSP - FMOD_REVERB_PRESETS -] -*/ -typedef enum -{ - FMOD_DSP_SFXREVERB_DRYLEVEL, /* Dry Level : Mix level of dry signal in output in mB. Ranges from -10000.0 to 0.0. Default is 0. */ - FMOD_DSP_SFXREVERB_ROOM, /* Room : Room effect level at low frequencies in mB. Ranges from -10000.0 to 0.0. Default is -10000.0. */ - FMOD_DSP_SFXREVERB_ROOMHF, /* Room HF : Room effect high-frequency level re. low frequency level in mB. Ranges from -10000.0 to 0.0. Default is 0.0. */ - FMOD_DSP_SFXREVERB_DECAYTIME, /* Decay Time : Reverberation decay time at low-frequencies in seconds. Ranges from 0.1 to 20.0. Default is 1.0. */ - FMOD_DSP_SFXREVERB_DECAYHFRATIO, /* Decay HF Ratio : High-frequency to low-frequency decay time ratio. Ranges from 0.1 to 2.0. Default is 0.5. */ - FMOD_DSP_SFXREVERB_REFLECTIONSLEVEL, /* Reflections : Early reflections level relative to room effect in mB. Ranges from -10000.0 to 1000.0. Default is -10000.0. */ - FMOD_DSP_SFXREVERB_REFLECTIONSDELAY, /* Reflect Delay : Delay time of first reflection in seconds. Ranges from 0.0 to 0.3. Default is 0.02. */ - FMOD_DSP_SFXREVERB_REVERBLEVEL, /* Reverb : Late reverberation level relative to room effect in mB. Ranges from -10000.0 to 2000.0. Default is 0.0. */ - FMOD_DSP_SFXREVERB_REVERBDELAY, /* Reverb Delay : Late reverberation delay time relative to first reflection in seconds. Ranges from 0.0 to 0.1. Default is 0.04. */ - FMOD_DSP_SFXREVERB_DIFFUSION, /* Diffusion : Reverberation diffusion (echo density) in percent. Ranges from 0.0 to 100.0. Default is 100.0. */ - FMOD_DSP_SFXREVERB_DENSITY, /* Density : Reverberation density (modal density) in percent. Ranges from 0.0 to 100.0. Default is 100.0. */ - FMOD_DSP_SFXREVERB_HFREFERENCE, /* HF Reference : Reference high frequency in Hz. Ranges from 20.0 to 20000.0. Default is 5000.0. */ - FMOD_DSP_SFXREVERB_ROOMLF, /* Room LF : Room effect low-frequency level in mB. Ranges from -10000.0 to 0.0. Default is 0.0. */ - FMOD_DSP_SFXREVERB_LFREFERENCE /* LF Reference : Reference low-frequency in Hz. Ranges from 20.0 to 1000.0. Default is 250.0. */ -} FMOD_DSP_SFXREVERB; - -/* -[ENUM] -[ - [DESCRIPTION] - Parameter types for the FMOD_DSP_TYPE_LOWPASS_SIMPLE filter. - This is a very simple low pass filter, based on two single-pole RC time-constant modules. - The emphasis is on speed rather than accuracy, so this should not be used for task requiring critical filtering. - - [REMARKS] - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - DSP::setParameter - DSP::getParameter - FMOD_DSP_TYPE -] -*/ -typedef enum -{ - FMOD_DSP_LOWPASS_SIMPLE_CUTOFF /* Lowpass cutoff frequency in hz. 10.0 to 22000.0. Default = 5000.0 */ -} FMOD_DSP_LOWPASS_SIMPLE; - -/* -[ENUM] -[ - [DESCRIPTION] - Parameter types for the FMOD_DSP_TYPE_HIGHPASS_SIMPLE filter. - This is a very simple single-order high pass filter. - The emphasis is on speed rather than accuracy, so this should not be used for task requiring critical filtering. - - [REMARKS] - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - DSP::setParameter - DSP::getParameter - FMOD_DSP_TYPE -] -*/ -typedef enum -{ - FMOD_DSP_HIGHPASS_SIMPLE_CUTOFF /* Highpass cutoff frequency in hz. 10.0 to 22000.0. Default = 1000.0 */ -} FMOD_DSP_HIGHPASS_SIMPLE; - -#endif - diff --git a/libs/fmodex/inc/fmod_errors.h b/libs/fmodex/inc/fmod_errors.h deleted file mode 100644 index fdb85984b..000000000 --- a/libs/fmodex/inc/fmod_errors.h +++ /dev/null @@ -1,123 +0,0 @@ - -/* ============================================================================================== */ -/* FMOD Ex - Error string header file. Copyright (c), Firelight Technologies Pty, Ltd. 2004-2011. */ -/* */ -/* Use this header if you want to store or display a string version / english explanation of */ -/* the FMOD error codes. */ -/* */ -/* ============================================================================================== */ - -#ifndef _FMOD_ERRORS_H -#define _FMOD_ERRORS_H - -#include "fmod.h" - -#ifdef __GNUC__ -static const char *FMOD_ErrorString(FMOD_RESULT errcode) __attribute__((unused)); -#endif - -static const char *FMOD_ErrorString(FMOD_RESULT errcode) -{ - switch (errcode) - { - case FMOD_ERR_ALREADYLOCKED: return "Tried to call lock a second time before unlock was called. "; - case FMOD_ERR_BADCOMMAND: return "Tried to call a function on a data type that does not allow this type of functionality (ie calling Sound::lock on a streaming sound). "; - case FMOD_ERR_CDDA_DRIVERS: return "Neither NTSCSI nor ASPI could be initialised. "; - case FMOD_ERR_CDDA_INIT: return "An error occurred while initialising the CDDA subsystem. "; - case FMOD_ERR_CDDA_INVALID_DEVICE: return "Couldn't find the specified device. "; - case FMOD_ERR_CDDA_NOAUDIO: return "No audio tracks on the specified disc. "; - case FMOD_ERR_CDDA_NODEVICES: return "No CD/DVD devices were found. "; - case FMOD_ERR_CDDA_NODISC: return "No disc present in the specified drive. "; - case FMOD_ERR_CDDA_READ: return "A CDDA read error occurred. "; - case FMOD_ERR_CHANNEL_ALLOC: return "Error trying to allocate a channel. "; - case FMOD_ERR_CHANNEL_STOLEN: return "The specified channel has been reused to play another sound. "; - case FMOD_ERR_COM: return "A Win32 COM related error occured. COM failed to initialize or a QueryInterface failed meaning a Windows codec or driver was not installed properly. "; - case FMOD_ERR_DMA: return "DMA Failure. See debug output for more information. "; - case FMOD_ERR_DSP_CONNECTION: return "DSP connection error. Connection possibly caused a cyclic dependancy. Or tried to connect a tree too many units deep (more than 128). "; - case FMOD_ERR_DSP_FORMAT: return "DSP Format error. A DSP unit may have attempted to connect to this network with the wrong format. "; - case FMOD_ERR_DSP_NOTFOUND: return "DSP connection error. Couldn't find the DSP unit specified. "; - case FMOD_ERR_DSP_RUNNING: return "DSP error. Cannot perform this operation while the network is in the middle of running. This will most likely happen if a connection or disconnection is attempted in a DSP callback. "; - case FMOD_ERR_DSP_TOOMANYCONNECTIONS: return "DSP connection error. The unit being connected to or disconnected should only have 1 input or output. "; - case FMOD_ERR_EVENT_ALREADY_LOADED: return "The specified project or bank has already been loaded. Having multiple copies of the same project loaded simultaneously is forbidden. "; - case FMOD_ERR_EVENT_FAILED: return "An Event failed to be retrieved, most likely due to 'just fail' being specified as the max playbacks behavior. "; - case FMOD_ERR_EVENT_GUIDCONFLICT: return "An event with the same GUID already exists. "; - case FMOD_ERR_EVENT_INFOONLY: return "Can't execute this command on an EVENT_INFOONLY event. "; - case FMOD_ERR_EVENT_INTERNAL: return "An error occured that wasn't supposed to. See debug log for reason. "; - case FMOD_ERR_EVENT_MAXSTREAMS: return "Event failed because 'Max streams' was hit when FMOD_EVENT_INIT_FAIL_ON_MAXSTREAMS was specified. "; - case FMOD_ERR_EVENT_MISMATCH: return "FSB mismatches the FEV it was compiled with, the stream/sample mode it was meant to be created with was different, or the FEV was built for a different platform. "; - case FMOD_ERR_EVENT_NAMECONFLICT: return "A category with the same name already exists. "; - case FMOD_ERR_EVENT_NEEDSSIMPLE: return "Tried to call a function on a complex event that's only supported by simple events. "; - case FMOD_ERR_EVENT_NOTFOUND: return "The requested event, event group, event category or event property could not be found. "; - case FMOD_ERR_FILE_BAD: return "Error loading file. "; - case FMOD_ERR_FILE_COULDNOTSEEK: return "Couldn't perform seek operation. This is a limitation of the medium (ie netstreams) or the file format. "; - case FMOD_ERR_FILE_DISKEJECTED: return "Media was ejected while reading. "; - case FMOD_ERR_FILE_EOF: return "End of file unexpectedly reached while trying to read essential data (truncated data?). "; - case FMOD_ERR_FILE_NOTFOUND: return "File not found. "; - case FMOD_ERR_FILE_UNWANTED: return "Unwanted file access occured. "; - case FMOD_ERR_FORMAT: return "Unsupported file or audio format. "; - case FMOD_ERR_HTTP: return "A HTTP error occurred. This is a catch-all for HTTP errors not listed elsewhere. "; - case FMOD_ERR_HTTP_ACCESS: return "The specified resource requires authentication or is forbidden. "; - case FMOD_ERR_HTTP_PROXY_AUTH: return "Proxy authentication is required to access the specified resource. "; - case FMOD_ERR_HTTP_SERVER_ERROR: return "A HTTP server error occurred. "; - case FMOD_ERR_HTTP_TIMEOUT: return "The HTTP request timed out. "; - case FMOD_ERR_INITIALIZATION: return "FMOD was not initialized correctly to support this function. "; - case FMOD_ERR_INITIALIZED: return "Cannot call this command after System::init. "; - case FMOD_ERR_INTERNAL: return "An error occured that wasn't supposed to. Contact support. "; - case FMOD_ERR_INVALID_ADDRESS: return "On Xbox 360, this memory address passed to FMOD must be physical, (ie allocated with XPhysicalAlloc.) "; - case FMOD_ERR_INVALID_FLOAT: return "Value passed in was a NaN, Inf or denormalized float. "; - case FMOD_ERR_INVALID_HANDLE: return "An invalid object handle was used. "; - case FMOD_ERR_INVALID_PARAM: return "An invalid parameter was passed to this function. "; - case FMOD_ERR_INVALID_POSITION: return "An invalid seek position was passed to this function. "; - case FMOD_ERR_INVALID_SPEAKER: return "An invalid speaker was passed to this function based on the current speaker mode. "; - case FMOD_ERR_INVALID_SYNCPOINT: return "The syncpoint did not come from this sound handle. "; - case FMOD_ERR_INVALID_VECTOR: return "The vectors passed in are not unit length, or perpendicular. "; - case FMOD_ERR_MAXAUDIBLE: return "Reached maximum audible playback count for this sound's soundgroup. "; - case FMOD_ERR_MEMORY: return "Not enough memory or resources. "; - case FMOD_ERR_MEMORY_CANTPOINT: return "Can't use FMOD_OPENMEMORY_POINT on non PCM source data, or non mp3/xma/adpcm data if FMOD_CREATECOMPRESSEDSAMPLE was used. "; - case FMOD_ERR_MEMORY_SRAM: return "Not enough memory or resources on console sound ram. "; - case FMOD_ERR_MUSIC_NOCALLBACK: return "The music callback is required, but it has not been set. "; - case FMOD_ERR_MUSIC_NOTFOUND: return "The requested music entity could not be found. "; - case FMOD_ERR_MUSIC_UNINITIALIZED: return "Music system is not initialized probably because no music data is loaded. "; - case FMOD_ERR_NEEDS2D: return "Tried to call a command on a 3d sound when the command was meant for 2d sound. "; - case FMOD_ERR_NEEDS3D: return "Tried to call a command on a 2d sound when the command was meant for 3d sound. "; - case FMOD_ERR_NEEDSHARDWARE: return "Tried to use a feature that requires hardware support. (ie trying to play a GCADPCM compressed sound in software on Wii). "; - case FMOD_ERR_NEEDSSOFTWARE: return "Tried to use a feature that requires the software engine. Software engine has either been turned off, or command was executed on a hardware channel which does not support this feature. "; - case FMOD_ERR_NET_CONNECT: return "Couldn't connect to the specified host. "; - case FMOD_ERR_NET_SOCKET_ERROR: return "A socket error occurred. This is a catch-all for socket-related errors not listed elsewhere. "; - case FMOD_ERR_NET_URL: return "The specified URL couldn't be resolved. "; - case FMOD_ERR_NET_WOULD_BLOCK: return "Operation on a non-blocking socket could not complete immediately. "; - case FMOD_ERR_NOTREADY: return "Operation could not be performed because specified sound/DSP connection is not ready. "; - case FMOD_ERR_OUTPUT_ALLOCATED: return "Error initializing output device, but more specifically, the output device is already in use and cannot be reused. "; - case FMOD_ERR_OUTPUT_CREATEBUFFER: return "Error creating hardware sound buffer. "; - case FMOD_ERR_OUTPUT_DRIVERCALL: return "A call to a standard soundcard driver failed, which could possibly mean a bug in the driver or resources were missing or exhausted. "; - case FMOD_ERR_OUTPUT_ENUMERATION: return "Error enumerating the available driver list. List may be inconsistent due to a recent device addition or removal. "; - case FMOD_ERR_OUTPUT_FORMAT: return "Soundcard does not support the minimum features needed for this soundsystem (16bit stereo output). "; - case FMOD_ERR_OUTPUT_INIT: return "Error initializing output device. "; - case FMOD_ERR_OUTPUT_NOHARDWARE: return "FMOD_HARDWARE was specified but the sound card does not have the resources necessary to play it. "; - case FMOD_ERR_OUTPUT_NOSOFTWARE: return "Attempted to create a software sound but no software channels were specified in System::init. "; - case FMOD_ERR_PAN: return "Panning only works with mono or stereo sound sources. "; - case FMOD_ERR_PLUGIN: return "An unspecified error has been returned from a 3rd party plugin. "; - case FMOD_ERR_PLUGIN_INSTANCES: return "The number of allowed instances of a plugin has been exceeded. "; - case FMOD_ERR_PLUGIN_MISSING: return "A requested output, dsp unit type or codec was not available. "; - case FMOD_ERR_PLUGIN_RESOURCE: return "A resource that the plugin requires cannot be found. (ie the DLS file for MIDI playback or other DLLs that it needs to load) "; - case FMOD_ERR_PRELOADED: return "The specified sound is still in use by the event system, call EventSystem::unloadFSB before trying to release it. "; - case FMOD_ERR_PROGRAMMERSOUND: return "The specified sound is still in use by the event system, wait for the event which is using it finish with it. "; - case FMOD_ERR_RECORD: return "An error occured trying to initialize the recording device. "; - case FMOD_ERR_REVERB_INSTANCE: return "Specified instance in FMOD_REVERB_PROPERTIES couldn't be set. Most likely because it is an invalid instance number or the reverb doesnt exist. "; - case FMOD_ERR_SUBSOUNDS: return "The error occured because the sound referenced contains subsounds when it shouldn't have, or it doesn't contain subsounds when it should have. The operation may also not be able to be performed on a parent sound, or a parent sound was played without setting up a sentence first. "; - case FMOD_ERR_SUBSOUND_ALLOCATED: return "This subsound is already being used by another sound, you cannot have more than one parent to a sound. Null out the other parent's entry first. "; - case FMOD_ERR_SUBSOUND_CANTMOVE: return "Shared subsounds cannot be replaced or moved from their parent stream, such as when the parent stream is an FSB file. "; - case FMOD_ERR_SUBSOUND_MODE: return "The subsound's mode bits do not match with the parent sound's mode bits. See documentation for function that it was called with. "; - case FMOD_ERR_TAGNOTFOUND: return "The specified tag could not be found or there are no tags. "; - case FMOD_ERR_TOOMANYCHANNELS: return "The sound created exceeds the allowable input channel count. This can be increased using the maxinputchannels parameter in System::setSoftwareFormat. "; - case FMOD_ERR_UNIMPLEMENTED: return "Something in FMOD hasn't been implemented when it should be! contact support! "; - case FMOD_ERR_UNINITIALIZED: return "This command failed because System::init or System::setDriver was not called. "; - case FMOD_ERR_UNSUPPORTED: return "A command issued was not supported by this object. Possibly a plugin without certain callbacks specified. "; - case FMOD_ERR_UPDATE: return "An error caused by System::update occured. "; - case FMOD_ERR_VERSION: return "The version number of this file format is not supported. "; - case FMOD_OK: return "No errors."; - default : return "Unknown error."; - }; -} - -#endif diff --git a/libs/fmodex/inc/fmod_memoryinfo.h b/libs/fmodex/inc/fmod_memoryinfo.h deleted file mode 100644 index 6db9de3b8..000000000 --- a/libs/fmodex/inc/fmod_memoryinfo.h +++ /dev/null @@ -1,201 +0,0 @@ -/* ============================================================================================= */ -/* FMOD Ex - Memory info header file. Copyright (c), Firelight Technologies Pty, Ltd. 2008-2011. */ -/* */ -/* Use this header if you are interested in getting detailed information on FMOD's memory */ -/* usage. See the documentation for more details. */ -/* */ -/* ============================================================================================= */ - -#ifndef _FMOD_MEMORYINFO_H -#define _FMOD_MEMORYINFO_H - -/* -[STRUCTURE] -[ - [DESCRIPTION] - Structure to be filled with detailed memory usage information of an FMOD object - - [REMARKS] - Every public FMOD class has a getMemoryInfo function which can be used to get detailed information on what memory resources are associated with the object in question. - On return from getMemoryInfo, each member of this structure will hold the amount of memory used for its type in bytes. - - Members marked with [in] mean the user sets the value before passing it to the function. - Members marked with [out] mean FMOD sets the value to be used after the function exits. - - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - System::getMemoryInfo - EventSystem::getMemoryInfo - FMOD_MEMBITS - FMOD_EVENT_MEMBITS -] -*/ -typedef struct FMOD_MEMORY_USAGE_DETAILS -{ - unsigned int other; /* [out] Memory not accounted for by other types */ - unsigned int string; /* [out] String data */ - unsigned int system; /* [out] System object and various internals */ - unsigned int plugins; /* [out] Plugin objects and internals */ - unsigned int output; /* [out] Output module object and internals */ - unsigned int channel; /* [out] Channel related memory */ - unsigned int channelgroup; /* [out] ChannelGroup objects and internals */ - unsigned int codec; /* [out] Codecs allocated for streaming */ - unsigned int file; /* [out] File buffers and structures */ - unsigned int sound; /* [out] Sound objects and internals */ - unsigned int secondaryram; /* [out] Sound data stored in secondary RAM */ - unsigned int soundgroup; /* [out] SoundGroup objects and internals */ - unsigned int streambuffer; /* [out] Stream buffer memory */ - unsigned int dspconnection; /* [out] DSPConnection objects and internals */ - unsigned int dsp; /* [out] DSP implementation objects */ - unsigned int dspcodec; /* [out] Realtime file format decoding DSP objects */ - unsigned int profile; /* [out] Profiler memory footprint. */ - unsigned int recordbuffer; /* [out] Buffer used to store recorded data from microphone */ - unsigned int reverb; /* [out] Reverb implementation objects */ - unsigned int reverbchannelprops; /* [out] Reverb channel properties structs */ - unsigned int geometry; /* [out] Geometry objects and internals */ - unsigned int syncpoint; /* [out] Sync point memory. */ - unsigned int eventsystem; /* [out] EventSystem and various internals */ - unsigned int musicsystem; /* [out] MusicSystem and various internals */ - unsigned int fev; /* [out] Definition of objects contained in all loaded projects e.g. events, groups, categories */ - unsigned int memoryfsb; /* [out] Data loaded with preloadFSB */ - unsigned int eventproject; /* [out] EventProject objects and internals */ - unsigned int eventgroupi; /* [out] EventGroup objects and internals */ - unsigned int soundbankclass; /* [out] Objects used to manage wave banks */ - unsigned int soundbanklist; /* [out] Data used to manage lists of wave bank usage */ - unsigned int streaminstance; /* [out] Stream objects and internals */ - unsigned int sounddefclass; /* [out] Sound definition objects */ - unsigned int sounddefdefclass; /* [out] Sound definition static data objects */ - unsigned int sounddefpool; /* [out] Sound definition pool data */ - unsigned int reverbdef; /* [out] Reverb definition objects */ - unsigned int eventreverb; /* [out] Reverb objects */ - unsigned int userproperty; /* [out] User property objects */ - unsigned int eventinstance; /* [out] Event instance base objects */ - unsigned int eventinstance_complex; /* [out] Complex event instance objects */ - unsigned int eventinstance_simple; /* [out] Simple event instance objects */ - unsigned int eventinstance_layer; /* [out] Event layer instance objects */ - unsigned int eventinstance_sound; /* [out] Event sound instance objects */ - unsigned int eventenvelope; /* [out] Event envelope objects */ - unsigned int eventenvelopedef; /* [out] Event envelope definition objects */ - unsigned int eventparameter; /* [out] Event parameter objects */ - unsigned int eventcategory; /* [out] Event category objects */ - unsigned int eventenvelopepoint; /* [out] Event envelope point objects */ - unsigned int eventinstancepool; /* [out] Event instance pool memory */ -} FMOD_MEMORY_USAGE_DETAILS; - - -/* -[DEFINE] -[ - [NAME] - FMOD_MEMBITS - - [DESCRIPTION] - Bitfield used to request specific memory usage information from the getMemoryInfo function of every public FMOD Ex class. - Use with the "memorybits" parameter of getMemoryInfo to get information on FMOD Ex memory usage. - - [REMARKS] - Every public FMOD class has a getMemoryInfo function which can be used to get detailed information on what memory resources are associated with the object in question. - The FMOD_MEMBITS defines can be OR'd together to specify precisely what memory usage you'd like to get information on. See System::getMemoryInfo for an example. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - FMOD_EVENT_MEMBITS - System::getMemoryInfo -] -*/ -#define FMOD_MEMBITS_OTHER 0x00000001 /* Memory not accounted for by other types */ -#define FMOD_MEMBITS_STRING 0x00000002 /* String data */ - -#define FMOD_MEMBITS_SYSTEM 0x00000004 /* System object and various internals */ -#define FMOD_MEMBITS_PLUGINS 0x00000008 /* Plugin objects and internals */ -#define FMOD_MEMBITS_OUTPUT 0x00000010 /* Output module object and internals */ -#define FMOD_MEMBITS_CHANNEL 0x00000020 /* Channel related memory */ -#define FMOD_MEMBITS_CHANNELGROUP 0x00000040 /* ChannelGroup objects and internals */ -#define FMOD_MEMBITS_CODEC 0x00000080 /* Codecs allocated for streaming */ -#define FMOD_MEMBITS_FILE 0x00000100 /* Codecs allocated for streaming */ -#define FMOD_MEMBITS_SOUND 0x00000200 /* Sound objects and internals */ -#define FMOD_MEMBITS_SOUND_SECONDARYRAM 0x00000400 /* Sound data stored in secondary RAM */ -#define FMOD_MEMBITS_SOUNDGROUP 0x00000800 /* SoundGroup objects and internals */ -#define FMOD_MEMBITS_STREAMBUFFER 0x00001000 /* Stream buffer memory */ -#define FMOD_MEMBITS_DSPCONNECTION 0x00002000 /* DSPConnection objects and internals */ -#define FMOD_MEMBITS_DSP 0x00004000 /* DSP implementation objects */ -#define FMOD_MEMBITS_DSPCODEC 0x00008000 /* Realtime file format decoding DSP objects */ -#define FMOD_MEMBITS_PROFILE 0x00010000 /* Profiler memory footprint. */ -#define FMOD_MEMBITS_RECORDBUFFER 0x00020000 /* Buffer used to store recorded data from microphone */ -#define FMOD_MEMBITS_REVERB 0x00040000 /* Reverb implementation objects */ -#define FMOD_MEMBITS_REVERBCHANNELPROPS 0x00080000 /* Reverb channel properties structs */ -#define FMOD_MEMBITS_GEOMETRY 0x00100000 /* Geometry objects and internals */ -#define FMOD_MEMBITS_SYNCPOINT 0x00200000 /* Sync point memory. */ -#define FMOD_MEMBITS_ALL 0xffffffff /* All memory used by FMOD Ex */ -/* [DEFINE_END] */ - - -/* -[DEFINE] -[ - [NAME] - FMOD_EVENT_MEMBITS - - [DESCRIPTION] - Bitfield used to request specific memory usage information from the getMemoryInfo function of every public FMOD Event System class. - Use with the "event_memorybits" parameter of getMemoryInfo to get information on FMOD Event System memory usage. - - [REMARKS] - Every public FMOD Event System class has a getMemoryInfo function which can be used to get detailed information on what memory resources are associated with the object in question. - The FMOD_EVENT_MEMBITS defines can be OR'd together to specify precisely what memory usage you'd like to get information on. See EventSystem::getMemoryInfo for an example. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - FMOD_MEMBITS - System::getMemoryInfo -] -*/ -#define FMOD_EVENT_MEMBITS_EVENTSYSTEM 0x00000001 /* EventSystem and various internals */ -#define FMOD_EVENT_MEMBITS_MUSICSYSTEM 0x00000002 /* MusicSystem and various internals */ -#define FMOD_EVENT_MEMBITS_FEV 0x00000004 /* Definition of objects contained in all loaded projects e.g. events, groups, categories */ -#define FMOD_EVENT_MEMBITS_MEMORYFSB 0x00000008 /* Data loaded with preloadFSB */ -#define FMOD_EVENT_MEMBITS_EVENTPROJECT 0x00000010 /* EventProject objects and internals */ -#define FMOD_EVENT_MEMBITS_EVENTGROUPI 0x00000020 /* EventGroup objects and internals */ -#define FMOD_EVENT_MEMBITS_SOUNDBANKCLASS 0x00000040 /* Objects used to manage wave banks */ -#define FMOD_EVENT_MEMBITS_SOUNDBANKLIST 0x00000080 /* Data used to manage lists of wave bank usage */ -#define FMOD_EVENT_MEMBITS_STREAMINSTANCE 0x00000100 /* Stream objects and internals */ -#define FMOD_EVENT_MEMBITS_SOUNDDEFCLASS 0x00000200 /* Sound definition objects */ -#define FMOD_EVENT_MEMBITS_SOUNDDEFDEFCLASS 0x00000400 /* Sound definition static data objects */ -#define FMOD_EVENT_MEMBITS_SOUNDDEFPOOL 0x00000800 /* Sound definition pool data */ -#define FMOD_EVENT_MEMBITS_REVERBDEF 0x00001000 /* Reverb definition objects */ -#define FMOD_EVENT_MEMBITS_EVENTREVERB 0x00002000 /* Reverb objects */ -#define FMOD_EVENT_MEMBITS_USERPROPERTY 0x00004000 /* User property objects */ -#define FMOD_EVENT_MEMBITS_EVENTINSTANCE 0x00008000 /* Event instance base objects */ -#define FMOD_EVENT_MEMBITS_EVENTINSTANCE_COMPLEX 0x00010000 /* Complex event instance objects */ -#define FMOD_EVENT_MEMBITS_EVENTINSTANCE_SIMPLE 0x00020000 /* Simple event instance objects */ -#define FMOD_EVENT_MEMBITS_EVENTINSTANCE_LAYER 0x00040000 /* Event layer instance objects */ -#define FMOD_EVENT_MEMBITS_EVENTINSTANCE_SOUND 0x00080000 /* Event sound instance objects */ -#define FMOD_EVENT_MEMBITS_EVENTENVELOPE 0x00100000 /* Event envelope objects */ -#define FMOD_EVENT_MEMBITS_EVENTENVELOPEDEF 0x00200000 /* Event envelope definition objects */ -#define FMOD_EVENT_MEMBITS_EVENTPARAMETER 0x00400000 /* Event parameter objects */ -#define FMOD_EVENT_MEMBITS_EVENTCATEGORY 0x00800000 /* Event category objects */ -#define FMOD_EVENT_MEMBITS_EVENTENVELOPEPOINT 0x01000000 /* Event envelope point object+s */ -#define FMOD_EVENT_MEMBITS_EVENTINSTANCEPOOL 0x02000000 /* Event instance pool data */ -#define FMOD_EVENT_MEMBITS_ALL 0xffffffff /* All memory used by FMOD Event System */ - -/* All event instance memory */ -#define FMOD_EVENT_MEMBITS_EVENTINSTANCE_GROUP (FMOD_EVENT_MEMBITS_EVENTINSTANCE | \ - FMOD_EVENT_MEMBITS_EVENTINSTANCE_COMPLEX | \ - FMOD_EVENT_MEMBITS_EVENTINSTANCE_SIMPLE | \ - FMOD_EVENT_MEMBITS_EVENTINSTANCE_LAYER | \ - FMOD_EVENT_MEMBITS_EVENTINSTANCE_SOUND) - -/* All sound definition memory */ -#define FMOD_EVENT_MEMBITS_SOUNDDEF_GROUP (FMOD_EVENT_MEMBITS_SOUNDDEFCLASS | \ - FMOD_EVENT_MEMBITS_SOUNDDEFDEFCLASS | \ - FMOD_EVENT_MEMBITS_SOUNDDEFPOOL) -/* [DEFINE_END] */ - -#endif diff --git a/libs/fmodex/inc/fmod_output.h b/libs/fmodex/inc/fmod_output.h deleted file mode 100644 index 2ffb867bd..000000000 --- a/libs/fmodex/inc/fmod_output.h +++ /dev/null @@ -1,93 +0,0 @@ -/* ==================================================================================================== */ -/* FMOD Ex - output development header file. Copyright (c), Firelight Technologies Pty, Ltd. 2004-2011. */ -/* */ -/* Use this header if you are wanting to develop your own output plugin to use with */ -/* FMOD's output system. With this header you can make your own output plugin that FMOD */ -/* can register and use. See the documentation and examples on how to make a working plugin. */ -/* */ -/* ==================================================================================================== */ - -#ifndef _FMOD_OUTPUT_H -#define _FMOD_OUTPUT_H - -#include "fmod.h" - -typedef struct FMOD_OUTPUT_STATE FMOD_OUTPUT_STATE; - -/* - Output callbacks -*/ -typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_GETNUMDRIVERSCALLBACK)(FMOD_OUTPUT_STATE *output_state, int *numdrivers); -typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_GETDRIVERNAMECALLBACK)(FMOD_OUTPUT_STATE *output_state, int id, char *name, int namelen); -typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_GETDRIVERCAPSCALLBACK)(FMOD_OUTPUT_STATE *output_state, int id, FMOD_CAPS *caps); -typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_INITCALLBACK) (FMOD_OUTPUT_STATE *output_state, int selecteddriver, FMOD_INITFLAGS flags, int *outputrate, int outputchannels, FMOD_SOUND_FORMAT *outputformat, int dspbufferlength, int dspnumbuffers, void *extradriverdata); -typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_CLOSECALLBACK) (FMOD_OUTPUT_STATE *output_state); -typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_UPDATECALLBACK) (FMOD_OUTPUT_STATE *output_state); -typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_GETHANDLECALLBACK) (FMOD_OUTPUT_STATE *output_state, void **handle); -typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_GETPOSITIONCALLBACK) (FMOD_OUTPUT_STATE *output_state, unsigned int *pcm); -typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_LOCKCALLBACK) (FMOD_OUTPUT_STATE *output_state, unsigned int offset, unsigned int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2); -typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_UNLOCKCALLBACK) (FMOD_OUTPUT_STATE *output_state, void *ptr1, void *ptr2, unsigned int len1, unsigned int len2); -typedef FMOD_RESULT (F_CALLBACK *FMOD_OUTPUT_READFROMMIXER) (FMOD_OUTPUT_STATE *output_state, void *buffer, unsigned int length); - - -/* -[STRUCTURE] -[ - [DESCRIPTION] - When creating an output, declare one of these and provide the relevant callbacks and name for FMOD to use when it opens and reads a file of this type. - - [REMARKS] - Members marked with [in] mean the variable can be written to. The user can set the value. - Members marked with [out] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - FMOD_OUTPUT_STATE -] -*/ -typedef struct FMOD_OUTPUT_DESCRIPTION -{ - const char *name; /* [in] Name of the output. */ - unsigned int version; /* [in] Plugin writer's version number. */ - int polling; /* [in] If TRUE (non zero), this tells FMOD to start a thread and call getposition / lock / unlock for feeding data. If 0, the output is probably callback based, so all the plugin needs to do is call readfrommixer to the appropriate pointer. */ - FMOD_OUTPUT_GETNUMDRIVERSCALLBACK getnumdrivers; /* [in] For sound device enumeration. This callback is to give System::getNumDrivers somthing to return. */ - FMOD_OUTPUT_GETDRIVERNAMECALLBACK getdrivername; /* [in] For sound device enumeration. This callback is to give System::getDriverName somthing to return. */ - FMOD_OUTPUT_GETDRIVERCAPSCALLBACK getdrivercaps; /* [in] For sound device enumeration. This callback is to give System::getDriverCaps somthing to return. */ - FMOD_OUTPUT_INITCALLBACK init; /* [in] Initialization function for the output device. This is called from System::init. */ - FMOD_OUTPUT_CLOSECALLBACK close; /* [in] Cleanup / close down function for the output device. This is called from System::close. */ - FMOD_OUTPUT_UPDATECALLBACK update; /* [in] Update function that is called once a frame by the user. This is called from System::update. */ - FMOD_OUTPUT_GETHANDLECALLBACK gethandle; /* [in] This is called from System::getOutputHandle. This is just to return a pointer to the internal system device object that the system may be using.*/ - FMOD_OUTPUT_GETPOSITIONCALLBACK getposition; /* [in] This is called from the FMOD software mixer thread if 'polling' = true. This returns a position value in samples so that FMOD knows where and when to fill its buffer. */ - FMOD_OUTPUT_LOCKCALLBACK lock; /* [in] This is called from the FMOD software mixer thread if 'polling' = true. This function provides a pointer to data that FMOD can write to when software mixing. */ - FMOD_OUTPUT_UNLOCKCALLBACK unlock; /* [in] This is called from the FMOD software mixer thread if 'polling' = true. This optional function accepts the data that has been mixed and copies it or does whatever it needs to before sending it to the hardware. */ -} FMOD_OUTPUT_DESCRIPTION; - - -/* -[STRUCTURE] -[ - [DESCRIPTION] - Output plugin structure that is passed into each callback. - - [REMARKS] - Members marked with [in] mean the variable can be written to. The user can set the value. - Members marked with [out] mean the variable is modified by FMOD and is for reading purposes only. Do not change this value. - - [PLATFORMS] - Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation Portable, PlayStation 3, Wii, iPhone, 3GS, NGP, Android - - [SEE_ALSO] - FMOD_OUTPUT_DESCRIPTION -] -*/ -struct FMOD_OUTPUT_STATE -{ - void *plugindata; /* [in] Plugin writer created data the output author wants to attach to this object. */ - FMOD_OUTPUT_READFROMMIXER readfrommixer; /* [out] Function to update mixer and write the result to the provided pointer. Used from callback based output only. Polling based output uses lock/unlock/getposition. */ -}; - -#endif - - diff --git a/libs/fmodex/lib/fmodex64_vc.lib b/libs/fmodex/lib/fmodex64_vc.lib deleted file mode 100644 index 77a761d3482057cfe3fae1c8ed8296e3d9273edf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 248676 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 diff --git a/libs/fmodex/lib/fmodexL64_vc.lib b/libs/fmodex/lib/fmodexL64_vc.lib deleted file mode 100644 index 6c008895c2ad15b95d9e71b75e6e34958082b923..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249370 zcmeFaePCuqbw56LE-F$*iquk6iin7)n0;YIL^jzZy9wltB)cq#glCgycf)3r@FZDw z0Ra&a5fKp)5fKp)5fKp)5fKp)6_HxC)KY7aQc9_{lv1_6{61&i?##V&@16VP*?xb2 z6!)0qp4T~Z=FHrAyRSH+))?P>zA9X(CN8io(Irm8T)D+`@c$YH-@DHBM1pM(b#tF{7R6xA%YDU1n^IHk; zyMb|nZ{8*#e%0elzzeQoF@WDNDj`uk9z{55H!d;GGi!;^(br1pKn61;l>}egMDuS^@DM zhcg2Hd6W|nzj#^z|I$wxLCj$qb^4ZH+T{7}M4pd)zlW(gY}Vw~XLZu_+{rZ0)Bs+g!i7!IKj^!lyL6}j055W4iLZ}f}Mc) zg{W5m|1A7U@T&m{n}G+!FKiRQZ$O*?;^#@=ABHYKeBi7A{&yEL0T07h1b>ToC-~`p z5*|Jb&jCMuT*5KGWSrn*r%5>L7RCuabF+kP@HfHG#S$*RgK>f@S4%kM0LBTvevgD7 zjxr92U%rn3e*gXO1K>jFB>2aZBz)_+j1vsQHi9uG;lydi2_Cyq!d0j@0oUUv;2iu- zaP3_Zo`DR4E!RnS_GH8-U9?uCreuRY2psoS& zs|Ez{cOZ@lzI};=-~5Def>WUb5WoCZ0sK1~krx0LJ}coL;d_D+!~wx4U^Br5k4v~| zU&aCPi!K(xZ@L?Q-_7FPe6^sMoy?!QufB7gz5byDz0Dd$42Z;ad z90B~xs8fQ+;cq~^@1p|vcQ0oGF51jE!K2VY@WjCqPHIQ{M2zpbiva$G!;yy8!Ty3`;l{dI-*FNVo=m zBlzTL67GA3ae`}im+<%3F;4I}o&n-NhYkS0;|dAaJPLlmJ%}%YZ=$ROBPc(?+wKz( zKL`B)fM1HZ0mSS_0{FXrguH>@qdy4X?}lvzAG%vW{M>^X0sqkc0^;W)F97&u&;^M1 zyH)^yV1fy__)^9ResQsc`}$CxJ{HH21K{tuNI)FJHvoRYK?34k(cc01l@(+CarF|uA zdl3B);26XO!Qa4MKztDB0DK;CN$|zTCES8~C-~xF625>sBDnP&2|qi6aRHCuC*Vgn zNH}hmaf099E8)!Tj1&AAu}ScD#0emN{!0Y#D}V#U&%a3k|LC6ZLXC-|6DHapljq($G8*xbR zh07$|d>xAkK8yS)05*RXa0B{2f^Y36;f4wP4Y+S!!gohmOz`C?3E%x8{sw&cNeTC& zJrG>~I|<)96LJ6_N4_BV<`ojIyPU-Y-y4u{`y(tSxOZ;}_rnH)ufYz22kw;cg?(W^ z;ERwY;57UM+<$_ETR=-S2y`v~{}@YNe7eEba91Ni>+67GSY2|jhTgm1t% z1fM!U0@_SWa4l#E?%7|$H}^q#0N258g73kH1YdbT!X04>ILv=#1Fw&)=Bv43fK+!xBXJWci=;U+cr!144xBQb&-Uxoeg<_?=P3| zneD&>zBDc2)>#${0MD&}FG4rLm!6Vv*Tb+2@bv)+cfO3p1lO#V@U3SNKY$zWk#OfF zzyoevCE-5EBKSP?6MTD0!slQBY>XL9d%1Cg*g%Umt9}v9fQVAda9sUMfu!n>zk6iq@-un#n5I_dO#Rp0Fz{^-naOsH>K5#Mq23&@^C;0I05YD)lyMPOShQ9$9-7VpY2fzoos9nNG z`=B52{v#!PtPTDGTnd>4?^`F~sPD3v;H{8NaO_nQ)@)-j!SSd|f}`(}FarGqtDuYE z*w;x|vkT|}BhwOAtp^@(Jd@D-FpCL}J6A&Q3HTc@it-Y4-Y#JseiE#PPYKpvD4}P9 z#RTj3lCb6}=mQ)Fodi9PNLY)q5Og0TVHma(v_C0f_%!?t=)YXTn=fK9!H|L@&t);e zz@-w7xPZk31JFxw#BLG>_hd1_TXvOj%!Anmx@RT4c302=4tZ3<8;%D(;B}`-SOUES%bPln-qpimf_I_}1n&YZ!CBBlaNgk(&W0TX=K)9X4*X8=?%O4t`w)u>&To_Oj;DbK zob#B3cb)|KfO9rWc=wUu1Dv}~!r9P8uo*H4HqA>oX(@{dYI{pK33W#>*)Cz?2o?*t z89xEzkVjCzO2WyA5rW!95>CcXf(=Z^iCJ{3PTcDp{;~o;~2SOfTN^oh&Ap`JIGQe$HZo*(W75e#T;gQ?HOPcM^*UPK7@S8Yf8D z2A>kl&P&*SF^dW2;Y)(;pe2}tEP@@oN|=Wo1l!sq>^Kw80Sjmg1gC72@b>FjOmOBt z5>6jwF~M1oLvY3&63)C7c);n9NpRNL5@@cH;0%-}qd6 zrn{qKWyi70>94Wj?vb^9qwVcO-5vP14)pCy+uM(a+R3f6V=WLwA_f=cTV%{)C9RyR z&-YJm5BE!d;)`Zjsq~ffp%N^WO>$Ey`|8{3Q*+@3Rq-$a1CH(<76H-U;}pJC63Hj6 zl9hyMt0a=|*3Q)%UA6gIxcA_-^^UWe7D3)=irF<`ky1q5*0;_ycJxkfoC)_sZ!gRs zSSzwie|P`j@Nr{nM>^JYBfX7w^!AOkyXmEWCu*TmjO>`3uWudPa58dWd*|jFlHpW9 zB9v_DT-X9(E9d5CWOEW6tNj@8J*MB%QsXD zW|C1EM4l;Apc=(TrRl0q)q?6vb+29BeI3V*9yiq8-rn2mG`_`3qH-@n2FldCBr&Kp z!pK7-v-R4RdV>Z*0ok`-{g+s>7!l-?YWk^a+vI=%;fL(+T^3fvL6R#{n2*pwV!hBHQXLq$#*{H0cdf;SR zRTG?4s-ec@Ok;9BD3Q8VT9uQ^R)q)UvlKSREJ`>tHz{7h1DbxSV;HK+D#}=a31zfZ zQX!k*rcw^$owKoFs4+8JZ_H2D=Rz|6Q1>eNt}xuau6uaZSZ7biz(9B3(D2|;_wZHu03}lU4n`0)gRn$qD+38)I%B1=Z^u9(%H@W%9@;j+TH{56cRTYo$oxx!Tm!hT8a+pfZ&ZFfJ7v$@gwjZC=HF@}dRWFrvSy#vWd}DG0y3T4DXxs(bwSGc9=lp4PWr2Va=O2^y=!uAzBWA`G~Vd98nkeElOm*Fsxu?f z`mJgb?r2_$^a3W%>m&8~`N`=`L2-jumsFrMCqeq4DzETB+67GuNjxyvn5<9F*Fpy` zCPU~T^|+)3A`>6AKv*(5U)Dt)Yk^4RzXeR)Z5^JOnwr_TF(}dM{HncY4L(J)>THQb z<-I0kWvUksEE`3;YsSVrxzdk=^P$VS zs$1fSB73mD-V@lc!Ha*s75PO7Sy`Kypf&!0Jenv^EJ5$6_Y&AIPOTNXa&m46v+5Xj z1)6EkKsCh+jq4^G^9!}9rZhIeOR>4%3zgtz-lo_|Z|6dzfg#<<%))d~ z52LDI(%aSE5?N#sri#bs8w*Zks5&E+sBdOw zwiCe~wES;5uo+e=TP1xcprx`&Ze7ZunaSz-pm)_?{Fg+hDrseQUD|L)s?XjwOSLL- zGZLuOW~WS8o6Omx6V6N}uBa15w$wJwFIr8qS0=#ZMeW6Dq5PGN`c%C(XR?Z%tS#7! znCyIMf|LB@+on^h74?LF>%uqwG$WB>*49VfO3x9ceEjKSl1eLoP{Z#t&q+#_^Xepw;o!w`p4zS1W z6fI3~i#o5y2ZL?J6g15Vpc30_1X(QnvKzg5i{Pa$sI-=^&D_b_OsRa! zZQ&)-6Y^HF)CFjrU}LM=J7w*3Dz!Abb57g0IAJtnB$cZnVW}lZIO~?!^8|~KK-q3! zVXM$-UTi`va9^sL7D4)}mA(hX&v;;wQe+QDlQz|C$uVW9wn$NAPihh}q)x~!H2G-9 zMhhgR<}^brQD!Lrz^0&y&6Y?O5nW4mu!jikN=0)s>_YFtR@I0X*OrY*@n3F#MFBX8xzym=5F?TTNv?D$S}Lv)JNY)|_lL)tIO>VLGyYPvZ(Bfl9F{vOT;0E!dGQ=Zl};Na;gEm5aN}Bw&;}fk3H5TS7ko( zY`7-4u^*6n^=XcuG^3X=%%x2SiZeY$Wp1au`WSs#itK7@qfD9Fdt`JsBWC5?=9yFR zg1d2YQ`cl|YGzYeEkpl$r(HG6PaX)dnCclo_XhMV#eo6m_7QpgK#|`v?4);e$870< z1B}*25_x99(Y^>F)ULYf8*2+wSdlMjR+zi9!mTb-j!oE)9m3MzKQ@4zrjGgPiF7vtTPc$2jk3KoaW2S4*P7-9h?uEuudLg8zoMvX zQUYmLs^NfjbO>`CXP!bTi8>uOBP>#o7+1(DAVaW&Ey#>)pd@JuNkbX6Xo;4mD#}Wo z!Ah)4e7|UkmhY^iYeD{_#+KNWc&te|mY=FhKtT0VKV#dI_-Ikm$Uo|JA;c-R1x;|0 z4=QNO7P$##D&g>qI(8LO#!P;-GD=HikrygjlxixLMJ9w z`BDu?%1i7YIR)~OKY}&oj+)AqX;vrK2C-QQ&(71qyi`JyXM?!%vuqW1(re||a@Iv< z*w%?R`Bk1JtF+=A!a{y=_WqYLp+4|0WYd2$qE=4L;DVJ>PEk7)8T7hj-@?}{`^tss zFjk?|J_%Hvky@RZJS;70{!C{mE7fthJ`}KUwzE{LBY?`fuGW|ow_(hcS8V!5km|ft z+A3Vq++^t9EIXBSSy$=?l~QMAMkY-OpfXq2ElTbbym=Y2^jI=U?tcj=ySp|fuM!#2 z_s0bC%d%I~?5Xpr%8dwBa_44{Qq#dLZ-vrxyVgXah$Ht#kmlqm&s4T7V;mk>_K8@l zZeN~M^54k923f??g3_d`yH&bbcJfX&y&2VukYJa31iO@RiE+I=J5ohhHDMLKx(q7+ z0Bwsc^*OYr)|9L9k*2=-^rrdELAvbDwFyqrwtA+qwKgB5P4A8vTszP;X6|5fo~|Ao z?(dKveCTnPT6eArb;;08%c#o~RS zHX*K52&tL%;@bjAL^Q{YTvgu^rqep6UX4lQL%Lo=?$iw_+&V!d>Fq72Y=RKg3DdbWojNctf+5w^C}M_$M3b$Z-RmLxa5oNS{dLlKq;+YCk0jDp;!vjfD&6usWoyT3c64*OI=gEx^$r_s_0gg zQr{?MUCL0MRDT6Gs+6it_(ja%n#FO9dDL;1z#)^94EviEAzB47E9L3{cxeezn^J}T zW<;3sS7n9^t#^NFLd}#yNikl)u3>z|r?m8zX38q0xdNvtb0CkusMVOMgl5*fw0zK* zGff}LN@c91&sEtZxA1IoUr(vAi<+WunRIuCzVx73b`PPjB!rLrlbx$CtXXmSc$BzhMHkB>>^^SGQt^_YRWxLN^ncPs=m3l4IkwQEWJI$ux5C0 z?axqe(m6PeX{`p=cNJyBhhYV9+}m;`GV{;ZSJx)$Rz@ui;dBqsoCM)P zT#;W@JDg`3Kptvd2zkKn^(z*=GAot25>uwI&2Y<`bi&d~l3>L>I>Ag-vSePf)Q>1v z?xbiiv(SktI-0If1IG|vH+|6@UlRgIx8Ms*Sn9Q2PI9C#q*$aNyCTB;zW8BRse3|IBx5geY`)s=Gj(phcuNJv zhB{bVPOqng*NzUY9ZjE&TD%~ttzcUaB!%X*M3!o|T@9QRZXkh`)&i``B(KWcq*XG> ziMdj(l)9{igEeb=@lEe!kku-2u3g6lxPuH^P5&pSBnu5&jJ(9M&f089J&{e~Y$1N? zfgXOvXRh%DbS!mvoYy+Z)aGRUhPW^>r7BzEl>j{`y&Ji~7Aj6ERZp!kaVoBoO6H2n zW7jEPlLAQh$jrw1Md@x*0C~9y){MWKmtmJ)uh^FRU5C9`7}iU`&Nb@8-6J?~-AA8( zcPdF+y7P3|J`L7F9tC*IC62c$3{Gv1Sw(XfcPp1|5n4qa7#Ui%uyJF(F*11?CKgJo zt=DR#lnU?GOS#U4=bq2z;ea*>?O!9V(%oQ3OH zzufwJ`SRW+&fmTEU*MMgQU|T#4Wke39aufs-VT~WT{r*#-O`n{`T5%T=Kn`#CNc5< z+6;=Sj)`sbiMojqv(K)yQ6+)UwXS2Jv%71gdvvsSU`_f%qb(OrEwSZ7ljGzq7cF`k z_4RK0C`5U_(%Bd;_6)92U6|Gq9|K>MIMH8J5(ImSO`~4DMH0zt<{OvgF0-?lUdkUC z?d~^U)*LyG{;cw0&7H55$~ZK&uxWC7s7CwX0@~cFt|W0Z$&KCgwF#*qS8Wp!$;6G*m6!+L7d6SO)~ zTK697#0yyx4=t6MSQz*|O+yQhjd&`z(Rl1^on&fBau#IOj^NO?!mC+!@=|5J)SMh| zG%I1{IQH(%*J(sqq0~^1f0-METOtc{Z=3L;xO$@#UDJ3#RKpUPt~)V>&^gxCJ<>Vc zJ2cumI3Tx9T8`QoqK&=qVHImZp0zcpQ*COCq^_Ktp2WuG(iG7{ZP1zpuFAG@d};>Y zmnm12ET>f9Sh+AeA@9mpkRw##D{on`9kq&B-Egg;s;SbC~i zkt!|fqd<S@FOoW_C`}$kCLEf+Wg^I-s zB^%ARDMH0LK5B+ry-|wb3X02BUG&bO`hTnjjCPOE+F18`xheo0{&}_s$+yj&s7IGX zbZP$^McIjplK1?ef~e~7y`xfP&`YU(G|s&Ew^Vpy^Qs-<`rq;xR>L#0+swWd8r(X` z%39Tz$*oA`1}8_c);XM6?>gv33f7Tr9cL^}qn4$j&B+pG?X-}UthD%qP-UaK@+L%- z$PaUw$S38B0KSM$JPy#xF)2c zt3wPouHFeM5|8f$;mJC_tkj*Lg6v0X?7^K20l7=1E}3$j@ppWS1#_vo?v&TS z1q`#&^HI=Lm07lr@tMX1-n8Y0(x%?ihwIJCNGy=*1J`NgyE=kGz7BdeE=!YIBGhN& zVs=B@iG%!>7`Yg!X)CMlhhE}j4BLIpNJ^}!FlkP;>dtgZGnx>A)mCyXuG47*EoV}u zkpuUo?e_flV#OFcW@ZC2xHa>n6$kUJoSc*1nw-W}My2_Kd~FxBNpAJ_Wv+A%P^^d8 zhR5z2~Ab5i~D=V!sL9s1Wy9X7e({zAMch5Da){Utd@)v?Hn| z@@(G>j*m~_@&gPG%BwlMqDt;^bCx!+HF7C}2I}*t&NQ}Q)VqC0n33+Dx#sxEN0m7< zr$MWlE(KVn9-Z7;pIHdXo=&S#rdMOP${fy!5U?_4;HENmJZq1zm{)u+@a=X@CJ*_vExgR!U~ zo9MTCF#W_Cu6V>Zh;$VxzkwMx#&_P!e&UrWtO3=%cKGrF=4cgQ$!loU@)nBza z#~4MdF*Y@PDwni9!V{d$0RwY65?qQSc`@?n0hfhOaVEohKc|JySX(2w~X0{tBv{|8?rREgkgJQ zy@%Vy`#7P!fRC^?7mY(ave*+uAU>yVtHNl8f9X%nJfdx|C{0pUG9-&ok{=QY?Am)_Xt=Q3EEOZF|o6&@}d z>){eR+w$2YI?LzpZ%i-e)S`JRw{+zy6Fn$xC-ZQt2o?J#c0XwEGRN5OKi(DI>2*RZ?tADHoXsIk6l>=m9vhqDlIv~A+;So$C$nd$yi%;$ zpqz?umx`UNBx=>g=gb^QV-jVV`6HVke-w5xAl8f$}lvx1c?%hw;o;_>*Jc4 zEnouD=IKoqO+8FD*5;CZh+c2UbJe>h+pTiTI-7&AC)ZyH69?vM`cT)7j`Yi zQwj%d^I3AuVw;EGOJ>VKDeZ+WkBBsd%?CnZmPl>bXS;=jyLcX31@&#RK#5d2FP`15wHM9=)0@w8aN;79!(a z7j5xDU-~4P>A6d3K9}aD zPp}r(u=*ximcw8y>Jjxdvn;j2IMi~|A^WB%{6v94zeu#jM^Tm_ym6MGT|TNA{dufh zA6pbIw?SmfM>c7}DX*L7nK^e+OqT}2KP`%srUkqCT2j^^2WwdaK?Ph6*5Xpq&^`WaaqDEIC>cX3y&GyRWEv7j5xr!8v>`+Tw#i zGqlUJXd7wqKv+JHjdXdepf^>M`)@*!OdKA*(fv9|*1nKZV&+10~lm&c<*V!XvsY>t;Cj=%K ztFknwgLgQgbEr0L2fpS}7>62ia;O!?p@sxx&{|$uB+lW0lw1yjb2y*_O-Ni%Ik`Qj z7#4xU3yBuW?>39T;Z5|4jc86EX?akwD;h^aqCH;8#kU4UoAVc6UcZST71AF>rP93Vv&8?|T=H&;Q!r_J$ zHqLK=P2q4uw<>RD#B2G%A#wPj-9h@*J0uQ2>90*qZK%1E5w>oPPV+76@-L%Xybg)O z54#gS9U@1D(C?u0Y;cGi8PX2bs<9~(m#5}71>N`+nIlKqQYyzs zmX@Q}2K|N6ScfaSbf~M(UOUv!dgnZQO|nQwL+{+W$;SLb%{gL_@MxsNgTji>Pfkwd zj8a^JG;ilZqk;4!rV)H~0&a&S&5yBWW_yRW7`z6Z<}+J3{1sr(X};d+iMn^l4P_GN za3J#1vmn|!jdJKAC68XC9C`@x&Vg7;61>9+aS6ungaq$!DxKMxkd#t;4n?Ds)_h)< zAg$N;Mz2M~EQ5CVAkrZG1vTh2pY^)$=d=iHUNMC8Eg&glU3``kCYMYnNC|1WtR#3P z_my1ANGP)0kYB=`P-M9wd1!Ke+}UXDIKU8Oc_Fu$*AQfRA$D0;QRi$5Zj)u@K!r_^ zjQ~>#Hd$5<6*F(j#+afgvfNbAV(x?@%MIN*ubf76<~`LEtB?~~b2xJ*vy?)b>B`zU zh!5E{CMW78;g%xHms2z|Bn{D`63TpO7~Xg~Csz*9xBFWY%JDwFFF z=gYLFfXXCVq*-|wng}=Ly3Y_~c@be)k`e5_sV3=uhsZ0VSU>nBftPm(AB~$<1bKdd z1e?q&M-S)|ixBN2-`O_i2Hy^#6XyB!La43{P?fy!1U!KFz{aOCSRqKDXGXwwoMeTK@a9jkPH z+O$Nn(f%fRfq4#DS`KM*2=a|`$kK9PPqst0N|oT#oUovfGr^}h)1wDlof$h=4c7_+gtfjZDPqsiBf_CX9EwTB3DuDGqtwD2GKOZ62?Gpg}&jDJ6H> zl^|6JLyJ)Bz&&@_LM8}93wA$kf-tmTU$tWv3o&UM5`>`zyPq~e7+SEa;i})14Bl`; zSRrQyZ#akRb9HA&s0;#nXlS4pV@M3fQd5&e>fj6q^yP9mIGck~k5-d$Ex25~&1u-u z`;=6ax_HAmvU%oIEM#n)+|-2|H)fo@XrgRsyy1j3IjWL~M+FZy=4 z3L`9(p@;rFdK+cvA>Wr+m3)IT^blemW^Fepo8F&#RcS4x=7HnYEtHf;e68O{;pg^d z1eZOP8!RMzlUk>T(OJA-b0H_nMR*S2o7^Qw!(^ddJ{U_WNU}N!%J8O0 zGW>W;DC4(DGW?1eX5b+3{N#8&*9;G(D-9u_Xh@X1Y+%ZhA#!D)xaBf3M6QfPg@2vi zV~a)T%1TsOBvw=zSzba{7VOIQ!bU)Xb-5t8fGfeeT#z(&ZVcxnsUW2O(0l z{xp`bSa_Ec%6$pYaN76`rdm4M+;Yy=2R_RiYrZFbE5<$+-VA% znG3&=fcZn_`6HBMN(AiCSpF1P)=tdkK>jnKu% z;ugqW+|jNtfn8$X$=hnNE4Sg&LGgW7HRIi@LMF#NMFsP42PXclbF6EPF!J5%$?4jZ zSq5uQ8Rw7Z^qsxU%W&=>)tOy;CQo_JHKbM8otsEQ8S^hAttcUNA88QxqOK%usRp~w zdZ#gGfdFb3Gmyt-_|nkR77nbhA^tPAEk^f%UmI$~;ML&;m(h&6=s1 z4Yeu#IRjlE{uDz=Mbf7&S&WpG(hcJFSGu`Yyhp24cU(3TTQ}cVXVkjZ&~!~kS8vkK zDbe|KS`x+{LK5x6YR2etKCMaH;&9}foFPkc2nIG2y<2C|233z%9DwWOfM&FT&EEA! zy6Ppe1tL9Pd`sF`h@q>x5TF#Js!I|}I@D;!29_r6W*mdB`MN`5Qc?@F*x!PyYJRUs z*=3(@q-#P&p;T#ABDHgaETcqJEZpL4c*B0~e@m9FSkbm*>6@0UaG$rSKi|0gjmsqJ zq}{&G8C%!G+4)CtcK6Yo-E$6SQ=j7Oj9p@O@&`G)?2nvXdM;Z|CgnKZ)5BpXTg$zvb-8?VL6KB4!VKjkEjq zj@f?r`RhM$Ht|l*);}+1PhST7pT_Lkn>jmt59s_nXVWi^*-yU&xjbf9yc;(B8qXTw zdzQ0v{+YAO$2fcP-#FWEBWGv+3-C40e)t5Qoy6JAPjdFq2F`B(cg~*K#M%6Ra<<17 z;C{u~>n1t7`YF&(aK`cT5d6GofwM;kIeW>EIBWkgXZKE{d~=-b1;^a^SDZa{Hu#?t zGZ@3#SmnQW1QV`7RvJ( z*u9Oji-$P7<8su)mC$ht>IwFZ{*beMULLdiVZ&h;a(2=`a`xPBLEbPb6+W6ik+T~g zL)ot4?0UdUP`7to3z}y*yAD1%8U8$BhO_-qFWc|r?BRdnYHzU|`FAvecHn<;_5ft;u^(dTdz?M;e&BwAa-qC?{SEwg5b6Z+#H`~ZwGyMDO zuON0&FNeJX?G18{`T)v}`dz(S%yz$yv&Rq{=beVQJ{|V#fNlT7*(&@z5$$dNmq5?$ zh-v&h7;=vM4g4_=+TU?@!6;%L{yk|c%DoTT;9Z>E|KGr){?7Ob;ukhdU5!|~5oG~9 z0e!bX-#+V+EB*mCAokDuYsAJ{&e~stHt{st(IlRu4IYm+co^F1bRBK=Kfn*%2`57z z^c;XX*!TnZ;nR?XHaB!OXBW=G&tFB{eiUsFvAOMT#1Z2Bj^p8X_F?{lN#QF0P(^qhI6MpUq8y`YlT=spm zsY}ofreoH(HD=e~=Uw=D{!GmF0{r|m_!RK$j+j05aro|TceHLvP z@bC>W+wEJ35&WFL54rWb@cWlz_Cx%95{X)+5--pfj#O&%% z!JcoRUhwk({JiE`#4n!j13h~~&;8Kzz*o?=?}*uXkaZ?(Y5yGJ|I^3^(0?$>@)G>M z4m2wu`>;>q8Dud+dYw{X_53iUR{M-Y7A8{qhe+lXmKW}?~%$@R6s4$pVN^J)CO9)C07AMQo}a~$FUKaU@c z+3lTxb+C0c%DEo((u0`A&!@n*3+Nuf-``z}a&<%gFygQs@r0k3_oHs!3>bpEBjKBY zm|buLc=2;L{M>U8b^8{S{TRquiJSeP>I}db^cEE3tcVi!7 z4zg#VXCs~sqm0Y(tP6H_!OoY#&WB<5iY~+n?79g*PeZv@qukfP#=bYktY<08emLlt zf$mL^u>}6d^WVM}^?Vrk+knH*lMg{XgYJP9@bz-U%AxQd;BfrjgJ)-h{-yHa zA9$X99m<4fkAm-bJULB~7s96z5u3-Zo`jI;4K{d@=f z{qC4ObS~-=_5U>fe(ao>odo*L_<1C7>wtR}^bc)D9@rGKr6-~N)lfeCY@bBzO+X)D z-8kyL4xgNidI0_+{A3%DTecuhH^MidoyYHc;P(STcP@VZXewrpgXSs7WxzG?`$>3q z0(9L6c@HC=?t2?_jG;~8=iMj5e<#H3R{XsRzdwlI?_7ZV8RWH75D&A6)dq6WsgN@V zJMr@b{C&+f=mzfM?XYtm&++qT!0);PGVpgB@Mq%pF38#lIoH1(ZQ)GhywgDgpWSf= zVhVphh`-Oq-%EjCg=fn#Mrj-jKMbPZpGMAq4f4k6$kBfZ8jK6}e?R(&{bP0r`v3N? zg61rYNd^G@=tJ@ID*U_)x%#?woE>xmXQw}hu{-#k{44yc{3hPPPG)b8>TH31fIY~f z=*7_?(Ovv?(Tk$jM{A0+%i`$syo;U9UL73}ZDq@%gW3L3H~S+yGHPd&?C|J9 zb}QSP{hB??o?-vRzQFHcd$FUV-spC|iM=xFVeet5vt8J}>>KR)tdIRQ8(=?X2eIYR zq0v9GU$76dV_1W|pS^%x%Wma2vA<{k&W59}@#nFl*k7@S*-zL{*?#P8?4Q^cb~pPM z)*lT<2S!uuKiNjMgPq3CV^6W&qD$D5?3?U+>|S;sJA*xkJ7y^Fn@ZDxD0 zx3Xi|pF}T+E@zjr%h&=bqp`xEv__C@|V_6YkW zJ0`k~-^TWf_GD|>KeIJ#hP@`*Gg`$~N1g1bXxHcq?1*Tboy2Nv1H%<3Y-zM4`Znu| zx}!a!KaGaj9J`o(ihZ8_jQxsjXE*Y9vQM!4+3VPKY${{Rewt^k?i`_9AvXTgRRkeVBcS zy^?*5y@FlO4vSvJRzx3VA7{U1zhmEF?_e)wf5CQ%_Km*AzRm{OEPEf@ja|cT;Wx6s zWB~VHJ+nt@ro?y?9ZeeeU_KI%ipW}Ue4SzEqTKFPQ6lX-*B^RxNe`3!$2 z-^!=?X?&LN;HUF#d^10jpTjrtDSj$Hh0pP`@FK9l-@(t|qtUu(Bw8D-kB*Hl;veQ0 z^H1>i^AGV4@DK8j@{jP3@vHg!_*MKeeks3%U%@ZuSMrbZw?@ZD$3@rj>-lH-b^Hc? z4gVznH2)O;3}4TW=NtJ6{3JfkYkUJ=$Lst=zLp=$kK=FU6Z~y_jQ>OQ^XPlg_oMGb z--`Y^`eF1~^mz2k=+Wq3qJNJ5HTtXQN6{nEkE6ed{x14K^!L%vqHjb$iT*A6c63kl zaCCR{x6yZ_2cr9Xe>HCx+vNn?T9`feJ;8wx-q&rx-Pml+8mu6T@p2-4@DP7cSY}u zE{o2Jz8HNuT8KUqeLT7<`a*O|^!Dh?=xxz?(Yew2(K*q3qM2we+7eAfTca;U8>6p8 zUyV+TPK)NFPeq@MHbs-sDbahQuSMIU8=`ka5yQCt|8npD<=+3xz5kbc|1bCcujbyE zrB^xJRUlgCNK<4NIGSG%3SY%(!A=JKv3RuxQMeHVs~OmZis^ne+3##g#bc~%q{N9; zk5Ut<(^+OK1U%i36PVITgcMkyRJZ zWZ@mz$=aVXnL;Qiq-7m}e5|W`q;t4;XtZ~5KvX`|s1_-_CKeMxr@tZ=AYN6IUkV*g z2#|5?a%u@v=L*2QSnK&;mb&uZEWO!tDku@Xt(gj$iszK4)BE)iJkc3rT=mIBuT!ExT;~e`1Mo0f-Jt`vy=Qa;a=-op1@3fr1I8;IUR?iY-K5W zY@m%AO~OMb>dKg?!KtnQ+g0q{uX^iQVUpBwr1Q71AT3BmYjN+A=?BDj)oEA7vMwC3 zs9X1)HDwvO#t6fJM11oiP*Q(eQZBN^u**hLTrh{(z9=nFxrq(!V?3Y_j;qo*5<~1M zmWLCU;<`O~<5r-FV*?Os)t7zwSD=V~Q=;rw`2t!gWmh+X+N?TrZxRf(D5>)le~6d+ z6KnXia+2@0p=5UwR;@`Q(@g{?ZT12UlexoVUS}_J`6q zqk8qmkl3TIE)4UG@uzi_U|{u=B{H=dm(b9EVdKVnV`TEQkbyfy(AZWR0e100wJ_6r zb;<@CeMhc>+2Bb0mSPV{yHs?qjPh6jYnHpdv9>TZKNrx15XrW~G-Fs7=d$9S^$?fo zm#gl+j^oVRRqqnj4&_JT!Ya&Ea|3rCH0V2V0esYUM2z64+k4=Z53hQT9dx=qP^Oq8 zkSTV}+TJdYpko6ittJyak`{5Q1Fczp{wC;EM7w2h?Lb%Z0_;3pJviLofyot$9oqd% z`95=Kr6lv{A)oFtlL1Re)TbtnC=|^IR7d-171mGW~y5!7!k~obt3t4QD5|$F7 zI#S$45a@?~?L7HSsh~#EOD83$y5+?Lo@2htpi@AE;J0%Q zyf{E$p^GC}*F|!ln!dX%T!xM)%GYa#2iFdbt?KUSSl3Gv>MBUBTNZ+5=i#y*Jse67 z+=kRw=(#v*I$6o3>9R@jCCROMsbOutN%^`TE6U4@6s?b>dCzt>DZBh-wn@RInPxF^ zcUI_?4`!-c-HP*I)c(*z2KQS?2__NKX*~V9TAbf>e<7BWOY09h3`6D{YvtWCjWmpn z#E+>rWhPz?=yPaAEs1iTPM5@t*{J$N5L=>iKGZK}E{Cp$)V?eYL73<;uC7hgEi*&- zwXJkbV->w!+BbqR#F-wB5Capo`uwRgjV-ttWBZP8kQ!ZUNsY4<8a) zh7L_FY?_=7@u(U{4fU;EgPj9<;nx9weGi(gv|9PY(`t4~&dudbN~iiD_&oz5f?UM zgDv>yPRc16+`;v?1f|8)9 zQ<|GgTqNZn$>=Nnf(7Z+=G?&-#!Ys(>%+QHs81#8N-GHxGwWm4C_~=Sa+Ry^Nd_u6 z$-kg0hb|));!}al*#)KSsRGmfF?bVhM7Bn#|BGk*jt$+wzH>W zV4%Ct8yG3+#G<>mUb)@e)yMOO|_Uq-rtM_ zsn1Mv3f@KButZ}KA!8UX>p>CKV;0+;TffUjCEC>}h@NRT-H;NbChr4UjYpVSHc-MU zEI82q0sN;UQGGv}rd5I*;u_;DT*4Od4ZgrWrN5`gio4aTN5_us9q1Z7*32BI<&_2> zyd5qysI=wc#AeRQI|YpU7dFWDP}(YV!%7zGD(q5M%rf_;HhNN%&~Iz9`wW<^%1DCi z<(N$m1f_ciH=K-^2n-0(>SZ!ZTD!iL$HN1ND`(T2YJa@$b_KCUWn;u-$Hako#kW-VO% zkYSTi8#LhdDGiL%j6%WJY}Ev%SC6&HwtPxM75ucW)|eDuw+@>=N;ZGuWpEB3#SZKK zbb6B?H42P;{i^LUg?Ki_8C)ZpPk+xW)X*M1#!NE?8Jpz}iUM@9G#Z(lp42yI7QG7h z(5!)o)k(8IFklb`COHC|oRjZVVp6ws=uADQ=2PE24)mqunwqIi=tdtDVXM~bp5Cy@ z&X6R@*_ALkV#|yO*QuHDE#=*WSPCT9(wvFh6i1AdV#{lh4v*nFZ1L$%-${;u@Ja8g zqL9!cGyA(r<%tHM*{$ivYK$`FX5Vp3rQi%w$cwHvFguDb)zGj0v)xoNzX%`AVtpg5 zj@2+gy|ZJe-o0Mz!c#NV;v@z_NAGu0JEKUx?10LnC|83NK=*w@K~@LO>P>Xj=4<6a z4&L>YKSaA|h{>ms`C20=?~vZa5c0bgFf$v_L`05j)HmUj3wDg+eQP{`2|8sQbz+BT zXXebJoDZAU1bJ4VEY?)LhBKootCof$HU0+9oe>Y&P_W`?lbZY%NMAnwv8BtJ z3KT7fE0wc6n58lFk$^C#wBU0BsD-)ue2BU^e4Qh725UVcMg;F%y}l)^nTh5FQ+!=P zQFxfN=}ft$1(gRvMoz!TbwUt^{w+DtXM~MZIMIisO)V_TTNgV^y1}t|}J-L@SQXg@%7KqB5Cq`N65r>=<6Lph1b{F7ct0XDr zQlDC^SSHY=!D~$U=+p#LvV*;vtr@=3ENEF<<(ytpUBfd|Q!^Vkny-eG7ZaBr&=Rle z3FVqWdpjhW;+r;DF3fI7YTQ*}c|{FT%&9-ROCqr%_`IL?M%ZCLqoTq|zcf#I(o8s7 ze#Q@ND(qyPvB5+~KseiXVx(fk9Z`;TcJ%eF>gYV$?69FLHB|K(jpZSfRXB3o$Y^(e zd%F$~@n^BR%{6?LaY{C~kU}OSYsn+u3gKA{xhl;+_v+-YziU}GU_gt>ummJEi>c}J zS#p3&g%k&^Dx^fZOkdSxr3zi-jVsyE=%D%bVN8$r4y+z*Z^x}HhiY$TUTcfSMmlBa zVRMy~r$W4m<2~9`u}@EhX@$im&EB$;DhP$XDkoKp0fwnGa&4CIGb*?qM2~vOz|aFK z4qK(uDLNjK;~Vnzx3mM-AF7MC>>ZsE8Zc~!Lz1`Z+VH>**bu+uVjcFBj zWhXqz_UfXBZTh@Q`>`Fas++O3i33&lIj`zcsYG#xZ*$gB7rc{EMcH6#8zX|N@-{{t z0@gfWQH5yln4N@W9b`|!v4Ah|=!uge9j5v!Zuv|2D(&|(28zvoL$&$M0bMEHkaTsc zeQ(wqmhOg%3fW_gj+@&#mwH80!Dq(n0pliPp3w*opz$s_g1YiBQ3z_hl)U zRe6EetifBl^wt@7GnccY#@fkc48)SE93Pa9g7CgAXS-8x8|sxg?8Q}&6d+7&gEHAm zNom0zD5^QNhbipPHQr{#f7&ONHbA)rN_Iby71ehFncSq$S(Gne(Bh!pW==}g{-F_U z@T}uro^k=;m&>i-PH)2~%H`k_i>@BF(h;YRw`8Fphb4I5M#k2#te-8T<}2HYkWm$B=Y+GR$SU}~xsLh^6M$ZA_Ow6#_CXP|+q=IJhJ76quEqtq)YwlG&prp+^_A|5wR zZt9w>P0eg78zoXms{}ZY6~lmzm6nj^EZWk-7>2N75c$G%rHut*C`~*eTMDSeZ8FJ8 z7Hah6At%h56(2|rBW}?rkemDjHmxy^soE4ZG}bXOfs!&WLQr^6YiPC1%*Oi(loCG@ z8tLjNKe9k;aub4|mEKDI7&?xdgGmlQ=Mo5$=KN^u2v!~ey=dj&=*`HF!bm~vP|m?x zdrkcmy2JEiWv=q$^nNN2cF?nLrhv>$8WzytMYjMed!}TJUqG4+tqO>8%RMYN1$bCT z%Ay?vIe`a^d}sEH9m=VFuocuEu(_oeK?Zho`P%oGXurw(vCANksfFhp3RoiUhxMWD zrCJZ(U4Zow%*@VC)f-~e?LoWimL39sdXh!gYk?lN5wR?mK_r(nW>9uE%_6P){W3^j z79<0^>R5xwQ2W~w(TlsRGW4lg@C@EeO?xqNPS}Go^S&8ePI4v-Y4$TqpH9|9na&3C zStfys$LdUCM(~iD_{bm%lL?7*UiC8UISEEFW|Or*g50(*&_!)u5ahIdf%CV0f%3I| zAoOBu##Q+(A6%YBjHfw`7?{H53Vcp;RTy7$6{wu%3S72L(!)%f#KTOR6wk74k{)~8 zBq6+Q5{Tk934($)nP9Polc^qm>jICjbtN4qvNGa(8iOxvw5L`lYDP-W;N+xG4loMJ>pFD^2NN#lWp0wvT2}b5T9?RT#9Bl4v0KYVi4&UU=?J#)rbM7pydK8$GG8Pl-f{}Gx17M_ zloJ?VIq}#nr>tL!Gi=45R~4Wh_To$sCf9HUw=8P^j_z7xj%d3ZjhTjgD7!m)m>q>B zINLMH({ykpnDqN`f^p4P&z(wA&rsA{i-7Z3gr_-rGj2x zYwSq!ZAu1)F=n5Ek3E?Vav7=u5ifR|Q9Fvm)mavynuQ|$Xd2I~i=K4H#!%dHiF|CafjVAl~PA z_RYh>`raE1+U@$xW4XwgvO?Z}oPMZxZF!#C!*e4#-JBDId0S2%Wi|w*wDc1JqF23> zsLbT@qs!LwkOq-z2-G|wMK9H*#Slu@j0Z>ep{49H7oMe_3j?f~USp6}ou=1n^PZQIXN40$&%sL`BKryeq_ z`9Te4Ur^(5>RnQLMLo}kDiFyq%g~B|Q_+@b@?*qfwxOkL79uiL4-Q||TaWd+aY~%8 z;=tvvxV2(6NJ$WR*_j}f5i^FV(c1XtWLK_3k56UHsUBXDcQ)!Zz3$*V%1#hCXpG!l z$wCgE>Ra#fu*oZeBTo;vJZ!R)_aH=NV3nVU`Pl$Qs)5D#wB-^S{ctM)}OV>aLJADIgj0Wx5O5zLGwA5 zG%t|iV=JEL$QOY9}j5SveV_%T*8G-Z^#(g|~Hnn?#vYThidLKEawPkOUd|P=@9lNH$ynj z`>Z=0G6)$?smJ2l1m_vO0j2vUdY0`gWJQZp>5c^bTrWndQViQC%2N#Tta)0k`=TRV zha|MDOZOo;U5%j0?P>%zb+pehM-bruvVD=n$RP0sI0y>+BH-Nx1?3w&&+j(~ne7Ph zG-r$gOkv6fzA$A2pPN<_oZ3*I_M9gPf~Oz}0xKhv_IjtKg=7l|kYwrkh{U%#8+fw? z_%+^>EeM;F6$q8uN}0Cb+xlr3s&7bf807dg-3r!<4MuEithaw?aCp?*gfKWfws9+7 z7Pt4USPtyK+P=Ol2@sQ8XUEbXt{1bZ?efln<2vZm_I^4V`WKMF17d>K6}M8~--vy^ zYy0p4EZU0Y%GZpJ{35>E#Ds1*?HzM?9UR?^@pAE}3RZNG#AWT+-kul$L2z)$o;K_W zQx}HdH}yxdHY6_%QKfQ)ih;B8n)j0-)g{YNZk@=+q%FW9 z{!`PwL03J{VU6smcxa)642g+mvZ8#iFU6sdI=5Coiyw0x9tPi6PM_la%9+u^SsIc>_*m3cQo{(amh>W9WB&u zgBpUYL6DnV**iFp{Xl(MxE`YiD50Bq@GrUgJ}XOHSy*na+NV#(nzP>dl6AixU}BH| zb}q+I*>462Q^i&E*#HoO!yq}Uy2y9x@H-A0k9LcLA>Hfcp<|^;%FEFsqp;kyR{SQf zmQLQ5(JPQu!xqP31Ij@oG!e{pxhTA?#w_N2TQ5(FrhML9IAQMwDC-Eu z2I%mTioJxBHVl-p!U}baM6qvj*Qx@$av5>@E*Q(2v^W*x1@|!-zi4TAAU>;U8%UG7 zgAKaQTwL|ol$D9ggpu|Xo|SbEYMtWeOsnZt6uy=agnOS?3-&qo2N{kieGU9kX^6tN0}bsYnp z-CZNyqoch8Yvjj35QLWPevr8~*16zFtiUkN^P)`&24ZFQvNdr7c&xQS;ejD|k~sE*~z2 z36l0`sl`!D^{pr+o8LCQk`(5#l((%T2HIsMnTD*Ai9KZw-a(R;t1x3|4D1>NA!3Cq zkl!7Mfti-UDij19&S)Ano)S_TKqvyaq(D-6>=ekTZ>%j$&4+x;4{agqPR$CNevtIT?+x9yU^|uU(PYr=seZm)1g?SZ`511HtMG= z;BbCWynx*u-0H498GMDbo74pr6u_x*x0YLRJmr*Z&D6|>+LXTMLVMreMZx#QBaVI;eUFwEN(6p~ra)=;* zLSfF-ITE&!X^|9Lr$nafM+j0KF5T-D)=P`q|B^-^xAz6T8jAztHs`iFV$3aTK|yq@ zL}~P=m(sTAU4?-~ajV*F^a?6WmRD{D3sl|P+h#5EpjJt{k`U5&dHBugr9czhbd=q7 z64uZtwu%OAQm!bHOaUQTPBa3GCpGd)w(ZKQD$Ol0(ygyVg5KI2E=k8>&MkRKfJ2E| zrkM*`ry(od0ba6^C!|h8zxi%iXf}px`K7L0l#-G}x>(s^32{+cbnjZ!AGAb)?sUB? zqKnc{J}s~)@uk^o@zQs0kd`N?W=nwW4HLavXQxzVEv#b7tFrlzHfrNrFcq6lg6Oe> z`%XwprF+_`5Z2+l{gl{(P+G^(mtxE8$uI9^XGQZhr9mJg0A9nL6 zw5I0O=#+@|cWLCc$lOfEbh)FgDOPi&wmEKjLM^<_ zWK37vmjk@6MutOuYuEG+nAwD^K>4}y@Ij#)(E426B8sFBkA!_uFH-=sQ>aOPI{Flp zeN)3>b3Q7FS=9zUO+GL(ij5OufrsYFoV_x5^^&n!_Lg7qEjjsxhwSkk<)Ra9^@l<}W*sU~~bCVtLL2u-u_Gyka?K&w9 zOZRlBo^BTi7Uw2YH9sJa=7-53o7~+Ese;PW{DCbjH7BQc=?9roVn~G>wIM0xm&VL2 zc@~Z>e_b_p_-~RAP zS-_n+ta9mjN{~}+`lyHM=t7zdwHB`oy)GBBzlQ=yC3p8Gbg}5GFzCW*vk1N+*4I7U z-k$P+SpKsnkqf$K(uRNjb$&}k$lI@xBfI3(tc{RByV_LXm(2kgY3?pqj9P^x9Lfu8 zK|QH$BWkx)*!Cn{5imxtyreorB~Bb{F|U|KdDSB_wV0!i5rr>I(cT#R=f+-g7%9wA zu3?@9bl4?MHU?%Fd;{Bx*43*=$BxApb_b7bxArtsZKkA#jOVI~4oX#_LQ^NX!kpWi zsvLF6efjI0ZlLMKVe=*$EJ9{`?-p&U27Pme?9>Bx5M<<`k;w63yGLOi6yT_kP;{;IA4~RQixhy88Pip9wu}Of}%~<>uATCR6`Z#RLUJ> zwRt%abO8GQW`{C1h1iMqP=3fbKL$LeOhQz8?Z3 zJx6(!;LZ~fGOEh8KRM1rDX+2@llx;r8W`mqKta^0JbRud z>>C|ok(%63^H=u9RAQ%;UtW^rKrAjyZ8Rn)>dU&U8MN@p&-AXvB#^Y=%$Cp6fVP^G z7Gg~-H^VNwfaF>P9V(@=P)FgD2-?`}`%S4H^?@r-$t&hEOTw(Yza$_U)R0Eakl-bz zd%ajvQEL|B3>ZR9?*?=BE07l1MV3cht{y3X&N@R)o+i5HpsO}t3+jm0Q+~3>=?!ri zkhr2Hz#-Jg&6I(iFtnJN*$^p7V`$h{z67vBzl^)i!LIJk%;{}AXK2x34c`a`c~-1# zu(-A_xS=Eor6Io{Qnr$lWiT1FU^*wuRX)1Q^2l(jq$X@E;89gNc(Zxv`sylrC=GiLzjG2fzyyRwb>nw1>zxOEto*uxzJ>UL!C~ zO!TYIJlnY<{4BKVrLdI-dlZGRs&ES0&smWl2)8+d*qIxbdh<-gLCQ{rE#umR31_=_Vun5;3BOP32MU3TWa`qHFx(&)%Vm z)p9GsJZuhLw@01c@iP^E$r-qS=I53uVJ(gNEMxfDIb0;=j`*t_obxbOIyL78L2`&p zj!;Vn9d5Z3_KIiFbTt+qKtp`cq0ZpoNR=({e27~YVTVIfJk6X8Nf}$=Oh=kCIhIlM znwaX9E1l->@K!y_;TmnPIrTPlPss{i?6`7gLajmGZz13|$)&fKM>xnUJ zlNJ!Xxl(UObGKDGyVR^bl__JfIY5qbO2>E@TgtT&@0*#Lnh2W|(BmCFY)$1zC97q7 z52<$5uEDUqhj{-J|GB=ZwDHg_VtUshSyX+$T`KqKGhgMisbXEr*=a`xsJ(jn!$Rd^ zP+j(h1IS2kTPn`J_QnAZbLnUs`mL=8wgilcn^PS;n9kQ7*7M|9uDQ#0=;RbUq`%2i z9n#`+)C$%`)K^F!kYjeWjZLooRdzKY0XWUyU63z|wj#b#pLv-9Hm2xy zlJGoMx&sCS$s*>Q#Zg+w6kAyF5~c;~`w;;nVe2J>ILEgHWxDlkcDj{}lxE69*D_Rm zxuO!wHhe;L0^d{9-q(4-e^r;YH3L{OsOp*L0yP1hUHlUWu?|6xA7Ed5?_TcP$NF6R)n{{ zOIb`N44x~p1#i3hsA@48z1$X3(0gbR0Y*&ndrt)>%eJ7t;$1+ehY3ac)K?S>r05-z zxl#r_d)i8g%|5kKN=#3b(#ZZed7~<2NCu{*q$M8GAB)QK;7C~O16g6f121Pla_uFG z!sr4)X+(ggq`cyjy4k|!XDRxislA)TQvgYl+R{--2Rr3wvOJaueVz7Jid<3dc7}Yi znc3N?dPBS!6?+2(5_?~iY zM-FFE%O_rO$7Bv~YPBba%B-Li;MEsr{o&I$V^%YAL=<*mR0^8G&*Q}vMmZ>dt|NK5 zjb9*V)R*V|#TimlY&l8;k|!x~rU!CF6{b}sB(HlDXt6sZw`U`gf)qyR-0Vfjg05_= zS8u8J6|Hwp?Rxhik&DXmn;;3uZ-%ZYze%F9{3fW%^P40q$!~(FJiiID!u%#Eit?Kv z$j@&;>kSn-HBpw`AR#w70auuufDcGOpejs23ZI{V1VLc}0!3baAyiI&0V*fI2u#k< zmA0=LlC0+)-vRND55>K1UA?2YntJLq-~(nV!Z=PRG<#sst92zR;A$ zq7vjhw+A8jgn1Bp?~w;ZN0YseXBXx@&vWaJq651&MRA?CNcdafWQFA*%~Gll@2zT* zYPdY68eC2hRa49LX5I^?DvfQuqZEfxd+(mx6B4_1bQ($n|1{ zd6{)CW3)ER&#R3p#-@kviSVK%LY_gHyrOgS3Na;X^jY3MEZ%0H4yyy=K8!fcoJEYN z!>B$C`mW-Jh$ae>;)W<_${Hew@*5(M1x-p}vvW7Hc7XP`8A1fK8BLbc9DptgJVL9@ zMP3JMq~3YtCCU#Hh%X9~wPKCmktqVzvoIuIFUN2LMs0j^a!$s>i%Rq)rX`4RSvjnnN?RcI{kklP^Y~ zM+Ha@tNO%%Z$M}YL=m#EabvwPl6t#H3Ih`HNlL#KVAC5ZELL&mEQis2(y$1h={^$6 z1wY}B^$XBp>z&C@Y}91M6`wxfgXjTzjP7*XF%o)}gynXJ&ug5*vkwfEr&LWpa zeQP2YufB@l$7g5%68}qFL7GCGOB#8%xL<=*Urv!9Ps8G_m*g^NzaE<^OjbdJN@2)K zh0c{!#R*4d;LL9SyfR>?%Le~ja#AmPBe{3fYhqASc}D#f4YrBnW?H{BYN9eT;7Hg# zTZt?)QyZcEO1#4XqX82_bl;qx)wkHH)YH6-hp9KYnaqRjvu+Q|LCawFBE?l*9tK^D;SgUYw~t6~aRxU8^GCX&346}ZBYDDVLt9;gC3JW!Q%K?%j^ zn?IM2L1ONXV@tdQEwU5tiorS$G{n(Z4kAJjzK+MQM&UCTc851UN z)=xwMr6xtQoM^zr49%g*6MDWs{h#`eq%-zr^%wo%Y#si8Y^=9`XmEJc-1;^+JZ7v0 zR)j-_q$pr^Gwgv8v-HrVR>W`-F<%u1l9`P8B4$FO%>P>vvrIpvi21bsL;a+P*-4QQ zQoApQ8M!{K?6)`RHkY)te}Dp6)qcMfw6sIDtEiM{{` zYYi_C;UDepOKuXu4^Rik1}U869SvgA1bB#eeM==}ayr}H!1fk4+o+@%ma_H%J{nMJ zMXsy{Tmp=5nPD8eivKOw^$zPfAGqEs;TnrHTb0h^9N!w&9KZZk;fT zn$|q7DdGh;Uj@}z`|vEaGTZEGUkp5NlkiMhRlH_r;OGpvdTmS#0QPv{Un92?TXI|e zZ4<8Psbl_yN1QFbaWEFF^#Do$w!Jjl8$hzRi`W`RFdla%Q%{P_@rFB&eum#T`7ZPS z_3wZ|W9iRp)(n@lpNHY6;@`JcDY%hKoCV)^d;Go`JU{aIsKQxAsie{h-N%-J$sHml z*1?nqt(J1A8>g`+2@(}nx3b)<)hz(yJJO6>cfg~Ple!~&;ZT3Sl?FJdu4S<6OPHB55jOYop&vQB=6p07*)l+2yPri?M!Ct!wkyl zp=esp(2jT(W%32_zmNC;u_iEi`8^E&u_w(}-i#w_ojZof%X?`LjJ1S&8f>Mm7X~zX z2p%imkweZdMDjqQCVM??^6?_8>CEFw__ljxzAZY0>VzuEcTJ2}xi@~ntlnIhpX{Xz zqCc9a3tG%`U0N^JW6DO5^nD_p*&8=`ss64p9M7dw(th$-`}Ha`8(Gx@YVi%N90jQ! zrE!JITXdf3x&HAZY?|ogy1Cv_6~wcVRW!ReYVwO7gj*>+lF~iQ<-qOe7Po9?rl;sA zwX`?snrOYWlFqU(1HQ*N`1%O5O>Dd9NQnn|$EIxci`<^#jox=6%v^3ejCLN^;+VNb z?#U2mXKBkTw;XQgeSFGIwJ&B~UCU4Xa2KGvq4-tgf{fQYsup9g;wPkx^)6;#dD`Je zBkN&3>mB*T2(UZR#m>ikMgwqDhHdz8thJt$a?7^1c%_y^VNfhJWyA)vVPJN0$}H`u zT={a!ZI{uuQ{2paP60x!D3dFmnzB<9BYeeH+^eit8)0KTx4?Rymhwt7g?wLv30GHf z3n-P=lP6Cz!0YrDFTLZ+!wB@bsZrr;v;>@^>4cgw$UXErMcI($5O6*t!x<{1UW36= zl*Lzgox_*(0jo0;R`F#?j|~bTCQWD_ewUL{m(C}xO7Y1bK}zgB);Y4~0gzHjXXUjE z3Bif8fo{dgxJck(0%@@CAKcbIHZU|eH8edvJhnNWeyuI1+y+V|l|tz`^e&L&YQ=d8 zZiYFhMmi=@#-0ajHmYVx9UY3-o!i5&QGAzYtGlbUYV%;{{4!^?Jqa(r_n~O#rY*CF z)t0*Gz4`>KYj46wzpmn;iMW!3Te{#smYb9E!% z_i&VQImWvqLLJ4{?1;u#!#X$N2&ZhVCU`&T z;ZZ>V333_Cc`bI)oj6ZowxbcRD_8g1&|-ym@dQhX2g}5QirJOA)J8+sx=C2kKAK&w zAB5FJt#eQm>l{-L=r#jP?|UamElJhFHQZDA~7JyQ)BFnRgaP69D2 zbl-Y`(P6Y7{+s6uGtKiPGh7`-_CXb&Vv7MXL3b-E1O&X(t^5T*QD@+9< zzYG7ZZ@$w4Qf?)tZ{vK$t=^a~H@!}& zl|JITh^>wt?VoNMpB(Ln_H&T(7HIs_wNwAeN49DcWmJeZfv#Sl_)A_X1zL8ANGw(6 z+-oFZrAjfa%C1igG+I;9w-d)SQofvqjv9Q0mCNEQ%v7Pr6t`M^ce$pVr?MKl?g0|p zwmJIqR2n9h9K&v0v1`H! zcjXLowoAnsah0pdlo3Qc%#Zm!Fg9jKF}mA!aq>9F+-aCfdBNz}JYpHu0)A)+@Fo0} z5vj&;RgYiy_{8SOW4IT-Mr#) z^dgc@N&Cqo!g4)D+fzpSE8u>0ZDN*GB?Pdp7Yt3tXGQ_+m&pZoD5fyhZlJ!r(DYo> z;;hy=BE%qMC_61yK3lrtoVc4u7iBp4zX=X2IXv8DUn!Jo8&`F{*k8<9;;e-zTS?cq#Kf}8G``W&#<)I-aTLxnesny&%`!idi~X*vH7DX8Kk`{pir>_~g!ATc`Rr55aw*>Hgsn z>X2B@+pP~XPTsj&k(H4bXJn;r6}a_!6Hb(vwb|!n-zy_6mN;_XyqHUg?7-{@c9(>&QuMf5HwQWKf>VM{0v1v|erK4E^c@ z{W_54XmE@`z_gBocLEjx?rcz%+=dsuC0U2h=uzHC}+G3NhD3f_z(_)v*=kA!y z)P~rQ8Q!A3w#6zk$fXWTj5`y0V2fM)ie%myAel@^b)UQ2ab1g1JV@B5f3D4X^`I7~ z^a00}(UMAv^AZovu!>(0^AFj!z@*GdT`D2e>k&Ia;~$b`w!Ejhpjs=q^eZVEPmFBc zJUo_8>#>Q-J%(csf;S`|nqgY69o$m~sy^i^(hPz!dsvHElv^Z;zE4OGAv31G_4*96 z!?LxToy@zLbsh6%+N=#}EoJV^^ix)on<+U{;4kN_c#ohdRWWp(ZY|M*QVxr>{ zLt|6ZFj6TxdB@WUYOvZ0_$ouyJqpe?eU#$6+-y&yikvOeKmTZptzY#XBniJm_0N}> znQxEL8G4avSXGiYNxSZBXi>JswVAd18wn%rA<=zSd2_HwggIFte+; z{-YKm5b+n7(o|n7v@-&UB=lv1PPzbhY%YhhosWP;lx!`jgPgjiN?L}q` zkk39N@-*0`PbjC` zSs_>|%k-fR!vo>Hk!Ph$<7erWspo{@5WTicJbAXs%18ZRS#ty@_C#C-`#FkZqgrqH zPj?8Sd8$yXTQE*;dv40AzKBKvHj&?5kxFiIXxq@_#$6MWuxpx}9v%wPuf^;=o|mwV zpMq;Wj_8q}M$Ql|*-mYw_QAbV@qB`zrzb~-?YIe8afX=-J++U(`Z#{$O z8Fyj_pSY=kE&XF-LnC3m71N*jQWtlxiiAczEN7;6@-oG_o{W`UQ6vq}ZOlvndU?We zYNiaWdTdAUt)!kJtdq*O%!qeZ9^zdi*av zspqzC1lJHZIk`^7H|SgiS4?q)8vH8mKbcAKHyZ4);nXXf>yivLjfBbV-`HY0(`+oy zduB|dTef68`KC?NyS5LH4UTUohLT8QCO2X7O%ArX?i{R0KzRjLrOL6o*Ti$XH=CTj z6rr7Lxjx9ZD7MB6^?vF*Y@3x>mfU&RTNS(H&^`aiR>koUvmm%>Id4n& zN&1ljuu}=5!4A*sKWwt|ELMR<*u=zZ$>m!gaWV7Q^4rwJE2>I5hRpCSvyYn0yw0Nn zNsQ^g|Cq_kGj0Wt7Sn(KagtT%`~}w&@(GKZPyI8{N;2J1pEP*2UV+49c|`^ww@tR&G?Ix83~OYN>}%#Jsp(-%l%EmBv!FzTmlWw8}9-IekWPs@IlVH|V&M7U)-i zo+GYT`?Dk`ADgs^i9IXh!9J(+@++5<;u5oBwEgo5tL^3e6+tcrWt8HY#hv1O!NJRG z9SL$`nK3K*MU$Iv<;fD6lofa9{Y%KIx=>Z82b>jd!M-&+G|GL0BR9kea$k=4q)#6B z%>^Jz@lqLa=NMm!ImHbu)dkqP<;FxTbOm6=W%gfpcFGsvWQhwnNEtn!C|OKtokap|O9*$phcdvfQSn<@pRPYEn;K zVrI|%0GTbqZDK#qlhh=WRfa>*p&ikkz~l;B^b9cgOEm_R8oeZEuLP^>a0BG}L&ZL> zJLG##C;#|g(B0RLFW@?$e}rFv&rwEczEAmN2WE-(A(Y%_G1Y({$E;@RjoGPYx#5+( z;jY~`~#Lu#v{j5J_41e6_Yc07{!ra`7pT}%#mGYAROrXMf z(puH#Wcc*;;Cp_NWrXr$?&n!V>@k%kd?60zH^6S)=Xrx@$ zI{et#Aemohx#T)mi;8@eRH!oar4P9L#^RD2`Yl3I*{oyM>9-o6+#PpeE^Ac-t|6Os zAe-OCT;^fhk#{g!m(9KE%h=RJZ~q23vR&N=k*2UGT=K5-){3A5I*cMEa&9dYn=<6{uFVlRQCC0 zQz0TO^SbPxV>V4{6U{}7bWgQyXkdDrY#0|yt;F#B3&k_vb6Ye=1MH+rOvmnDQ=V{| zT^Vmw;hubS7UWr+i?b~yRLe-kGUd*a|E6(G-@x*yx59?hq9*nG+)2#eX=b_6F$6E} zzVAO;yq1@m_4&zqtyZ6#ThZFuZbm9Wt_u542h&^;runnd!Qwo*y4b%`o`bM4DKE@a zHdSjlki$a@ca0HhD7O$t){6Z`|8B9XFD}+9ji>|Phg)&`;Od|MNqOO=kIF)&ktu=Z zR~VqwZdN~u_ItS`9T@@68~ks|c(l4OTE0rHwwEkzVamBN-9CpLidjMhVxYk-*I0t+ zpCebmo|;2bW^ij(Ej4r%z+ow`)=Q5b21|%b>hrh>NH=q{%H75g z)Wj0wPU;R%xj}ioqh5rru4Cu<%~MWE9832T`3eSGiP1DvB&F8AJ}}h6c>!06yhX}5 z%~tZMQb~b$ZMoS2w`{SBi~E9W*axqud2h# z;g0Cm2_wI2c=2Vzg_Ze`I81|G)+5yxJY`U~6FuF0E1Noqoo34SdfX&F{(g%J%0>?VOq( z8tv;-E;0Ji^JCBB)jAv?JLFz{ zE(V82`gg{r9iS75>kGWQV%Vrct4(Ki9i{Y&x$b3d1bx3p!Urk@mBhh_{LIGqawPaq z_>Dd>>w|Wz$^5)#&2UNkc{ux1>VW(4j_4#@x*Q(cG~U+-f2PM)WN{|I=YwuF84egk3Uj0>X>m%`6qT!9LW041#J%d$^xsDtQ4rfb_WNcZ9_$H`oMV#C4P& znPKGr`t>mUDz0bTZvH5nSFWhq&uUf5O7!w|2w%qJdPgU$pmZvGn>m1PmAcijxE_=7 zebQqrUc#4|mDBKgmN}&FI94&2yoeZJmDf4W8?Z~}IK|2HJw)3;#S(HCd|g9uhVTDEN+8L3_4Bc<^MKah#17oPdPo| z6+g}8u}@86&N%mIh&ZF>GO#l=hJsf^YzHsqwa&4kSb0A);gz}a!RpRXp1QBK}*a8+#bbhW$!MKhl5g$=XUW?+YJxy~uKukRr7C4;k4MxvJt^ecT~=WH`G z+0Rbc#)q)~zh<(Zqj9${QhKTB|7a%rxi0P=CjhG1tv#<^(3(9Bnth()ESt%0xKVq6 zr`Yg9p!rd2X&7B z`zhV3QNyTJVIS_0&eikK2~OyvUzRe;EsDA0vB}`(H=|n>kmFM)$AE4zPp)#bS@D!l zWF}HjsU~uDhAoPjXc}{vHyOE^Ov47RDYz8_$JfxT;xXnpz)U9Y6zcqhn{cLRfEh@f zj$PnjmAlsmGq9;ib&RWujF`-F?iG`SCxJ_}=MgVcO zfdG6Q^AU!C&vueeuCCjp=2Dv1Cfjl)Ex=*a~E{yMp1g8T2oC`l$ zfp%i=abd%1Z-E<`g|V3x-|NB-v*M2Eat27e>Ovl^%-0(S@zpEi!!^Y}bJZ%S#`kuW zy4ROdlvU9$W$wM|e;BdtBtXByiN4&dv=Mio3wNwMUl^CMubLBgc|K9`CF8T@p2ZQl zPX~F=Gx(9J6-Q^je!+!40nhp_G{fk+BTG01zP|3p$5tXk@M1k@?0eCPjLkU)uzbZG z`^MAYo3C^sLq}}%kfi}G{%Xe#qYJPbPVA`u5I<2@6rcI_B^SObDi_6Obgk*aj%WB5 zMP|Nw*@dj0geZu;))BvZV8!>7*yF@VaD#+c=hr%-N;j}Lz_Likd>a(Rn$N7kRV)MO z>nw=PO&2}LV#lT1R+ouEM7|CVueTc3;cAviYvguO4!umwxj)N+G)A!uxD4k3B>rS2 z8b@nK)Ig=n0n+d6b;MNM6F8@4pCBwb(BWU#Oj7bAt{Ou0? z##+oHNpv-#FP_I}z{|g$k^Q4+{LI9~!syJ`Kbl0>Cjl15XX40XNPJfjOuX)ntO=`s zk0p`Se7d6F%+)&|MX0wStEZBfi_6VKrJ=2~C_0nzKaD^iQ4>Il;xhj7=?>g@riKA5kC04^ zcm|1_&ZjV-#ahjL^D_x#XTe_l%{`8+;8@VHXHm$|5^Q{IP|RmjnD#bOj>+Wt&ml02 z*KN4{%yUUZV$&-BPUejBc@%0rzP(p?O&Q$hQ@F|Px1zXQJ?I4lZs?j=uS2h}9{)lD zKdFSpHx!JI59u{tbT=(IF7@NzcUrJy*3NmtB$Ic1s zA}=Fw$zqHgm9giS6R3^@2RSbDwXZO7ht&(kh9Lz-eWi_>y!KlZmDA=|nW#}Yw=PVAXKO5g_CGdt?Xt6-=8 zF$>jhUJ%DW2Ojpneq7<(A9baY}%F=AUt5hq7j_PV!kA9SQ}3w2jFzKj*}@U8mT# z8Hs=1i5p7dJr2);p6m-5bnJ)<;ZL};k}qcQpb#=sUs!;4_WoL}s8(~Q=3k;wH#O?> z2CQ^tdmMIrG|2YLSyb@V@q26rpxAmj#IG2L@#|cL5gpo#r;1-S5C@YtiV9;o&QOm6 z%&!@k#8oG`R2dujx`hWP^Tr2?^@gd8f5X5F7wx!e#y1UAcp)`%2Ij@0kYD;O8#4}Z zCa8Elxw!sq8x`&`!Tm9KC)orRe=Xw=zGL8qiRRpze%C-uKeM3ra?<^t3zINYsdPEq z?;E(uo{Mz4Qe3X``2!O-w2R+wrcB5vm=;)fB81(kbwrX&3?7OrcnD~+98rRc8|Dm>V0}C&1x4nYi2G|6~|| z5b$-4>P*F4da>3y;vZH=|HUwfANMF~Xu?G+xbNy^Jjcx$2JQD8x1iD6?m2Er;da1t+={|&yXUwy zg&N9pICKkZ@V8O8aiJJ<+^J@{X$C^M9WyoR+Zvd|3)LpfN3C9M7EI)*%$MFSMLjrF zZY<%K4mBF}M&WqCWP7()m~j&cVy+%^COlHF#qA>QU?Y=78!0B2W8BfkbRIv1#J!V^ z>l}3>#pUABoo(Du7R&6r?_!{aiS*o_<*o)I>`6PM#douj+pfiTw=p}SP4}>I18Ea? zGwq%VwKen@y;SRIbHhDK?PsmSJFbD)bFVyX^?Z3j4&3+O+rc5&j@%Ikan{Fu9N5sj znm&STe7Za$GS!#+()b~!VLJR5-i5rM0~IO}FchG=u*djhsm5`YpCg>uk@^?UdK~)* ztg#(QV+Wb~z;)jr<-m0xHHszfuyL$+t)kIGc{XM*el(3tHh4&GzyPsU`_zVj@STBI%o3RperiB{6VrnS1SiiXYT3r_ANM&J9v+!(c zE@x$$*v0nA-GKjqfcUNemg$(9X zP{v#iH(=p8wqo+HWUObfRQ3h zH)5d&+v_oLXVgLsHIanNQO8KsKzks@ddDr?5PiGcUSz^X489lPBz+-`A7(ee#GgqE zw=>z>l#LrGd*gO|(@xYW7^huXm@yM&d4ymx)~yzLCo+s}7HYr@!?E{T1@UmZj=L3J zrY)XhFg{~PiWi+zVW~I7`?Sx7b0mg%g}FN%6$3Xq4jZXL0b`-k2-a1}+4LO604mIiM9~@~*Il`X z!gd@4iZ#uV=U|u8UJ`e)0`GP=CIZcZBBgA)@4%p~h%8l6r z@XER409vf&4ljbQZeL}ikCq`bYA{gxh zxMP*(fqG*fTp75k=#&616McXadAd4ZsTZCx#$jJWU_+NhnijRwt6ocDN7-26`CD8R zc_4`!Z{&-9FBdVdvvJAMUt()wa^45IFgsAWc(4n5OL<|oRy6PBPURnBBge}d2AT0* z4|O4j$P^f#{V*GMvNBU|%*N&vB0pl#ujkQ2d^?k?JUk!0c&@~J{UcoXP)!Kr%@_-R zqzm1#p_h7>wT{YF55($6QP{8r*xf(By9(zv&dYW|bHzuySUBOOGT<`R$Jppo^|@xq zT#;G*$GXwUmSgFcb2W{}QP|51vy=U!#@0lN%JnSXK%mAItPm&B-1k17M5dm=6Mrw` zU7kRoM&(&&NkfXxee)A-bjQ)C7}ep?v2OJw8x@9QELH0ZhGL2R2=}c|wox4q;EBK0 zams>IjGtnl;sk|ue&th5yrno%D1KX$J7;*BfjUwz&#Hn#;jd*h>FES6d1NQoB!^eV zjwp)m(0u`dkZj4<3&-2H@_;i~%hET1WK>UzUHK12=#+F&6WD3zcdMm3}980{H?1 z5z30I2i4(UM@}GLNHGX`0_o6ctna>v!k(_@OGh%y++p#O>S( z=u2(6FSk*{p2#s#>JyvoK^ zDOM=UV$ff0qlZ2-VXF79vC%tJy??C}IZXAQt0=$D#%_B>`SmW$P!(k+YP`Y5j+6O` zvUSl}YFS*J>qZ+lZbs{9o$HM*79FW`y~#%JV4dsDZuB5^F0SJA76Ln5#fhsezLh}k zTqK?#|B6&hCCO zLWo19NC^D1ZU5$C(^(BGdwP@0o6D2ErO8EoORAD9lI^kC)wQLu*uwJ4rufCForSnU z%J7oI7ccK@O&(gcV{3c66c?oi3-R3=LiC>E!C#7H|7KznKfh|I!r6^X&Cu*Z3vzCr zSR1)X(POy*zZqg0@oNZ_Z&uNQ8A{gX`m%<3RgJM&Wh{PPYPLpDKvj-u4RJPN@UPn;n;xr(#bfa!Qu8#vRj0)9t|<;dyn{qn8gG@DqwtnC)Wu4c zCOSH7PYr}wG+z~*7ON|&(?6DULXDQ*w$2XtWh{Pw>HrOV07-HQ28+8;f;B}awf{b% z)`!2myR)w=m##yExGL46g&1hMT#_N;5|m`H=&)^}$MalKN%Ei>Sp`Y{n%ZAWGH?{R z3`51oD8mr3+{)0uhuB@=$3`$cDng4)Ro&;&RJF!iI0cSxn79}54HfNaeC47{;j8TE z>g$cE&Wv_BOK%5QS-Se7)IyDQV5o82Yl$YrJxnaKxN&*``)m3~U1$5sB{1sBlby?x zz1=Hwh*4eLTvJh3JWm_t`DG=Iwe>NO3M|c)ynhS`MJ~s1aRJJ)mN>}D(QoWc16akn z&bE%;SVL!DM=sM?Sy@+Hsu}?WXjoWNQde790~1RuemS={14EKau(miCB^WN+j0F8h zh{I+jdV3QsOJ}#WC(RHIAE{*DL6(ZTqDm!C)3jLJ+I{%v4EE0%Gb*P#|E`38#p2he z&d{Cie-HxK&j_+&Ym23%pUGmoSuO3IJ;_+8Qkvqor}ozJz zk!UwcuFNs~g9NLD*}Ay~`rq@ZPA%N(KjfCwVlCEcAkC#2BQ8a0MvGSJf2E>0El=^vy7s;$Z5`oq zX^UW-t62QEsrefJ0FdH%$BKs$?-XX#)WldKJDL;YSrim zoG_PVocJlqGFB{NW2Rrt?>PSL)EL^SD!?Q|@39rsuz%mq?*l=NBOfoGN95x~f+08K zy-3V5`0HWW*u5yc>uBtzutGj3)u7eCs&qK!31Vl&JYF2=VD3La>}T-eL>{Vaut(6@ zaWXHdFDq&+Yp9)9Q(D$kSu?xV^duyugn1yI#Wg7D1kvnBYT8HnFW4hA zNOWzZ2(6om)lt&@VEvZ?Bgti%L>~G?ae$Gf|4^}ll zQ_U&5CI5%mbG@uXD}za5e_tE-H;esAKfT~aERQh$^6Jp@QU_}_tX?i$+I7XA*rV4G z`}w4W^+bi3J*zd@p6mr*HmXZbeZcX>=cnRYumK{+C0LInSXb=plR(F#THAVBFc4AH z-X5~3Yp$6Ri&xorRNhrNuJy%K)a-g9PUCAgvCFJ9(b?Ud%R>Oc#G@C#8>HrF{S{c9 z7_-zz1?k#`g)T+kpe&N@)2}+t!?iCA;VI%QRlwm`$fXSfOzgl4sI!o4ewsC^{?$GFWFPf48V&HMy?K{(RQY4G}=`l!Le>CYEYk>h(^+9t*AEm z`g(dhm)Cc;w|6dH9BD|B8FpeiyQE+*0`?XLmMWKGGcg{e*iCe&88^Eq&gPg+U?(kkl+Zn6doenLex?JR_jZxg(}cz zvLo5e=ABTt8P;X4$(y2V$m@1}IlzRuEL({?QI;)5t<^U8OS8mYC{J};M|I**>Lro- zM>T+-liEl3=vAY_k!~$EN2FVc8iv%YSN0Nn1mX=JkP7V&salP8RcLUm+lb#G)~!Xg z#;W%VbTiiUEvGKh6T#_L@#}KCUr;Coj%{195n|g$R9QXt&lJ0%{%TuV+WUIcPFJMC z16LT0+(;t<8 ztXr!t(UF&}`lI!a3#!f$P8JU!!tF(+4`KiAVpqgxeVb4#1x8<)rK3`Fb#oV5pCjBs z?1Km=iwXx}e}mY^;Oj~zmL9>1nnB?%8KTe)vHKL_0+ne=9*ai#Z*!w zA9%`KrX9uADANw2+{)Cyidt# zHB&^XgUpO?l^>GUSA>Nn(dK}R%q6!i1EM_@~`qlmbbh?t#`r7K! zZm>x;iRBS?Y@o$UE2hBz#o{~J{ee}Z!}0D)R$&*hw~N=zrzLgs=Jh0&L_n%%Q#GFs z_ zc4cvGe=zt%y?{*QXF2_$a5^0GOferZ?=JRmFzfu4w1!a6q{m#77=%fkwoy7?Ve?l8 ziXxX`53vWzFjLI5GSGV4VCkuAPppIpSS(cUI^pJLe7#*5365}2(S`^i>B=DNSNqRO z8-3l~5L(1lUPS$3VWrsh?f&yBlj3;y5^p2kJ;iQ>*Q`%rE4jFD@#186L)&4Ij09{% zfi3$BU!N98gCpEq+=dAE61!@I=Zw(Mm0-MX;r>>>l{unWq5~1_Eq1ZJ zkol)+{Z*(G(}+zCi1eo1+dlmjLW84?(XRX~u`}wgSj1F+1csb;n0?iohXnGeRHJsN zSD6q;S|me0f@3TeFCoSvG2LM7-&O3a^_g6p=xgr{ z_efxAsz=IesY|?=F^;^9_NGh46bHG{ugZ5<<4L)G z-BGL&Sjo9I-#y=&9NBEjcP|q=S!Dex|JqV5NpwYs-GK|Dtalw96fhA9I5Pm5M6vh; zn}0p9bh#|$l!G%{>}X|C8rJzkmTzUp;?8g#gCr`c6PJtS^D5z(M=bsg_Xn}HR)HGF zUO{tIx!A$MuJN1w-89Dqkp!5XA;6`4e|Oc%aS19#1CGuLG1(_UznRZww?TH}?C#{j zeaVg%J5Y1xITpc&#tD2rE06|9I){9~O0m60s`Epjf6VUeUY-a~UQYLMmE&ZSuChzPbp~nPEskM&{-=KV)@s;WEypcX1@jS^LfZF~|@|0j9! ziC2NvCGYGAngy?Q!nJ_ZteP!ZFs0 zcTt-)Vk@6Eq5qnE1!tid=6!-Kq^z7@^L&LuiEy-aVkM%j6OwX-q!H_G40LMs_<1r1)?CpGgmTzT_szL0JsOrUL78UwxdOkM!N>R=m*=|Rx zAK&S^cAl>^5Cpj#jba^?qd{!SPHWydh(QZ-u?y~pEAt3ZdNohMF1w2fjDhBiIk zH6ODWu5OFgQ>$SBZOg}dp+q>+`Ql|nI!|ouAjLkS&#%HnQKF;HF145DGZxRO~{sm&gG=Af+ zRCRWCmB7ie-l#U}b?&d^U7O=tD2_&4O=1I!i!4I_&SJXqSJE897s#N=(^BPnxmieE zjx8>xA-08LeT|LsFBBeq9xqxhUuESK=!X~c{ELDpaBTaEy%AentY`H``|*r=xWW)! zHIFA0P@iMlPkf2k_7&?|Y}&q?ct=&|A$71pRGxstK2c(D;Hz!t;>)`}$G5+D4)N_L z)^YI}|F}8<*;m~L8Tv8d4zlusoGL0dJcIkk14ouia{y%t?Jp)d(tv$e=PzLVAYJYd!A=C zGT~AtXea7GG2Ti^))@MeIe~8+&GQCe1$S5#VB9j)bsm7vB1|q zDXfxXsToPsQK@Bm0In|jT*@WldX#dp80kpa9~VtoAaI1$pm#j^kg_125Yct7={hTivee&sfdR04T zQ);OeZ?zET(j6o|N9o$c@C@l-e%@Cs43cj^W{0BGaxLWQ|dMqcefVl69aK>rN& z%OmyAH?s84fuYXjYNrf^Wn!3>i##mruWM62uP51BxxB00Y)R#^FtGH%iLJ34uF-<6 zPUWv(;`r+WLXu0eT*;yJic+qx@!0HEiy}LmBNn zzd8Tv99f_E29d#)krtWpAI$!kVlX?=nq*BH4inmS6pxn|N`zxwAudL&ed0$SRz03g zzPQeMHiIJ^Xek6wuH*X5zdFZw2u03Uh#!0yDPJ73vO~wL0@ls*#q+4g5gjVNMXeno zzIPDOcumudrmcPXc+IymN48SDkH`)c|8|g>{%6kD)g*fl>Fi!s*WG#O%J760m2eY_ zFXZRz3L(I89wy#FoGZn53@62h4Ee^k<;hOCI55xDZ%BLUi& zpGV8DDo1n-WkdIiuSh@X{#BRghNC;MD-#LQFkk=5uQo?@ERBF;#NVx+Xaq2OVvjaN zi~B=6j`i7-{3&pp$B8r1-W@CcW^wkLd4)Eg@u2J_JV(|sed{+Pgj_(A@Ek9m-5sXi-ILyK$l67hK z;mex<$9JOmBewnt;;$SZ`G0-O8~PS;4ml!TdNOWs{J*@bb8IJx-ypUV#pev0oK7{EX9{on%XbA%}|4-uXu{^B5H_OLMl7xzS1R>DSCvCkgnQI(@QS=^7P zQsU1BRez1BQt^V?u4G38+=LXqEVnz1wRL4R4UKSrph}&E?Jj+x>6WPjbu?i>iEG@eqLu)2ywKhk-a)qd}7gpJuMR@y8r0OJ&Ip$W`o*!jdk-HaW+sHRSR^t83zQU29Ay0hs-$XVh;2OW$L6aTafBILS)St^|}MTI{h9ex6j ze-=!Iqdi9)hwXZ{_`ru2@T&JSp!WbLIKGN*N96S)C2e2E@84P_N*wpObPoF*@xH}P z`FwSWKG@rc)FoBK@#j3BFVDIh(|KYG)aAM2J&lR{OP6N2`=&r$$^ExN2ykTQ)B7>! ziFd8GpnYk)wDqu_-q)p`Z2Fktw= zR?FM`{<;C8$tAf^l%pgUh_|u*&3QcJr3ZVc^#@yLa`);vaGUbwDU` z2`&+HQ1d?#Z&(Rvzt&!hWhRfD&Wp;ae~ZUg@~+KsT`FRT>k{#Miwk=L*gtbWgXIuG zwV8@NkKfO*YNR;w%V?kIQt`S$PWuOS-H-wr^>!ZUv+MKygM2G?H*VV&Hvc9phOs7Te!0$sEFsfXl%f%Te(ND$i zG9;q)SADXjv%3{T(0QGz2AAzCZZB4a5J!E5XhhVPi&q(Hy6=^BlbTcy$3N)v2c|O&l!wjpD1()w9Tb>eI6k=Kgn zQ63ZDs_!({#24T%Kmd0Mk8iCaEspnk@hIZGPCSQr&HZ!@EeQx56#zCCAHvUzt^ys7 z^9G7_UN3%QMuPFrjlFE>T-;m0dF#pCUKU7$pv(=`+7J|Ob}5*pPjtwq&!Rq8@m=qKx^j@JGBKgpBJf0O7!`EL}@xcy0| z(&*iauxJ4Y4uK%t*icEM%}#$RoDRo%Gu?}DllZmUpUik=NW-^S2rf#dFrUN6>nhUX zxNi|3p?+@`PosX#`c(5!_ivkEZ|>Aw0*o*F4CVgjsu1ExZxwMwdW(39X_(e`noT_< zXhyK>73wz0#e992cWsXBHgO*!yH)&(Av5;G+`j{Pbn15INY@6_FijtxRuPLq{QjL) zC&wkYoqYM*#4mjkP`m#i*Lx|-33$ODDM=@u)o|Pp73cK*01V4S7qO^zv!o{BXnt3-E?!-qdeX+AQZVA zcTq(5PVu;vgVx``t);iSZ#ji@bH-b$D=OFwG<$Yq^McBn(%JB_6YK*!7coj}qI%ktb}@fk1~7Y{M)YRuC8gBCvqpF$I_GXyZ(9S{k=iSKs|AYCre19YFn{o+AKBFbmL zVOqQBATX%S|8Dc=PQYb6oqfs^mEGN5!eA?MKAD z7P;}~O?&_{-a<_`zU_{drLm}7c{AVe_&|X)IMQE;T@mS{;vS8Z=0p8%b69_4P8TIU zJ;(Fw3nju4K1N>RFT~wGU21!6_W$7|Xm@F%HxbdcL2}WfeE&cH>KxFj zjNYjKaiWnk20>wcy#EzSgk$_A`8iLD+kI`T`=80rwX7nAD76xu`G5%#EPC9=>0lZ)J||*R%$ETHKt04(4xj-;m29qIKDi=T{a)fg^o} z_U3*qZn8)-+85n}5a$9E_;q0WMy<_pJu9}uvGI(!(c;3^1^ti}Dje@`=-ltK;)YDTX1<%B=x)>R{6kKZ72hZq-2Ojky{Xq_%ysC0MzoqkR&x>mb zkC`vbodE_<_;`hc#lP_L90kg=3 zi@%^QUlLboq}0Bac7y?{)i;8-Z{D>zrdR0R<(I{kKJ9@$R`-3hb+pmGQI3hC0`g2@ zqPRXq_kHA5jU#%MvhiOLSNIU=eC#&+EK?Nwp*CA?wE5Wi*X785Ctkt!dsSSXZojr3 z%vFi>P!z=16rx|-_A8_|$MhP-YeCjqpSq8>t!I8)cW+;!J<@7Sp}UajE8n^t z+v}7+@S3;`^`+ipYwt|7TE9HJ!xuMU(9~8@5wP+0{f&X3#xeh%-h_BvT$-s*HQy_a zm?#}#d$L&FN)B`CBi7y(RGlMyLwtz6@b}^pA3~kai4R$Y#7NaGQ!rp5TR^>cGvE5h z1yttP-V}!;wl~C2eAx7Sv7?v_`fFLH*0rHc-xQygis^)fyee@#Z_)jrZ;Fe9@Tm98 zJ69yTyW3im(@R@vD4P;+UV44uhe|=A#x&f+KxjtU#piiE|CoewDA;1#gu_ zvWF(XYf>{|Pra;39gd!_Do=|w*XXSa@`=gL1c{E%+`_&}WP^f~QssfW(>VkkT~)daIJI0su^-YnA2xvF_uWz4c(s?LeFvp&m8w>+)w_yhILbeYn{ga`B+hiS z2mY$M?~w3zc7?kLut-bV`wsK0$T58^jzUa-6lX9@{S9Itz_SE0=iqvMxP-AK91^97 zm%xK}C2%EoLrHyQU1Mc!jlReLT6^zQQmb^}DRYVbM4r#b;&dyKJ`X|iM6x*~4HV9h zMcp-dpcbXdDro?Saw$F$6R}0 zdOfdd9Lb+4qWhUR*&@L<>R0|g5f0r;Xo7Q`F|CrkDse1-5#zAG{8^-YSag5cL2PgF zgqi0i$St0w;p9_?qxoDMjA;HMPSR+MeZ&5$`G@z`3TEH(s>qT2RV+j#pNkWjUYzy` zot>NF?`5=4gi0L87nB+ES8)QvfxQLn|8`;$ygj^SLlOZhBFyq_L}87USYW6vWG05OjH zZ(?J_{iQgL;kNqQR%{LW>q+*8s;@k?hgM(I@*KtADZ}`0;#dcTz8|g!g2BBWJsM8Cyh z+ehV(L+b>E8gg~6%qYXfHeY5y$Z-k&L76^Zi=%xK=zJeP!%(|U3*h->C5`Hxm}*#C z9h((@LF738Zz$jAAL1xKe)YbP#t&Hx$=Ysp{7>)OMGB2#?hi>3i@$F3-v^8&m*b!G z^5r+;NF#^7AJQ^wNcQ$Z(Ai!RnWG26LR?*1UZXqr%(M#fCBgCiON_x0_fK&I;Zymr znfStHT8-`zo8M3%0gmlk@g!pVmpGjD0iBPJk1Tm7?6}*TEmAVDjRr?*jUvseN^47$|xi`@bnm>^rg2V%Pqc+TYjO zDupFgqN61_yR99TRuLMYxkh#2Pi%a0Rj6>R--|zEPx-ev)WNFp+WuVH+11sa?A9k{ zBA^ARx4Zp0e*zrk58_Tl`Mo%Vq3l=jYpn@&xGUKKN0NGbyW1AQb>EPQfJv;`z5fco zVb(`vp0)Ao0Vd4l`H}8e{6VbX@~C`F&9=I&1D-&mUJ^y)pz?d|er@42I7%V!L9PEN z`ZP+N-xEYTYyhghdyviVDU<@oCgoDZCS;G*ppK_&>Tovzb%`iFAr^nZ#?uR{&#`&Z zyjLh?x5cK%liEMi^wTeSQ@}ENKUK;*(e9rWRGp(+Lz+{#o;=t=2kQ^p|1$7}Ez}gq zPPhLRM1vz8BoD$iUPE?a|5N#IS^=J;knHs7PPea$muVJe zX0@xRP-6rOD7ZQgT`Uvf22W8friR#f*+5g~k`0yuC0kQ=SjlvLhUVHpzE-Fp+L?LI z?(Y{;o8uZH&HlzkSm`8?!+n={d`+%Tc`20E5nU9G~sFWd8Z14)(3GgO+h z4?|>oraUU1XE^HxcLd`Qi*Ik^d3jgm$cD*Hu?Gy5%M3EJe(a5O&{yeiQ?`DLUW=nx zOPYx1FnLf`{TMtEB76$eom@ZpRprQr%WF|TYsog!kBZlW(hbqjrJF)?sf}mlS&?H| zTbkR$hs&i*OZq)VMYeT?axPmNB9B@!Jw>JSi)u>BN*l@=8!Kzd^`%jj_I&4nljbsw zkb9th*Op62zZk#hEne9L&ku*hbd++3^ZpmT*5c)`w{d9Ij;-zOBjvvl#R$2WY1Y`A zF43Xd+nV+8@o58Nq+x5^-Oaw{lA@}r;-ZqdbcK7q8R}?Q*w9#39gC4Y*8j|+j4$l{9sfC=Toa?Ec|~QEY}J~e^{D9v z=p#kw69ErT|H#*)13-`C9wSZO^G*uvL@KVdF|zKM&{rav}BEm>VnqiDPbz zT;$?Y?_EJ#mnIh{`r1QZw*c1zkUf}=r{-Cc>uj974l#|D35!YZZ*x51>mG&Ze7nD$ ze_f7gyzECzL|7!6K~`E;RkRT8jLOYxxA!fsGAWLBf}D?N$IE7; zLH&M|V$$6PNoNsO=&|@K_I~U9>Tx6!<->?%f;_;srS>0xDlS#}gD6bWn65l5Sh2d{ z5Az7YRx``iG=u$f#*E6T&c7@9zi3t{Qm4)9%Zf@XYi8HRVo+pf=s2@ew`=SFUk#FL zdXhA6Oiq;hJDN80r^?4w`tD91+?VWViPC3b4OGp?Po8x-x^?6X><5$NemH*Ac_qL@ zj$}h*e+f{X!s8hQQQ+9tmF8}!b>zNQa};l>NOZU6cYhajo|ibjf+%o&>q&Dj(7H07 z#;5M90R8F5kj$jT^5b#@N=V_-M?3f2uHcTl-R=S$%Pgr_B}n`)qOO8*IfJq z(^jO@oaCF(S`oqD%j4ezLXk_dfiy1#t}mOcBsBk2b#``@K$cRJ%M(D&2|j-EtjjTN zD9uZx8^{G36Yh6{J}sWG2@%jt;PZ1{H93}zbHJe;HpjQAJR9+CA{#RCnf8Uycu`+#+amRPhf3B93r<3> zdxE!b0rfe?&Eyq`aZ_3EVAS`kLi?ua7blk{R>0-b(QuNXshw9-T3%l}udcbctfFXs zrP?)y)u6p!b+xhJQf@9cKq)tq`xq(7{^axGGxUygx&6trE=RP5>_9}D%Q}rn=X)t- zM0+0^hIuMQ`CfTd<0!V2ix9;Yves#Rh)1e?FCrW|He>NUZ9Y*Rl{l8I0yRBuF(H*T%_=Chbbfh9qYxDI<9`!hqZRPujWE(lxX+?dWNp%hO-gB6(Q=q=) z`yKgK=E%0AX!W*oj)P3~F6i&-e1XB2=ljagju-KK423d(5*+LHvK_U!ovftxH1kEC z&*v7G#^M+7`J#aO9NA>rHQHWQI9jCmOTMq?!hF^ofG_ghj~5fqW=Fkpm=_o#f9CP*$hA0@De^(Y0-zi$8jsn(urFVQgxJ-j@HyYV$fqJl zHB~-@sHVsghKkk`?(J9u2UF44O* zJmv@YjHwgrl{zq>S4(-<<_LF|y@+szoRxvFzZl+wRPBq8)w1Lvis$6$dlk54EbaZ! zt4N5W-i7Afo#oyPHRbOW^4gFuhgPL;?yq&MBO(JrkxQ^Et&w(-dszu+{b0B0qpZ%= z5vOvERL2hUtjjU&CMRQG*j4VSG3ob;bhGue^|p0(L`vJvP~=HGes1AK=t2JcGj~?r zT~;I7-Q*rdgZlm$g*W?#d#UrbRz9ZR@Nwuf^yB+)Iu}3HOw{Y6<(*`zS%YLp@iYcy6ye z)4q=~@U*!+d&@eMXD_)6%A?*}P(1T_AH`>%;9BUoy)SpwX>q)>_J_| z1p6Oh#-%Qnr=!$Ga+;NztTEVQ zv;Jg3-ms_|o!>?$UEKn(K3{*X5+#njM4DUYise*`T%Vs){T8zkBc;tz%$GKo)RN|O zdwy;Jh;h`VvI6y8BBxl?OyA~wkil;@wZbO{zYMrRwlzN=G%zH&EM*h{D3v=IStx%w z^Qw*^lGAPtUiwmc8DT_$(b2q|BPXsfVw=+xvYmtMoD;Q2xWK#$`t zr(EFKatEiEP`oeyrv=m&+tEDUR~QM7vO?~H+AWupsr^lUeLl|#%-63Ge971A`B&$- zDk*cQLT>M95A2zV#}k7FIDZFe5M~!EM<0cQqTtB4IQ_G4kv3*|(%?wv$aPSIm2x}m zpC+C_H-|>pJ=M3~Rq%L1zLhzmxs-i5M{euWow8CiU;9~vMPxL{seHaJhyq7iMeB&U zavO_OpKk|~ZK>zJ13|;ujK|aRsmRe(%U7@^tK`-e4d~0n=Q-I(84nuS4}829MuKCk zk+&hnYPprcNaqVI@hFRCbsC+(SD)MfF77f1-4(bx*S)d z+!i&~AUDDGGxHP4o6r5z(2%Wsekza#$2X5+@{Mw1#AoKGJT8m|*De}?_

9 zIkF~c?si@vH((KF1Z8Yhi0Hlz^#Pn*|5=yCOJdP4VBP_SUQV zJgRUM`%*?~T&`@SBSmi^=;2aD>_dj9L{$mfb%SQnjZ=fAwGa%2ZkcJuynBDI&YM~W!i;}c;j zo}yN1ldL_;vm(dROxeN*$O%kKI$sOPD$h7{#%hYsO;Ns9Ue!331LddKV$E_q!=l?u z-G|lJ)tcyyunup6oo2cZD|#J{Bthqg4wU0G68#?9ibQ*xMquJBaC zt7_DjT~aV+8r*ydu`a!Mz0byXSDhBeyGS;o<`Qx&;#KSGL*N$FzAkekR8gecp_*XF zd5*S41y<*%S}3ZrNRIKh=XzottuUh{ZJwHoT3eyF-JP1O5o9gEd9=z}l)OcbW<2^g z5bFif*Njd{?Wj5AD8hLpaQB^aO+;FUTZu!HC?MPtQ_Zb zkQ|Jh+T>b}RQ>CVb%Xgq_T0y*9W8lc)emjlQ zWpZemezyJ%*L9dK*RxK}{>=(yTH?_XqSE(bGSdOpb}ALL0vs86%}KBs)FAm`ah`y?H5O~$i-L$Q9Ke3)^xL24&0T&^;l zOP9O}wb&^KX)eL`4hDzL8A|0GKe`B~elVTv?~-d68TvOC8wTQsfVO_1c;HqXxAo+$$w=?5Ap}vYtkeRh_|xaYquchdxUI8 ztsgG`$@m7(ul0C=^LyFnS5ty>IFjPlN62q1hhTXc9RIO6yF6||&h045^E^`i!*T=t z1^OdEMrHHAnOz=Jf^#^UJjbKt*Oo)@{06mgejA-M?c+~aQ-LdNf; zHgxIe-O5N_v885<#P*io~Oy7DBr2_PmHJEo+3XRT1W=j2VWV^ z<#d`|Pm>>OE`EE8b?L6YAA{_vTZB_TgW}Jp%Rd?!`hD>otlZG0?n-+wD89oBaN1|e z?NL8x$d9;weDMNRT^}@VYj5jad1N;H=^~uRS>&moDL*9q0rrT8ssiIJ3Is32d7Mor zx6YCuFgfge5X7&qTdhTPIQX(`_OFB$;{48`or$yM`$7EH6_XtM4bV;0W@c)8ZNsyD z=UmREo7T>e?>SuhCy5Ce^pkM+&Go5mHTB@Hoc4LrypV9NeAl6^$D_}mQL49I{vU$; z8K(s2bG|Ic9(JC5$MOlnU)cdyk6oS(zy8YUUO*%JeEGJeYuh`(KKt(GI4zrf_Lbv2 zFO*-QEEmW>I6VFSpVEfC(c#b8^kqwM9v8_5V%kl`aC+XV{R%9EG=^~uN#qurW zaFKk|a0s%8Rh{0Jk>Cj+c{6wiRU4&D=gzU*rm#;7$f%MH;pPjPOHw8HTD=A)hg?yRQ5AZkqtNhQi`5XR% zoZnTH33R1=iSzTt_mslTsvdKT_X%46WR&8Zu9ml;=B|=2GEUfMgT`Arif~>wdyy`} zIb9?Fikz;NFBnci?E{r{sB-UY?L!4P?VrhukoGn5w@eEE{)pBD3r*gVZNA2x)Y?S{ z0T#~ZTG~nYnS7q{p%ES=4=qg(%_a{O;C!y5Op0sebBs@az<9)E=7!nEW9BOKdOE>* zo%{`>tz-zoPeI1xv*D)#9RCgS4Q!9=<+F@O2L4KVdwI)1{Pr`aeWN@KY2P59VYD@V zzkVv|t>Up+=$q$=IsKdDVx)hg{I#FH-~WSUA%A=2oxuL&E5v!-OfkHhMlsImR*FyDB7bE$De0iU z`TZ*-#Mi%f1o~H*HPg|@=3-qSf6}h zJ0rV3c`?rG4!UptcKHP3rS<8bk2Gv|S$lGJ`P_n>=biF**jw(9k29Vb{+{M%*S`w` z{XMq~=W>_)8FIN(KBl>3%s;v=t$+U>IR7|BIQ6^b-bno}`3oaMhP~63as7K+puJ-S zIPH7nzmWFb@=>lI|N0uL(_P2G^8qWs>EBDc4)@4MIQ;;7#Fw`BWwS@T5a)BB{1N52 zS3b=6=)tPStAD)+a7)#C@zTKc7JcO$el9;i4)@82GB{+ce}IBrFTNPK{^2D!pZh7x z`{(jO%O}X*_||Ft+3bz49Ov}_-Kl@Se8BS3U&y#ZkfzwdE*2d5t}zxkI@?`NCe`~|r@Pf}L(6Y_S>&%fRR zg`33WT{&F20_*IIWDzI)Yg74$G!!Z;XIy^-Kdpc%NsQhyZ+3m zi{0m4XMWC7h;w+BZfJN$-e9F*_KwC!2B~xiY;R|Ljk+6^7^g3#>Y#KAM!_B;6Ms&$D|zX zg(Wzr7in+!1$njQWY;?x^htl4<aHl3QO7GrTrY2!0hhM zhI*9*mqu)KQ&bS z^za3k?}O;!Cr z82&i5g_b_!1E>3YIRfdvE-ztpo&H6$LL#Go(HBnf4S6C`{Js2%rRel8sFk+Li!%C` z^O;kAlPJF-FSeA8{IotZDulFLJtTVWb=GJ8ublc@^7n}QO?i=zI{4G%pQb6GjqP#w z12R5y4u2p^|CYSa$AQl$s{aChdn01chJO2$QG#=Mn^yaOkQZ1k{{D>M-wx`}nRCZG z@(0w++wy!v(XNM$z!vP&LHf2|InHl* z9?`!m&$WE~^o_5HW@Ba$eWwJc|Gr#+^xu=`r0G-q!{~>H)lYK#&42=&`UmoAr2f7< z+foPp_{MwV%C6*#LE~M0;PgJEy}u9SS)88FKGAekA7r2CBd7Zj-I@ELJd@G2?aA?) zB*d38@CIZj{*nBakK`GQZvPlD%G$en{m%W?sm-;y^Z%Zs{8-LHZT?Z7&ZvPtM~jh+ zUQe?3ywqlzobT71+Mg)P{bPBWLk;Nh`3R{vrG#+&`b>3%|MvOmdF4P8GyoOHen zqL(=zeM);bpU6{)9&c{|LG#hp8STwJa*UtR8*87+lYO$QHh1g;kg%ikp$z-Lzj6+L zmcPZe`b?%WI5^`MC^(~Y$BgmoFTwfzMaGcNpXEuGkB!f$;R&^=%g+wd4}IiRKPRj3 z7kQ$kN}~bv!|hvx@0@R@{qdLJoc=23ApXzg36_)1e=JQd>RX~LsP?P-ocN6Ujnn)> z9*;EtDv#GRee^&hnqFG~J^IG!{f+WJzmUfvJ({o8gGmY=_?*j%`+8Ph<@68#S5EUQ zirRfCkF|1>hHd}T6aW&@zaW!7`^xEmP4|xeO&*g;pX@u`GoqYubM@&Cj(ra(z`6W` z?jHKP>}Op1$zQhBK}Tpru5tY3%(9ZMQpsmA!X0D{oRQ-1ef95{zbbE|By#&Zh`VBCkpT5?OB#p9#)8R z_?B`8zmZ1-$+LynOwSh_t6`ST3Vt)Si=IOw6y?0Xqtm_rl!qJM_WVcyKagO4vb(pf zCE0VTbABXuSZ+S?XKCKTpI(>QNdd~VL<1?o$ zJadcI_i}}$Y{n1G7n}giJ0E1lPbD}P>Aj0>{e$eYT&%sc^o=jp;@C_7S5DXS%t@6W zWv``c?J@a7mO?{fMe-8Ie{nu>%4>M$eGTDt8_JpX5v(}c$BTmPqy5e)5Ax1IT}ba> z2XlYM_=fr!yrqfYcic^#HZ=6HkJG@7o+N}oz_`a`Mp*YuXB>1T{Lps&Z< z$l&otpE>1Wo{1R__S!AwY~u|G&}e!sD}E}$xvb?qi>)xkTV}af{}KZs$^&ZXP4xCW za=0Giu;d4helk9D9&3BAB9CESn~z5t z|H`sNcaOqf*4^FN{f&#?{m5yL@cx9f*YcM7Xe%kKzkqvJiat*_iaGv5a2d{Rq&Ee* z4fmF4Zr0wV>!S5I!?Ab%ubk#6&zwG5+gqF=f$jfk3aDxozi{)vgGz8dqpAOl@RF8K z0R8mw%6pvtnWmpE!Re3ju0q|6^jg#O$^T5(roR20V_!4BbJ}CQ`;qo2uf@{V?MwT| zroNeNs-5+O`;F5b=k11cM|+DjU4MUp(aQVFjG+GFE5qrJ_clWMW4r{?r}c`#1a+~$ z92?YM>{m{6g0~E5j`a?7bfNV@^Lv_py0vZyYER&iF2VUs^vt_=dq{eLe`MMfszc^bd&TAcS2I^~qx4*+n^V?c% zsr~P4l<2vRCy43etaI+kpeLx1T~oY#il5ahL<*W~ch{e{-MKD>R)^)Gt*o%LasLY&)1o;i=O zzPBKQ8^}lT0hg5i*Y-|)AfN!}v$1DxaNEF}&-mDUE?;$);yuU7=gMA=bKAt*26ech zH;-{+^RY{ZY{Ue|z6O`!d^Yv|hI}^i8Z{p~pSg80N8$m;{soobv^OJvabvH+$`I6_ z&75<7w*DLtjo#erLfo5p^_F%v`v*2OZU2h1^=GFPmtzZW1LU=-w~xasoBeYrk^S?s z*}uTjod1^Io5+7NuP&2+fIU(axjot-n?3Ru5vSyc*3VsQ*D-?0>gr>wmTcr@f75Vy9br)m8%QFLV5m!gH_VFZ(`ns@r;} zVry*WRavU4C*U8qf2&|*!^(~p{c`bLnf=@O&be&oorGMr_U1ZVY<`x8*bJ$!$zFKq z-mqwK@+||4a4y?>=Dzi9yg7!8jo)Eq?e42=f6%bbzW;Nkea1BbFT{CF_8vh=w)H9< zNsPXn`Nxpr+4l!$j@N)voZ}8&F>>6_tH|JJ^Fx??Zqj+Bv%b$-jC0)4TNgQQ@0I&F z+V!6$L_0hqob_MEXHI`7?=7T1*_-XBPy0uf0KO>lZf1X0YQvA5_7v|{q`iYz=A*4z z$Q>_=L{+k5N$=8+gX!Z(PJgOrZg1MrD-EJg>l=&T<{n=WFkTdYdYPPandX_7LU-~? z94_wsukqWL#J9_w|J?$d!*uU!)YBBNm~qIYpI%nYo4A0yUH`OcR^eJAK zt`6DBPdo8C=M$&7Gp#_Tc`-xNog#E1G1>TNW`E3_FO*&~p9|)^cJZD<{Y>{} zar_idbNPYiXjt~V9z5POH&%@E+SR)pdClSrTB+p(Q{qwg|^O z)7u^~@9OPA^y&UEhd#|0Jzr+d*GgxKfi1&1>_MY>H*coqVB%OQ%F||K~+G^ajk#M_Bc1OI^H zhgh#3u5Bqz^d{W=2KO7MTke_nJ4?MCHC>;5HA}yn1MF+Ss<6UagnBLWb}%S?_!^SQ zWeT60FM;^z8^>2k@yFTTWW?vhFH}a#^iuBny7}}(*jI>inB$#?n9IHG9nG5l;QGhN zkNd~T0RK3%6z4dXb~h`$?J_v}{9{eY^^f-on6CqhagJ4vB-Z+?kx&X)D;5~!*>%7f4ecHdX zLzyP%!NL8LK6BcQ-t9E|0`v;lW5MIiUySpcN9|tkZQ|#bArDPZ zn*_^4pE>>cv~S+vZS1F?(cbClX+m&&qziB!3%rL=XN}%QjE8SNpQm3!SR-IQ$1j{> zlXnABoab$5DW=Dlb~{u+1~Lt$JHGfQPH~}kEmEBCZD1&-<0qz4Z*QVysY-rBr{y>| zeiB@W^N4#}Baa2%`W7|L4Z8o(`4c4HT+-gzllTRd}8=s<5QqYmwD{k@F(c-?%^c*c?{ny%0hhHyreI_n(+Y(uIZ&!Z9VX4 zWwJY+F!`*LznHr$=epQy!5+}!jnZ8G<3;m>@B*>y**9psWR&7Ome8J6t2dHKX7oq< z_Z&0KsycZ6ox6X43e>!)1n0AqqBTixgyoa=pLlJ29GKF!Hgf%^>;*ZuHt#Of++uHS z%MJP;-A|L2r>J#B0$vzxCCqj1{-R~)FUPqZGegL{?Y`TscawZ`aAy5oceO_N|fLrZ>U2Z^yQo16h5R+_e$L#G{0pQD&0T9RP?<)n3pYH2+&A=^|W$KJPnhhi*?84gvO(oC|wN(*s%TWkx~HYX$A{^>{y8 zX`nqa?In>Rd%0c~d+9I7xgA0lpx66>aSP;Ek?3wc1YU zdzT;G$CjQCsuM7KcXOBe80S8=TqQZrm9zu3!uz-78K6((m-cRU&LW?`9Orcyf>Q14sIBOTAS{kXU@26SjPq!53aU|s{9_Ibi%7NYv^grKvL}7)! zH9KYZ+>ni*Q;PFD%G(xYI^6pvlV4{006#PtJ$GkmpL7Y%=V)&_@;So$hvgGs@1Qm= zt$OarPT!Q^^!vS?kp7Y0*J=8h^8uc-o|$Dn$UKF8jCUW>J<9va(#_ExNP*UeB1?O? zrMMi&l5cag_xDVGzV#urKT@hlbhNf7-_O#Yc^S^@IB$QHt>62b<`pnrP}N9(P!{^U z45xp*cNEe;#`_ZKXZ9zot0tGHv$S`*1gCuhjrU`{FRY#d>{orVrL(&=JqIVV*e`!M z&g(?)4=BfR-d`;*ZND<-A5KR}bzlU3svPHclJ^?&JKp=;(o| z4DS%+b*lHV!%Mek=K4~5F7-v#Z)aJ*(09(`Os^VwoaX(};o*;;f&Dc{;MG3O!CCxg zR)ljo%XG5hl zbL!_&YlGSx>R^vD@zd?o4`jhl-#Lf#z0FZS=Xmcr9PE7}2B11GmT>OpU>`We3&^IN z>%GG$`terwpkai}{xgE`vhSSwg_Qkvp7%DR4*KxLE2}yat+bF@Hz;1o3vdn>c}Js0 z&iDSnIQZiOsya^p-v-48(w{l)i|It{1>ReXwzdy8e*yc8N{E06!_m(9C!=!njZ^*! zt$+ z_er1GpRsp9epPqxVL|Qa1Wey;n3{e|#T;9zpT_M}y+~S;}%buJYDL9bN9djQo7_ zxuyX=o{jI<2Ki?hr8tkPy&I9o72ZpZuC%^<{;sA}-`U>Yxp*<%YrRj9zZ+DLbG^p9 z3AtYBy~w!w`EJEwoWHwfwf z%zMtI?~8{+eHeOa=jGL)c(}h1=X8U&9df$X`;Eg%^*)ftXO9&r9Zzluvd8u-=WwHU z9dfwNdp3hZKz~ao58RohzokoXJ~w%5BA@HMXDpw9_NVC@!0KK-GE4jW%W+;e(~kTN z-mfh$t*^}f=8t>slZBtZ9Orindfy>2LUz%Wylzk8bgPnMps>ej^2n zSACU59=8#}bMGva=^pQ4M<%~N33O z$-Z;?_j?~B{d>KKT>8HCm`a1A71Ow&^%yU}IXvJkKo0kL4>At^`47|VV9LEH$R63R zobrRTR`|L10HdsjPx`(_v*w!D)e8A%X9VS+;U`Y{A@2pme7|?Up=|Tn>>Yb5F7qjl zeY&ccuI5vpIK2tYcoil89-DDA2koN|&83LE9YEiF%1YmSkL}jN>3>;`dKsX<9|t;n z9|V7m6XJMFb3XxBY|@|eg}8M+ywV}v)zKkUqRpKoX3Scm?!0L0?1m>)W5&$HRFzn4 zpQ7?vMGI!=`t@ZE^QszSvAUv)Sp50HVs}*!)&^{MDu&G*R(a`~>-rF-U7l|zPMy`m z(z;`Md7OhHfGJ*kBc#{a*U^ee{BDx_RpZ5uv%2vW_ZT@oIcPS;w_l4C`2U0dZYEj? z<&NryJ?LM$V~7*i*V^G*%1TLiI`GX=_y#3zy6O`_>cXTk`IE|^_lVRIqT$O5h zu-iIr8KupuD=JJU0@Knwdv;^bQLKBQxg{$~`_vW9(<03;D`~8) zS5%%DoR;~2(@z_Nu$O6p4;Er4{lmR!`N1rRTJbnOx@$}@v?MNZ&YZA;Rw6VB9C=aK z(nDBPH8lEyca0HynRZSrOLoJ3{*i1$^%VRQi{C#ahV9zEa!F?g7zzl@>f02fv~Y#C zGFJ^2^AwGAMnHIPtE{Xmg8#=3Qe9SETfeY*UPDoNS#xPwV^L*QgX%6%4%$)E1q&Ez zV1QgK{^cO^kgMvzFnDM%EE}8F_W$5dO~hNZIQ-cg|08e%#*9ePNSnQ+%(rDrY71sfqA@P**fxHTyJh z3Gm0X9f4oQ;$>oA)!zP~cNExwmQ_$tCk+zllbG>sRwZ~DS#oT>lEWWai^2)TC@P&_R8vw`+ECWm zSXoo9;U7NSJUwLWG9L99@Azt%c}@(;zU{+K@@vKqHl&&Z$7*4Nl7wuwBhfajbYFOCN zSXLd28IJ+~*<4aoRaIP6GPiMIU77Mho2JF$vG`TPr>Q=G%@o6qmctCy6*bqy;!`~_ zZI;ox(uP_O=xeu4&4rmhFU$a=v_Aja{sP0V{C{zQ5RVG6y@vOi>IKgjq~$_L7VPa$dJTtwtgdc8|qcLvoe4idPq_2P z^h-5n&nY%m)a!BMJ9`j88D@|MS+tp+m_DnG9!QR2<@Io^8djwGCo{3?U9szxlKi{<>9&`-OO2h|2{$+W~)|1N^ulAD4QPY<`u2_YZ5jwFF<0tG=#|C97b8IZd(kcw;S?mVAjyMHBZ>xX4?q?0|jX zjzl|}rOKS$1DwXAMm#U83RP!0%n z33NQrj0J~GU&~Eol(ruaf*AePhSF68H(sO|NDF*+W zCYsfc=ngzOb5BE&x8BmM6maYjOIL64%d<}Z&I&9k~F10{T{8;8s| z;}F0pYf_#Vy3*kAH`nNOfYHBR0lYG7rlVVDG=>e~Jx7Y2RSzKx5ROp$BeD2%L#NH^ zW0CUkis1LWJW|Y3+z38)_#7A^L;=E6akYp@dAsT!-Pzu^JQ;P6L8p$ze;DeYGyKOb zo(ORMv9;~rF`D~XuTURraQ-(VSf!vHHc^x)q`FI(Ra1zUrG;hXmAuCcapJfzqS7wS zGvRnG@c;XvU=5rNHA`W(2gh$82>Va9gj65s$A7(r^IUqSMGKB8|7%R-u@z`SELOYd zAQccCFE-aRR=RGWn=oOLuap|+Y7KGR1f22G^~wI)8SlCY7=z;b`r!k%uDCQ7|IOOY zr~%VP)Zs^+{2(SdJ(SYDbUN8B6IaY?(f0}HZk_fo^gc;W2cx*OQms00y;@RVR@7M5 zP&-c<#LAl4waO@hWl(z>X{(4lv{4)`Z7U7b52uJ5)MO6G_R4 zp-!eLhj9a&)V#K7Rb?5h*Qnf}!^gQ1MbI{R*-OW`v#_nFf0#T2WO0_2`Lu#&K@UMaKf|Ty`f7M1Fj2QJco6&U{9~2VDUW zQoN$BtY~goJuGPbzccqL_ea0v zdGQ!WlkjVDZhI$U+(`9fRh*vsI%cf)+rXJ8M*_4II(vZo``Vi1^E*9?8=UjUAsQOT z$|*-L?W3{INCrI9OKFtXOxQ(v8Fh(1c-WpgcUW_)NYLmJ=+Dn?gN4QH?&QIJ$&MDg z2b$9as9AgG)!MeKJwtwcZXaD>xhZxP{CAw#L5N}@-Vx`BZ>OMkx?$+T8Y(1IuUzvV z))res%oubUQn)F;Y%Mdps5VvI#JMc6WxV#_GE|$x@@RjkW{q-%ndOFr55(Z{_w@+e z<)T#q^qJ|U>6VwBr&YainO|qCo=ZJ%_8iCp~zKj+Uq#Z^+)KUYk=fs>|*^ zjCTe#%TMRONdFwOKi24dyh2uKx-GsP?_$8liZr^BS~Xw!h~VefROO_JR?ZUhIbtK<$%lF~VmL z6ji!ov}e}%BDK3j9Vk}R1D_g~f)|!6!fUq(U=oSNH+ABu&>hn^%sn+8eM#zt(I$R~ zVaMX_{{^dgw;7}T>pU!Wpea2C|NAq&1Uy_c3b9-~tyiUV&q{=LRACksXzBK}w?<1` z^WU(EHFI5jgomDlSq0c*Eti;BIax{Qn;4*aa&&q(&W+wd8p6|Kbo5ktcoD3ovYEHJ z>jYqf2UF5+=){R7vsS=6UMf3{h|=`mkhvY?toyaIKUJ-V|M4I1L#O}Lv^)G~bM+&v z1N9#j3x+>a#9rgXy%{qgZ^RYKwZCeRDff0G4xrop)d{5SRlM#6cct7!lXvmVMlRiiM@W`e`I zwZjIv_6&v&GoC@(pEny!*N?+JhxEE1yA>@Hx1Tr{`;W6f7-1Pf3&C_Bf;r)Ai92zu zwPC;J#L+Vq5A#d9zbU-?=**+bJ+YN9rh&aAG9!}zzGbEjA;v_Ltz`r`D%=^)t7;nV;vM}1vYz- z(AkH4qR%Uy12fY{gT?HOSuPx(-$a2UHCN&;a`DQpL{Cr13KNr54)DwlDrRlt_~b)! zhzhWe6R_1IURJFPe`?@=U7NsP*NG=t4)8y4|Ho8TAr-XrXN-Y7nAWzQ7R>%EYHtrg z)?5R!>?Tc2m?ma5mzXDfVM?JS&%4KJ{p+Syr$Ds|^LZ3xawD)rO} zUghW|;albNr7F6!#W@~1NdDgY{wk$nx6y`UV z^mQxyiG4pxFCt}VUEJV7vj+Xqfxji{i_HPWV&mp+YRa4Z&-A>m!!&BnK69M$vw2&R z1NI8+i^ABXaA1U?U!-@rw;JZ#Z=@X28)(HzJrO!iQD1A@qPBK8d9c%HY;EX6=$A)` zz3Qp@$Tf|e{|o=KHOai2b^+1rub^L={~jIfk}+G5ZPVxe<3Cz_JS!u zTw)vi*ZQa9^xrqD+<*1w$2y$F=n#K8`WZf^?am81+&VCDr*z|++D@7^g=wyyvQeT{ z$8b$r51uECz>(s(YD2Agc5Qui5%dS=012E#DypulDyvuhaqF8Hf`o<0udd&g!*du$PpkUHc;g-V+*%#~+`>HNr{#-~u zzyW|KlslmQ{Mew{KO+kp*Je5AQXG~h3ER!S-hBw#0zPwq={Al)&$VL(&I0J#HK!j+ zpEOQPRd}LiziAskWQ~}PMt176B&-7y`y66aR9CB6ddCqNXGucW{gGVFpA5ph5qn9a z+9Hk6&(*%>6!^bbd`Y&+9osMW-xaF)ld8I-e$XI4Hb(3MnZtBGHCzSS_*a7Kl^6y!p-*VdIY6^-*DCcvvgMj4dSq%T z?^b1l?K1{OVvio#d?bd;4JTD%@f-eIqdmG!*qv#(V0aV#w^WcBy>hpSh zC8T!V7lgMD82{OJ0-&w;e-AeCchWd`2(T5~r5x^UM++y?3!m^X*%uRV_m+mMYNq;5 zIA{n*&VC&0L?WP$_Eh0Yx7vwLeg}M^`cPd518+643TJtsCZhC;^4c*>U;pp@c&YOJ zp%>g|M0*YXTP|StcauJo1#+xe|D|Jbpe=PJ_sJ6|@~ii5L8taHrQ62qJ>#h7DwKWg z9`5=Csulcm&SezWXIS)gE2=|YV)_Ul|GFt5(7*dAv!=k+FpxH-Iw#<4!dGoM<^o(> zue;_nWgCoi)TeS(Q}VS97kerjRX}EmUX)H=6MX|4cBOrW@I@xrxs$Rlayt2OZ`~Kf zT-(pjgze!=oHIqByY#-tf-5KZPHjLh@I}gZ8>9TIh#Bx;JilJM%*2eWWlOY0?b=Nh>0Np=b(Q*F24|2=!K31k2|f5wSj z(*NFWDT~sp0cA(|u<>|m0_=f$DM`2ct79As4oX7{zP`z%qb5>>D4PHH*izL)oHKJF zp(JwhFhMc@l3umPl}fllqSjMOwDS7ed3DXjWfev9EAcG;4uc?W3jM*^9WF2rZ23+)ioYNF0u8UgMW+IZ9~n!?qOsJ||j8-(%O4AL&Run(;gW>CkzV;?-0Rz{5) zIvLnbS_$#*&0O z^;Yk-^BU{sHR8$rSbUwqPHqS=aIYZvt3zlYX=CC_}FHa2`D><;(zc6LSWaZT~ZMpDm- ziRbl?=bK-c2?}z-?@+%{$3TBvpuN51^3Lv+`pgBjb`J9vDe`&LAblEkda0Y)94fhr zcgNz-NQ?>LxKk0K^redRUdY z>N_%&ox?|t0|9L=9Omd%&kn-j4mc7pl;SeVLV`_p^fcC-yrBBfP}c6x8spk?J(&64 z$ETy|%m?~dP{40zcbTL;Y{j#^Z%JE61RWWBURO1*9Ci!MjUb@5`_|0#-GC$dZqJO< zH`bx`qWe&ztOB4lHy@0iqI2zF=Oj}1|M-7*XgMp5;hyVZCtxQ0Tib$0@wnb^sqAP? zM!Uib6nUn5z6!boIaW(2PJ!GC_2f>2vRI*$01*3TnD3-LkYh*QHyo`;3NfG&7CP;! zyGLU2BZrz>HL!n~JT{%IG;@NOtZy<=Zfq#frg+~l6Az`H4mhEz3YC_O#`t4;d|)@~ zS^K}^{x943Qx8->j=SPKft$eUU$^Y0Y$=Q{JukuVvJ0CqGxXe=aD$UNAs$JCW>jXJ z4_B1~Plx|%m_CI}8v)Ty-n+9k%pA%Qo-wCCvhrq>Z z348c0N7o>4x~!^bAsJtF1JHLKctGiVvf168%R{1oj zCVsCqms;>RQ_AErTWf-|O%7?4#{hQZwxP}lPwyXzu?8Dj5S%_?Fi|!|PdS}_*1ISG z+Af6mAFuCHGkfAuy0_Y@uJ8xKvTWAszzL(mgWwx4(a}Ir~#rTBb?zwU87LdZyyZ4VwL=VtuRVb^L%#V-K z(E#$M8z6NK&Sr++Uf8HZqlTo2{3{21aOWi)HKaOaVa#d z(@rO)zyI-l@B7|L@4a;;$8~u#+I_p)cYXi+ZVkP%g3tQom-lZRfOBAA<2O=pA&T+p zhJ2sT!uyL2jsQB;cmkhMze+?)*Hw>sNCM@rt5#?<2i$Z1PMT7mj6a4$K$|oS!to}3 zKL`pk(&*U>+|dWJ!navqsa}f4PWkR8&S);$?x5$HQa#hvhApQN>J|s@)(le&NlfF@ zQmGlUSWKm_jvuCD$V|eEqxf+OXxrcXxxLEa0Bj@sI@>VC>b=l+49F;*ev>f< zsO@EH`K^8rS4bpM&qF3(XjyePNQX9QeB!c%WPIZiEbkC<##NOD9b!fL)=mm0MsZ?1 z3xwJOQ@kuhU-F>J;XC*ZHq`ab@nH5^k@%#hZz5(pn3kTzVPcwsu|JXNs-IAQ1TC8L)S zKV8U@jhtN|$} zXID-LIy_5fxouVuy!2QQyo&vK_{)BizP)Bnu#?_{<6ix@)p(V@-ktHI@uX+Fq<4|Y z>C`Xj|LiGPRL_2;;=1k#nGcqu$1re=3#82ArC9oR)sER00C$8Mv3(8P=fog)*w2eJ zv-mJD3xyw6zHiWk|~lRRO7Dz&?TdI6vLPS8~b4QKFBlmsC2Qb7>owyhQ3( zIk%i`DFc;s0+-=&AFhgOB0&omBV+GeLTW2bj}X@@EKB>|W@o8Rhuyt+2&dXJ%fTRV z1kmGM6+E$&X>DY98x7zX$fxMk;D@yR%8&K6e;~Gj8|O*1Z8)!fe^n6nq6QI=H{qg2 zXm8*JEF=`nF%Sj^-&5nq6D&s)R+P(d)vh(&6K{=kPsOe5RiM>O42zyj9OLRw=K`z* ztko}w2T)DOmwCbyM}Cv&9>sXn%5R8&Hc8*}aCg_4x-wHu& zk`Yd*8PK{asjSvq?xg3VG}CvNxE4FGF!VuWPP`Ah1B8>g>zMjYQ` za8q>j2j6X@;Pv0tMZBa~CF6>JwqC3?%h9ps-~>89D28%XAly+|=y@=D;^2or+7Q&S ze-3AbNCjV5+~_~hJD=PYcu6JwjNEP#0*?f&^J!Bk`Qg9ooDo`4z>z~=|J9&8ylZ&d zwk-oAlJ=F%eWCsyt&%#1RU8CPZ}fr70<*Fe;x(6};fN@%)_Yoo_#|9)fHOz9_2bhS z(aAzfN7%xWtQP@;mKAk1teh?x(P55ETC7f$C^K9twG7txm4X>#y}H`k$O{H9`HP#8RVk;oo(=BWh+yZu99@)O! znkt=nVsJ@Prhkzsps&a*hfB43B(#6RT(66?=d0eIgLQq=ITNs$zEogPkJfR$AXbm#ywWGiP=ckf{ni=-*C$NXNi0`Ca&(fd-b2E%Wy`uysvgR5Gsj z3=M2aGOkH6`pcT&Lj&E?^@BZqD8Wo)=Phi56ZSJcXC^M=bez7T;REw_z)3i|O`AP- z{lZ3`S8+ftSy>yuHan} z_z!oVAj)pMU2_j!i2uLGl!QJT91$#0`jQMOh_|}tDAh*uLXOgeu+76epx#|KxT$Nf zf6MTu1RjBhCsg`soyT)DD~p5|gKthVy6y^8aU&_#TpNUt3KQ|@IdSE$n~ov+q)>Lk z*|bzzzP?$zGZd-yKnAzxzGV6yxp=tFjg#={Q9TX^FuIy zP0yZxF1!p3z_;h=S_}70v)ou!{W19}e-_+0uRkI-Qk-QX2nB3~qQ&Epy-^X4|lTHOEeIWb zH0iToTTkB%OZ<V_rSymLI4v}|9pi^$l*k)bdFr{ zsu{v)&#kOrUldX62-0ee>p#|O0N&eF67d-Tk3*lqSL($FBz;#%$i$wHQVKdwWu>lY zjO5t=)=9pej+Rd~ zEgC$JH)I;s`kE}@%lYcP^=|DttPShcJ(6Wv4wgmv*(szE)HGYq_;QKbF*cu{IpB^) zj&p>GXz4ti%*SSx77exuIN&zU@U$nw6i^I($U+gK?Yle*24TS*@nsR81%ahBD<@Pu zW*ev(73k8eTt9V%4EYAy;2k(Nl{3?dU2o9uV2yMxFj9lkNbYLzv&(=(p=WntyuZn+ zeru!V_*a-}|B&!sRe5^`w+;-CrpQdL-;Wga%>Sn7Wh)s^<8_MP5OK&Nf}Ss!JCV093H z*k~9mw&&lL8a;CxYy?OnJ-NX{jS}gb90@U8TVT^jYLO%o{HFO*vEO`;bPE2tZW-ls zzf|RMec>r^K5=Tv^LCo5*gkUMGa5}F4r^rzN;`d#X0%9@i}T&%;coMm@H0(!Z_jP6 zw0xEI6Gg2U6!3V{(ktxGSvS^qPLe1a8lLq1LPIAf&UF;re>c)QQT_6fhTo{MS>sqXpL6UE5^#?P!2M zC^1z%R=uTL3{{b}*}@(+LLhN4j4T5o=$(_Eo!EBE?H1%$G7iwk2dy!1faO)F3#E`) zqMsd~$~E;9;vG1*hJE?gPnH7MSiG_tFL#YVaxnXMi9qQ7^BW z{Jy5yHrF(s!uxWwCLM?tf<^6Qmj)W<`{BJf@F4!EP;94nlDAq}>#|f{I0@`qO#xSW zgxXh%93d50W10m&D(9MGnKYFO-`aCenTjak%3wzYPQ4#1R|b%kq2>)9B~w2n{YaT` zb=Dg74Afmd4R>CO;}1@inKaP?(_|wG2cJ>HU5zxFm3&E{|EE&af@qrmr2=x;d;vVB z!NM%a|I6~-iz{vZEDt_SzFVV=bYh5QXVl|PaowOw;?ZJ1160f-ZjwpbMQ|GFmC$P@ zjaqqZhE)w}eFBNr)saZVA2qJ9dAzPi*g!K8BO=Timfp?Uhc>h`%*o=IK1Bz9HN|8c zGPePr3Vpvfx?y?&$ppWO>vth~J_irdsfWMjTp;_JNMfu1IfA}A%X4_5>Q6F;KwmAK z%KB#cVvRI7W`?llxb@QjopTHs9d9F;MY^=<0L0eF_}aJC!gvs`Eju)xOs^#n3WEJm=<|KFj-i=l4U)L9X{x-IKPmO|IVr8>c!Tg*AwOkvNwjDe23^pn zisoEAk7YY>7jzaptyV9@%XNFzalkR9+_QUuAuyQoXjwee5{OL|>K*!^MzAlso^(wLZ_29D&@aE0p1tMcG|7d-jY?kk%K92rx|QN~y99*QcMLva@L4-Tbewn3?8_~y3{Y}KBO4)=&-66DulDZ?(HRi}Q2ZvwikdJMTg zaQn`c-#Ln3r$vV+y?$FZ{%=~~G-)1yOR8)O*<`p2Gdj~#B3HJJ*V&gU6ZbXnYBLo?`K&$ zHw_@e79iij?eqsx{~sXcIVk_Naf~TYCIRB<#t)J_je6%(QJxn!(qeGGmgIdEL*!?& zB>>4*k&|X6r?*As$~5%zy3URzOXhcUUSS$gP>vS7G1b9xdY-V%IR#!?-O^=9q5uPB zKVHsV21Km5(kMm|WQD^KL<>$_5D{Ct8-svQ|Hm5|{^~Y!hwMCA(EriI-+!k8b$D0} zOKr^R67C!HcCZpzc{t9|DP8FibAnWAWlyQr(7E!aq*)?(_Fj!W6Q{*0e|W@nUe>!L z4iUxZ?Pj`_`OO0OKlug(rca)t`6wd<@ka7?Y924`smj@l2J(Yx&T16!_Y3!?C6_*)L^ohJd1cDQpq+dZWk# zh+*pdlERg=5O)0Qr&W4~f#ulmR|MG{MfqsctRLDvF9_~>n062sWY23cQxu{7-%`V| zd0(_A^Gd+_NX-}#8KiEoYS@sGIJx0KDdY%lW=*xHy@4{Lv4c0W>VL7=gexjGeZus7 zA}>;es?Tr4%sNOQ;5hV!D3{Fgx*nb);$jq}tONaR-6};6mKT>mRbHP~0@e zty}j=jF^MEyc98iT8>YbN3|>FbNNAhaTJc7Q6aKqE;6KXUvaHBxBSQ4FU@+OG=iD?cO@?Tsttn4XdT4d{u)UdA7k3M?k$^(t=h_Gf%*A^3B!PcmRvaGhT8Z{6C_Rmhg@ z>fheKt4StRs7_?E+1_jjx~c0%nrH^N_V}R;OeJ+;%gTNK&@~N$i*!{a{A`fAaq1L% zw1K-oL&;Cp@wxCyY>b|c1vCV9Z6(8NVzjsoQ_zuOlx-9eUuvd{pKPo#B7M1^rHIoi zFed!%UOD3sJO7vShimLbxIe@J_W%2F=S1Re&)r|ASvr;&jU-PxSh93}sr~(B{fHw- zepP4xw*1}Ae&2Z3eB7$6Og$>ZK!IROUhl~imyT&b`ErHy9V#lm3kEm4+OFuSwe!Zq zQUSQ1Z>u#}qPO<~zh{FrAHmLldt6TVGi7hSYC1nT5OULiZ)(Prm%;ohF7yW*Po@N@ zy`=KapXT{*dbz36_0z#wXgaL1(2`HLVt$|ao$VnMB<-EXw5|e6larElOcM$AiYAfU!j!MB1}EF#d8|cx-KI*R%VfjQgI#C7xVWvO1}rr8gdhFSPsXCU=GKY zm5GNDjI@)SJ}H3CJsrPUg1J(leMGovVW{5}yy(>ZetO??K(s7tX&2^ywKho=hXeLB z76Kp)XWJ#Eim9UA0ZS$LZsLnGr@Q@j@b6H8d#(u+8b&ZZtUp}^!Lq6XYK^7|9B4*o zPgw1ozik9o43-kVs;Kp)5$c z=5$5c`hLH~%LFFopi_+2G?_eE>m4#9Z6q;gVZn@Mkr$z?&uEu-;d{(oY-IU-zcULi zEJuT+b`@$^4h+xx*@OB@J6Z&{4%2P#n;58 zo=4=Net2iy^!Z_r0K-g@Z-N^#*h;@|2NLhIb%We_Cs}lfb>Xyw({LZS{uw78t0Ra^ z=(fR}ji?^mmGY*qto@_^7x(Tl7G7cl2UD%|ixT#XPmG@R_qE=vaS*!g&vHeRCqL+4 zquaNQq8+WE>G6}6O64uy|CtZ030{WVy-P;{%ALKL-_DL&u1t4KcXX``sxfO zwroN(($S5B>j$?CZcj7*1=d}AuBW81L!8l`?yMJ`uZa11e9lanM0kztNpu8=alkY5 zN-EXMuDplDjIA|TULW!~d~f;O44rI7{14wNrfX+bua7HO6Ls-8)KvJ?Mvea3Z&63! zM-5{Lb4NrD9HkJxh8kqnY4pHzPR3`R8|mfeZJgemFhdoX^|cCw*}wZ-P^S$rOAuP^hZ~i>C|I z9A9XW$3LB4zkuPd#{3KRhrJ)K1|qO8U^kxr+a7<#8u=Pr*L0fbraHI{!o{e}eYx%` zKW{+b4-yh5(?`^z450!F3(JfDxg|oYxFt)g7dEg><&OkSfj1qnsa~8SbHOD^H_bs1 z=f^6IhHIbQ*HO1-UF{MN8S=IBe*4?U`Y<6RW7$agt;ERa)A|fJ2#266}0Wo4kR7B)ML{vT>$R80A5fxGS@PAG{?!EQ6 zT~)Wcac|oVC%w~E=hWl=>fBT3)Z>{iEY&wpU3bCr4~w5vCYv2jrN>9d4j&#SN#Xw< zK0KC5WwYe>TQBgugWu!zU4F6GcX-X~d-kQ2zT*+E59v8ul)md4uMg>YU!yeqDX$MH z^C+e4d%ZrSiMLRCVb$wHnp~kYmGkqENZ&nSKGC%rzT zyWT9vkLVDmclz#FduMg?XAP4DZ zpg)ivJWT25pX2o*{lb?iJ^VJW59yb;DZTq@uMg>0vy|RH?DZji;2V^F<2_y<(xdlN z`fX@C((gjOkbeIPN*}w->qGkZS1A3_r@TI-Pd!ZOPa9qz(r4x<{pGW~KBT|?Dy7f8 z-|IvATWAB)7f(_8hbz54q_03ZNdJ5hrGJHfM*2GRDbjy_kGc8i_r06a!0Wtz zq@fd(E*SUvksfymrN@8V>qolyK1xr%)9XjNY>m>>hrNEJZ~HQ(!=Lf`k)HilN>`rp z`jMV{Ev2gudHqP&e2P-)&%A!5kxx<@d(i7gy7t4AUUa|LkCX#>NYn49H1~+tk5m9T zNDH5%wEQn#KhnxKDIFd3`jKwFjM9sr<@FWZ}W21+LvyndwHuA#I8bw#Q{ zA0X9VO=*9{>qk0!HKjYg>h&Xi@7pQewe9sIegAcoUU`YvkMyc9Qu^UXy?&(EfIOuC z^-@Z&zufCbdc$Wa{qKjpexx_vMd_z@y?&&(PFUYEb&eTfBaxuO6lJuWMdE z($|M6{UKg9=(({HX4PWUUK*|hI8vTTK0BQUKlwJVe zNY}lUQvMCz0i>BTl#blu9YDH%p3>r_-T|a#s5jEeJ1MP0-H?t!KBVuyoYG6a=p8`1 z^}Uof@A3{HotUFk0a-|=|AJB#+KcqEdnq-p_YNT4egUO(pY#qO-T45eS8RC)knSF* z^aGxE0O<#zUP$*seCG)WsIJF)*C>&{2EG!zw8YlJ^SsHu6(yQ zfb`tkC|&(lZvg4}pQe=lU2gzs^nOa?$Gicg7eM()FZvHkIgo)gvq0&{6TAVW!WSql ze9#*}T7Dy?m3zGbr1d3A$1d^)kZ$=5rI$SD4ItgROKI~uZvg4UEtD#kc>_qNKSrr~ zmp6d)vX@e7Jj)wEI`e0g&Oy0Ich)JrV#*spy89AJ_k7hGK>EQCQM&hxH-PjbBa~hX zX-N0IpVE)r=?x&=56=SWC$6USro-L<(wpI#ApOjTDLwcqZvg4%@22$7Tf70JUwVYn zJ3rzLAOV&Mz4w*g0Mf5PdypQ1zC!xVZAu?H>J1?M4)izDN1jFL51`MH{_u;GJ^{}J z>5pGW>C?c2^ygPn`oB;|q`!I(rN4Q(H-Pl{c}jnGp*Mi^_t4KsUw(knKS7<4{^eRq z|JLsfApQFzl)iC~H-PkCbA%4|U+NJW_@H+XX{bTzf-Ag(NEd#d(&OLc9YnhLD5WP4 zcn6W5@;ORRd)PaO^lkH$zWoc{L8NCrK0bB^=|?W4^x6l#gGl#5SxB${5~Ux% z&pU|pz;h_Q@x9(bq@P-&^waQsklqS;kbdqON5 zJ@4@jBE9c=N??l|M0(`qlzwyAJBajKpQiNTv))0Z-@BO7??YXXKDI*X|*OWr}Gzkuh0^j8m4`Wxtfq|aYO=?l<*NPiD~g!E6#%8$^2At(3m)kT;0*?Qf&>tSN60>55NL`p#RtL8Rw?gVNP+@dlBe zzeXwb6>kt} zBD580^=?W>FZBkIjy*`}yRY>IkzNAzMY{E+l#YW8r1HI#PF?8@BHi{uN;^o~efwmz1*%K&z<{@to=`SG<64*9`K3DYykvO+Si#|Xpcgh<=n(n7Gd#^WyG=CMP z>p$uZAuU3gNXyV3q?K1wT0iU!A>H&IO1B*IhLB$TbxIp|dP7LZpFnBr?cNa5$>&h2 zywe*(+P;=j^+Vne(#vk6)VSCiLOSyZrE@FZ5YqQRn~+`(?Lzv#3n+d62fQJqS01JG zs;_uMNI!fJrPmC5LrAZKGLU}srIdc`v)&NW{ZKB_PdtIrPrlw8LVEKvD81!(y&sos{0c?F}LQ`X!Wp;~m}*(xb;I z{Wg@3^gHjR^bvTTNFV(yr9XU)H-z+w5lWx@h&P1vC(s_GKm9VL&)n+`A^qi*l>Yj| z-VoB~&QkhY_#Nr*K1u0IukwbF{xM7GpFZIYA^l5((!W7JApJY^9nv>$rS#2jctb#k z`d&?GV8lCwH25h>k2&idLb~u0N*6uq9YT8IE~QJJB(A9#je+PTs@gj9n*LaOgl+P~a8gmgQUg>=U$N_T$UJB0L#H&ePB z`V9%@xP*T2Veb&qy)UNpBTzr2*S?j~eJkD}q}P9e(vRQm9YT8GVoGm(z&nKWQ_rFF z)9<;Wabl;oRX*!oafLU{7oZRyN#9E)%At7T&|FltLVTemnBrjp(r!oWNB+_ zy0pE0ytH{bm)|>A-CR3WFPFAh58aqQq7+xmlHW49`P?l*BU_e(HJMp0=B7`Ts#X74 zYb%gHiW$?nV!lZJIb8#e%|@kGg&&0~wMn2l@(xZ&Wk0lqXyZenCLV@a!2uwkNW{XgyM{?UWn!b4@C? zxVW)2Uz}Pe%H`!AsGeVR93+eWNT4OJhOo!5kGW&nV1mpWGqbDHD}~}(VR;D$Jblv% z?>AcMb_x#aI(4qNy??S&HP@MpEA~Q`I~3{`TTr+zYv*yDP zv8RAug$J5uP@Ea9xE)(Ewd*{MX6QnOcCMwQ`^I)5u`Iog(y!%ZCex=uA7^pD!^;o z(9QUcCHgUF3+hXGY?DTQ3k&CMZoms`#{$)@0ID-(Om3C8%MGw!Y)vfwq_nnGdxTAH zRrWUN^eMl+Z7`BImWBfqxHE>znyc4#426M;6s7<{c`nS8C(Dh@Ouo^mSB~#D%6nGR zOVQX4wYfdQlsYjT+iZ3sR;id@Oa)Iuu2o!dv|ccoE-%+BD%HPis*g>TzXgYhVVS zseDTbwDhI@9p0yV7RFB4A4EoW9DZ8z^5*9D{vP^Lt)MA)dJOi6a;c5nT)#>KLn+)+ z2CYG{RE<9-otbHw{;SA13PBYq!_J+XmAYFloi5jlwY>^?#~TZ0Q|r~@Z2pGX6`YSP zri%HEC8_^c+bEaUltd$}pr};Fi51JsLlEIi*=U$b?RMb`mEzCxn?YP(ls#*xJPWf> zUz#l=DQoKtzGSytkV#)I`I)2nrRmw3)!DVR!qSn|upb#8O?w5Cx`x7C`Ov@V^H|kH zzVb)uNWu9q_2LLq6s%@QPWa#MGD!{hw<^ag+m*&SJ7p}4fV?|1mN|89x3stCItE<0 zu$1YUmF2~mI*hiZ(vF314|;oMei;5IG_e&aq!z{X^}W(bi}H!~mGtj)3~o{?i*Pcf zW_m|apm7ZtcEn&mwk#`LBjbC(sxEP)gla+igEy?1as(HF(1-fIX;EINW_!i$(m9xW zx*KGynyvy!+57c6Ovb78XxS??v)mo63BtOdKY#zkiE@3la);HR0cWE)V&h6+rB83y zV4Z>yU=ZyS?NTV#jg^%*k4qseI~~dp+@!R>VoA`HZqgFOS!=F>o0xDtEIM5iqY8C` zqX1HN`9x`dyJ3DCfoZHD&6!sy(Pp+5U8Vy!Efo}t1J) zez@F#8ns8(3$S2KQ@2)Ri8Z>(s!DTqRf;VP>oiw^i2Pi={IdOWb<>A))7X4obZy0z zKuWLGcS`1ED*<{izUT*v`2?5zIJdmAn1_Wd0JhK?0c>H%${;O}yRO-)2D#^)d9g%3 zj|}`KW+g2xMFJft#Uk1$G+alQ8KsCSULjWrr1b6D@zOR|P8`eHxgo~%Np9H+pufhE zL25u28wz%Av`q}7T#lRJV~#5V%bzdRw{9=h`4S=CjHcKW-wJUhVCjV_EDN@HGsQAqI(xKJADPEMYTYbxeF^T&%7$pf1KR9gXooRr7P*EHi#4I6)LM)m*|Z? zf1P9uDSj;&=oc$?2v`(hN2(A<1eU*0uAXe1GA@DyID{5@JM+S75Zj&nlsMOh(v%`~z&G9Zi^gI_Fps(h++rc#3$Aub9x`w+O2 zLTmcS%JO<~V`_Fjf3$#W*M-SYP`Nf2!RpTz+V9z{v z*d}Ys(c1PtM)eI_2*JG}^<9(sto1JPNPLE-d%uSHY|TCZ&{S8X|xL~ zEw5pR9BE0KUnRVJ^5jf+3?Jm|-q*ZaeUi5$nTfdd4Gxv8K-B!W)CF-3S zPBCi+RCZB5L* zE$^1AtFVX9Y=-+wB9@D@ORH(@x9lYsK|7s+|Otz^W2kQcxTF;~eDaB&~xhe^By#sk((R5R)$g zL*>Ubt#{?el3`Pi)nrMWdbn`WQrHXE4Bkb>LiXRd_RK<=7Hbz^5Y7w_<78c2YUmg3 zEQ8emmNnCtjJ2t$S=<7(Xh9CG$v*g_tRA#9n=Y2zIMve3FWII=TC$UJD~-)lypd); z3DWM&q)c*#jP1zN*jNBM(e*`7rD{^6H zaInJ4JQ+K!iVD>SERv(;dZV%lXDZlLNVJxji5gE#s2*4eSRrOp1?UuUAG7e5U=?an z9<3SMR>{;_Q$tT$Kjd%8wB{8`wCDyyC$Or=6GZA#hlK*RJJuvjxU$mnYP$$Tz@agQ z#oN9zdvtbXYNNOU7VpYhVO9>YgS)CtGO>m$<;_}sE5@31@paph7`YyH`Uyr%)3xm3 zDzzd}SG(9t(SyL7T)o&LgZhEKa`aQl)p3^)lF3;(Q(`M0)o1SDs7`z>05#+iRt+pnH;!88lXP{Xyb);@LX#oNKF`g8^ z7PNdSs@c*^UJ06CSCbYb`L)55W0<3)*&3vvPsH>6aPXifJ+2tP9xD*ux6mu|(!P39 zxDziak)Azbbr=VSc(90Gnklh^Oj;2ZsuNq1Z+`Wt^^*29uzIyBFjP0|%@uIy6MjVP zNc%j7jBpKbHH!sI#Lm&|`edC$4!w^rkJW6mQQzO;?vkc6xW)PTkY=2lTidv)ur#xL zleE+sYS$*2x*D1kAov5~RkKCGLR~E$ifb)f6-nwxj{9^x*gzTxaYc~wS@6pk7NT!4 z`N$a_{&Hd`4k$LY?Sz(zt+2sT6a`iC#m$a&3@GYl)YWEFZrO zhP0KA!1q2izT|g4`8B?zsM?r^ty7hp#VPe_zIdLRBIX`)l%mwa&O$TS!LCeGa& zI1?zG7;s2+oP}YXAgXK}{q+6>I?~qiN2K>!TnVIfJlEayOhYeMO=y#x;T}f>mJiE@ z>ocWB$#M*fVZ|8Cx-xAZTl0c#B?zUPx=aqD`mMENl*_UXfk!kIN_7$;lyBt(h-|O} zx3*N%6fB~}yjUA{pfv|&UmZCTawY*8PmOdrD5>Jlq0mP}s_&8PTL zO||6>mlzzdkEW0f7S#5-%fK2OE!8XJ1aO<>O7hX9F_=l2u;>s^p0%**MFS6_b}o#h zEV@U*JSmqqDX`5Awv1|7X5@;&cd6i`R60|(exJfrPjDv0VAhps z(LaWQZ6ye$TR=9l!PdN!m1>21_L}%4=3%u$NC~+yO;-F<3T+@BcAUlFgwkka%Ia7} zm;j6A#o&b!k5=l9eYiZzy?xG{liRh@7Jrpn=(VY1bdvA0gy)NGkwt1`d$|+2JS)6J z0juE73}xc6jfUAg?t28_LZl&lrd=FXQXU$r#*r1=nTF-qvP{+>B3iF(m33E(7}bY- zf>xjf+b!0wr*bNrsgj|$0k2dn8Ga2yiy~u`?a1wy8Wo&1Re@i)XcGhG{nOF1{1$O1 zcW@?>sV$4_qr$8uS$>V&%o7c;+yzYT!j2KE!OENmEQk+&`PpN*xSicshZlUnAN)NK z*0mihfz+NVL!*9*sy}7NTMV1Fpo67M;_3Rt*fZ&M(CMJrLk4>cPACl*QNf0Wx{U#Z z&Q0>R!5#{L-#u$qiKc(3&`IAbHd;f56ia8&g8b` zqIX)w)x0%00OU?gzUSU&n-PgwA}Ed*$+Jt9M`Mt>?r8B{<((7(K6O zk1(Z9#(~exXnq6TV#xZF>l9BItrLU>+ID9lsaIPB26bDtzq1gG_26CT*Tq?YrficQ zHI!_}&dPPZSCB>*IZi^x6YYXF$kWx#)Fy7R*wrhJG+HZu&z<$%gd0l=OybI5HE_F9 zP{yd^jfBWf%jK8cg|;^t=S1_eS`n6|5x}%jEUl;WU4qKld}o{ zhBgi5fOrs|8aWek;NG&S`l*|Cvw+Iv|c z3+dzIXs=+btJTeYQis^{UGLx{+Bm*v5N!5ss(2eQ*!opO3`UZX!&oQ`> zK~P2C!a{{M8nu+t#MPTu*Jc-UIX>dapAHS|aEYXKr%G_|#5R4OSv*DGrA|4*es#n{ z8>C^az;WiXXuBXDw6(lxN}N0M3hi+6Nfo+Vrl$6zsh|n#%Cs$8IK=JcE7(!e2DS* zvEg_%vK@ra?}zG?PM&D$9nCmt=jXOaVTE z(SvPs<(5h{RkT@|mb|n?m)m5-k?eL84c8yRRU>pEl4)`-KFK)T*v^2@?Sd0-3^u<( zrE>+4x;va{EESB)*NmHx^mSzhYfUe4R;Uy);IucNEaI?enLQyYbq0KNWK4UKcp;pVjU_VsC%eC%!uSMcAFLOe($uu1a0jtbR&%( zm=Hp{JXGrzC6n5^oLwf3;LxEW*rzQ@!rIuMUnW&W(59_OA+>Nm!%S2t{8TXpTg#OQ z;gW67BjZQ;h^LY4vEVKp(eBV5qO`&dGwv5&4MVaye-$Bq3b7)j3;Y|H`Lq zp+;dfX+;{TmGhBFl6kcnPXH;~;l!n*!g)*B0q)Gmr%I-8Z~AV4VFVwM$ItTnH; z#O6m)gm#~YA0{u-%q)~?TzC`NMoUhiH1qo~qIGtRYFT#J4qiCtg8ep-QfTdcv}juT4z>Lp6zKOQdur+YB?t4G%L)8H&mh( z*0kkWb58D^s@)En@I>Y0Or^A4J8AG;0N*DYi_L`@37@ z1~!wz4HaO|F?pu6T_N%rdiiU0l`NvfR{|c?y}qzUw!CwQr(tm=%nb#zwhfXdZ!euL z@9(aiA}fsZdvG2o`*-xaDQI>)X3|8~E;3Ly@>^T*a6J05j7-)h5CP3NX$F<|2yWH$ zcO67Zkg{pzu(mXl!Lw-jq3!dqEx#E*&!XjT-UrZvCVdcGbKk7^P%do^FhtyxAJes* zc<*vEPLi(Y3~s$`Dj<|CN)G9tJ%bdMNh>3Comn#};cO9dFkIGL1j(W2#^_a3W|Be6 z3l0Ku&~-C*KaXAlQJ3^=)233w`LvR_soYG8pGPZ!9!}DXpXJbU^E1tw@%wpH3Co&e zh9X62Ge^tx*I*h2205dpL3G+E2lGTrkbUt+aSB7UZ0@tFoHa@fWsR0+00n;%k;qt~ z$5KRAhNr7FShaiCNZGV_Xv?;<q(RC4WsZzv!&5>fHY#KSC9nR5G!kJVV;vU{eDN;67PBUYXc5RSD zKDNo${_QG&GQIuA&bJlU&jkx$y7Cp zKb%G8=k~6uF|en3s=|evSR#re8(hS(4w8bmq`sseT`sFo-74!|OjtjfrgH4=^KDcR zREnslwDe!8vA+^NfH({j<(KV&|E59R|gB)_nq3MIZn?o5CUIR zm6}GpAn~y%??(JlZv*iZxi*n6QOcm$=HzF#s3)Qoe8G{@622fOijS?=QTP-SOW)^8 zHo2|LsG_mih)RfgA|ynEJ;H9oUW25l35k%blo_60=vz)bM{K4d^EWY8uv|Y`=8H5@ zkV|8o;LrXfLSIimStzT(Px{q8k|0syVQ1j#d3d7012#ftrnzk+XHofOn?=)5B1F!o zm*kr*&BXYbG%^IMB~plxOO+xSEm2~mY#KRXvn5hWIFl+vGFqafNZC|5f#nh?Yyt}j!4=R;{x?|hyl%a3^H zLv~D2bCcJ)zCM~c^9IUk^3D$@D`oMQdPHeFS>{t-=6Zf5n=D6spX-H)c_Ji4yz`;$ zQSW?6@?Wm{g8gK<%;E5)HjNZP__s;;=Dr@0O@*8x@)Fs2e2%9e*fV$tG}N~BLg0#sTYGRdVUF% zV(Wn!)AgKw#Ug7D?0zOL1ARt1+yuY-Il)@kq$y(@w(lpf~Pjy$ZKG~VzhUxcQ&g0!%7|JR6z zA*P2pnIew_lb9}WM$FMzr>pZbmVnpBX&Od;4$JokqKW}O$bBIq> zEk;ZabNXGcGWkhCera8hQa?GJa+Z(ppTu!M-V_3lm=ekjEseoiS2)S$p(r+*sPOosI5fb+o$sfMoLtlDxOke#u?k0q zYwJc5q`XZ>1dKp7UKB1BD!K}S05xNjtR^T3bS>2t!Ry3g<7tm1?lsv~q`l1I7_bq&(+lOZ7c0W42ze z)x*eHl#)n(I!ngVjWG7HX*XwCPe=!FI@S^8(ILy2R-}4{eEl zYM6_UN|l4BgmVKX4E-qQkhmlJ5%@Iy2)~9}tJYCWm&)?ntL5`k30JTX7qJo?8Wes4 zk$IX*;KvTxNb>XQBnI!?P`b(Cy-CM?;HQl9+#?Ts_$k*5>*p zup}uzKPgdLgcP$0MENHPMzV$DH9nu-?9e5PwUpyD0f)abBlt-^PI4Z=Y)?!s@vdE`>iD7xt`-}VpFCMn%SYJnILy$o#2a@=hjAjmU zDBNo$aRH#;G$@p$i5$zj-=`q1?~C_V#(0S+M43;Vov|Hq0?M`qR10$cGMOUN)GWY zz(y-IJNY$~YlYnpspj-kgxut&K3!&-5X!sCZr@Tf`zbc}IM91qViaddS*D(dDDwi6sr)Y(yBAcrHAwjRjd4gDmMm_7Q zsL7_06QO~zWYph^28IOEnh2dECX40yYDHIDKT*%aPj1iw*FRUn&m_w52e7VOKT+ff z4PPBsC^^KpPBv1iRb;=@oMcXd#vsH~gseh>khjq&ZJr7aG}m#-S;G9&+qFIMtwM{U zzY96*W%&ifveE=Kudq-j+*4sbA(JXY-x1TKNKDgm@Pj8co#Au(c_Jjpp)5KR+z9ap zQ7s{jJ5(bJ_cN#^Q+H4#CreiO$f%2Cqp1;G>R1gwozQUB@ROrrqKl=;VLme7;5T3C zg8{5BqjD~<{GI|ydx;?F#Kv zqMUvnZJG0>>ehCI7N-0xhr~@A(u`Zkq2-R&9F$k5IabP>wfa^_Cuv)*pvxLuwwXnYA+Y5x4-& zR9GmNBt z1o-JHr!>8cXhySHCaRDrv&gFnr%p&tg&9IPBongVR zO&w-px>OcdL6E7*^HOq2Qk2<;wzrjBk`%#i*Gdp_=()Mo-i)8;kt9Ug$j~_&8`=NW zw|})|HnEXG0@c=dA%}jbh0>+kMwv(2NMc*5^77ki zog5;lc{n_Qh@asL*)eRB8)4Zu^l71Aq5lcTxP~K0yP|Po2jrghyy0tV$8UT7VgHlL zWV6Gm^!Vu5;lsn^*YJN2A0ADOv%I%nu+TT?z3*M8Z@jF}^B(8nXQ1zzM)_=m{5$$T zhduAsYv63eQgjxQl7s(Vb9`^lkj=Xb^WkBOr7OmG-V5O$7ec+{56d?~(jjpGDLUWi z6CfQ4^BvOUgP+NV_UFPiTd=Jw+y}^VK*JYqe}7b-P}>hgv*6KTPA+OZ9WJ| z2l_Cl_+fcSdj}y&mnT3C?T>!aD=9|=Wk<3Kg06!ex|mexza2qo-Y=KHKM)y+Zv5aA zzz^>!OecBZJF9!b^vR4|2I)xH=htfT$1V7t3Y1^!Vd=v?~iakOyqh?$~O|ucM&9B%rZ#%vWQCj;P*3lBKd{>=fA!K zzhCz{{4eS#lp8!LY*p|VwlzQ|{j1NL3_Kd-g+_N^srnIRi51{|0|}&Ts*kjJMllc7 zk61%(o)OH0sZHc$F%QKX?-~3h`0#$k60ko!?@IDtT6({CMF?-0(C;n5f3g3||DXf<}h0}iJ8IiRz8oiiQoRWbIy@;bkhtmZOPKg<5 zhN+Tm#1*BZBO!YrxhUm2qf;n7;G-1m_^#BZ+<1>d>23(6LLc~Aax%}ZNa9DUhfcc> z97sXuHD?@kMsm6#xLVXxd&X_B{$HP7>itj5Ei0=#7Q^M~~;CqlfWAtC1|1&n;7pzOzmx}CVmJ)^R zH$yri8(M8~?+{$of*IMZE%49aFfsU1fOwk(j=N%gqK9?rH*4;z7~)U8i?F_C!1~)& ztdn)z%qqSyuf3`$2H;zkI^l}?an*w9X?WE`cc=?dk3Kj2L}~apK^oWabWYelytghd zB?aV6@wn`$iuC6s(3U~Z8h-G*6SmA_$TO$gRL*~EhW7^P68}G{HFF(Hi^BTLAsw+! z6);;EV4;nL`{!cwr=-xJ5zFIhT&0I)Rcl{Bo+&+Xw0p38y#dQ_U|1&YHr_spS16LJ z6q_35t;?Kzt~Y^up-`NfLDfzHzk2i1baA<`1o!9)fNzt)loZZ1 zA%1K^Mf`9A^*gT0!4H0SLcc!_5HFu7aQ@peyjMuq`2SJ0{3}>mlwFRCRFw9cue$dA z=P&~1i}?bMf@A62Ey3^kV(^i}D8!WaW-DJg(lESAZtd0$<9`|$t-vF1g ze#h@lya65$PmLVF5_U@@0JpqfSog3m^&POvQlj1gZ-aDA5128@%%7v-eiNciYPYr` zG$n;sjrbo?SHa-A=cKJ3xSTyd{O$z)pP+mCg=(W*uag!LUFX&0^Id#ex^dtf2h-HdXAah6#{cx)+Y$0+VtMzv#-i0w}A2f37En;yQ^Mc6JGu>GL` z+cbP@p0iHPfSFF`tbyXa;`UJ(i5183waOf9cnUCT1fT!;fFMlvn z(CaUIe7@C%r(NU4ncmF7W{1{OeKe8N-@3@UI&K(A9}bNq(sqlPLo4Q0XUa%B#*wp{ zH%$`lt4@1QpXN<&N%uP@U~JghS2q~O#{D=pr1l$^kn%T+cI{|;gryy0!r2jZ)ld>W zrFd2ye$YGE2~X+M;b~X)Hfz-?9FU%e!xj^Obz4uV)%iC<>kZprHkO71Ysj53?HbqB z>_to>hWYdA6o#J>#_(Ldw$nuzegPT%(YtTYLV9QfW9tnd1~2p7E2O2{BP`<@r|ptmE1kBrFYju! zFXE7gPn1XJjgTgf_8f~s(SsuOM}~-CFXk6hfmI^oJ+8QnW4v~3SoOLj(T~Z!b@<&0 zd;8nj6URH6m+O^s748qmOMuS*)tJ0z5YfRWrU#$ERO*8mieAEfTLfktqq$klN`>C) zOLe8f;SloSv{8CZO9F6jyZSQE21S&%zX#H(wnv!q9&F zDz=}gd9q3Hq}XD6(tz!|^w=h$qGlUS@&;tv3dp!dU5C|mlu5)je}4Gg32Wt99M}7M zjoJ>oEv<`m_KE@54+gjn_kfks=1y_#2_n?~X_L&1YlKu|tM|~aYV~J#Ir?D}82Ln5 zEN_WGzga80Vn43LjB5;3vr{UGv(!$nwz+~Ke+KRyEmb$murvhr(I&y7v7M#P8LhZQeO8^w;e##1$Siu5cQ)rS90HWC&q)y2|T{toUYOJ<4+!6Z|XfeUA0;Y~w@ut}e#2y=|=k z(tIn3VtvGwG2$5g)ZKBDL`~i4y%AS4WEV@-#CQg6HMP~ca$-C1*4rs+$t&p0JmMJ3 z%#NxnRC-uet&Zn0Ec10oNwA}BvHU`V)p3V!b@0~P*wE_I6nE|s$N1z}N}U-d(d)sZ zaGhF3dkshPZn<>2Trbx4DqXgU_NW2V4+oeQ`@jrscGTT!aW;R$>KJ08W12N`g+eJ^gFKfd57a|Je3e*2(Iw6YGd$v@)Af zZIj-))GCUH35xTZjmnvF5-@CgF7=23!?!UE)0P{zZAu#2g=^F`x~SPb-$Sm7+*Fq$ z*H-&74Eo20HrutPhp#>BsA~jqL_HO~hhY`N=`O{v)#(r5;b0iH*eIz-ur1@LW0X+0 z)+vc|!A`GL%~1Sqoxz2wTYQe51UrJyl9`#nzSKD3O$IyS9o&wP`oKIDXJDKJL%L?@p}x8=)g%?_70r?G%|1p8vaw zd7m(dvoCcFtgw`*RZe`TPCjUTF8pt5nXDd}%rp1L%Ixa;0$g$m$Dz>EL-DLbdJ4L5 zJPN|UZ8Aq)V~|~P0#K(THKP>y`&*UcmF-I7ToSauE%I$6HF>}FF?=C0m`7csjy-P( z=rHr1ge<}G)VbZ#ULsaIwc8s)Tkh%&ap4+ujWLd?e!L{^m+bU6w+~#hE(z z@|H?FiSXyyuGgC}*dXLa3a}T%9xz+sV0FyQ55xb22uv$dMjhjhx)mY4c#G;Q8K(#@ zuCMQvP9_4|w(%C*82U78yBXCGR)ifh;tK0H+@r3s!*TT_swDdT_xPa6c~Z52l3KmpW6lx*rR*G;KLImQCyR=+uxig^$H=i>y)C*rH~2Y7gbA#=f>o zQEqLEFq9i_NU_3q94T4X*yDt{2C8>Xy^8D?gpp0OR}#D)wkO3d8Eox0K|1bgWD1#T zZ?2u2g(1P;C-CSsd5iM0uCdB4Ij@1wr0}~FHp>gc&wQ`AT{>5(o=m`wcHS=x)a*;O zU2M;5U~w4$+|`&HK&O5{Mzb_aVq?TyGUEx zdO$d~jUH(esvQMnU89kss;=%u)>S-DQ#_YXl=in9iCFh!YeQda(AH{dR{b=9k|C_BaE8$e9uYXDZ;px6hHXg z34h%z!!m?f5@2EQ-XLA#|3{6n6j)l6pYHXLPORrLwA*4f$o3P=%r4|_Uc0$Ci(3i` z;*ESWt%@3RjVF$%R!0)8=*O{V)u}a5bM#5$V%2&Q{C2iJkE{XXRgQ7eavQIm5EX*Us8v+b^zH3Nd*E+80NZ$>dJal%+ik#7NGC*UkD z&w$bv)?Sn4>-F|X9dnH)j;rgRdgxaz?fDS;3)K^~B=t(PF+8S!1s8#c_3CO%jpLpDKQL!VWJ;NWUoo);RAIrpDQqYK`B(QlhN!`yriJ zf_V5#$-G2wZYWr(uW-v;SusVjY8w%3bO(oK8H^{H(XI_4Vr?A=5LPZpyqgA4(l zcL@G9B>lA{JpFDwhb_li95n*C?asl<`@muV+*ZZ!PFN|+ z6x-XiH%MXlgX1YpYt0}8u@T||sKMntnc z8w8%3*#^0hJlXkDee3p8z07yXCc)ccYlY_w=;k(v+y^!`h#2FKD`DI<-Z`SqFniis z)z&Kn+lA^@`D_T7Y>T*Y$2g_#l!hMCRXbxnc;a1z^ce%v z`Pr>LG(+fZrnX^LsM#{vij;BJNTX(Mn8cMOd<6x5cftla8sM5u3>Pa&u%vmvFaWbJ z)t6`M_aN8|dcex2UX+b$cpbzMG42?B%=Y#%!1G3%rg`k;CW7sSa`j~6R1&-$w*G0` z*&%JY#oCfWL0B*1#y9R7Ih;^E8%d0=bb1%gF^1kVWeBb$z~-<;?-JA1QSm~4h9$XN zehAcCUC^;BB|EJtS;9 z^G>)%4>fn6CUK`be`=jtxpzy~;&|Mkx9gCOUXcLD=0&YhD7NFAaE%vgBH&5fS<~qq zl;7&F;x0zC z?Fl5Pml-0>>a`i3t+^*$3qr*R)CCglqh9B5segwPkGQ znu{ggdK#-St(lh3xs1m@;TUxs)2vAC*)!@&k&=Yysq(4PnM$qRP4-O5pv^zzYjcil z-V3$}=iwaO?tWxtdA+zXH9Ma_T3B9@4(JKM-{vAFT;rNuqVc(Q!|zVaUXSzfQLJsB zJ6WqHVdog{69#+srP}!p8lSg5$9FY0T?acaUJnAGkHMcB7K4|mOg1~5N{^3@9X?EB z^5Op;K0KCIBlSIhxvKFuDWc0ewfZ?+nw$hpZ;R;fW>}B1+usZ6#BTRnZ{dz9z=4DC zf4aSWadvTe<>rm`)%=m!jhWfCd|_c#*75BZo*EVdpvJMFInSpz7Syq@C8434#=@m%3VAvZZeFDcc`PH`L3T9217dpr-sEK ztZ@uvR6l=j45(w^L>G?%>-lhC$k?uHY;81HEuFM0A~h_AbB*I7-5VD+9?+9rJT6{r zcsIOXeK%N4hwbpXu~FIC-H_%cZIhlF7Q?~j(J*qDer~;Bq3@vgzIUCzvG#ixeF(6DhlqDV@w{`JIxY;lg-mQ)V(<;ms z210v8r-sD+H`}3AKN`-#GToh)?XOhIF%mtjMxv8=n#Yrwe(Tg}9y_6t zu)bH`D(viTCm{l7dzy#!DpKNSk{^*t|hvbr9`c~I0Na#yIDDFeMkb_ARwId z0cZU<@}^R55#nq{_46e0e6dcS1zDrdvbL3o70_stsUH=?qbySthT-Mpx7%Xf5Ud&! z;S1em&6Y~J#dWh8)nng7uIiWB^`Br8EDc-aW(>%M1Eu_S+nlhZ;@0G4pN`2V#`RS z+#;!2&7GmWJ%uX5>jA=-_IDV_6LFH5?ViF(gO0un(uswP*bMc75#7oLt9SxZDYuwt zR&!QZFA}68doOsZtGng$Rub$E+x7Ogr>7I0OTBhO-Q;a!Ni?4KUHDQdwYOrgH zJr?s#0Bp&eO1VW2bvE*F0{zC9u;+o_o$wo<@liZi+A33H;{3mBnfD6o9QLKo|MDy) z%KLT?q*MF2QTE$U%?UFuWt$?Vh*a7w64=wv_)zg(-2CkG+sTt%Dka0CVQX91>St^> zcMO}MJR=@M8iP5Nc8u#~)U{4MD?_z1&UPh=M{o$kCrU5h25G352@uV0VjX-fxl(Dz zXr3k>-NUVl+jIW&OM-90R{PreCIZ~X)4f(p?uvPW`&8O7s;4=nC5e{tlZXcKyiQrh zcTfbE8@Jc$r;GL4*>g!ivaMzOBG!9R8u(7GfkW-LIf+hI#c|kEX~&44=C=CY+Bj7w ze@__EYn7dH4K6KAz{$C`YvXLs9$KQHWIbSmYRNo~#h*$$M)`WE1|4Lc=iNzB4FSHH zmF2~mdgV+x5i!2Dqgv>J7^sfLpGrGM__FHij3h?*cr**YJK>l6ULVz`N^o5&T!3}{ zd*yhaFw=s4#rMjE1J=Uv&e7XY&BKj_lXmS;BHzC?~MFt?6w%u^2y~fON;7es3 zBYv8j2Ya@Kir??!_+8#_z(v$uWm}9fr5)w3+l6!zG1=c?t#^m83u7wd81EZZ<9$i= zI&=SOr@YR0^QTxW)ggonHv%O=5A$9zSr!f!a?pNvAUpD=GLA7ojfLFP$ErU5ejm%* zrE`_)$t3uiZRdK{zUKX%B5l3xvLeMqj=`VGIK~7gdM8!d_?qtt5WRo00v9)Qkymcf zU}3y5urP|-r1fU+1-rwfxUhbtu(Wn_aWOJ!UmhUyyUBx-Q3t?;`OUg#h2 z@!owml~_l>L4&i_Ti#S6EY^o9r8|2n;}|Q{+#B2TaHtl^D>!N=7H9rIf-+{C$Tqbr{;=3=%ac6I0JM7>=E0!qV-DW{hd|bev6%eih1qI zoXR*x2D7TIkwi4}=hi7Szsg7Rx#}jproD^M{6d3ueMewjulnte1!q_8RK_trsEMXr zmB5`<7qKUT-<`0Xe~9CGt#mR8mIm(+)-CKyUA^JpiN==OU|77`4=iRE##F{J8aSb@ zKKtp>RNt{ zI6B~hzm27|FdJ-}$kd2q3~@rWLXxPpAIF|ur?mDD(PeSTU`^z z;Vz$z8-P59nAC`4^igxZT@TwTwtu8cu|03V_I)C@jc1`3`E5$e>ubgJH5#Q6jTZV& zh%G5K;uwwW?R>QSD_}+ z57=q1_G?3^o-b9mwi9tS8264c<;=cR?}_cY5sFFLej7v=^T#wg+m$~x;uv?-oDkhR zonN&@UPmxpEL9WWMX^1de}rK?%8SC!@PJnH{Q*sGO_5L2b>T{lxW*S%P2BSUs;K>6 z47F?_Y67rp>jAWlE&2;d%?^x3b{t1=X;2L2)QDqjQRC-GqD{fyo}G#<-X|itP(4vg z0GfHPm~0B$Q_g)rV*AaAo*5p-L(WrzT@hbKYQ!GPso;~AzxX&#K z{terh%(wyFbsyc>at`dKMznO$Zn5OXnHqJBDr$Ch^$@Hg_{X{w!M3YTMI4${b5j^w zvZqEJV}@OF?m0ip5WhRIuIUXF%az9FsRURWyf>JtWnZda&U!|O?dGc3j70H_=%PDw zYSb+{IHtKLHiUIbCKaZ$~X5GNGEo4sQqRyvt~CJOc2Ej3279{ z*6$oGF*WKIGaMUM_m?Mew%FH!q^3q4V~d*AeM!6#j^BHR-<_~s{x?NG-OiV9H0qV(aF3399QEvy&FE&S?2@cCk?CWkCy9= z%4RZ7N434-({`mF18JxiEKw@%7i&pOYSb}KIicD#Nwnp890R{Qq1AsPjB^Be`D_BL z8r~~RVY4q)quZ|BX3(VVw*oh)^L0E*b>ryl^xE=DE+_iJ=^LU&d8tvyh^FQS&?Ls@ zAJ3jAMx;A|`8P7m?^PO=S~Uq?aogCu?HN(U8f`mw#x(Vd7o=ILGjD3N_2^{}$EuC; zlUmsQbZUt+93Lsy;J~-~xu!sFs<2xUlp1x6UTXa1J%p8~iO8HE=e%wM+ugo5uU76Y_uE5UVm9@g`s%&MqO=c?V81Ecck)K4L;ZxYt z>y*#%%>?-?<;_}siypl{UD{2=$$z#!Lt7t;+y~}}5jx4?z&~*bVM}6CS=V@|>MQJ_ zT-EPCt)M(9(IH!u7Y$mT$3(;Mw2S5d$}t>7P4gq`g&9f5w@YFw+j>kiiP+~)xKkSb zEn4i~lmH(h?->Sd_NDp|ZBIOrk$RJril1`U92-$jsk%0SXA54=G!A}uBKq^Q4Al0&VqdD=vcXcKeCQv9bgH?vJz)kqx7tl^8tU&+y1LZ@Qdzg?=vYQw z5zw<~RK5RT2o<4$(M1;ht%i~Ds4y~uKCtq^)0r$A6VvngrKQ=0NDn3*8tpG3m351_ zj-}OiM{jJXW8>$#ery~wjE#3jjSb^!V7J#rXiT&yIhA#c&5o;Mp% zb^gx`cyBNj&c4){!Hhx2-^+A7X?GlO3)A0Lq@>0i%u2;&HgP4S#vG%uy^}rRnVPZv z3j((1YW1B`qnrGey9Q)`7ShqL!*NM_zzWy?e!bP@^`)7Ox#g9`{8}zI4EvVYMm{*N zd}C#HHNRL~n1w~}q80P4Dls+Y7R&8fI|v!`$a#q2X1}`iKhfH$LA&W~6{fQZz{L*- zAdzdsU`C9jU_=Qww)O}g{Etaxdtz2Rd`%6sWG>xZML^(4<5bQHuolxhPNkle(ium1$Ip(_r zWY@NmV7u@>VZdcy>MYattQcl)EJEvTOmR_}gVP1Bx7DJ&HF>FVw@9h(tkWcVRXTlE z%)2?_Hyic+og`>-+j-{-8wpXiI^VescqeVQ)8q5=p-9o(+}g%Xg{7J0n^erVNoH!? zF^ZZ}ZI~YJRU774x)%308F2p&NN00Y0i&jH4j3`H`~NzaY8YNcYjXTCf$JL#BNklWBiQ#uAyfN>iXg*inEY>R3 zZi@I@$B}s3?chxJ=B?hmG+kUSEWuJ2(GkiG|JHO^t#8u>(d z+}{YP#Pg^@r`bv91a@a}sR_r3>X>T7_Ykil{@0Z!-c6d_dZ%d^@vz6J$-I=VPB&|H zM=7ZZxA1uq>88rH9bQ+!bp4xzLXE~_}w^(Vntm*Bvb^aS&jd6Ql zOvpMX*mO2BHa03dyBmrL6i--c!Z9wY@u6Rtz%wx}U^)rEJK=TwAVK?D>0|;{^76i5 zUBbT9wO=`w5@nh5(*mH?Mo(jLDmc)3Eq_FEGRBpVnsAJFX4M-Cl6b<)W7(6z9YUQz z^KVi#pW97Dj1zl7{it}hjd89)yA9hfgsuN;Hy7pQi?KzdCR}5j>Kff7Muj@PV)0Re z==HsFeWuhXC1Ezn<76VTRaC!#Wr)(!u+Uy;yQPotm=Fcx9p}KDnsAJ7W_w7s+4K2Z z!qe;~B0r z;jTsX3k`bt4p}c--KAU1M*!M^J3Z_eQ`C6qdKy~Q(7)5QShii|>T76@M$=J11~A*O zr-vOQh`p14K=YVS{`uXmMYHY6KR%i*ZqAL=%htTY?BtircCvL?x*3#h{c-7G$M|2*y0Fs9zu&cZ zcD61ow&X@y7uLM#VaKSSW*up7->y36`>259LbXw@S4-PTh?&^#+qFG;idz}H59opo zn;BfN{3yPR^sr+rP~)FV;>lA_WN*(-ojmmi1m8zX^$NLeDiL>;*q%IP8`ln6Z(f9i zC#nf??HJ7IVb>U-8rQxmfh*`PVpzuSPOLfl7{zkAzK0j5o&Wn7d4I5OVPER{4BH6c zQQC5=0~JIJyD_GR9V37v-GSf7br`>YNby_S-rq^Ys=2n~m$ck!fzYCeUpL0|uxqTZ zhhG~X#>cx9zqXOSqXG=g9*AZjw&PBxTqAv|H!g{mM5i_J|LIaB+xjjTk}W-PS{ys@ zrc?S*cc%a7rHU3DO<@e^h^4hNVU65w z9(I&HQ#$1s)6?t~>CNs`yZBS^^!AF|rE`_)$s|PbZ2fHG2He&OZh6bCY~qcjKUxkl~O-POIBor>T;K?JXqH*58+gkacqFRGR85Nf-HHWe?ni^ZExxkl{N-61_q ztm637h~uM`dSgEsYbx5TiCN3-^(k9P;rE$6XFBB=v(ua)nnX>^^$vb_!utJFZ*sd< z+T!~m5)gIfJ;ICy_N7|E*Rzx;EBFnNF0|dOii=an=<(;gyM*&Y!~GarRyySx+fyx$ zBx-7|nee+4IR7*Htc%`S$i*I7!Go%|4_Yx{st-i(2`DSF|= z(b?&><&|76wEkGvwXKLvryXN`n%m#f35=0EnLWcx;ky%~;4cCM%+<>;+b>r)&m}>F zV}Gb0bqrYTA>m;4d%zZ{q4h;A$w;RiBY>JcBuVsvboyk(zYNe_ELD?$Yg-?P)yhwf zNoacuh<4;or`=+MW14-~;|bK%&tU2ZzdNC+|0=*TJ=vjHukDuWjY=YH7T!Ce&Q|sH zZ7f5S&GIQo_iYxrA8bKhWOmES?9thksg3FR{L<3wLUCoeIJ>e|m|YE@;LOKRN6Sj5 z9ix#G>I#q~S~vVH-YM(muLG>W)yAdM<@#dfYyvziykAVC#mW=T5ghb@?KoLvpTOnP z7Fp@EW6V;s7Bz`GX8G>WPVJceY=CyUOg;ff=Y3*A`lR8#a2KTe?*+H*E*c}=T|heR z7R4M(t6rL(Us3fd{*5=e3+th}%&&N>0nLvhnpwNee#M(c@J>)}#uS!jW{>4^a5)@$ z7}L3pC31n*^r;e@Te>a8H9J^BI_(zi9LuQVA&Jq>PVfKv9K{9M!<2;iERX&&z_Tya z?%y(uh>!3QL0TSvOi*^?sOVrR>5OaqR2>;fd{gk43x0QEe*FJ=ll5|Gi)<)6|4&%p zy}@A5zSMDHwQ`oX+ZacM7%D_kLrVZ+aHcbk5!5ktuG;fes+P{@5x=-@cC}HeC*rne zTVLfgLwA%<=T(p%Zo65#!&Vr%xgK0%G@M1unX*PuI4} zn@O;_ZG9?74fuVS;y2WKGlYwIx+GwFd1iKcV`g@BdZkcYD=aVJj5NIXQ0Ucm$W3P) zW2h73hw10m3l{ngdhdJJ=^J}?iE5YpT`&R?;)SubOKvpa|E*#CTP@e(=!eV-_QSfJ z4yksCOlRDpty#@#+$7E>JAF&&7ZLT_<bKJ7uKyXfxuA?dHb?@IJu!&(_Nk9;Yl^HFQK<5mSNDr0n`=W;jZk4)y7Pkm)} zb$wwimxKK2jAPVN(nRr%tVK{wjZB)1~e0du-LMg51kF|%$FW*f}%jMHu zwo*84!0rixUDj^nO5xBNVcu6(Jn0d~D4Av_>u>^RXis9je@TZh`!&RDBNINTCINaE zdqe%GbF~{-rl`5v{g5uVpRZ47X81;*Pa}0^OkwE}$LLxQ?eHYc(Y1e5o^}#q!yQGt zF?7ZcHQ)kwKr|Dd=+_mZsGd z22|Uzr$-%QgqnRINyIeQN%-9fugQOMOz-bCYC9{n?d{r$6A7?Uc)u{nvM+TGy2MhV z=AdtabUFu}4)=hCvgW%&xP=n-3F4f-9rDtnjuFQR^;Cf#>Qznt4c#;EBGfM!Q2#&# z>P@=X4fAoNrAHlOk7H_7CyBGsr?4l6bFWV5`TxfdKLeXyOV!QtTxA!kJZLtJt0myv}+t z%0hn#(y4{6_JjF^fqB`1K0F+{&w#uR+9)KG>->keOfr>z&Sk0M~PQe7;a;oGOFRS=?64IlNQBjSzyl0uKbJ4!8$M$swY`;7T+olPmVwFqC zw&G8Zy2U@USyg8z(Z|y1C{RDc_0s+hf5UcF6zGKpRNvvFI@|*m7K;=Da_3HG9pjps zduMw46jV)pfFXK$b8~xtuTo3Gy`;AL6s+zgCFZi<`Z%VCGjlrY8p~Aufjum%SRUwN zEawcGIk2S_IGXm?Di%jP3F)k3G;>t7Ig*I#PM_;|kf9nbw@Qo$&{jiR-MdRPG;h6) zf|iU8N7i)KEj~GxQnhmu=Y)J#->GQLAj2_>$Mfxc3Gn*yo?$AOeW`KzqXr#KPAMg5 zmioYKK*Pq!MINYRmw@GR-~*AM-cGsctYg%2RE^X3^to!K46$*rnxIvLw)*^9!w5J7 z>D24VTW^NGy41>*H=T8hPmT?%YhrsET}ARCj%0daU9q-TX(VF?X{*s!40wJpz_Zu~ zW>~Xh8&`|7`5R{8M(V}IjU`E&vup5pzs8oC&bq}ivm>fS(>rfk#s6b`{Nu3(Nr>Fo zo;PiE`Yy3#R(Hvf4*brp=o8E2fQ=JlI_nsN)SPIV#QQEfeMi>?1i|^uMg=yQopp>Zj;I!N54Eb^eQcMa)>i8>1X>*Ipogw4 zV>;^?MeLGWhB~cvFYHqMTAdgPRs+MYaci$0y>@KrF}HZ3Zv9>o=X{-Bwe&cO-K{gY z;ChSC#FJn<*v|QGGT099fOPa>sewkHI9`1Sj)LG{fx_0F38b;1%<&k4N09zS2t2eK%%`WD0-0MyLbQm@r zE-^jk80(x+*RJ%=f>X!L6X}>aRjO9Y+hiS55@rgvr(-P`#tq+*%$(zN9hTWs4mU;% z9BFZSAf&~VmL7A9h-NkKh$P~jKUw_l#E#^P3Ets?wyFISC(8BJ${k5KbC&lCgERY5 zz3R5B!-e*nr^N;Fl!-Xp=`q&`r|N0%**vQLeiFrV`9x`dyOD@luI+3gYtY?QNXOa2 z3~Re#o(qdqBosUGrNC$^Q$*6O|Q)6X9`Pm z%efq685M`hd0WNwxMN(lOKg5VL&NV*_+T!hecyzLft zlejF`l`}o=7NyPh&QF1dY+hUNRDxl?PH#0qJB4gl+1Q?+BKLv$JtHDI9)Eh=Er!~| zHR>)iuAfG5JzuJC-CnAfS@0qee#Lgchl&JZ@J&=y`0jUQp?2lqzay!Nrksf!9 zX=-k`>Un6?dG0d^w#m^GiO|%x9-1WsruixQwB;E8feU)7W!NiKt2VjGjjwRw`#KeX zw?|%j+%@9a9T6iwSL)R4@!KfcYqj0!+J3c>03FVIgu$78sXE+t_PD^?ZlS$Jo5Ynf zJ?Vt+ z+kN~NYn5s;)}7dT)@|2NA%bb^E!1!UKEf8FINa%R#|UTdydTg+W}nC5E=IHMc|RdM zniOj@EL-xXC)^^Q*)Bmc*FpH*2`|Sp8Io@=!j`uqrAjxQ6>E=Vzx5W1S@cCO)LePf z6OJ*$o`qqhlb=P94A(B?_qQs?w-a&p2_N0iz|cpX=h<2qLF;owubPgD6)ojB-02Co zXyI5!-P4(cl?U{EhJil5TIdk#4}2GY1_*ch;RmvMhdu9BzG8^?6@Gse=xadu!F>2( z`9{O}FmZrokn)X$^IZgq7whw7pGw7hPlNAH=;dciXr3ycDxIm+>Pc9Uf__yes^MQTtUZ1BBC+8FIbnbFLf-~dh#F!W$m^WEfrVJ^n_zv zQFF#b64!n|mOUeU^K=5e-$Bs}OGlHS%dr>KkBZ+6%M|6sI|b=PmqWWPjBL^Mv1ref zo^Xs9X4IYXJ=CiHyDPgAwJ8H?x5B73dMZSl0x@gDlAdsk`f2vq^ekuuKfqqVaZa7l942p`+ zoDmW@$2$M^+1PqJY|qRjs3xs9qFDoGd&cyHV@y!vbs<^$XD{*UkZ&Mh7CjW91@LI8Eh8?4RniB(iXWFO; z{w^QEbET~^H6YG^`{5F1?TTNjFJh8qi1J0;1?j{W0UFqEznx22wj*K*$P7D105!XJ zlZfgkvFC!%u@j!Ps|l)?%8lD=_0z?A?d-WESjD!ewv7RX+i%{1Qk zuw&#-~B{`%dQA$c?f%UIXc9anP2V5zHdj%j;{!^)-6* zji9Allam>CjO=CAxO5VC3_h7XCDc!yus@z3Lig0U;`aVYSWcG!zg)ZZHAN@y0W;dg zU|$^W%y8>bzurmnn&yyK;jQVNT2KDwy zsfbN6#MVnYpmV`YBKC2yge|vFyOLwsjW09o7|$E+q1VP=k?B(OzQBOqvs(08 z1voY~Dm%LyI5iX@Y{i@z{+}7&(%lKJb(nn^jv_qt?P-xJwW!WA){K=3FHK*1)H-#d(Ky5WUIkBIOM-=B>!}+z;Jps%RHM_jb7Q-S9+%F7Dc0OLGbzW2 z-K<&OL;y9_ec-!s~GKK&6q0 z^>nsc+IE*ok+t1ION$GS92qkyw}{}_usVb6ojj)^_yr8XwOz2QD=>9TfMsp#3t2H( z8V_Ovjs;8eB`S%pRRxnc66>EEi{2)(W$$(xDl!z?SuBt1>eww`k(n zh`ML{+611HaXEW>_}z(FyO29IuqCjo_grU=;BFVco>O)cK|DIWiGFVc{Ok z(^;lzNOY)xOv)`@sXJpSiN3|BuqWOr-{Olx<0CXM5->7seT%oU9*pw5JPPSJ6Q#fn z`oO~0kzNzi^ZBKv*@eirMW;&0q}*blV`=r>(Hk48)pT9gkBwu7vGLBRu|cl}Y=Z@* zjENQ{XVQ+*)Nyqz^ya|oSeT?^q1GsMo2PQ#Fb3}9V}P~Y#wpKV4BRC@EbLrZX;D%p z?HFg(+)kIoJ?(szN2k`jiNG`fcFN2FZ)tw1~UeH-^=h#+8qbn0=8R` zl1V#8RyDZp*)gi_&Qo01PBi|f-%htG^?`ZXE4nk|@n_O*(bF-_THD@UGZoiU0|t}{H71S{Tl{aC^9E_gkE7lhky*!{*|1N=%yX_X`# zi4=5Y98sCHTQoO2p{}^;t&~)C`D_^J>;lvCf4*vq^koCm-z*}XT|3H-w{7B)l+mtS zV9M~`s=!RzEs~qnoY&T~U{uu4g;9^!P$$4gW4neSXTUr^!e= zXDiFHPDAfn*{i{Hn3=u3)dpzEr8j^JCd+{w0FB+@4rZXi%#x6koU<*^BC)&Q8 zbI!h;eEH6I=gVim>aMD;u2(f(54U~a6j1$r+y+oJ_}H(1cvbcOuU-vyFV1&%vgyX~ zgI-iVcFi_$t-HCQ*`PjZqouze@)txAQ6DwzHVyhHCi_Z3_Ixvs2>38Jam^8S-TA-4 zpS`vY{UZ=uS=B=-^bbc7Q3dVdT;brOG0BfsNZx>i$!xrJq#^Vgc*U9*h920&)6cP1BLta%N z8WVlv$P(>ZH%k)jvJu}lO?Lil6cH7}5R-#>Aj^M#IiD|z(?Z0z#n~b2N0wvPm>lBx z%3-{+0J;9dQAAV;L!BTek{>&=B=`8AtZjGZ6xx|aC`m3hj2#AJ$4^EPQTq#3RGb*T zd1M)Ot)e0suFo2^MBdy!7{yeL4`-N$c`=?BZyZ^IT~8sa66_W=E6aNy=F?G3RQbY; z!pR#yeq>oD&nW75oZD7-j-QNTqM8?!YA1%Ds4#p5gzD*dF!DjwbIm3?4|ZUeZFVe_ zYT;Rh4GN{Ye!Yf$Gxaw_F;U|)#Nd3)3vIf3{gXM{PY$NTyx_u-s@UeLRhLg+n|T4L z&K0ei{Lv_;YI`{2BAn)g=gdzP98X5`T`zKoTu*ayRra3DpWGqaLgSb6u_z`gdxmVG zz%FL@=_AUns|r$Ow{Eq!2w<1bMln&%GsN8j#hBtxJ)#u5uJbs>dFafA!*Whc{bUpq zbv#49TiEZ434T8ie0%adWCrXEZ>!W*56RvFGp8falp{&jW^qC317ffACJf_wY7boZ?w%&!5?0BK-9G zSA+`&Be{Jbiiw(C6i9W+p!oD7M`~O{>T^1&byEg2t`47y5~51i!PPN>cg3@X&p2|- zc50a2k<2<*it%P24XgHb}%;UY}%TRoi5zLLKoc5i~xZI*sHt^=zjaxa4S?Id?ZM24T0yS)FfctKM^HF6|IYD4OR8A zm)$(^-n)a*&=X!=tLi^e!|O*Fuj08y5KAQFY&`tl3%nd56k2}bDpX&Fnkb^8TL-?; zOQhU`-xMW8eeH`9SUW_+8iZB#cUPp5I&ybDQw!*DV~{`%p6f4R&K7Rc)q2E z&GR-k3rj4Zv*-{dRGkcGIiB~>bDrdOJq7nB<^VeeJ|E6z(b|ozt0FcA~k#1Sk<~kDN!X`#VXlZ4~Z3?par&Ug4kPTV)@wb1Fg(5_`t&U4wQbt-=-yNEKb8l&FmbO2O*&6&!AxDTNv7BW$VV!CI@u>8sxEA*I3=3n&#` zqLiqAh1sbSr9(5NVRky5%=eyw0e$i8RCb6`qRwT|3(k2s)_)>*4(#5?9Sf~< zFZ3>9ojOiMM8L-BIV-2k4vPq7?NLh9vI3i6@A~=Z$js*T0c>tu{&QOzXEV3M0ygvZ zC?)DpQHVjgu(@ktbH2-0sb1_M7vp!G|2%XI>bhc&MW`y>qLipNb>dcWJ^RY5CmvXN z>BT#b`8Y2Xk&~w8rDH3x`GUa;UQzj|k+#5Y>}tV(O?c3$nNK)ibZa)9?|MKevkbnl4;8am z8=;rsml%Dhw8a8QWuK@^)SnEyw0+Dz5wk9KZ-Uc(3#a)}x;HkT16(~|RamLYD`xer zyn~I^>sD4(do1Er?H6^anpE(uE@S`9%&aJ6=>e~;DyaNB%809^pE>V*Tvs5QS@0tmHYH&Bp4>?`_ zb(CNa9#^^Up(mBLSU{=l6LpFDl%eAMWe>AZ-ob7EPPjKQOMTwJ>5aSDbUNJ5qO}XN z*>t!G+O-!^e`X_mVPfCKJK4PI)6kCBRYt4W&^30BxRO$Zu(pI(W;TQJ1J+g;@f;gZg>w!2)vE2V)PI zZE+T>H_Yte)?31jGF#Nq%KAiIqH1NR_4=rX9`=*D`A@^W2@m_h1)LTKxUEkod)ah0 z^kb&L?1V2&txE+>`%D2@rVe5Bfv88+xD02TuX)Jx+xW|2BV7|bf7Sw?AutYw1E$x8 zFZiH#iMc?PW=yhJN7&}PkHaspldRaJj$x&1)FUcjA?pR+LjA1avlr0I!#W|k@OqCM&nHLu`Jo!I|f0z~uns7KVjf->vG z=7-E|@~qC~SG}55W`WL{{MNEZ)FUchp)PFVhEcRceWHpKs`!D8>&Ndesgjsi`1C8^uf2nc8>#v(DptlXTGQ=e z!&UDW^@)m7sG#D+?3Y=Xg&F^BIKJgYF11*jSHZ=^p5z^D#6AM;*taqgr8O4eDmz7e zqLvh@P&%>tciSzaL8RJzhU1>&3r0&)$CydR_hk^iE2}r3pf$`l_p{* zdwZj7dNsS7jeOwM)xREYF0iIr!%C~#De4oIr{GYEU8D#L1_Aje$_uspiet z?@B1Onp#1qw1f>%*&%Mz^r$qPF6qSQ*BbcT*vpSh^6JZ zjZNMhx2gJ6s6*)z`TsB?^TK?4xH%jRX9qsaL!0!RiY3f+DjniBQJD(*sgvjYI>e{C zWx@wSTkxFt!f~j>=%*E1m>I2fiQ7aiDo_fqu3kU=2&QyCW!2F)CiC(3v8PnEg@sbJ zOWY=^P;ETc`225o(8u(C2N?4|jNx`m-$<)MTZUYOEd0X5jYDr<= zC)l}uEdNHtV_BhV`TeBue|1cXb(4+Ba|R|$JD9mF+v7G(I|{y%y{~#UzX`EyzPl z=0zs6m`}pPDi>a#A4b7s^l?kr@#G!iRjN)DPSkUmd48LL&*#?%`}+?MhCb{Kapkkc z>9vjW7olB`A6=c4maqX@_J~)hN)e83`grD}P>0!@Xd;gE?TFB8+3sX|aAmwR@gV~5 zO6XxcsA35-ph|~$m8KCTee6MfjB~!8|K&Fo=ll-L=VUwcflSx6yQnl^^PRE5cV1&Q zurSG*;#Ha!6li1^*GH1R6Vu2F+j+2FZM{48P$uIJKG$%ObWG zR8$({RhsG(vWMNq>hHl!PWFd+Q3emFbd6hz^`UL{covMMue{fV9W0JgG{>t%{U_wL zgSG2tk>88SoDL^bPjZJFB~#eJLZ)brSBY9r*k$QN=Jz2o(Xl@s_)eiYvT>rk@Q8kx zJ?zLHW>QhNxId9GNO~%=kW4RV0%1jk^h&oW1lY(EU_oF{(;&W>@o$vav zhHr9C3Un5Bu(DY+#~qpil!jeGPGtTNCi7r_mhIlyd=6fW4|KNRIq`)@_`~dF+fZ#` zAyn-WcWBB`h&Hh|SMNW67*Q&V{ChA5ZPI^AJDBN|&2fjO5~ZQiyc3x}g2?2h{XO8a z$=JO02m}_J=Z$fPsu$tiYdsHluL-S#`GqF3j(!v|`PATUwlGH0^p?^NW^XB* z;|^6d3QDHSIR0Z*GOz5f!>&pwjO+uKjd{z`3I;06#<)Y(ivp7_O#Zme~12aUii`3j?3Jx#EbZ4uumsoGATC z1Eu;&6U(13=c;FtPw2=o)a_xzRqq!^M5QQH<#uBBr!36M<0d>#PcL? zwP~8@gbqopw8kP_Wv4hIszzZaJG`0tsOL|cSgo8kvHafEl~v(|ZLFf5>;*k`%I=oM`#Qv;_SoOGxV?P(DJE0?Y z!j(>OMAVsrcXeX*=M1cBM@@J@s~F|sk(CS2T*0-iwFG$1E1l9j$$QcKcORsSDerh5%sB%&+Ozme-V*+X)qdX z4z}+2pqe(8VFKt$JD9zuY>s21CKZ%ZCo+EtlX-i~mPK0}6P2b=h1QA3mk^I--Sp*O zsk@HnV!dQrshuOK${3f9X{Xp<_aZVfZ1dapPp zYD&SAI??*8h}N=B_40Gtq$e%yU?#L|k7J^S6ylvuZ2p>&%}~#qMU)oT^R9M?2x6!S~?V^l7@a&Pfg+dR~y7}eDC&H*iL6~{EiC{(CrucUt6{s$4E zd97d%w4%l;)B<_7ddZ?Gj%oT(pwW%SKZI#K?)8!xa+Z3@qA8APno!cm`{+6z?m8BA zf!V!@(fbc08d*)?qq%Nfrzcv|6TsoPz#aDet>Beil%Kfgz6>3NME&u8P#f^I0;Hn z6KnN9Y2);`*Gn!bWtLcoXkITlAu2&3zZkqpy&wHkh)-F_(t{Dd$<>mygPBd)949md zDAfC8<6J$Ne;Sb)>U}c(++OdqY>X444%EY^xVAlvyuXH_1sA(FF`EAwjmg<$&jT+h ztdg5X{)1Q5SW`+|Mz{o=kX zj9IDQJnzs08t-}ThQ$&JmzExJN>qiy&LAg3|D1(Tew2|1jJDu8@r6C6^UfedAh*RL zNO_kyCF(>W<_WK^-jDuy3#Hex-O2Re%6Mnu!ydL%7*qHOCe=CSiAYuKv4~csTbxq$ zqh71Ho_*!j6A!Gs^x~bze5^JvR-^3R#O(7g*ocJy%JRoMg>|aHVp7HYz%~n&dxtQo z)j*Q5Jx+-VQW*2$h1Gl0zi46e#(cInKc1%>A^x~67I{(LB~GcT5njKa^Kktx=2J}b zXu^a3B@3l8nCF2X6?#yeA3e!C*!-xhNsBm@)>uTU>=dU|P#Ohx* zu?iu+u!`a_kJ1)aPRlNFO4W}rrD0CGvhtvGJFkGR9$fh=7D}0BckJh+fS)FAR(&mR zk5i(86spbwd-ZeDziMGq4qYA)+VE%(1WIcx@}ja+oCam7iJ9qNldL{-VSC$`SpGd% zmcT!j&tC9>v;zok!@&~M3xrN zU@RNrE=>^%9I_Wszry)j6%H>R><#w!k28nd0+>VI5O-J~rK&JEwiq%ha7M*H(3xBxOb5H!ESvh^Cq*o~ zB$9oFsib82vNKYsti3Y$Dx)q~MntXSAnmKUay8u#WF zz&P@TxJT4q`nZx-?4c?sW=rheM1QYpa%TxaR@>tqO`8d9GS5-Z=0B;h$*Vqb$@=)R zS+xW9nbr2VM^kD-tyVWS|7n%YgZ){ydt>uCNbvVT#dh_Z&b3;3ynI8og8@yoIqp#v zoS-4Pc+G!SA@lKrJumWmTooLuhL}G;CNckU+@t9?A*aI4H~#YqfieOA2(5910%lv| z#9$~jr$X8QlPH_w9#OdoITcQ`$bV7NcrzPigZ<;{55@Cq6pA0mJ(^aNba7n#w1+XD zS24E+7rQqR^ZA!5fx8n(xLy9$i?B&<82Jy5_K0!Y<_X^kpOv2QCKRZFr$_kZKaG1d zRVL};h@+46eH^!LQ}q3YO5c9w#rnjRK9P@Sqwnoi`qr3Eww%Z9j5R9(WZ7x)XWk0k!<3Wvvhw*la0-fd7e#C@9D5?01+5U=O(-&8o1 z>GU4V2VK=a(#jZslQzIUQ8vYWn!XZp8r^98w-p+trgem9Bx%t=V`&47W7!t>shSF2 zCx`qooIm#ODm+$otmR)ZyJ{+={4rp%Y6r|^wLR_=Rh2%jzvpA#j>vy%DsSiCSJ;$6 z+au&FsUx?v0Y*|b#eJH>5;7y)M(+Qh(0F_DJe1Sl8QxkO4n~t(9uV1#r_}ABW2v{t zeWKnH&iHm(6&RPRzkLzV+X8MM7*mOPwo0d6^dLI8v!Q;c( z1hxxK4_Lv>^~vbq)?|DvvuRCsP_Q&LCvBQylZGmePGtU9jZ7H5z1e{v#$@(4SYCMS z7VB}_islS_IA767@JcI~uq<1XHch!n!w16rTbRmggBQ5V^r8kps{~T{3bXkT zZ?&RpZrR5QI%dhANrA7f1zQl~Scn2G!7oi<9 zT3W(}XxSra(^Q?{N7*Z>C-lE#LRqxfq-vL>O;md#oWXn1!~Ah^Lgib5 zxhAqG{|Ba&BYI&rn+`YUv&;)tnSJnu{ps6yC!0TAhj!#ou|+Jz;*Lq1rUa!C&gbxv zTk$@c;`V=9xdpHBWHy}*w*cJbp9cs#RoTVdvTSp9*|@z4Z8mOIi!26L?U}S`%2685 zUxIf~KQH)SR&p7(*$X~IrSAFpOX}*MJ5g?p#lZ4TNt>oEgRjkEqzV#e@*x*~a9jt)z_GFc&GX*x;yQ*jN|6n$6PG*C^W;T;{ zu&^oHlU1tb6sk6;#!+y|97>%c3z^rK(MM#S}8&aR&Tv zVvE2k{}-*gIV_0z$DxEU@B^$tqDZ3XyjwZ~8JTw;}SLd)4~LdkMCPysr{f zqEI{CiPZ;8tcJ)t8~fKM3nK4od$Jl-p(e)vmt!_%M0xpF?9Hh{z@D^&Ww4j+Nr$Qm zg~+>0CkkbaPp`djjycGcx4QkMuXAtgU3@h z=g=uuz(gvINr$Kfh3Z^REAijWnLK#kV7kvd~1#QWHd%=%0`XlpG}HfOEw;q7tYCS@kU!trrh^tv4n!ArAN}CsY4-` zgT0dayv&c*3H4@AyQ{wx8FDr@Amf7=_rq z2{u1gXH&-FmVcHhY{OxoF&||+62lA{d@v<$6sOnD8!Cl7g*XTSdv-ss7!Npt={#ca@&nZQO z(>AA+yUFWIo=0csiNyF~tYUOJ1074>w^u`SP);EsDr%qFeC$>D zB_w{e%=C1dAT~(cz=2o!cnYSh}O+`w>cn?0Ie!PE^ zkxHn}JsKPg$3C2M*}@JKeu91IA=g!`^ftGJozSvR5>quM95FrX;duWR{ubEVXu^Ab zf`!xEk$AC7gINY&nA3-NC)-%R2JMEi9ysN;ScEC>lEgHfDV(syUP`?;eY1(u+~z*a zMqT6jZ>}NqteMcl4pusg<|HO6P93a(p7YRuiqVPPoA95%*GT5U{w&+QvH4uKHS-`M zC2Yj;<2URqL0=BRBqi-?MDm9knk3k9LlY_`_ znA8?;v5|Ta+6|;iOIRtDJ(8HHM}=H^uz5Y9Efb+nPDXPt*7L3-z2Ml!r&RFs!CUHb z+zwVcd3zEQHKx;WZe#3s#xo({jh1y^?usBTClq5u*Da4+fXneau<1-hww>J*PTkDhI z*av;7nb=d+3ObV2)+C|oNw|W;84uM@p(wMNR1>kMcc@gZWut7Cm0)_X8giXsiYy%4 z4D&qLx73rK(Jg`C)H@^zQB7J6*-b8E_&ZfT^HO$~CgTj|PBX~CJI2{fMOnX!EfAyF zTuDOIl|rtl)7btlOzC`oHrc&78I2}8J0AGa7Ca}u@QhPrn%Mkkbq^k=v|LW_0H6|}lrn`gL@r@`kBDoDrJo2U_rKv-KMmHMYqtSRZ8{eAU zKHfBP8<=S1O-V{sf^a0s$MIT>NllH{ZJox+WbYCbB{|0NP4JFar4@`w%GM;MX+UA$ zk(-ZPHBgyH-Mxq%xn?7aD6ws=Q{8vOMs3C=w}TB#-khXVJqYhR>UkJ>7jtv=4w_is zbTl%RQtBSWi<%=-v4e?Br8!Ayno!ciG53y#WWJWUKDb!D;3mk7bTTK~UPOjm>nFcH zx1PN&Qybc=k)dnM0!A8HLy{7;pOCK!7Or1y$2y1e{o&T7+k^2q8}ZZ{4?N{5PFwYc zt_RyrhIn*Ni9 z-9b)%vTxv1Bo*&_;4fYIZ1KNKTXgdxv{%>b48PJ6HbBcBNtdPxg>zonE2$sJ&tO6y zA3)mX^6y-8-GL!gH5;3$iOt*w7Ao_$q)SzU@Q5BXN<54R^o~sOkgU_NtdPsr6C8?Y5e~EI+=X=;{%ss zWM(s!^1^XzBweE36QY?;gq}x) zDkYAO5TV4KzOepTSl*Z|kSZOLE>-ox+Iic{~y#yr?lK%SU-YqU+p}zTS~mFySa0 zlO9p!33(b$OkUEMd~z@y4ras2*b5C(tYoBX%)h|?k)FY>*uli5(wy{&>P{Eu37__G z#C{bwI=eS9Vy~%WUY%^+@xV(8o7C|r#&z3x&CYgJ#_Rm)5r+9slO9dWN&0wyxQ|)t zV#dSnP0;r~mA;$VV0&#a8+bsVuuC0*LV>gq*r^gIEr2MLElH22--LWM_KxajjhCw= zjjtek=SePd1(bSsY5#2a^Smkgd%kCU+k0>pGK$I;>kEqdvs%=gl@sTQt zvuLeSsmy~>y2bwF(1q765Ai;>QF;y9m3bl*uG4H`fK%_1^oW{GsM-cruOGLsU`i`h z$d*4#t;Ol9-Y}(NPmhgKt!i6AX~h;6Oe=ko9#OgJ;K+EW+J>{%9z~pLCCEJRr-Hyb zQcv;@Hd3{!Z8@o$HO#1LonUQqdb0W4ds_TjjncHe+UX_TR;yTltN*rIA!CTWn0lZ3 zDH^M?B$)?{HWWbzMx_-@Y|6%@M^$w~)~^ebS2ZTfnmo%t!n-ml;_NoRsbvfSlcg0* zP?oK*`X+kHu>aPD%4-HHk9}n#&ZVs~QMEbg6LpEbweWF$raxURD)suNsCo}9ZV_XU=7^xJEP=|o# zEknfJiOCHMlN;H1mL2bNQWQ3&H5M@{J0*RhIu!h;6RVGFtjdIJ55{%Z=q52|9T=5X zFtI5clRi}i3b9R>G5raRNhKNE11g)FZ7Oy!aj7&XeVP^oIdxpgeD;-BPdu>l(u;Q< z3%ks)mj0wl<`d(QA6e@n8@*Wfh=1|=M?^qvDv-9zj6Xj@k^dYtZ_?~Cjj@LHUeW<7*=o0)DcTAyse7#};6~jscBxaB}OhcBY6NgV%Ih@S~TemL{ zM{oc%1Jeg0TU8YKcbG``EKLrcZVLmOdY80KQ-Q*W&0bf%xBS!!rI$t%*j%yvc^mhB z#4gAzo*&~_{5);bbe%9_yD|9wDudIEl??QN!lp*-ON9jt7#0m_o2cT1xTKRW{4@iH z{A`Jbr<3`f4@}xl(uQQPN@Cs<}*Ltz$#nlEdSUocHXk*EH6B( z6wyoDYCDAw7khtHLYWP0V6ryIwVGt4|*JXjyiZw<#DaM>zhRKCJo z3J+`JvfS;XaVc%FfKS;cZ4>pJP)X2<)6cYV`uM?~4=bO0Ur7*AnppiZ36++x0V+GBZJNdtvM|}OS3lA}YvA){b~l@D z`atKsS07b6xgBh5^5%4vru;zc6RD5k{0Xc+4h&@GDTW@*KE-N>{SB5Eo_z{_ZL`mE zCz{G-VFeqOMQgembf6|GX>Ho5^d_d%DuGnK!faA?pd!wxBmpl3v@jQ(u18zHhdP+> z&gw_?Efb|P2>N-UR0^-C;0a%1LftdiE8erPgO$#rIbEfxLurKTU|xj12_Kz5#LG^I zNFF;akzMQ^{yO~k8|)jn*fxgN%F45+huct^?^IVjExZ3F{P$b%AG=sTcJY3R+K)B9 zjCaub#cIEgfyP&v`=xI!e*Fr&H{n0GD`Y~w@M!Jo5G3?*HoY*LO^2KFS?0r;XTnb0 zT>K`i%#6!+o~*3AJ^y!Q#Wup~u}6>%w>Up)uE0QpsE2MeFFJzXX0N@15e*t_0`-ZHScmksV@)Ah;zkQHk8A?kFh z3Mc;#`%(8@>c#vt_oJ}$w_*<)s#>>nm8dXv@a_yB>&c0+irt&=rnhxsFKpi(z^=A! z=_|y{o?*b|efOVWe+PVe&3*`%nANkd*}U-n6O0yPpM>>cUTs02nDt@5VL=}zsINSb z_YpQ?KPfNF>nYx7^Qn(QyXI4oHH^5TUXXPh=BU-zpWFWbb?5p}r}fg>%^TO&ro+40 z^}((WifD^7SiNCZ1=BWGb=@9(t7Z!$sal_Om8v?0*uKj=;5o$U`V&v=4{rHDXj8F$ zMyRlYnN87}cBqOIJ|)9P#p#XQDX=%t#8`g^QF(hX9%myT=A^Dvy6+B_b5foGYDmOm z$Z`{<9irY8vY3J5`W4g2!sPz?Xm9{)dLP&nV|Cq_ev)^vjp=1QW1UTD4YT7c7?qvU z4pDUqd*qy0-PKuz6y1ySotNjD zi0V;LHl29_aMp9oYD8x zq9MKLkamb_P{;~#;&Z0+DRzC`*xDLF-Tq^r6@u+ybfvf(oSs3{*+W){%V`d>V3?kTs07 zqF!l4RFNW_8*(0UfPBke78YjrCRF(6by}|tV1LN8Qio{ybMAzdIF9`GGJa>NU-#u- zi+v5Um6iLrH~~G_OD<4zhGuo*$lb-#5U+*3lbG;EZ|k?l}1#p zDeMq&q4faKn(a=e2YC!;`8jPcR&}kkgPG8>J&kCZ6YR=EyO+**IQolN47)cm`hQSo z^LjRWeloqYKApU9;6Wr+*e4&{}vr*VBFYI9BQ?#cMQJD&CI~J8VhCvO0P5~>Pr_o(ko4fs#TcB!po~yt-eyH zbz`zK3w!urXV@;=af+;Aq!sl_6QY6@=CMw+ewB^Z%aiHu;F#w~3kta{7Lv;QqzP5W z!h219toSS{%dvYC^VqM(oX*GFH!ocCVBRWhQ#baD3{~6Me+GVmHgC=M;4v#$*yJ`! z6QY6@>h(Bz&#ysL7KgoDn{0bgMb|Y$^aj3o96*6pd+0 z)S7~)bYk-Bbta!0+|7cglvXf8DO=N&rXD3d964%xsDQp2*kadf;J+p!N8eDP^2&HP z^Fixm*1#9mi(bn+*Lz5*4A~7s0yqiqJP!3EVHzBiNB(%fHTX z9jmFa%PWc%3^*#SX-ZUn+E`Wh@$`8y`(c)C!Y_VPh03dw!L}#{>w|w3ym9x(Z`eP+ znYY;d<5_4|{bR)r7|cp@no_kMyg%7Tt*7bJJ--=|S!~wvflF6^DgL@`T=ooHax0jr z3MWYtd= z7BInBw4^Cb(+MQ9ms3BR{MHJI>~PuRO`@;>CQ-DcDNV--b#2^8{5C{lo{r#wR}|ik zJ!g4guP8=yn^#QX!>U(g#1%F$(^#~nX;5mK7^A9p}}I;0~-{hY}joE>)?)yMla-{fNJEc5i~o z@6?#QHOvq0fULDG4@Pfc9p)j+3;Rlu-DdNZ=itNY=zTL&?O*~^ZBM&2y(SIOaJrR$YWNpbIDrME=|J;t8V5&>Z$y0jml9r*!Q6ZT~qO&n^|E26OBbn z+9m2X5gxlQdKifm=R~o46Jz)HR7iv)`J%O}Z1^5$(+jiNbhtU6!FJx|R~Chx*xz4y z;ZgkUywNs_--LE`6t`IflWOakc8R)9*lPywpx%dmFD4f%RS0-}V7A3stlluQVz;l2 zS-oaLPGZFt7FsKP(k@Nwfiq@N%>*CMH9X19e+uqRc-Zg5oZg&_Mw6YLOM}s9bFg*C zhqXJi4!$s})Y?fotGYcbxa!@~E=?0k!|4a`3hO=V_hVw=HO(N!$Oo_5)OtQARocOV zsBBNWG?gfLQ|4Xj+57LA&576_)QP>Y zeRnY4%C@DiSpL%pVDFg(h5d8Woz0aDom?5N_E!5D3#dJ-vY}u zLFEtYR6=lC+2HHJh|es8FU;mcypxU1HE7q^tlGi|Xthh)qiIbcgNePA`nl#sZ3!V@5bYg>O5W^j2|2XnOEV2KUic9Bdw@c+9N7X;T$<9-})0et=F^J^ONZvDA)VK zfd?bM7}3j7pM8Z#{ub|GTPt0Jc5SUxv4oM*N{_ThRG5Nx4>qqK{eRLz=;OoPY~saP z#)3VLAirTo#mHo1)S%sS0);IWQ7ZbRJ(}7SR`l$J)pPn&I;Z?B>E(}wHn^haHZXF@ z+tMCYOTxJ%KE^>?+z+sO6Z6oYHuEUYj$VE)g@w4G`0bwf&4N8?iv@hjK537tBH?&_ z*b%a_@}PX3uYj)}T=^ND)1sch`e1h3gZXEJktf9tMn0AHv`^HM!Wl-uUj3N6TtxmMQsM9J=Lb-H%Fdk#;w>2xbL>LhBhuxKG+AYEt2}7$>j#3y4$Y2ow+IuC7sjky~aP|IdT9v?%}L z(_$E+imB2*QH2Vlz7wCni1^gcm^jvRREKjp7^u3<(mqj<3Uwl!X#FLfR(a;c@>AMi z-m|oVaZV~*(>_gqN<&p;Cn|rrLgf?V5!6-YrCB`~;a%gX)T+uAJ76#?&1s*eLih#OZzm%Dd}Ow$;XPy;$(@YDk}dois)6|)#twt zetf^-cdO6Ne2}q^^4#qI@%|I+$*Pz7%nv}*{U=z@>c#uy&--#{GW9t%E1r^llKqDJ H@_&B^+Cu!5 diff --git a/libs/fmodex/lib/fmodexL_vc.lib b/libs/fmodex/lib/fmodexL_vc.lib deleted file mode 100644 index 63b6ee4fa082a5416da945ca52424cd425ea2fba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251478 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 Rb|5oXV==b6N}v|{`aj>77Dxa9 diff --git a/libs/fmodex/lib/fmodex_lcc.lib b/libs/fmodex/lib/fmodex_lcc.lib deleted file mode 100644 index 235fe165c34aec85cf4566a220c0938b62444607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 566264 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 E0UIiz;{X5v diff --git a/libs/fmodex/lib/fmodex_vc.lib b/libs/fmodex/lib/fmodex_vc.lib deleted file mode 100644 index ec169885fc2b43c3f24d5190205c4413e1ab8282..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 250782 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

xoWuKa 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

tRbX3@tn~P#L_53xi8Arhz&A! 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 diff --git a/libs/fmodex/lib/libfmodex.a b/libs/fmodex/lib/libfmodex.a deleted file mode 100644 index 6c49195aa7c272aba1de55be2c85f5025ad4996e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 280138 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 z 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 F{{u{wJre)` diff --git a/libs/fmodex/lib/libfmodexL.a b/libs/fmodex/lib/libfmodexL.a deleted file mode 100644 index fe253aaf6f4a0e72f96d6b2bea9ad4a934494062..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 280828 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 diff --git a/libs/fmodex/lib/which library do I use.txt b/libs/fmodex/lib/which library do I use.txt deleted file mode 100644 index 12738bed0..000000000 --- a/libs/fmodex/lib/which library do I use.txt +++ /dev/null @@ -1,28 +0,0 @@ -Which library do I link? ------------------------- - -If you want to use fmodex.dll: - -Visual Studio users - fmodex_vc.lib. -Metrowerks Codewarrior users - fmodex_vc.lib. -Borland users - fmodex_bc.lib. -LCC-Win32 users - fmodex_lcc.lib. -Dev-C++, MinGW and CygWin users - libfmodex.a. - -If you want to use fmodexL.dll: (same as fmodex.dll but with debug logging enabled) - -Visual Studio users - fmodexL_vc.lib. -Metrowerks Codewarrior users - fmodexL_vc.lib. -Borland users - fmodexL_bc.lib. -LCC-Win32 users - fmodexL_lcc.lib. -Dev-C++, MinGW and CygWin users - libfmodexL.a. - -If you want to use fmodex64.dll: (same as fmodex.dll but for 64bit machines) - -Visual Studio users - fmodex64_vc.lib. - -If you want to use fmodexL64.dll: (same as fmodex64.dll but with debug logging enabled) - -Visual Studio users - fmodexL64_vc.lib. - -No other compilers are supported for 64bit libraries. \ No newline at end of file diff --git a/tools/fmoddyn.h b/tools/fmoddyn.h deleted file mode 100644 index d1e7c43f8..000000000 --- a/tools/fmoddyn.h +++ /dev/null @@ -1,582 +0,0 @@ -/* =========================================================================================== */ -/* FMOD Dynamic DLL loading header. Copyright (c), Firelight Technologies Pty, Ltd. 1999-2004. */ -/* =========================================================================================== */ - -#ifndef _FMODDYN_H_ -#define _FMODDYN_H_ - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) - #include -#else - #include - #include -#endif -#include - -typedef struct -{ - void *module; - - signed char (F_API *FSOUND_SetOutput)(int outputtype); - signed char (F_API *FSOUND_SetDriver)(int driver); - signed char (F_API *FSOUND_SetMixer)(int mixer); - signed char (F_API *FSOUND_SetBufferSize)(int len_ms); - signed char (F_API *FSOUND_SetHWND)(void *hwnd); - signed char (F_API *FSOUND_SetMinHardwareChannels)(int min); - signed char (F_API *FSOUND_SetMaxHardwareChannels)(int max); - signed char (F_API *FSOUND_SetMemorySystem)(void *pool, int poollen, FSOUND_ALLOCCALLBACK useralloc, FSOUND_REALLOCCALLBACK userrealloc, FSOUND_FREECALLBACK userfree); - signed char (F_API *FSOUND_Init)(int mixrate, int maxsoftwarechannels, unsigned int flags); - void (F_API *FSOUND_Close)(); - void (F_API *FSOUND_Update)(); /* you must call this once a frame */ - void (F_API *FSOUND_SetSpeakerMode)(unsigned int speakermode); - void (F_API *FSOUND_SetSFXMasterVolume)(int volume); - void (F_API *FSOUND_SetPanSeperation)(float pansep); - void (F_API *FSOUND_File_SetCallbacks)(FSOUND_OPENCALLBACK useropen, FSOUND_CLOSECALLBACK userclose, FSOUND_READCALLBACK userread, FSOUND_SEEKCALLBACK userseek, FSOUND_TELLCALLBACK usertell); - int (F_API *FSOUND_GetError)(); - float (F_API *FSOUND_GetVersion)(); - int (F_API *FSOUND_GetOutput)(); - void * (F_API *FSOUND_GetOutputHandle)(); - int (F_API *FSOUND_GetDriver)(); - int (F_API *FSOUND_GetMixer)(); - int (F_API *FSOUND_GetNumDrivers)(); - const char * (F_API *FSOUND_GetDriverName)(int id); - signed char (F_API *FSOUND_GetDriverCaps)(int id, unsigned int *caps); - int (F_API *FSOUND_GetOutputRate)(); - int (F_API *FSOUND_GetMaxChannels)(); - int (F_API *FSOUND_GetMaxSamples)(); - unsigned int (F_API *FSOUND_GetSpeakerMode)(); - int (F_API *FSOUND_GetSFXMasterVolume)(); - signed char (F_API *FSOUND_GetNumHWChannels)(int *num2d, int *num3d, int *total); - int (F_API *FSOUND_GetChannelsPlaying)(); - float (F_API *FSOUND_GetCPUUsage)(); - void (F_API *FSOUND_GetMemoryStats)(unsigned int *currentalloced, unsigned int *maxalloced); - FSOUND_SAMPLE * (F_API *FSOUND_Sample_Load)(int index, const char *name_or_data, unsigned int mode, int offset, int length); - FSOUND_SAMPLE * (F_API *FSOUND_Sample_Alloc)(int index, int length, unsigned int mode, int deffreq, int defvol, int defpan, int defpri); - void (F_API *FSOUND_Sample_Free)(FSOUND_SAMPLE *sptr); - signed char (F_API *FSOUND_Sample_Upload)(FSOUND_SAMPLE *sptr, void *srcdata, unsigned int mode); - signed char (F_API *FSOUND_Sample_Lock)(FSOUND_SAMPLE *sptr, int offset, int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2); - signed char (F_API *FSOUND_Sample_Unlock)(FSOUND_SAMPLE *sptr, void *ptr1, void *ptr2, unsigned int len1, unsigned int len2); - signed char (F_API *FSOUND_Sample_SetMode)(FSOUND_SAMPLE *sptr, unsigned int mode); - signed char (F_API *FSOUND_Sample_SetLoopPoints)(FSOUND_SAMPLE *sptr, int loopstart, int loopend); - signed char (F_API *FSOUND_Sample_SetDefaults)(FSOUND_SAMPLE *sptr, int deffreq, int defvol, int defpan, int defpri); - signed char (F_API *FSOUND_Sample_SetDefaultsEx)(FSOUND_SAMPLE *sptr, int deffreq, int defvol, int defpan, int defpri, int varfreq, int varvol, int varpan); - signed char (F_API *FSOUND_Sample_SetMinMaxDistance)(FSOUND_SAMPLE *sptr, float min, float max); - signed char (F_API *FSOUND_Sample_SetMaxPlaybacks)(FSOUND_SAMPLE *sptr, int max); - FSOUND_SAMPLE * (F_API *FSOUND_Sample_Get)(int sampno); - const char * (F_API *FSOUND_Sample_GetName)(FSOUND_SAMPLE *sptr); - unsigned int (F_API *FSOUND_Sample_GetLength)(FSOUND_SAMPLE *sptr); - signed char (F_API *FSOUND_Sample_GetLoopPoints)(FSOUND_SAMPLE *sptr, int *loopstart, int *loopend); - signed char (F_API *FSOUND_Sample_GetDefaults)(FSOUND_SAMPLE *sptr, int *deffreq, int *defvol, int *defpan, int *defpri); - signed char (F_API *FSOUND_Sample_GetDefaultsEx)(FSOUND_SAMPLE *sptr, int *deffreq, int *defvol, int *defpan, int *defpri, int *varfreq, int *varvol, int *varpan); - unsigned int (F_API *FSOUND_Sample_GetMode)(FSOUND_SAMPLE *sptr); - signed char (F_API *FSOUND_Sample_GetMinMaxDistance)(FSOUND_SAMPLE *sptr, float *min, float *max); - int (F_API *FSOUND_PlaySound)(int channel, FSOUND_SAMPLE *sptr); - int (F_API *FSOUND_PlaySoundEx)(int channel, FSOUND_SAMPLE *sptr, FSOUND_DSPUNIT *dsp, signed char startpaused); - signed char (F_API *FSOUND_StopSound)(int channel); - signed char (F_API *FSOUND_SetFrequency)(int channel, int freq); - signed char (F_API *FSOUND_SetVolume)(int channel, int vol); - signed char (F_API *FSOUND_SetVolumeAbsolute)(int channel, int vol); - signed char (F_API *FSOUND_SetPan)(int channel, int pan); - signed char (F_API *FSOUND_SetSurround)(int channel, signed char surround); - signed char (F_API *FSOUND_SetMute)(int channel, signed char mute); - signed char (F_API *FSOUND_SetPriority)(int channel, int priority); - signed char (F_API *FSOUND_SetReserved)(int channel, signed char reserved); - signed char (F_API *FSOUND_SetPaused)(int channel, signed char paused); - signed char (F_API *FSOUND_SetLoopMode)(int channel, unsigned int loopmode); - signed char (F_API *FSOUND_SetCurrentPosition)(int channel, unsigned int offset); - signed char (F_API *FSOUND_3D_SetAttributes)(int channel, const float *pos, const float *vel); - signed char (F_API *FSOUND_3D_SetMinMaxDistance)(int channel, float min, float max); - signed char (F_API *FSOUND_IsPlaying)(int channel); - int (F_API *FSOUND_GetFrequency)(int channel); - int (F_API *FSOUND_GetVolume)(int channel); - int (F_API *FSOUND_GetAmplitude)(int channel); - int (F_API *FSOUND_GetPan)(int channel); - signed char (F_API *FSOUND_GetSurround)(int channel); - signed char (F_API *FSOUND_GetMute)(int channel); - int (F_API *FSOUND_GetPriority)(int channel); - signed char (F_API *FSOUND_GetReserved)(int channel); - signed char (F_API *FSOUND_GetPaused)(int channel); - unsigned int (F_API *FSOUND_GetLoopMode)(int channel); - unsigned int (F_API *FSOUND_GetCurrentPosition)(int channel); - FSOUND_SAMPLE * (F_API *FSOUND_GetCurrentSample)(int channel); - signed char (F_API *FSOUND_GetCurrentLevels)(int channel, float *l, float *r); - int (F_API *FSOUND_GetNumSubChannels)(int channel); - int (F_API *FSOUND_GetSubChannel)(int channel, int subchannel); - signed char (F_API *FSOUND_3D_GetAttributes)(int channel, float *pos, float *vel); - signed char (F_API *FSOUND_3D_GetMinMaxDistance)(int channel, float *min, float *max); - void (F_API *FSOUND_3D_SetDopplerFactor)(float scale); - void (F_API *FSOUND_3D_SetDistanceFactor)(float scale); - void (F_API *FSOUND_3D_SetRolloffFactor)(float scale); - void (F_API *FSOUND_3D_Listener_SetCurrent)(int current, int numlisteners); /* use this if you use multiple listeners / splitscreen */ - void (F_API *FSOUND_3D_Listener_SetAttributes)(const float *pos, const float *vel, float fx, float fy, float fz, float tx, float ty, float tz); - void (F_API *FSOUND_3D_Listener_GetAttributes)(float *pos, float *vel, float *fx, float *fy, float *fz, float *tx, float *ty, float *tz); - int (F_API *FSOUND_FX_Enable)(int channel, unsigned int fx); /* See FSOUND_FX_MODES */ - signed char (F_API *FSOUND_FX_Disable)(int channel); - signed char (F_API *FSOUND_FX_SetChorus)(int fxid, float WetDryMix, float Depth, float Feedback, float Frequency, int Waveform, float Delay, int Phase); - signed char (F_API *FSOUND_FX_SetCompressor)(int fxid, float Gain, float Attack, float Release, float Threshold, float Ratio, float Predelay); - signed char (F_API *FSOUND_FX_SetDistortion)(int fxid, float Gain, float Edge, float PostEQCenterFrequency, float PostEQBandwidth, float PreLowpassCutoff); - signed char (F_API *FSOUND_FX_SetEcho)(int fxid, float WetDryMix, float Feedback, float LeftDelay, float RightDelay, int PanDelay); - signed char (F_API *FSOUND_FX_SetFlanger)(int fxid, float WetDryMix, float Depth, float Feedback, float Frequency, int Waveform, float Delay, int Phase); - signed char (F_API *FSOUND_FX_SetGargle)(int fxid, int RateHz, int WaveShape); - signed char (F_API *FSOUND_FX_SetI3DL2Reverb)(int fxid, int Room, int RoomHF, float RoomRolloffFactor, float DecayTime, float DecayHFRatio, int Reflections, float ReflectionsDelay, int Reverb, float ReverbDelay, float Diffusion, float Density, float HFReference); - signed char (F_API *FSOUND_FX_SetParamEQ)(int fxid, float Center, float Bandwidth, float Gain); - signed char (F_API *FSOUND_FX_SetWavesReverb)(int fxid, float InGain, float ReverbMix, float ReverbTime, float HighFreqRTRatio); - signed char (F_API *FSOUND_Stream_SetBufferSize)(int ms); /* call this before opening streams, not after */ - FSOUND_STREAM * (F_API *FSOUND_Stream_Open)(const char *name_or_data, unsigned int mode, int offset, int length); - FSOUND_STREAM * (F_API *FSOUND_Stream_Create)(FSOUND_STREAMCALLBACK callback, int length, unsigned int mode, int samplerate, void *userdata); - signed char (F_API *FSOUND_Stream_Close)(FSOUND_STREAM *stream); - int (F_API *FSOUND_Stream_Play)(int channel, FSOUND_STREAM *stream); - int (F_API *FSOUND_Stream_PlayEx)(int channel, FSOUND_STREAM *stream, FSOUND_DSPUNIT *dsp, signed char startpaused); - signed char (F_API *FSOUND_Stream_Stop)(FSOUND_STREAM *stream); - signed char (F_API *FSOUND_Stream_SetPosition)(FSOUND_STREAM *stream, unsigned int position); - unsigned int (F_API *FSOUND_Stream_GetPosition)(FSOUND_STREAM *stream); - signed char (F_API *FSOUND_Stream_SetTime)(FSOUND_STREAM *stream, int ms); - int (F_API *FSOUND_Stream_GetTime)(FSOUND_STREAM *stream); - int (F_API *FSOUND_Stream_GetLength)(FSOUND_STREAM *stream); - int (F_API *FSOUND_Stream_GetLengthMs)(FSOUND_STREAM *stream); - signed char (F_API *FSOUND_Stream_SetMode)(FSOUND_STREAM *stream, unsigned int mode); - unsigned int (F_API *FSOUND_Stream_GetMode)(FSOUND_STREAM *stream); - signed char (F_API *FSOUND_Stream_SetLoopPoints)(FSOUND_STREAM *stream, unsigned int loopstartpcm, unsigned int loopendpcm); - signed char (F_API *FSOUND_Stream_SetLoopCount)(FSOUND_STREAM *stream, int count); - int (F_API *FSOUND_Stream_GetOpenState)(FSOUND_STREAM *stream); - FSOUND_SAMPLE * (F_API *FSOUND_Stream_GetSample)(FSOUND_STREAM *stream); /* every stream contains a sample to playback on */ - FSOUND_DSPUNIT * (F_API *FSOUND_Stream_CreateDSP)(FSOUND_STREAM *stream, FSOUND_DSPCALLBACK callback, int priority, void *userdata); - signed char (F_API *FSOUND_Stream_SetEndCallback)(FSOUND_STREAM *stream, FSOUND_STREAMCALLBACK callback, void *userdata); - signed char (F_API *FSOUND_Stream_SetSyncCallback)(FSOUND_STREAM *stream, FSOUND_STREAMCALLBACK callback, void *userdata); - FSOUND_SYNCPOINT *(F_API *FSOUND_Stream_AddSyncPoint)(FSOUND_STREAM *stream, unsigned int pcmoffset, const char *name); - signed char (F_API *FSOUND_Stream_DeleteSyncPoint)(FSOUND_SYNCPOINT *point); - int (F_API *FSOUND_Stream_GetNumSyncPoints)(FSOUND_STREAM *stream); - FSOUND_SYNCPOINT *(F_API *FSOUND_Stream_GetSyncPoint)(FSOUND_STREAM *stream, int index); - char * (F_API *FSOUND_Stream_GetSyncPointInfo)(FSOUND_SYNCPOINT *point, unsigned int *pcmoffset); - signed char (F_API *FSOUND_Stream_SetSubStream)(FSOUND_STREAM *stream, int index); - int (F_API *FSOUND_Stream_GetNumSubStreams)(FSOUND_STREAM *stream); - signed char (F_API *FSOUND_Stream_SetSubStreamSentence)(FSOUND_STREAM *stream, const int *sentencelist, int numitems); - signed char (F_API *FSOUND_Stream_GetNumTagFields)(FSOUND_STREAM *stream, int *num); - signed char (F_API *FSOUND_Stream_GetTagField)(FSOUND_STREAM *stream, int num, int *type, char **name, void **value, int *length); - signed char (F_API *FSOUND_Stream_FindTagField)(FSOUND_STREAM *stream, int type, const char *name, void **value, int *length); - signed char (F_API *FSOUND_Stream_Net_SetProxy)(const char *proxy); - signed char (F_API *FSOUND_Stream_Net_SetTimeout)(int timeout); - char * (F_API *FSOUND_Stream_Net_GetLastServerStatus)(); - signed char (F_API *FSOUND_Stream_Net_SetBufferProperties)(int buffersize, int prebuffer_percent, int rebuffer_percent); - signed char (F_API *FSOUND_Stream_Net_GetBufferProperties)(int *buffersize, int *prebuffer_percent, int *rebuffer_percent); - signed char (F_API *FSOUND_Stream_Net_SetMetadataCallback)(FSOUND_STREAM *stream, FSOUND_METADATACALLBACK callback, void *userdata); - signed char (F_API *FSOUND_Stream_Net_GetStatus)(FSOUND_STREAM *stream, int *status, int *bufferpercentused, int *bitrate, unsigned int *flags); - signed char (F_API *FSOUND_CD_Play)(char drive, int track); - void (F_API *FSOUND_CD_SetPlayMode)(char drive, signed char mode); - signed char (F_API *FSOUND_CD_Stop)(char drive); - signed char (F_API *FSOUND_CD_SetPaused)(char drive, signed char paused); - signed char (F_API *FSOUND_CD_SetVolume)(char drive, int volume); - signed char (F_API *FSOUND_CD_SetTrackTime)(char drive, unsigned int ms); - signed char (F_API *FSOUND_CD_OpenTray)(char drive, signed char open); - signed char (F_API *FSOUND_CD_GetPaused)(char drive); - int (F_API *FSOUND_CD_GetTrack)(char drive); - int (F_API *FSOUND_CD_GetNumTracks)(char drive); - int (F_API *FSOUND_CD_GetVolume)(char drive); - int (F_API *FSOUND_CD_GetTrackLength)(char drive, int track); - int (F_API *FSOUND_CD_GetTrackTime)(char drive); - FSOUND_DSPUNIT * (F_API *FSOUND_DSP_Create)(FSOUND_DSPCALLBACK callback, int priority, void *userdata); - void (F_API *FSOUND_DSP_Free)(FSOUND_DSPUNIT *unit); - void (F_API *FSOUND_DSP_SetPriority)(FSOUND_DSPUNIT *unit, int priority); - int (F_API *FSOUND_DSP_GetPriority)(FSOUND_DSPUNIT *unit); - void (F_API *FSOUND_DSP_SetActive)(FSOUND_DSPUNIT *unit, signed char active); - signed char (F_API *FSOUND_DSP_GetActive)(FSOUND_DSPUNIT *unit); - FSOUND_DSPUNIT * (F_API *FSOUND_DSP_GetClearUnit)(); - FSOUND_DSPUNIT * (F_API *FSOUND_DSP_GetSFXUnit)(); - FSOUND_DSPUNIT * (F_API *FSOUND_DSP_GetMusicUnit)(); - FSOUND_DSPUNIT * (F_API *FSOUND_DSP_GetFFTUnit)(); - FSOUND_DSPUNIT * (F_API *FSOUND_DSP_GetClipAndCopyUnit)(); - signed char (F_API *FSOUND_DSP_MixBuffers)(void *destbuffer, void *srcbuffer, int len, int freq, int vol, int pan, unsigned int mode); - void (F_API *FSOUND_DSP_ClearMixBuffer)(); - int (F_API *FSOUND_DSP_GetBufferLength)(); /* Length of each DSP update */ - int (F_API *FSOUND_DSP_GetBufferLengthTotal)(); /* Total buffer length due to FSOUND_SetBufferSize */ - float * (F_API *FSOUND_DSP_GetSpectrum)(); /* Array of 512 floats - call FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), TRUE)) for this to work. */ - signed char (F_API *FSOUND_Reverb_SetProperties)(const FSOUND_REVERB_PROPERTIES *prop); - signed char (F_API *FSOUND_Reverb_GetProperties)(FSOUND_REVERB_PROPERTIES *prop); - signed char (F_API *FSOUND_Reverb_SetChannelProperties)(int channel, const FSOUND_REVERB_CHANNELPROPERTIES *prop); - signed char (F_API *FSOUND_Reverb_GetChannelProperties)(int channel, FSOUND_REVERB_CHANNELPROPERTIES *prop); - signed char (F_API *FSOUND_Record_SetDriver)(int outputtype); - int (F_API *FSOUND_Record_GetNumDrivers)(); - const char * (F_API *FSOUND_Record_GetDriverName)(int id); - int (F_API *FSOUND_Record_GetDriver)(); - signed char (F_API *FSOUND_Record_StartSample)(FSOUND_SAMPLE *sptr, signed char loop); - signed char (F_API *FSOUND_Record_Stop)(); - int (F_API *FSOUND_Record_GetPosition)(); - FMUSIC_MODULE * (F_API *FMUSIC_LoadSong)(const char *name); - FMUSIC_MODULE * (F_API *FMUSIC_LoadSongEx)(const char *name_or_data, int offset, int length, unsigned int mode, const int *samplelist, int samplelistnum); - int (F_API *FMUSIC_GetOpenState)(FMUSIC_MODULE *mod); - signed char (F_API *FMUSIC_FreeSong)(FMUSIC_MODULE *mod); - signed char (F_API *FMUSIC_PlaySong)(FMUSIC_MODULE *mod); - signed char (F_API *FMUSIC_StopSong)(FMUSIC_MODULE *mod); - void (F_API *FMUSIC_StopAllSongs)(); - signed char (F_API *FMUSIC_SetZxxCallback)(FMUSIC_MODULE *mod, FMUSIC_CALLBACK callback); - signed char (F_API *FMUSIC_SetRowCallback)(FMUSIC_MODULE *mod, FMUSIC_CALLBACK callback, int rowstep); - signed char (F_API *FMUSIC_SetOrderCallback)(FMUSIC_MODULE *mod, FMUSIC_CALLBACK callback, int orderstep); - signed char (F_API *FMUSIC_SetInstCallback)(FMUSIC_MODULE *mod, FMUSIC_CALLBACK callback, int instrument); - signed char (F_API *FMUSIC_SetSample)(FMUSIC_MODULE *mod, int sampno, FSOUND_SAMPLE *sptr); - signed char (F_API *FMUSIC_SetUserData)(FMUSIC_MODULE *mod, void *userdata); - signed char (F_API *FMUSIC_OptimizeChannels)(FMUSIC_MODULE *mod, int maxchannels, int minvolume); - signed char (F_API *FMUSIC_SetReverb)(signed char reverb); /* MIDI only */ - signed char (F_API *FMUSIC_SetLooping)(FMUSIC_MODULE *mod, signed char looping); - signed char (F_API *FMUSIC_SetOrder)(FMUSIC_MODULE *mod, int order); - signed char (F_API *FMUSIC_SetPaused)(FMUSIC_MODULE *mod, signed char pause); - signed char (F_API *FMUSIC_SetMasterVolume)(FMUSIC_MODULE *mod, int volume); - signed char (F_API *FMUSIC_SetMasterSpeed)(FMUSIC_MODULE *mode, float speed); - signed char (F_API *FMUSIC_SetPanSeperation)(FMUSIC_MODULE *mod, float pansep); - const char * (F_API *FMUSIC_GetName)(FMUSIC_MODULE *mod); - int (F_API *FMUSIC_GetType)(FMUSIC_MODULE *mod); - int (F_API *FMUSIC_GetNumOrders)(FMUSIC_MODULE *mod); - int (F_API *FMUSIC_GetNumPatterns)(FMUSIC_MODULE *mod); - int (F_API *FMUSIC_GetNumInstruments)(FMUSIC_MODULE *mod); - int (F_API *FMUSIC_GetNumSamples)(FMUSIC_MODULE *mod); - int (F_API *FMUSIC_GetNumChannels)(FMUSIC_MODULE *mod); - FSOUND_SAMPLE * (F_API *FMUSIC_GetSample)(FMUSIC_MODULE *mod, int sampno); - int (F_API *FMUSIC_GetPatternLength)(FMUSIC_MODULE *mod, int orderno); - signed char (F_API *FMUSIC_IsFinished)(FMUSIC_MODULE *mod); - signed char (F_API *FMUSIC_IsPlaying)(FMUSIC_MODULE *mod); - int (F_API *FMUSIC_GetMasterVolume)(FMUSIC_MODULE *mod); - int (F_API *FMUSIC_GetGlobalVolume)(FMUSIC_MODULE *mod); - int (F_API *FMUSIC_GetOrder)(FMUSIC_MODULE *mod); - int (F_API *FMUSIC_GetPattern)(FMUSIC_MODULE *mod); - int (F_API *FMUSIC_GetSpeed)(FMUSIC_MODULE *mod); - int (F_API *FMUSIC_GetBPM)(FMUSIC_MODULE *mod); - int (F_API *FMUSIC_GetRow)(FMUSIC_MODULE *mod); - signed char (F_API *FMUSIC_GetPaused)(FMUSIC_MODULE *mod); - int (F_API *FMUSIC_GetTime)(FMUSIC_MODULE *mod); - int (F_API *FMUSIC_GetRealChannel)(FMUSIC_MODULE *mod, int modchannel); - unsigned int (F_API *FMUSIC_GetUserData)(FMUSIC_MODULE *mod); -} FMOD_INSTANCE; - - -static FMOD_INSTANCE *FMOD_CreateInstance(char *dllName) -{ - FMOD_INSTANCE *instance; - - instance = (FMOD_INSTANCE *)calloc(sizeof(FMOD_INSTANCE), 1); - if (!instance) - { - return NULL; - } - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) - instance->module = LoadLibrary(dllName); -#else - instance->module = dlopen(dllName, RTLD_LAZY); -#endif - if (!instance->module) - { - free(instance); - return NULL; - } - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) -#ifdef __MINGW64__ - #define F_GETPROC(_x, _y) \ - { \ - char tmp[] = _y; \ - *(strchr(tmp, '@')) = 0; \ - instance->_x = (LPVOID)GetProcAddress((HMODULE)instance->module, &tmp[1]); \ - if (!instance->_x) \ - { \ - FreeLibrary((HMODULE)instance->module); \ - free(instance); \ - return NULL; \ - } \ - } -#elif defined(__MINGW32__) - #define F_GETPROC(_x, _y) \ - { \ - instance->_x = (LPVOID)GetProcAddress((HMODULE)instance->module, _y); \ - if (!instance->_x) \ - { \ - FreeLibrary((HMODULE)instance->module); \ - free(instance); \ - return NULL; \ - } \ - } -#elif defined (_X86_) - #define F_GETPROC(_x, _y) \ - { \ - instance->_x = (LPVOID)(size_t)GetProcAddress((HMODULE)instance->module, _y); \ - if (!instance->_x) \ - { \ - FreeLibrary((HMODULE)instance->module); \ - free(instance); \ - return NULL; \ - } \ - } -#else - #define F_GETPROC(_x, _y) \ - { \ - char tmp[] = _y; \ - *(strchr(tmp, '@')) = 0; \ - instance->_x = (LPVOID)(size_t)GetProcAddress((HMODULE)instance->module, &tmp[1]); \ - if (!instance->_x) \ - { \ - FreeLibrary((HMODULE)instance->module); \ - free(instance); \ - return NULL; \ - } \ - } -#endif -#else - #define F_GETPROC(_x, _y) \ - { \ - char tmp[] = _y; \ - *(strchr(tmp, '@')) = 0; \ - instance->_x = (void *)dlsym(instance->module, &tmp[1]); \ - if (!instance->_x) \ - { \ - dlclose(instance->module); \ - free(instance); \ - return NULL; \ - } \ - } -#endif - - F_GETPROC(FSOUND_SetOutput, "_FSOUND_SetOutput@4"); - F_GETPROC(FSOUND_SetDriver, "_FSOUND_SetDriver@4"); - F_GETPROC(FSOUND_SetMixer, "_FSOUND_SetMixer@4"); - F_GETPROC(FSOUND_SetBufferSize, "_FSOUND_SetBufferSize@4"); - F_GETPROC(FSOUND_SetHWND, "_FSOUND_SetHWND@4"); - F_GETPROC(FSOUND_SetMinHardwareChannels, "_FSOUND_SetMinHardwareChannels@4"); - F_GETPROC(FSOUND_SetMaxHardwareChannels, "_FSOUND_SetMaxHardwareChannels@4"); - F_GETPROC(FSOUND_SetMemorySystem, "_FSOUND_SetMemorySystem@20"); - F_GETPROC(FSOUND_Init, "_FSOUND_Init@12"); - F_GETPROC(FSOUND_Close, "_FSOUND_Close@0"); - F_GETPROC(FSOUND_Update, "_FSOUND_Update@0"); - F_GETPROC(FSOUND_SetSFXMasterVolume, "_FSOUND_SetSFXMasterVolume@4"); - F_GETPROC(FSOUND_SetPanSeperation, "_FSOUND_SetPanSeperation@4"); - F_GETPROC(FSOUND_SetSpeakerMode, "_FSOUND_SetSpeakerMode@4"); - F_GETPROC(FSOUND_GetError, "_FSOUND_GetError@0"); - F_GETPROC(FSOUND_GetVersion, "_FSOUND_GetVersion@0"); - F_GETPROC(FSOUND_GetOutput, "_FSOUND_GetOutput@0"); - F_GETPROC(FSOUND_GetOutputHandle, "_FSOUND_GetOutputHandle@0"); - F_GETPROC(FSOUND_GetDriver, "_FSOUND_GetDriver@0"); - F_GETPROC(FSOUND_GetMixer, "_FSOUND_GetMixer@0"); - F_GETPROC(FSOUND_GetNumDrivers, "_FSOUND_GetNumDrivers@0"); - F_GETPROC(FSOUND_GetDriverName, "_FSOUND_GetDriverName@4"); - F_GETPROC(FSOUND_GetDriverCaps, "_FSOUND_GetDriverCaps@8"); - F_GETPROC(FSOUND_GetOutputRate, "_FSOUND_GetOutputRate@0"); - F_GETPROC(FSOUND_GetMaxChannels, "_FSOUND_GetMaxChannels@0"); - F_GETPROC(FSOUND_GetMaxSamples, "_FSOUND_GetMaxSamples@0"); - F_GETPROC(FSOUND_GetSpeakerMode, "_FSOUND_GetSpeakerMode@0"); - F_GETPROC(FSOUND_GetSFXMasterVolume, "_FSOUND_GetSFXMasterVolume@0"); - F_GETPROC(FSOUND_GetNumHWChannels, "_FSOUND_GetNumHWChannels@12"); - F_GETPROC(FSOUND_GetChannelsPlaying, "_FSOUND_GetChannelsPlaying@0"); - F_GETPROC(FSOUND_GetCPUUsage, "_FSOUND_GetCPUUsage@0"); - F_GETPROC(FSOUND_GetMemoryStats, "_FSOUND_GetMemoryStats@8"); - F_GETPROC(FSOUND_Sample_Load, "_FSOUND_Sample_Load@20"); - F_GETPROC(FSOUND_Sample_Alloc, "_FSOUND_Sample_Alloc@28"); - F_GETPROC(FSOUND_Sample_Free, "_FSOUND_Sample_Free@4"); - F_GETPROC(FSOUND_Sample_Upload, "_FSOUND_Sample_Upload@12"); - F_GETPROC(FSOUND_Sample_Lock, "_FSOUND_Sample_Lock@28"); - F_GETPROC(FSOUND_Sample_Unlock, "_FSOUND_Sample_Unlock@20"); - F_GETPROC(FSOUND_Sample_SetMode, "_FSOUND_Sample_SetMode@8"); - F_GETPROC(FSOUND_Sample_SetLoopPoints, "_FSOUND_Sample_SetLoopPoints@12"); - F_GETPROC(FSOUND_Sample_SetDefaults, "_FSOUND_Sample_SetDefaults@20"); - F_GETPROC(FSOUND_Sample_SetDefaultsEx, "_FSOUND_Sample_SetDefaultsEx@32"); - F_GETPROC(FSOUND_Sample_SetMinMaxDistance, "_FSOUND_Sample_SetMinMaxDistance@12"); - F_GETPROC(FSOUND_Sample_SetMaxPlaybacks, "_FSOUND_Sample_SetMaxPlaybacks@8"); - F_GETPROC(FSOUND_Sample_Get, "_FSOUND_Sample_Get@4"); - F_GETPROC(FSOUND_Sample_GetName, "_FSOUND_Sample_GetName@4"); - F_GETPROC(FSOUND_Sample_GetLength, "_FSOUND_Sample_GetLength@4"); - F_GETPROC(FSOUND_Sample_GetLoopPoints, "_FSOUND_Sample_GetLoopPoints@12"); - F_GETPROC(FSOUND_Sample_GetDefaults, "_FSOUND_Sample_GetDefaults@20"); - F_GETPROC(FSOUND_Sample_GetDefaultsEx, "_FSOUND_Sample_GetDefaultsEx@32"); - F_GETPROC(FSOUND_Sample_GetMode, "_FSOUND_Sample_GetMode@4"); - F_GETPROC(FSOUND_Sample_GetMinMaxDistance, "_FSOUND_Sample_GetMinMaxDistance@12"); - F_GETPROC(FSOUND_PlaySound, "_FSOUND_PlaySound@8"); - F_GETPROC(FSOUND_PlaySoundEx, "_FSOUND_PlaySoundEx@16"); - F_GETPROC(FSOUND_StopSound, "_FSOUND_StopSound@4"); - F_GETPROC(FSOUND_SetFrequency, "_FSOUND_SetFrequency@8"); - F_GETPROC(FSOUND_SetVolume, "_FSOUND_SetVolume@8"); - F_GETPROC(FSOUND_SetVolumeAbsolute, "_FSOUND_SetVolumeAbsolute@8"); - F_GETPROC(FSOUND_SetPan, "_FSOUND_SetPan@8"); - F_GETPROC(FSOUND_SetSurround, "_FSOUND_SetSurround@8"); - F_GETPROC(FSOUND_SetMute, "_FSOUND_SetMute@8"); - F_GETPROC(FSOUND_SetPriority, "_FSOUND_SetPriority@8"); - F_GETPROC(FSOUND_SetReserved, "_FSOUND_SetReserved@8"); - F_GETPROC(FSOUND_SetPaused, "_FSOUND_SetPaused@8"); - F_GETPROC(FSOUND_SetLoopMode, "_FSOUND_SetLoopMode@8"); - F_GETPROC(FSOUND_SetCurrentPosition, "_FSOUND_SetCurrentPosition@8"); - F_GETPROC(FSOUND_3D_SetAttributes, "_FSOUND_3D_SetAttributes@12"); - F_GETPROC(FSOUND_3D_SetMinMaxDistance, "_FSOUND_3D_SetMinMaxDistance@12"); - F_GETPROC(FSOUND_IsPlaying, "_FSOUND_IsPlaying@4"); - F_GETPROC(FSOUND_GetFrequency, "_FSOUND_GetFrequency@4"); - F_GETPROC(FSOUND_GetVolume, "_FSOUND_GetVolume@4"); - F_GETPROC(FSOUND_GetAmplitude, "_FSOUND_GetAmplitude@4"); - F_GETPROC(FSOUND_GetPan, "_FSOUND_GetPan@4"); - F_GETPROC(FSOUND_GetSurround, "_FSOUND_GetSurround@4"); - F_GETPROC(FSOUND_GetMute, "_FSOUND_GetMute@4"); - F_GETPROC(FSOUND_GetPriority, "_FSOUND_GetPriority@4"); - F_GETPROC(FSOUND_GetReserved, "_FSOUND_GetReserved@4"); - F_GETPROC(FSOUND_GetPaused, "_FSOUND_GetPaused@4"); - F_GETPROC(FSOUND_GetLoopMode, "_FSOUND_GetLoopMode@4"); - F_GETPROC(FSOUND_GetCurrentPosition, "_FSOUND_GetCurrentPosition@4"); - F_GETPROC(FSOUND_GetCurrentSample, "_FSOUND_GetCurrentSample@4"); - F_GETPROC(FSOUND_GetCurrentLevels, "_FSOUND_GetCurrentLevels@12"); - F_GETPROC(FSOUND_GetNumSubChannels, "_FSOUND_GetNumSubChannels@4"); - F_GETPROC(FSOUND_GetSubChannel, "_FSOUND_GetSubChannel@8"); - F_GETPROC(FSOUND_3D_GetAttributes, "_FSOUND_3D_GetAttributes@12"); - F_GETPROC(FSOUND_3D_GetMinMaxDistance, "_FSOUND_3D_GetMinMaxDistance@12"); - F_GETPROC(FSOUND_3D_Listener_SetCurrent, "_FSOUND_3D_Listener_SetCurrent@8"); - F_GETPROC(FSOUND_3D_Listener_SetAttributes, "_FSOUND_3D_Listener_SetAttributes@32"); - F_GETPROC(FSOUND_3D_Listener_GetAttributes, "_FSOUND_3D_Listener_GetAttributes@32"); - F_GETPROC(FSOUND_3D_SetDopplerFactor, "_FSOUND_3D_SetDopplerFactor@4"); - F_GETPROC(FSOUND_3D_SetDistanceFactor, "_FSOUND_3D_SetDistanceFactor@4"); - F_GETPROC(FSOUND_3D_SetRolloffFactor, "_FSOUND_3D_SetRolloffFactor@4"); - F_GETPROC(FSOUND_FX_Enable, "_FSOUND_FX_Enable@8"); - F_GETPROC(FSOUND_FX_Disable, "_FSOUND_FX_Disable@4"); - F_GETPROC(FSOUND_FX_SetChorus, "_FSOUND_FX_SetChorus@32"); - F_GETPROC(FSOUND_FX_SetCompressor, "_FSOUND_FX_SetCompressor@28"); - F_GETPROC(FSOUND_FX_SetDistortion, "_FSOUND_FX_SetDistortion@24"); - F_GETPROC(FSOUND_FX_SetEcho, "_FSOUND_FX_SetEcho@24"); - F_GETPROC(FSOUND_FX_SetFlanger, "_FSOUND_FX_SetFlanger@32"); - F_GETPROC(FSOUND_FX_SetGargle, "_FSOUND_FX_SetGargle@12"); - F_GETPROC(FSOUND_FX_SetI3DL2Reverb, "_FSOUND_FX_SetI3DL2Reverb@52"); - F_GETPROC(FSOUND_FX_SetParamEQ, "_FSOUND_FX_SetParamEQ@16"); - F_GETPROC(FSOUND_FX_SetWavesReverb, "_FSOUND_FX_SetWavesReverb@20"); - F_GETPROC(FSOUND_Stream_Open, "_FSOUND_Stream_Open@16"); - F_GETPROC(FSOUND_Stream_Create, "_FSOUND_Stream_Create@20"); - F_GETPROC(FSOUND_Stream_Play, "_FSOUND_Stream_Play@8"); - F_GETPROC(FSOUND_Stream_PlayEx, "_FSOUND_Stream_PlayEx@16"); - F_GETPROC(FSOUND_Stream_Stop, "_FSOUND_Stream_Stop@4"); - F_GETPROC(FSOUND_Stream_Close, "_FSOUND_Stream_Close@4"); - F_GETPROC(FSOUND_Stream_SetEndCallback, "_FSOUND_Stream_SetEndCallback@12"); - F_GETPROC(FSOUND_Stream_SetSyncCallback, "_FSOUND_Stream_SetSyncCallback@12"); - F_GETPROC(FSOUND_Stream_GetSample, "_FSOUND_Stream_GetSample@4"); - F_GETPROC(FSOUND_Stream_CreateDSP, "_FSOUND_Stream_CreateDSP@16"); - F_GETPROC(FSOUND_Stream_SetBufferSize, "_FSOUND_Stream_SetBufferSize@4"); - F_GETPROC(FSOUND_Stream_SetPosition, "_FSOUND_Stream_SetPosition@8"); - F_GETPROC(FSOUND_Stream_GetPosition, "_FSOUND_Stream_GetPosition@4"); - F_GETPROC(FSOUND_Stream_SetTime, "_FSOUND_Stream_SetTime@8"); - F_GETPROC(FSOUND_Stream_GetTime, "_FSOUND_Stream_GetTime@4"); - F_GETPROC(FSOUND_Stream_GetLength, "_FSOUND_Stream_GetLength@4"); - F_GETPROC(FSOUND_Stream_GetLengthMs, "_FSOUND_Stream_GetLengthMs@4"); - F_GETPROC(FSOUND_Stream_SetMode, "_FSOUND_Stream_SetMode@8"); - F_GETPROC(FSOUND_Stream_GetMode, "_FSOUND_Stream_GetMode@4"); - F_GETPROC(FSOUND_Stream_SetSubStream, "_FSOUND_Stream_SetSubStream@8"); - F_GETPROC(FSOUND_Stream_GetNumSubStreams, "_FSOUND_Stream_GetNumSubStreams@4"); - F_GETPROC(FSOUND_Stream_SetSubStreamSentence, "_FSOUND_Stream_SetSubStreamSentence@12"); - F_GETPROC(FSOUND_Stream_SetLoopPoints, "_FSOUND_Stream_SetLoopPoints@12"); - F_GETPROC(FSOUND_Stream_SetLoopCount, "_FSOUND_Stream_SetLoopCount@8"); - F_GETPROC(FSOUND_Stream_AddSyncPoint, "_FSOUND_Stream_AddSyncPoint@12"); - F_GETPROC(FSOUND_Stream_DeleteSyncPoint, "_FSOUND_Stream_DeleteSyncPoint@4"); - F_GETPROC(FSOUND_Stream_GetNumSyncPoints, "_FSOUND_Stream_GetNumSyncPoints@4"); - F_GETPROC(FSOUND_Stream_GetSyncPoint, "_FSOUND_Stream_GetSyncPoint@8"); - F_GETPROC(FSOUND_Stream_GetSyncPointInfo, "_FSOUND_Stream_GetSyncPointInfo@8"); - F_GETPROC(FSOUND_Stream_GetOpenState, "_FSOUND_Stream_GetOpenState@4"); - F_GETPROC(FSOUND_Stream_GetNumTagFields, "_FSOUND_Stream_GetNumTagFields@8"); - F_GETPROC(FSOUND_Stream_GetTagField, "_FSOUND_Stream_GetTagField@24"); - F_GETPROC(FSOUND_Stream_FindTagField, "_FSOUND_Stream_FindTagField@20"); - F_GETPROC(FSOUND_Stream_Net_SetProxy, "_FSOUND_Stream_Net_SetProxy@4"); - F_GETPROC(FSOUND_Stream_Net_GetLastServerStatus, "_FSOUND_Stream_Net_GetLastServerStatus@0"); - F_GETPROC(FSOUND_Stream_Net_SetBufferProperties, "_FSOUND_Stream_Net_SetBufferProperties@12"); - F_GETPROC(FSOUND_Stream_Net_GetBufferProperties, "_FSOUND_Stream_Net_GetBufferProperties@12"); - F_GETPROC(FSOUND_Stream_Net_SetMetadataCallback, "_FSOUND_Stream_Net_SetMetadataCallback@12"); - F_GETPROC(FSOUND_Stream_Net_GetStatus, "_FSOUND_Stream_Net_GetStatus@20"); - F_GETPROC(FSOUND_CD_Play, "_FSOUND_CD_Play@8"); - F_GETPROC(FSOUND_CD_SetPlayMode, "_FSOUND_CD_SetPlayMode@8"); - F_GETPROC(FSOUND_CD_Stop, "_FSOUND_CD_Stop@4"); - F_GETPROC(FSOUND_CD_SetPaused, "_FSOUND_CD_SetPaused@8"); - F_GETPROC(FSOUND_CD_SetVolume, "_FSOUND_CD_SetVolume@8"); - F_GETPROC(FSOUND_CD_SetTrackTime, "_FSOUND_CD_SetTrackTime@8"); - F_GETPROC(FSOUND_CD_OpenTray, "_FSOUND_CD_OpenTray@8"); - F_GETPROC(FSOUND_CD_GetPaused, "_FSOUND_CD_GetPaused@4"); - F_GETPROC(FSOUND_CD_GetTrack, "_FSOUND_CD_GetTrack@4"); - F_GETPROC(FSOUND_CD_GetNumTracks, "_FSOUND_CD_GetNumTracks@4"); - F_GETPROC(FSOUND_CD_GetVolume, "_FSOUND_CD_GetVolume@4"); - F_GETPROC(FSOUND_CD_GetTrackLength, "_FSOUND_CD_GetTrackLength@8"); - F_GETPROC(FSOUND_CD_GetTrackTime, "_FSOUND_CD_GetTrackTime@4"); - F_GETPROC(FSOUND_DSP_Create, "_FSOUND_DSP_Create@12"); - F_GETPROC(FSOUND_DSP_Free, "_FSOUND_DSP_Free@4"); - F_GETPROC(FSOUND_DSP_SetPriority, "_FSOUND_DSP_SetPriority@8"); - F_GETPROC(FSOUND_DSP_GetPriority, "_FSOUND_DSP_GetPriority@4"); - F_GETPROC(FSOUND_DSP_SetActive, "_FSOUND_DSP_SetActive@8"); - F_GETPROC(FSOUND_DSP_GetActive, "_FSOUND_DSP_GetActive@4"); - F_GETPROC(FSOUND_DSP_GetClearUnit, "_FSOUND_DSP_GetClearUnit@0"); - F_GETPROC(FSOUND_DSP_GetSFXUnit, "_FSOUND_DSP_GetSFXUnit@0"); - F_GETPROC(FSOUND_DSP_GetMusicUnit, "_FSOUND_DSP_GetMusicUnit@0"); - F_GETPROC(FSOUND_DSP_GetClipAndCopyUnit, "_FSOUND_DSP_GetClipAndCopyUnit@0"); - F_GETPROC(FSOUND_DSP_GetFFTUnit, "_FSOUND_DSP_GetFFTUnit@0"); - F_GETPROC(FSOUND_DSP_MixBuffers, "_FSOUND_DSP_MixBuffers@28"); - F_GETPROC(FSOUND_DSP_ClearMixBuffer, "_FSOUND_DSP_ClearMixBuffer@0"); - F_GETPROC(FSOUND_DSP_GetBufferLength, "_FSOUND_DSP_GetBufferLength@0"); - F_GETPROC(FSOUND_DSP_GetBufferLengthTotal, "_FSOUND_DSP_GetBufferLengthTotal@0"); - F_GETPROC(FSOUND_DSP_GetSpectrum, "_FSOUND_DSP_GetSpectrum@0"); - F_GETPROC(FSOUND_Reverb_SetProperties, "_FSOUND_Reverb_SetProperties@4"); - F_GETPROC(FSOUND_Reverb_GetProperties, "_FSOUND_Reverb_GetProperties@4"); - F_GETPROC(FSOUND_Reverb_SetChannelProperties, "_FSOUND_Reverb_SetChannelProperties@8"); - F_GETPROC(FSOUND_Reverb_GetChannelProperties, "_FSOUND_Reverb_GetChannelProperties@8"); - F_GETPROC(FSOUND_Record_SetDriver, "_FSOUND_Record_SetDriver@4"); - F_GETPROC(FSOUND_Record_GetNumDrivers, "_FSOUND_Record_GetNumDrivers@0"); - F_GETPROC(FSOUND_Record_GetDriverName, "_FSOUND_Record_GetDriverName@4"); - F_GETPROC(FSOUND_Record_GetDriver, "_FSOUND_Record_GetDriver@0"); - F_GETPROC(FSOUND_Record_StartSample, "_FSOUND_Record_StartSample@8"); - F_GETPROC(FSOUND_Record_Stop, "_FSOUND_Record_Stop@0"); - F_GETPROC(FSOUND_Record_GetPosition, "_FSOUND_Record_GetPosition@0"); - F_GETPROC(FSOUND_File_SetCallbacks, "_FSOUND_File_SetCallbacks@20"); - F_GETPROC(FMUSIC_LoadSong, "_FMUSIC_LoadSong@4"); - F_GETPROC(FMUSIC_LoadSongEx, "_FMUSIC_LoadSongEx@24"); - F_GETPROC(FMUSIC_GetOpenState, "_FMUSIC_GetOpenState@4"); - F_GETPROC(FMUSIC_FreeSong, "_FMUSIC_FreeSong@4"); - F_GETPROC(FMUSIC_PlaySong, "_FMUSIC_PlaySong@4"); - F_GETPROC(FMUSIC_StopSong, "_FMUSIC_StopSong@4"); - F_GETPROC(FMUSIC_StopAllSongs, "_FMUSIC_StopAllSongs@0"); - F_GETPROC(FMUSIC_SetZxxCallback, "_FMUSIC_SetZxxCallback@8"); - F_GETPROC(FMUSIC_SetRowCallback, "_FMUSIC_SetRowCallback@12"); - F_GETPROC(FMUSIC_SetOrderCallback, "_FMUSIC_SetOrderCallback@12"); - F_GETPROC(FMUSIC_SetInstCallback, "_FMUSIC_SetInstCallback@12"); - F_GETPROC(FMUSIC_SetSample, "_FMUSIC_SetSample@12"); - F_GETPROC(FMUSIC_SetUserData, "_FMUSIC_SetUserData@8"); - F_GETPROC(FMUSIC_OptimizeChannels, "_FMUSIC_OptimizeChannels@12"); - F_GETPROC(FMUSIC_SetReverb, "_FMUSIC_SetReverb@4"); - F_GETPROC(FMUSIC_SetLooping, "_FMUSIC_SetLooping@8"); - F_GETPROC(FMUSIC_SetOrder, "_FMUSIC_SetOrder@8"); - F_GETPROC(FMUSIC_SetPaused, "_FMUSIC_SetPaused@8"); - F_GETPROC(FMUSIC_SetMasterVolume, "_FMUSIC_SetMasterVolume@8"); - F_GETPROC(FMUSIC_SetMasterSpeed, "_FMUSIC_SetMasterSpeed@8"); - F_GETPROC(FMUSIC_SetPanSeperation, "_FMUSIC_SetPanSeperation@8"); - F_GETPROC(FMUSIC_GetName, "_FMUSIC_GetName@4"); - F_GETPROC(FMUSIC_GetType, "_FMUSIC_GetType@4"); - F_GETPROC(FMUSIC_GetNumOrders, "_FMUSIC_GetNumOrders@4"); - F_GETPROC(FMUSIC_GetNumPatterns, "_FMUSIC_GetNumPatterns@4"); - F_GETPROC(FMUSIC_GetNumInstruments, "_FMUSIC_GetNumInstruments@4"); - F_GETPROC(FMUSIC_GetNumSamples, "_FMUSIC_GetNumSamples@4"); - F_GETPROC(FMUSIC_GetNumChannels, "_FMUSIC_GetNumChannels@4"); - F_GETPROC(FMUSIC_GetSample, "_FMUSIC_GetSample@8"); - F_GETPROC(FMUSIC_GetPatternLength, "_FMUSIC_GetPatternLength@8"); - F_GETPROC(FMUSIC_IsFinished, "_FMUSIC_IsFinished@4"); - F_GETPROC(FMUSIC_IsPlaying, "_FMUSIC_IsPlaying@4"); - F_GETPROC(FMUSIC_GetMasterVolume, "_FMUSIC_GetMasterVolume@4"); - F_GETPROC(FMUSIC_GetGlobalVolume, "_FMUSIC_GetGlobalVolume@4"); - F_GETPROC(FMUSIC_GetOrder, "_FMUSIC_GetOrder@4"); - F_GETPROC(FMUSIC_GetPattern, "_FMUSIC_GetPattern@4"); - F_GETPROC(FMUSIC_GetSpeed, "_FMUSIC_GetSpeed@4"); - F_GETPROC(FMUSIC_GetBPM, "_FMUSIC_GetBPM@4"); - F_GETPROC(FMUSIC_GetRow, "_FMUSIC_GetRow@4"); - F_GETPROC(FMUSIC_GetPaused, "_FMUSIC_GetPaused@4"); - F_GETPROC(FMUSIC_GetTime, "_FMUSIC_GetTime@4"); - F_GETPROC(FMUSIC_GetRealChannel, "_FMUSIC_GetRealChannel@8"); - F_GETPROC(FMUSIC_GetUserData, "_FMUSIC_GetUserData@4"); - - return instance; -} - -static void FMOD_FreeInstance(FMOD_INSTANCE *instance) -{ - if (instance) - { - if (instance->module) - { -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) - FreeLibrary((HMODULE)instance->module); -#else - dlclose(instance->module); -#endif - } - free(instance); - } -} - -#endif

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

Catatonic Porpoise, <graue@oceanbase.org>. -Updates can be found at http://www.thunderpalace.com/software/.